a symmetry

雑な自己満足を残していくブログ 年度によってテンションが違うっぽい

セキュキャン2018に参加した話 ~集中コースYII Cコンパイラを自作してみよう!ゼミ~

こんにちは. 以前にも書いた通り集中コースの Y【システムプログラミングトラック】Cコンパイラを自作してみよう!ゼミに応募して通ったので参加しました. knium.hatenadiary.com

今更参加記かよって感じですが気にしないでいただけると.

このゼミの目標としてC言語でCコンパイラを書いて,その自作コンパイラで自分の書いたCコンパイラのソースをコンパイルできるようになるセルフホストを目標としてて,結論から言うと参加者の3/6人が達成しました(僕はまだ).みんなプロですごかった.

期間中には,全体講義だったりグループワークだったりがあるのですが色々省略.社会性のある他の参加者にご期待を.

あとCコンパイラについてはこの記事を読むより他の同ゼミ参加者/講師の方がためになるのでそっちを読んだ方がいいです.

セキュリティ・キャンプ 2018 (Cコンパイラ自作ゼミ) に参加してきました - 0x19f (Shinya Kato) の日報

セキュリティ・キャンプ2018参加記 - hsjoihs’s diary

http://anqou.net/aqcc_diary.html

Cコンパイラ制作の夏期集中コースが思っていた以上にうまくいった話|Rui Ueyama|note

当日まで

Cコンパイラが書けるようになる魔法の資料が渡されました.それを読んで各自で時間を割いて進捗を出すと言った感じです.ステップは十何段階 + α ぐらいあったのですが,色々メンタル案件(お酒ください)が立て続いたので4ステップぐらいしか終わらせることができなかった・・・ 前日から準備中にtiltしてバックれようかと思いましたが流石にしなかった.

ここまでの進捗は """'a=1; b=2; a+b; """ や 外部オブジェクトファイルで定義されたadd_one関数を"""add_one(1);"""で呼び出せたりとかそんな感じの四則演算(実は割り算を実装してない)がパースでき,変数が存在してて,外部のオブジェクトファイルで定義された関数が呼べて,それらのコードが吐けるぐらい.

初日

ずっとフォローしてるけど会ったことない

Harutaka Takeuchi (@nametaketakewo_) | Twitter

がセキュキャンに来ることを知ってたので新宿で名刺印刷するの手伝ってもらったりお昼食べたりした.多分当日の集合2時間前にコンビニで名刺作って刷って失敗したり昼ごはん中に名刺切ってたのは僕だけでは

見られてツイートされるのもインターネットとの複合現実であるセキュキャンの特徴っぽい. 名刺ですが,結局そんなに配らなかったので40枚刷って20枚ほど余りました(コミュ障). 人間の好き嫌い激しいのと配ってもそのあとの繋がりが確約されるわけでもないので同年代と繋がりたいなら #seccamp でツイートしてる方が繋がる面においては効果がありそうという気持ち. #seccamp でもそんなにツイートはしてないけど

その後は共通の座学を受けたりチェックインしたりした.個室でベットがありエアコンがついてて,この瞬間私はセキュリティキャンプでの勝ちを確信しました.自室にはエアコンもベッドもないんだよなぁ・・・

2日目

朝ごはんはだいたい食べたい奴だったので脳死で選んでいつもオーバーフローしかけて辛かった・・・ 朝ごはんトークンを無限個先読みできる頭と目が欲しかった.あとは備え付けのデイリーなカミソリが辛かったので,コンビニで買おうと思ったが売ってなくて完全にお菓子を買いに来た人になった.

Cコンパイラゼミの全体的な講義の時間は当日までに配られた実装をやるだけなので,2~4日目で大きな差異はなかったがとても充実していた.

初めて「真面目にアセンブリを読む」をした.スタックマシンでやっていくのだが,図を書くのにめっちゃ苦労した記憶がある. というか 「アセンブリが読める人類はスタックの中に何がどれだけ入ってどのレジスタにもなんの値が入ってるかを全員図を書かなくても完全理解してるもの」 だと勝手に思い込んでやってきたので「あ,書いていいんだ〜,というか書くんだ〜」とか思った.

