セキュリティキャンプの応募用紙公開

タイトル通り、私のセキュリティ・キャンプ2018の応募用紙を晒すだけの記事です。それではいきましょう。

注意

私が応募したのは言語自作ゼミです。

ここから提出した内容〜

[問1] あなたの現在の開発スキルを教えてください。プログラミング歴、今までの代表作、どの言語がどのくらいできるのかなどをわかりやすくまとめてください。

小学6年生のころにC言語に入門しプログラミングを始めて、今は高校2年生なので、 だいたい5年間はプログラミングをやっていると思います。

ここからは今までに作ってきたものを列挙していきます。

自作言語(中学生のころに開発していた):

 この言語は至って普通の手続き型言語で(強いて言えばRubyライクな構文)、x86のバイナリを直接生成してJITで実行できるという点だけが特別でした。ですがその頃の私にはまだ本物のJIT(VMとネイティブコードで処理が行き来するようなもの)と呼べるものは難しかったので、実行時にすべてをx86のバイナリにコンパイルして実行するという、ほとんどAOTなものでした。またx86のバイナリは、gen_bin(0x8d)のような感じで完全に手作業で記述したとても簡単なアセンブラのようなもので生成していました。中学生の後半になるとLLVMを使い始め、16進法でx86のバイナリを打ちこむようなことがなくなりコードがシンプルになって喜んだ覚えがあります(今となってはXbyakを使えば無理してLLVMに入門する必要もなかったのでは?と思いますが)。 処理系を作っていくすべての過程においてその頃の自分にはとても難しく感じられて、途中で何度か挫折したことを覚えています。ですが難しかったものの、まだまともなプログラムも書けないのに、言語処理系を作るという大きな目標を掲げ、x86のアセンブラのようなものを自分で手作りしようとして奮闘したのは良い体験になったと思いますし、トーカナイザーやパーサーを作っていく中で様々なアルゴリズム・考え方を学んで楽しめたことは、今の自分がプログラミングを続けている理由の多くを占めていると思います。 そんな感じで、私の中学生時代は言語処理系を作ったり、競プロやCTFに少しハマったりしながら過ぎていきました。

Cコンパイラ(中学生のかなり後期から高校1年生のころに開発):

 高校受験が終わったころになるとそれまで使っていたC++から離れて(cmakeのCMakeLists.txtの書き方によくわからない部分が多くて苦戦していました)、Rustを使い始めました。そしてRustの勉強のためにCコンパイラを作り始めたというわけです。 Cコンパイラはインターネット上のいろいろなオープンソースコンパイラを参考に作っていきましたが、その中で私はプリプロセッサの驚異的な複雑さに気づきました。一度理解してしまえばそこまで困ることでもないような気もしますが、理解するまでは、なぜどうしてこんな実装になっているんだ!と毎晩悩んでいました。そしてしばらくたってから、悩んでいた部分がプリプロセッサが必ず停止することを保証するためのものだと気づいた時は、本当に、本当に爽快な気分でした。結果的にこのCコンパイラは比較的まともに動くようになり、ネット上に落ちているコードもある程度は改変なしで動かせるようになりました。2048で遊んだり円周率をGIMP(←これは間違いで正しくはGMP)で計算させたりもできるようになりました。

