Hatena::ブログ(Diary)

七誌の開発日記(旧) このページをアンテナに追加 RSSフィード

新ブログ Twitter OneDrive Wiki

2010-04-10

[][]コンパイラを作ってみて

コンパイラ開発(id:n7shi:20090310)を通して物の見方がどう変わったかについて書いてみます。一般的な見解(と私が認識しているもの)、私の見解(過去・現在)などの視点が入り乱れるため、箇条書きを中心に記述します。何かを主張しようとしているわけではないので、特に結論のようなものはないことを、あらかじめ断っておきます。

【追記】私が作成したコンパイラSilverlight上で動作確認できます。 ⇒ id:n7shi:20090727

アセンブラ

アセンブラをいじることに対する一般的な見解(と私が認識しているもの)

  1. コンピュータの動作についてよりよく理解するため。
  2. カリカリにチューニングするため。

これらに対して以下のような意見があります。

これはその通りなのですが、だからどうするかとなると、二極化するように思われます。

  1. レイヤブラックボックスとして扱って、高級言語のノウハウに注力するべき。
  2. CPUごとの特性を調べて、最適なパフォーマンスが得られるようにするべき。
過去の自分の見解
現在の自分の見解
  • レイヤを厳密に切り分けないで、必要に応じて降りていける程度のノウハウはあった方が良い。
  • アセンブラが露出してしまうケースは依然として存在する。完全に隠蔽するのは無理ではないか。

アセンブラのノウハウ 1

ノウハウだけでは抽象的過ぎるので、もう少し詳しく説明します。

たとえば高級言語で開発していてどうしても期待通りの動きをしないときに、それがアルゴリズムというような大域的な問題ではなく、局所的な言語仕様の理解不足が原因だということがあります。言語仕様から探そうとしても具体例として演繹する必要があるため、かなり苦労します。

こういうときに該当箇所のアセンブリを出力するのも、解決の糸口を探る方法の一つとして使えます。もちろんそれで全部が解決するわけではありません。あくまで一つの方法です。これはある種のカンニングだと言えます。

ただし『ある程度のノウハウ』がないと、そもそも出力されたアセンブリを解読することができません。具体的には後述します。

インタプリタ言語ではそもそもアセンブリに出力できないため、この方法は使えません。インタプリタについては後述します。

過去の自分の見解
  • 高級言語では不可能なチューニングをするためのもの。
  • そこまでの高速動作を要求するような開発はしないので、自分には関係ない。
現在の自分の見解
  • 言語の実装をカンニングするためのもの。
  • 楽をするためのノウハウ。

インタプリタ

インタプリタ言語を調査しようとしてもアセンブリに落とせないため、インタプリタの実装を読むことになります。その際に以下の壁があります。

この関係に着目すれば、以下のように解釈できます。

関係として相似でも、アセンブリ排除という視点を入れると、見方が複雑になります。

【注】話を単純化するため、アセンブリで実装された昔のBASICのような言語や、JITネイティブコードとして実行される言語は除外しています。JITは単純なインタプリタよりも更に読むのが難しいです。

過去の自分の見解
現在の自分の見解

アセンブラのノウハウ 2

コンパイラの出力するアセンブリを読むために必要な『ある程度のノウハウ』について書きます。これは現在の私の考え方です。コンパイラを書く前には考えたことがありませんでしたし、一般論(こうすればコンパイラの出力したアセンブリが読めます、等)としても見たことがありません。

まず、アセンブラの用途については以下のような見解が一般的だと思います。

それに対して、私がここで取り上げようとしているものは異なります。

まとめると以下のようになります。

これが自分でコンパイラを作ったり、コンパイラの出力するアセンブリを読んだりするのに最低限必要なノウハウです。コンパイラを作って初めてこういうアセンブリとの接し方があるということに気付きましたが、実際に役に立っているかどうかは自分でもよく分かりません。

2008-01-18

[]Scratch

子どもたちがOSS活動、プログラミング言語「Scratch」が開く未来

本当の意味でコンピュータリテラシーがあるというのは、つまりプログラミングができるということだ――。“パーソナル・コンピュータ”という概念の生みの親で、先進的なプログラミング言語Smalltalk」やGUIというインターフェイスの開発者としても知られるコンピュータ科学者アラン・ケイ博士は、そう言い切る。コンピュータに囲まれて育ったわれわれの子どもたちは、コンピュータリテラシーを持つ初めての世代になるだろう、と。

非常に共感します。これと対極で「プログラミングが必要なのは環境が整備されていないから。整備されればユーザーは開発などせず、既製品を道具として使うだけ。」という意見がありますが、閉塞感を感じます。

上記の記事ではScratchというビジュアル言語が紹介されていますが、この方向性にも共感します。最終的には教育に行き着くということもよく分かります。自分が何かやるときも、初心者への分かり易さという視点は忘れないよう心掛けています。初心者に分かり易いものは、自分にも、上級者にも分かり易いからです。

究極的には、プログラミング自然言語による対話の形式を取ると考えています。プログラミングに限らず、検索や作文などもそうなるでしょう。そこまで行き着いてようやく万人向けと言えます。そのためには人工知能が必要です。可能であればそれを自分の手で切り開いてみたいものです。