あらかじめ共有されてたCの規格書に目を通したがBNFがわからないので hikalium大先生にたくさん 殴られ 教わりました.ここでは殴られを打ち消しにしてますが,本当に優しく分かりやすく教えてもらいました.本当に感謝.hikalium先生,わかんないとこたくさん聞いちゃったし理解遅かったけど怒ってませんよね!? 最後にBNFの部分を印刷してもらってずっと読んで再帰下降の気持ちになりながらコード書いたりした.

その日の進捗は """add(x,y) { x + y; } main() { add(1,2); }"""みたいに自分で関数定義して呼びだししたり.

3日目

朝ごはんがオーバーフローしかける.昨日の反動でBNFの表を読みながら朝ごはんを食べる.少しずつ気持ちがわかって来た気がするけど本当か???

この日めちゃくちゃ集中できていた自信がある,compound statement何もわからんって感じだったけど何となくわかるぞ,何となく.if文とwhile文とfor文を生やし,今まで変数が出て来たら暗黙的にint型だと定義していたものを明示的に宣言しないといけないようにした.

つまり,"""int main() { int a; for (a = 1; a < 10; a = a + 1) { a = a + 2; } return a;}"""だったり

"""int inc(int a) { return a+1; } int main() { int a; a=10; if (1) { return inc(a); }}""" が通るようになった.ちょっとずつC言語っぽくなってきて嬉しくなった記憶がある.

あと3日目には他の集中講義の様子を見に行く時間があったのでXの部屋に行ったのですが川合さんが面白い人すぎて面白かった.また,リバエンがすごい楽しそうだなぁとか思ったりした,分解したものを戻すリバースリバースエンジニアリングはしないらしいけど.

翌日に個人成果発表をするらしく進捗がァなので夜を消費してやっていこうとするも既存のバグ取りで終わる.(だいたい3:30ぐらいまでやってた)

4日目

寝坊した.部屋のインターホンの音がファミマの入店音だったため,反射的に「いらっしゃいませ〜〜」って心の中では言った.寝坊するとチューターとか色々の方が部屋に起こしにくるようだ.というか体調大丈夫?的な意味合いが強く,ちょっとの寝不足だったがそれ以上にやっていきがあったのでやっていった.ご迷惑をかけてすみません.

進捗としてはポインタ型の定義,ポインタの&, *演算子,ポインタ演算とそのコードが生えて来た,具体的に言うと

int main() { int a; a = 10; int *b; b = &a; return *b + 1;} // 11

// 外部オブジェクトファイルで定義されてる関数
void allocate4(int **p, int a, int b, int c, int d) {
    *p = malloc(sizeof(int) * 4);
    (*p)[0] = a;
    (*p)[1] = b;
    (*p)[2] = c;
    (*p)[3] = d;
}

int main() { int *p; allocate4(&p, 1, 2, 4, 8); int *q; q = p+3; return *q; } // 8

が通るようになってた.結構C言語では?

スライド発表では通るコードと通らないコード,進捗具合と3日間の開発に割いた時間を計測してたのでネタにしてスライドを作った.同じゼミで6人が同じものを作ってるのに発表が被ってなくてすごい.

部屋に戻って来てからリファクタリングをメインにした.ここら辺から,別の参加者のコードをちょっとずつ読み始めて色々参考にしてる.他のプロたちに圧倒的感謝

期間終了時にはここまでできてた.うーーーん・・・・ GitHub - Knium/knicc at 183668eacb57ea350c1ff09ae615a5863442b4d9

最終日

してないから!!!朝ごはん食べながら @nametaketakewo_ と話してたら「15分でシャワーと荷物片付けとチェックアウト」に気づいてちょっと遅れただけだから!!!!

知らない間に5日間が終わってた.気持ち3日目ぐらいだったのでマジかってなった.チューターや講師としていつか来たいなぁとなったし,他の講義もすごい魅力的な内容だったので来世また受けて見たいなぁと思った.

f:id:Knium:20180825162913p:plain

全体的に