OCamlコンパイラ(Cコンパイラとはんば並行しながら開発):

 Cコンパイラがある程度動くようになると、今度はOCamlのコンパイラも制作も始めました。 結果を先に言うと、MinCamlレベルのものはすぐに作ることができて、型推論もHindley-Milnerを自分で理解して実装することができました。また型推論自体は多相型を扱えたので、コード生成でも多相型もサポートできればいいなと思ったのですが手こずってしまい、多相型を考慮すると高速なコードを吐くのは難しいんだなぁと気づいたときにはやる気がどこかに行ってしまって、他のことを始めていました。 結局MinCamlに毛が生えた程度のものしかできませんでしたが、型推論をきちんと勉強できたのでそれだけでも価値のある挑戦だったと思います。型推論については、数式の一切でてこない記事(https://qiita.com/uint256_t/items/7d8c8feeffc03b388825)を書きました。

Webブラウザ(現在開発中):

 さて、先ほど他のことを始めたと言いましたが、他のことというのはWebブラウザの制作です。 最初はかなり壮大な夢だなあと自分でも思っていましたが、いざ実際に作り始めるとやはり思ったとおり、コンパイラを初めて作った頃と同じく驚き・新鮮味を感じられました。まず一番最初に感じたのは、既存ブラウザはあまりにも巨大だということです。試しにFirefox(というよりもServo)とChromiumのソースコードを読もうとしたのですが、Chromiumに至ってはGitHubからcloneしてくるだけでとても時間がかかりました。もうその時点で嫌気が刺したくらいです。そしてビルドしようにも終わりが見えないほど時間がかかりそうなので、途中でやめてしまいました。ソースコードを読む気力もなくなってしまいました。 とまあ、ここまではあまり良い風は吹いていなかったのですが、ChromiumではなくRustで書かれたServoのコードを読み進めていくと変化が訪れました。 まだServoが発展途上であることも関係があるのかもしれませんが、コードやディレクトリ構造がわかり易くて、コードリーディングがとても捗ったのです。スマホでGitHub上のコードを読みながら学校へ登校するなんてこともありました。それくらい夢中になるほど新鮮な体験でした。 初めのころはいろいろと理解が進まないことが多く、特にテキストやdisplay:inlineな要素の処理には難しい部分が多く、どうやってテキストの改行が実装されているのかを理解することに2週間も要してしまいました。ですが理解した時の感動は本当に計り知れないものだったと記憶しています。難しいと感じていた部分も、メモリ使用を減らすためのものだと気づいた時は(Servoでは画面上の要素のレイアウト計算で使うようなノードは、一つ一つが対応するテキストを保持しているのではなく、テキスト全体の中である一部分を表す範囲オブジェクトを保持している。特に大量に改行が挟まれるテキストでは処理速度も上がると思う)、これはコンパイラのエラー表示の部分にも応用できるのではと考えを巡らせました。 現在作っているブラウザ(というよりもレンダリングエンジンに近いですが)は、簡単なHTML/CSSで書かれたサイトなら表示することができ、ローカルのファイルでもインターネット上のファイルでも読みこんで表示することができます。(http://github.com/maekawatoshiki/naglfar)

最後に、簡単に私の使える言語について書いていこうと思います。

Cはコンパイラを作ったことがあるのでそんなに苦はなく使えると思います。

C++もCと同じような感じかなあと思ったのですが、久しぶりにC++を使ってみたら標準ライブラリの中身をところどころ忘れているようだったので、インターネットで調べながらなら使える、とだけ言っておきます。

Rustは最近日常的に書いているので苦はなく使えると思います。

スクリプト言語系は正直あまり日常的には書かないのでスラスラ使えるとまでは言えませんが、PythonでTensorflowを使ったりしたことはあるので、ドキュメントがあるなら使えると思います。

[問2] http://essen.osask.jp/?seccamp をよく読んで、Essenのどんなところが気に入ったのか教えてください。また、もし今のうちから「できればこんなことをやりたい!」というのがあれば、それもぜひ書いてください。

 安全性を確保しつつ高速に実行したいというところにとても共感できました。また安全性を確保するために利便性・コードの書きやすさを犠牲にしたくないというのも、実現できたらどんなに幸せなことだろうと思いました。 C言語で高速なプログラムを作ろうとするとセキュリティ対策に膨大な労力が必要になるし、スクリプト言語でポインタなどを直接扱わずにそこそこ安全なプログラムを書こうとすると速度が犠牲になります。これは誰もが何度か体験してきた事実だと思います。特に速度に関しては、個人的にはプログラマがイライラしないために絶対に手を抜けない部分だと思っています。私がスクリプト言語をあまり使わない唯一の理由が”遅い”ということなので…。 ですがC++やRustなんかもコンパイルやリンクが遅いので正直どうなんだろうかとは思っています。その点、JITが使えるというのはEssenの開発理念にあっていて良い選択だと思います。 また私は今ブラウザを作っていて、その中でブラウザがいかにセキュリティに対していかに気を配り、リソースを割いているのかかを身にしみて感じているので、Essenのような理想的な言語にはとても期待しています。

 Essenについての説明を読んでいて、今のところEssenはWindows上でしか動かないということに気づきました。 なので、できるならLinuxへの移植をやれたらなあと思っています。他にも、Essenの安全性に直接関わっている部分にはとても興味があるので、そのあたりをいじってみたいです。

[問3] その他、アピールしたいことがあれば自由に書いてください。この欄は空欄でも構いません。

特に何も書いてないです。

終わりに

応募用紙は、自慢話を書きなぐればなんとかなると思います。2019年以降に参加しようとしている人、がんばれ!

Written on June 15, 2018