言語をつくるって、どういうこと?
作る側に、まわる
コース1で、あなたはにわ語を使う側にいました。このコースでは、机の反対側に座りなおします。言語を作る側です。
「言語を作るなんて、特別な人の仕事では」と思うかもしれません。先に結論を言います。言語処理系の正体は、翻訳の手順を書いたプログラムです。プログラムが書けるなら、言語は作れます。そして書く手順は、これから12レッスンかけて、ひとつずつ手に入れます。
完成見本に、触れてみる
これから数レッスンかけて作る言語の、すこし先の姿がこれです。式を打ちかえて、下の3つの欄がどう変わるか観察してください。
- 式たす +
- 数1
- 式かける ×
- 数2
- 式ひく −
- 数10
- 数4
数式を渡すと、答えを返す——電卓です。地味に見えますか。でもこの電卓は、Pythonの心臓部と同じ構造を持っています。電卓と本物のプログラミング言語のあいだに、原理のちがいはありません。あるのは語彙の量のちがいだけです。
3つの欄は、3つの工程
上の実験室の①②③は、飾りではありません。あらゆる言語処理系が踏む、3つの工程そのものです。
- 粒に分ける(字句解析) — 文字の列
1+2*3を、1+2*3という意味の粒(トークン)に切り分ける。日本語を読むとき、あなたが無意識に「言語/の/庭」と区切るのと同じ仕事 - 木にする(構文解析) — 粒の並びから、文の構造を組み立てる。コース1のレッスン6で見た、あの木
- 意味にする(評価) — 木を根もとへ向かって畳んで、値にする
文字列 → 粒 → 木 → 値。この一本道が、見取り図のすべてです。迷子になったら、いつでもここに戻ってきてください。
⟡ よりみち:コンパイラとインタプリタ
木まで作ったあと、その場で意味にするのが「インタプリタ」、別の言語(たとえば機械語)に書き出しておくのが「コンパイラ」です。前半の工程は同じ。このコースで作るのはインタプリタですが、あなたはコンパイラの前半分も同時に学んでいることになります。
壊して、工程を見分ける
どの工程で困ったかによって、エラーの出方が変わります。実験です。上の実験室に、次の3つを順に打ちこんでください。
1 ? 2— ①の工程が困ります。「?」という粒を知らない1 + + 2— ②の工程が困ります。粒は全部知っているのに、木が組めない1 / 0— ③の工程が困ります。木はできたのに、意味にできない
コース1で「エラーは返事」と学びました。作る側から見ると、もう一歩踏みこめます。エラーとは、どの工程のどこで困ったかの報告です。そして数レッスン後には、その報告文を書くのはあなたになります。
✎ 演習:工程あてクイズ
次の入力は、それぞれ①②③のどの工程を困らせるでしょう。予想してから、実験室で確かめてください。
(あ)(1 + 2 (い)1 @ 2 (う)(10 - 10) / (5 - 5)
ヒント1(考え方)
①が困るのは「知らない文字」。②が困るのは「並び方」。③が困るのは「計算の実行中」です。
こたえ
(あ)②——粒はぜんぶ読めるが、閉じかっこが来ないので木が組めない。(い)①——「@」という粒を知らない。(う)③——木は組める。畳んでいくと 0 ÷ 0 になった瞬間、意味にできなくなる。
(う)を②と答えた人へ:かっこの中が0になるかどうかは、計算してみるまで分かりません。だから構文解析では見抜けないのです。これはとても良いまちがいです。
このレッスンで分かったこと
- 言語処理系の正体は、翻訳の手順を書いたプログラム
- 工程は3つ:粒に分ける → 木にする → 意味にする
- 電卓と本物の言語のちがいは、原理ではなく語彙の量
- エラーは「どの工程のどこで困ったか」の報告