技術的な面ではBNFの読み方や構文解析アセンブリでのコード生成をどのようにすれば良いのかを学んだ. しかし,僕が一番強く印象に残ったのが環境面である. 日常生活を送る上でどうしても避けることができない雑務や課題や用事などに文字通り何一つも追われることもなく,ただコードの事だけを考えていれば良いあの時間はとっっても幸せだった. そのような環境にいれてかつ分からないことがあったら信頼できる方に秒で質問できる.どう考えても最高では? またずっとCのコンパイラとそのコードについて向き合っていたので,いやでも何か一つに集中して諦めずに取り組む能力は身についた. 他の方々は日常的にこの集中ができるからきっと成長できるんだなぁとか.なのでこれをキャンプが終わってからも継続的に技術的な何か1つに取り組みたいと思う.

Cコンパイラゼミの参加者,講師,チューターをはじめとした全てのキャンプ関連者に感謝申し上げます.本当にありがとうございました.

f:id:Knium:20180914134001p:plain
期間中にコーディングに費やせた時間

作業時間が2.5日あってそのうち36時間ちょいを進捗に費やせてたっぽい

終わってから

セキュキャン終わってからもkniccの機能をちょっとずつ増やしていて,

  • *(<ident> + <number>) = <expr>のderefな代入
  • 配列の実装
  • 配列の添字アクセス
  • int型のグローバル変数の実装
  • char型
  • 文字列リテラル
  • +=, ==, !=, ||, &&, ++, -- 演算子
  • elseの実装
  • for文の(;;) 第1~3式の省略
  • リファクタリングしたらフィボナッチ数を計算できるようになった
  • -1 とかの表現

などができるようになった.セキュキャン期間中やその前に出した進捗よりもそのあとの心がけが大事だし絶えずに何かをやり続けることに意味があるんだろうなぁとキャンプ前に思ったし話も聞いた気がする.他人と比べることに意味はないけど,期間までに一番進捗を出せなかったのでどうせなら一番終わった後に進捗出せたらなぁと思ってる.

あとは

  • 構造体(.演算子, ->演算子を含む)
  • 引数としてポインタを取るケース
  • typedef
  • enum
  • bool
  • NULL
  • void
  • size_t
  • 関数でポインタを返すケース
  • 型キャスト

辺りが終われば1個のファイルぐらいは部分セルフコンパイルできちゃったりするのでは?やっていかないと・・・と思ったけど記述して見たら意外と多くて辛くなった

github.com

でやっていってるので見守っていただけると嬉しいです.

セキュリティ・キャンプ全国大会2018応募用紙晒し

ポエム9割ポエム9割ポエム9割ポエム9割ポエム9割ポエム9割ポエム9割

まえがき

久々すぎて自分の文体が思い出せない・・・ので雑に殴り書きします. セキュリティ・キャンプ全国大会2018の選考が通ったのでほぼ全文の応募用紙を晒します.通らなかったら晒さなかったです. 締め切り当日の15:21くらいから書きました.もし昨日や一昨日が締め切りだったら完全にぶん投げてたし応募用紙は書けないですね,メンタル大事. www.ipa.go.jp

集中コースの Y【システムプログラミングトラック】Cコンパイラを自作してみよう!ゼミに応募しました. 凡人未満趣味太郎が書いた駄文ですが,セキュキャンの採点上加点方式が主らしいので書けることを書きました.気分を害した場合はブラウザバックを推奨します.あと文体が整ってないのもダメですね.9割ポエムです.間違っているところがあったらリプライなりコメントなりで激甘に優しく教えてください.いやもうマジでメンタル弱いんです.

という訳で以下の文章はフィクションです.実在の人物や団体および言語などとは関係ありません.ほんまか?

[問1] これまでのプログラミング歴(C言語に限りません)について好きなだけ語ってください。何か作ったものがあれば、それについても教えてください。

やっていった言語を順に書いていきたいと思います.言語自体が好きなので言語についてたくさん書いていることが多いです.

C言語

開始時期

大学に入ってから(8月とか)

動機

最初は授業で学ぶ予定だったので予習

所感

やっていくうちに自分の想像通りの動作をするとすごく楽しくなってきました. でもC言語で実際に何かの成果を上げようとするのは始めてすぐの人間には難しく,並行して勉強した後述するスクリプト言語たちをメインでやっていってました.

好き?

