sanopy's diary

雰囲気エンジニア's ぶろぐ

セキュリティ・キャンプ全国大会2019(Cコンパイラ自作ゼミ)チューター参加記

2019/08/13-17に開催されたセキュリティ・キャンプ全国大会2019でチューターとして参加しました.

集中開発コースYトラック(システムプログラミングトラック)のチューターとしての採用だったのですが,去年同ゼミに受講生として参加・修了しているということで,専門講義が行われている時間はCコンパイラゼミにチューターとして参加しておりました.

チューターとしての仕事

チューターの仕事をざっくりと説明すると 運営・講師・受講生のサポート を行うことです.

専門講義の時間は講義の始まりの時間と終わりの時間に,講義で使用するディスプレイなどの機材の準備・片付けを行い,残りの時間は受講生のサポートとなるのですが,受講生の皆さんが優秀で私のサポートがなくともバリバリ実装しておりました.

受講生の皆さんがバリバリCコンパイラを実装している間は,私も自身のコンパイラを(受講生の様子を気にしつつ)黙々と実装していました.専門講義の時間は受講生とほとんど同じような気持ちでセキュキャンを楽しんでました(笑).

キャンプ期間中の進捗

ということでキャンプ期間中には以下の言語機能を実装しました.

実はCコンパイラの開発は約1年ぶりとなってしまっており,初日は過去に自分が書いたコードのコードリーディングから始めることとなり,enumの実装だけで1日を溶かしてしまいました.継続開発は大切!

これらの機能ができると,以下のようなコードをコンパイルすることができ,結構C言語っぽいプログラムが書けるようになります.

#define NULL (0)

typedef struct _Node {
  int data;
  struct _Node *next;
} Node;

void *malloc(int);

Node *new_node(int data) {
  Node *p;
  p = malloc(sizeof(Node));
  p->data = data;
  p->next = NULL;
  return p;
}

void print_list(Node *p) {
  printf(" %d ", p->data);
  if (p->next == NULL)
    printf("\n");
  else {
    printf("->");
    print_list(p->next);
  }

  return;
}

int main(void) {
  int i;
  Node *list;
  Node *p;

  p = list = new_node(0);
  for (i = 1; i <= 10; i++) {
    p->next = new_node(i);
    p = p->next;
  }

  print_list(list);

  return 0;
}

ちなみに生成コードもちゃんと動作してますよ!

セルフホスト達成に必要な残りの言語機能を挙げると以下のものになると思います.

  • continue文
  • break文
  • 初期化子など
    • int a, b, c; のような2つ以上の変数の一括宣言
    • int a = 0; のような変数の宣言と初期化
    • int a[] = {0, 1, 2}; のような配列の宣言と初期化
  • switch - case文
  • プリプロセッサ

初期化子周りについては,「単一の変数の宣言」と「代入文」といった言語機能は実装されているため実装しなくても現在のコンパイラのプログラムの自由度を下げれば,実装しなくともセルフホストは可能となります.

同様にswitch - case文についても,if - else文が実装されているため,switch - caseで書かれている部分をif - elseに置き換えることでセルフホストすることが可能となります.

あとは私が実装しているCコンパイラコンパイル可能な言語の表現力とCコンパイラの実装の労力とのバランスで,どこまでを実装しどこからの実装をサボるかといったところになってきます.この辺をどのようなバランスで実装するか考えつつセルフホスト達成を目指していきたいと思います.

Cコンパイラゼミの個人的おすすめポイント

Cコンパイラゼミには様々な魅力があると思います.本当は去年受講生として参加したときの参加記で記述するべきでしたが,魅力を伝えることをすっかり忘れていたので,ここで補足したいと思います.

低レイヤや言語処理系が好きな人にとっての魅力は参加者の方々が書いてくれると信じて,私のような低レイヤ初心者的おすすめポイントを紹介したいと思います.

おすすめポイントの紹介の前に簡単な自己紹介をすると,実は私は普段はWebのような高レイヤのプログラミングをする機会が多く,セキュリティ・キャンプでCコンパイラゼミを受講するまでは低レイヤに関しては全くの初心者でした.そんな私の興味が「大規模開発」と「低レイヤ」だったのです.

当時の私は数千行程度規模のプログラムをいくつか書いた経験がありましたが,どれも段々とコードが汚くなり保守することが難しくなりがちという悩みを抱えていました.また高レイヤで興味のある技術には触れていたが,低レイヤについては全く分からないので勉強したいという思いもありました.そこで丁度良い題材がCコンパイラの開発であり応募に至りました.

そのような私にとっての魅力はなんといってもGoogleのつよつよエンジニアであるRui Ueyamaさんにコードをレビューしていただける点でした.

そもそも学生では開発バイトをしているような人を除いて,現役のエンジニアにコードをレビューしてもらえる機会は皆無に等しいと思います.特に地方大学で学生をしているような人は開発バイトを見つけることも難しいのではないでしょうか.

応募前の私がまさに上記のような状況であり,プログラムを書くことは好きだけれども「果たして自分の書いているコードが世間でも通用するコードなのだろうか?」という悩みを抱えていました.

そのような状況の中で,Cコンパイラの開発を通じてRuiさんからのコードレビューを受けられるということはとてつもない喜びでした.オンラインのミーティングで自分のコードをRuiさんに褒めていただいた時にはその場では平静を装っていましたが,ミーティングが終わった後に小躍りしたりしてました(笑).

謝辞と今後セキュリティ・キャンプに応募する方々へ

実はキャンプ開催の1週間前に気胸を患い入院・手術をしており,健康状態に問題はないものの主治医の先生からは「激しい運動や重い物の持ち運びは控えるように」との指示を受けている状態でした.

↓は退院直後のツイート.

運営事務局の方々やチューターリーダーの方々はそのような状態をよく理解してくださり,私の身体の負担になるような仕事が割り当てられることもなく無事キャンプの期間を過ごすことができました.運営のサポートをするという立場ながら色々な方に心配や負担をかけてしまい申し訳ない気持ちでいっぱいでしたが,無事キャンプの期間を過ごすことができたのは皆さんの配慮のおかげです.ありがとうございました.

受講生として参加したときには気付きませんでしたが,セキュリティ・キャンプは参加者全員が無事にキャンプ期間を過ごすことができるように様々な配慮がされております(上記はその一例).ですので,受講生およびチューターとしての応募・参加を考えている皆さんは安心してセキュリティ・キャンプの募集に挑戦していただきたいと思います.