技術

1.1. まえがき

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第1章 万華鏡: まえがきと字句解析器
第1節 まえがき

“LLVMによるプログラミング言語の実装”のチュートリアルへようこそ。
このチュートリアルでは、”どのくらい楽しく、どのくらい簡単に出来るかを示すための”簡単なプログラミング言語の実装についてざっと説明する。
このチュートリアルは、他の言語を拡張出来るようフレームワークを構築したい方に対してもよい手助けとなるだろう。
このチュートリアルで出てくるコードは、他のLLVM特有の何かをハックするための遊び場としても使うことが出来る。

このチュートリアルのゴールは、我々の言語(言語を段階的に創り上げていく方法を説明するための言語)について少しずつ説明していく事である。
これによって、極めて幅広い言語デザインそしてLLVM特有の使い方について(大量の細かい情報であなたを圧倒する事なく、道筋に沿って)我々が説明する事を可能にする。

このチュートリアルは、現代的かつまともなソフトウェアエンジニアリング原則について教える事ではなく、コンパイラテクニックそして特にLLVMについて手っ取り早く知るのに有用である。
これは、演習では多くの手抜きを経て説明を単純化するであろう事を意味する。
例えば、コードはメモリリークを起こしたり、いろんな場所でグローバル変数を使ってたり、Visitorsパターン等のような良いデザインパターンを使ってなかったりするかもしれないが、しかしそのおかげでコードはかなり単純になる。
もしコードを深く研究したり、将来のプロジェクトの土台として使う場合、上記のような足りない部分を修正するのは難しくはないだろう。

すでに知ってたり興味がない部分を飛ばせるよう各章の簡単な説明をここに記してみる。
このチュートリアルの構造は以下のとおり。

  • 第1章: プログラミング言語”万華鏡”の紹介と、”万華鏡”の字句解析器の定義。
    ここで、我々が欲しい基本的な機能と、それを実現するためにどこから手をつけるべきかについて示す。
    このチュートリアルを出来るだけ理解しやすく、またハックしやすくするために、字句解析器、構文解析器ジェネレータ等のツールを使わずに、全てをC++で実装している。
    LLVMはそのようなツールを使ってもちゃんと動作するので、もしそういうやり方が好みでも心配は要らない。
     
  • 第2章: 構文解析器とASTの実装。
    字句解析器と共に、構文解析のテクニックとASTの構築について説明する。
    ここでは、再帰下降構文解析(recursive descent parsing)と演算子優先順位構文解析(operator precedence parsing)について説明する。
    第1章と第2章ではLLVM特有の話ではないので、コードもこの時点ではLLVMとリンクしない。
     
  • 第3章: LLVM IRコードの生成。
    ASTからLLVM IRを生成する事が如何に簡単であるかについて示す。
     
  • 第4章: JITと最適化サポートの追加。
    多くの人がLLVMをJITとして使うことに興味を持っている。
    我々はJITについて説明し、JITサポートを追加するための3行をあなたに見せる。
    LLVMは他の用途でも便利ではあるが、これはそのパワーを示すシンプルでセクシーな方法である。
     
  • 第5章: 言語の拡張: 制御フロー
    ここまでで実装した言語について、if/then/elseやforループ等の制御フロー命令(control flow operations)によって言語を拡張する方法を説明する。
    これは我々に、単純なSSA構造と制御フローについて考えるきっかけを与える。
    訳注: SSA = 静的単一代入(Static Single Assignment)
     
  • 第6章: 言語の拡張: ユーザ定義演算子
    この章は、ユーザープログラムによって自由に定義される単項演算子と二項演算子(しかも優先順位割り当ても可能!)を使えるようにすることによって言語を拡張する方法について説明する章である。
    ばかげているが楽しい章である。
    これによってライブラリールーチンとして重要な”言語”の一部を構築する。
     
  • 第7章: 言語の拡張: 変更可能な変数(Mutable Variables)
    この章では、代入演算子と共に、ユーザー定義のローカル変数を追加することについて説明する。
    この章の面白い点は、LLVMでSSA形式を構築することが簡単で取るに足らないものであるというのが分かる点である。
    LLVMはSSA形式の最初から最後まで全部を必要としない。
     
  • 第8章: 結論およびLLVMの他の使い方
    この章では、言語を拡張するいろんな方法についてまとめ上げるが、特別なトピック(GCサポートの追加や、例外や、デバッグや、スパゲッティの山やその他諸々)についての情報へのリンクも含んでいる。
     

チュートリアルを通して、700行弱のコード(空行やコメントを含めない)を書くことになるだろう。
この小さいコードによって、それなりに使える言語のための、とても合理的なコンパイラー(JITコンパイラによるコード生成をサポートし、お手製の字句解析器や構文解析器やASTを含む)を創り上げる事になる。
他のシステムでは面白い”hello world”チュートリアルがあったりする中、私が思うに、このチュートリアルの大きさは、LLVMの力を引き出すための、そして言語やコンパイラ設計に興味があるあなたがなぜ熟考しなければならないのかについての、やたら長い契約書のようである。
( While other systems may have interesting “hello world” tutorials, I think the breadth of this tutorial is a great testament to the strengths of LLVM and why you should consider it if you’re interested in language or compiler design.)

Hello World”くらいのチュートリアルしか持たないシステムもある中、このチュートリアルの幅広さは、LLVMの強みや、プログラミング言語やコンパイラ設計に興味を持つ人がLLVMを検討すべき理由を、よく示していると思う。

このチュートリアルの注意点:
我々は、あなたが言語を拡張し、自分自身で色々改造して遊ぶ事を期待している。
コードを受け取り好きなようにめちゃくちゃにしよう。
コンパイラは物凄いモンスターである必要はない。
言語で楽しく遊べるようにするためのものである。

コメント

ありがとうございます。大変参考にさせて頂いています。
下記の訳ですが、多少意訳入ってますが、こんな感じではどうでしょうか?

“While other systems may have interesting “hello world” tutorials, I think the breadth of this tutorial is a great testament to the strengths of LLVM and why you should consider it if you’re interested in language or compiler design.”

vvvvv

“”Hello World”くらいのチュートリアルしか持たないシステムもある中、このチュートリアルの幅広さは、LLVMの強みや、プログラミング言語やコンパイラ設計に興味を持つ人がLLVMを検討すべき理由を、よく示していると思う。”

ありがとうございます!
意味が通っててとても分かりやすい訳だと思います。
本文に追記しました。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示