微妙,でもいろんな本読むとサンプルコードとして出てくるので必要性はとても感じる.

作ったもの

特になし(競プロだったり各種データ構造を実装したりはやりました)

Java

開始時期

学部1年の10月 ~ 12月

動機

オブジェクト指向を学ぶのに

所感:

入門書をちょっと読みました,CよりスタンダードなAPIが多いので色々触りやすそうだなと感じました.この時は構造体とクラスが具体的にどういう風に概念として違うのか他人に説明できるレベルではなかったと思います.

好き?

1.8以降で必要があれば書くぐらい

作ったもの

Ruby

開始時期

大学に入ってからC言語を少しやったあとに独学(少し) ~ Python触るまで

動機

入学してから知り合ったプロの友達がRubyistだったので布教されました.あと実際に実務でCを使うところはそんなに多くないしRubyの方が求人は多いと聞いたので

所感

この時は型宣言しなくて済むし任意のデータ構造を1つの変数で扱えて楽だな〜と思ってました.学部1年の時にExcelで大学の物理実験の数値計算を行うのですが,「せっかくプログラミングを学んだしRubyでもできないかな」といろいろ工夫 して実装しました.

好き?

シンタックスが柔らかくて好き #{} で文字列展開できるのとか(後述するPythonだとちょっとダルいので)

作ったもの

Python3

開始時期

学部1年の2月から

動機

Rubyで実験の数値計算を実装した後に「コード書いてお金もらいたい!そういうアルバイトはないのだろうか?」と調べたところインターンなどがあることを知り,熱意を買われてそこで学び始めました.

所感

おそらく一番書いた言語です. 主にそこではWebクローリング,スクレイピングDjangoを使ったWeb開発を行いました.書いていくうちに 内包表記やfor ... in <iterable> だったり構文が単調であったりライブラリと情報量が多いので作りたいものが最短かつ可読性が高いまま実装できる言語だと感じました. あとインデントをすごい気にするようになりました.別の言語でも無意識にインデントを気にするようになりましたし,見ててわかりやすいコードを書くことを意識するようになりました.

好き?

結構好き.出会えたおかげで今でもコードを書いている,そんな感じがします.

作ったもの

ECMAScript6~/TypeScript

開始時期

学部2年の夏休み辺りから

動機

アルバイトで必要になったため

所感

最初は嫌いでした. - 関数オブジェクトやPromiseがよくわからない - $ npm installをどのプロジェクトディレクトリでも打たないといけない - 打った後はめっちゃWARNING出る - Pythonみたいに $ pip installを打ったらインストールされてる処理系自体にそのライブラリから呼び出せるようにしたほうが手間暇がかからない気がしていた

などがあったからです. やっていくうちに関数オブジェクトは考えてみたら便利だし$ npm installはプロダクト毎に使ってるライブラリのバージョンが違ったら辛い問題を緩和してくれているしこのスタイルの方がいい気がしてきました. あとVueとかReactとかAngularとかフロントエンドのフレームワークは多種多様で氾濫していてキャッチアップが辛そうという気持ちです.

好き?

ビジネスのお付き合いって感じです,ES~5 は・・・

作ったもの
  • 検閲削除(アルバイト)
  • 検閲削除(アルバイト)
  • 検閲削除(ハッカソン)

Swift3

開始時期

学部2年の10月から2月くらいまで

動機

個人的にiPhoneアプリを作ってみたかった + アルバイトで必要になったため

所感

XCodeに開発環境が縛られて辛かったです. 先述した通りiPhoneアプリを作るのに必要だったので書いていたのですがSwiftが難しかったのかXCodeが難しいのかiPhoneアプリが難しいのか分からないまま書いてました.今でもわからない・・・

好き?

今思えばそんな悪い言語ではない気がするがそれはそれとして後方互換性がないので2での情報が一瞬で消し飛んだりとかするのであの時期に評価するのは難しい気がしてきました.

作ったもの

トイレ内に人を感知するセンサがあって,それがWebサーバに情報を投げてそこにリクエストを送って,どこのトイレが空いているかを表示するアプリ

Go

開始時期

学部3年の6月くらいから

動機

マイクロなWebサービスを作る際の流行りだったので

所感

最初はとてつもなく書きづらかったのですが500行くらい書いてみるとだんだんとよくなってきました. クロスコンパイルが楽にできるのでハッカソンでRPiを会場でセットアップしてる時に最初はPythonでやろうとしたのですが処理系がなく,会場の回線がとっても遅くて詰んでいたのですがバイナリをMacで生成してRPiはバイナリ送るだけという風にしたら見事に動くものが作れました. この頃から型がある言語って実は良いのでは?と思うようになってきました. IDEなどがのオブジェクトが持つメソッドを補完してくれたり, 他人が書いた関数を読む際に返り値や引数の型を読んでどのような引数を渡せばいいか,そもそも型自体が説明になっていたりしていますね(例えばJSで仮引数名がurlという風になっていたらURLのオブジェクト or urlの文字列なのかぱっと見わからない気がします).少なくともアルバイトなどの業務や複数人で規模が大きいコードを書く際はあると嬉しいと思うようになりました.コンパイルが通ると(ロジックがあっているかどうかは別として)少なくとも動くのでスクリプト言語の「動いてはいるけど予期していない引数渡されて止まるか不安」みたいな懸念すべき要素を緩和してくれているんだなと思いました. また,Pythontry ~ exceptは予めエラーが起きることを先にエスパーして書かないといけないのですが Goのerr, hoge := ~~ は本当にエラーが起きてからエラーハンドリングができている感じが健全で良いと思います,あと _ で errをエスケープできるところも. 型がある言語ですが interface{}のおかげでダックタイピングができるのでスクリプト言語の手軽さを保ったままゴリゴリ書けるのもいいと思います. でもやはり規模が大きくなると設計がきっちりしてないと辛そうだなぁと思いました.(どの言語でもそうだと思いますが) あとジェネリクスがないので map, filter, reduceなど高階関数を使った関数型プログラミングの便利なメソッドがなかったりするのが辛いという気持ちです.

好き?

最後はちょっとだけ批判しましたが結構好きです.書くとしたらスクリプト言語代わりって感じの手軽さで書きたいものがあったらって感じですね.

作ったもの:
  • 社内向けにJVNをクローリングして自社が使っているライブラリの情報があるかないかを教えてくれるWebサービス
  • 検閲削除(ハッカソン)

Scala

開始時期

学部3年の11月あたりから

動機

アルバイト先で必要だったため

所感

シンタックスシュガーがすごくてDSLも半端ない. 型がとてもきっちりしていて,設計が綺麗だと型合わせパズルをするだけで大抵うまくいくコードが書けますし,Scalaで初めてOptionやEitherに触れたのですがパターンマッチでエラー処理が書けます. REPLもあるので比較的触りやすいし, 言語自体のライブラリもかなり充実しています.関数型言語としての側面でバズったように見えますがオブジェクト指向 + 関数型言語として綺麗に成立しているのがとてもScalaのいいところだと思います. でもコンパイルがめっちゃ遅かったり,学習コストが高いと思います.あとIDEIntelliJがメインになってしまうのが少し辛いところ

好き?

結構好きです.

作ったもの
  • 検閲削除(アルバイト)

Scheme

開始時期

学部3年の12月あたりから

動機

SICPを読むため

所感

初めて触るS式は辛かったですが,インデントを意識したりparenthesis毎に色が変わるプラグインをエディタに入れたらとても書きやすくなりました.述語で条件分岐を書けるのが新鮮でSICPは読んでいて楽しいです.再帰が書けるようになりました.

好き?

そこそこ

作ったもの:

アセンブラ

開始時期

今年の4月くらいから

動機

なんとなく,知らずに大学を卒業するのが嫌だったので.

所感

使える変数が全部グローバル変数(レジスタ)なプログラミングがすごい新鮮というか・・・ ソースコードからこんなに分かりにくい形で吐き出されてめっちゃスタックだったりjumpしたりで構成されていて「僕の書いているソースコードはとてつもない抽象化の上で成立しているのだな」と思いました.

好き?

何とも言えない

作ったもの

"Hello, World!"と出力したりとかそんなレベルです.

[問2] コンパイラソースコードから実行バイナリを生成する過程について、現在知っている範囲で説明してください。ソースコードの言語については、好きなものでかまいません。

おおざっぱに以下のフェーズをたどってコンパイラソースコードから実行バイナリを生成します. - 字句解析 - 構文解析 - 意味解析 - 目的コード生成

字句解析

int main(void) {
    return 0;
}

とあったら

int
main
(
void
)
{
return
0
;
}

という風にソースコードトークンに分割する作業です. トークンはその言語内で意味を持つ最小単位の文字列を指します. 字句解析をする際は,オートマトンの考え方や正規表現を使うとうまくいくケースが多いです.

構文解析

if i == 1) {

といった明らかにC言語の文法的に正しくない行を例として考えます.この場合は ( と }がないですね. 字句解析のフェーズでは

if
i
==
1
)
{

トークンに分割することはできるが,誤りを検知できません.そこで構文解析の出番です. トークンが正しい順番で並んでいるかどうかをあらかじめ定義されたBNFなどの文法規則と照らし合わせて検証します. 構文解析に成功した後,トークンを構文木と呼ばれる再帰的な木構造を生成します. 構文解析

で表現すると良い感じの実装になるケースがあります.

意味解析

int ten(void) {
    return 10;
}

int main(void) {
    char i = ten();
    return 0;
}

という風に構文的にあっているけど iの型があってないソースコードに対して誤りを検知できるのが意味解析です.

name type scope .....
ten int 0 .....
i char 1 .....

上のような表が用意されていてハッシュ法などを用いて表にアクセスして照らしあわせます. また,上の表は左から順に

を指しています. 他にも,意味解析ではローカル変数がスコープの外で呼び出されていないかなどの誤りも検知できます.

コード生成

構文解析した結果得られる抽象構文木から対象の機械で動かすことのできるコードを生成します. アセンブラ機械語は一対一対応であるためこの時点でアセンブラを吐き出せればCでは完成であると言っても良いのではないのでしょうか.

最終的に

1 + 2 * 3

が字句解析をへて

1
+
2
*
3

となり,構文解析を経て

   +
 /   \
1     *
    /   \
   2     3

となり,コード生成で

MOV eax, 2
MOV edx, 3
MUL edx
ADD eax, 1

といった風に機械が解釈できる言語に変換されるのがコンパイルの一連の流れです.

[問3] C言語コンパイラを書く際に、最も難しいポイントはどこだと思いますか?考えたことや、これまでのプログラミング経験をもとに、具体的に教えてください。

最も難しいを判断するのは難しいのでいくつか書かせていただきます.(あとがきですが書いたことがないものの最も難しいポイントを当てるの難しくないですか?)

yaccなどのlexerを使わない構文解析

過去にコンパイラを作ろうとチャレンジした際に構文解析でつまづきました. 任意の個数のトークンを戻ったり,先読みするのを表現するのはとても難しそうだし,そもそもの構文が再帰的であるため,任意にトークンを行ったり来たりしたいのに構文が再帰的なのでこれを表現するのは難しそうに感じます.これはSICPでの再帰をある程度やった後の経験に基づく文章です.また,Lexerはいろいろな言語のライブラリで実装されていますがそれは多数の人が「自動化できるにもかかわらず煩雑な内容である」と判断して実装した.というのも考えられると思います.

型を前置して宣言すること

型を前置すると,その変数が関数なのか値なのかが実行するまで分からないのも辛いところだと思います.意味解析で使う記号表に登録するための処理やタイミングが難しそうに見受けられます. これは,今まで触ってきたScala, GoやRustのモダンな言語とCのシンタックスを比べて考えました.

マクロの実装

マクロは定義されている構文や意味を加算的に追加できます.あらかじめ定義された構文を実装するのも僕にとってはとてもハードなことなのにマクロを実装するとなると完全にどこでどういう処理が行われるのか見当がつかないです・・・

goto

gotoは正しく使うと便利なのですが,人間が正しく使うには難しいところがあるのでgotoの実装やテストのケースは膨大になるのではないのかと思いました.

コード生成

例えばスタックマシン向けにコードを生成するのであれば,そもそものスタックマシンがどのように動作するのかを知っていないのといけないし,それだけでコンパイラから十分逸脱できる内容だと考えられます. LLVMなどを用いるとある程度アーキテクチャの後ろ側を無視して書けるとは思いますが,ブラックボックスブラックボックスのままにするのは良くないと思いました.

[問4]. 何か他にアピールしたいことがあれば、自由に書いてください。この設問も含め、誤ったことを書いていても減点はしません。書いておきたいことはなんでも書いてください。

問1でいろいろな言語について書いて気づいたのが業務で触るのと個人で触るのは違うなーとは思いました. 業務で使うとしたらScalaやTypeScriptなどといった型がしっかりしてる言語でやっていきたいですが, 個人だったら好きなようにすればいいのかなーと思いました.いい言語が増えてきていますし.

問1を読んでいただけるとわかる通り,僕の学ぶ動機として一番最初は「面白そう」でしたが最近は「アルバイトで必要に駆られて」となることがとても多いです. コードを書くことは楽しいですが,やっていくうちに

  • お金とのトレードオフで業務で必要なことを学ぶ
  • ハッカソンで勝てる派手な技術だったり色々レイヤが高い技術だったりそれを活かせるアイデア
  • 就活のために人事とかの人から見ても分かるような技術や動くプロダクトを作りたい

ばかりで本当に興味があるプログラミング言語自体だったりコンピュータサイエンスだったりができてなくメンタルがすり減ってることに気づきました. それらを学ぶための機会や興味が,やらなければいけないことで埋め尽くされたまま大学生活が終わりかけていました.

学部3年の終わりの時,バイト先の人と進路がどうなるのかという話になって「もっと自分の興味があることについてたくさん知りたい」と思ってSICPを読み始めました. SICPを読んでいるうちに「なんとなく再帰を理解していたつもりだったが自分はこんなにも再帰がかけないのか,こんなに知っていることが少ないのか」と愕然としましたが,それでも自分がもがきながらも一生懸命解いていくうちに再帰がちゃんと書けるようになったり知っていることが何となく増えたような気がします.それと同時に「即時的なお金にならないけど,コンピュータサイエンスやプログラミング自体の学習はやっぱり楽しいな」と最近やっと思えるようになりました. そこで,「お金にならないけど夏休みに1週間同じ志であるコンパイラプログラミング言語について興味や知識を持つ仲間やたくさんのことを知っている講師達に積極的に質問できる機会がある,純粋に自分が興味がある分野を学ぶことに全力になれそうなセキュキャンに行きたい」と思うようになっていました.

僕は電通大の夜間主に所属していて夜間主では研究室配属が必須でないため,楽をしたかった当時の僕は研究室配属をしなかったので誰かと一緒にコンパイラについて学ぶ/教わる機会だったりがないです. 数が少ないとは言え,いろいろな言語を触ったつもりはあります.未だに新しい言語に触れることは飽きていませんし,やはりコンパイラは言語が好きなら通るべき道だと思いました. 学部4年になってやっと知りたいことを知るための機会や意志がマッチしました.この応募が通らなくてもSICPや様々な本を読み,自力でコンパイラについて学んでやっていくと思います. それでも,自分よりたくさんの事を知っている講師の方や同じ志を持った仲間と共に一緒に学び,苦悩し,実装をやっていくことは絶対にこれからの僕のエンジニアリング人生の大きな思い出や一歩になると信じています. というか,こんな機会は僕にはもうないと思います. 参加できたら誰よりも受講学生の中で一番年上になりますが,そんなの関係なしに年上であることのメリット,デメリットやプライドを捨てて誰に対してもリスペクトを支払いつつも,全力で取り組みたいと思っています.

どうかよろしくお願い致します.

あとがき

セキュキャンの締め切りツイートを見なきゃ完全に忘れてました. 去年は同じハッカソンチームのメンバーの id:kden が行ってたのですが,まさか今年は自分が行けるようになるとは思いませんでした. 22時にラーメン食べながら問1と問4を校正してくれた同期,締め切りツイートをしていた各位,こんな駄文を読んで良いと判断していただいた講師の方々,その他諸々各位に感謝します. 受かったからにはちゃんとメンタル調整して全力でやって行きたいと思います,何卒よろしくお願いいたします.