言語をつくるって、どういうこと?

よみもの+手を動かす時間:およそ25分

作る側に、まわる

コース1で、あなたはにわ語を使う側にいました。このコースでは、机の反対側に座りなおします。言語を作る側です。

「言語を作るなんて、特別な人の仕事では」と思うかもしれません。先に結論を言います。言語処理系の正体は、翻訳の手順を書いたプログラムです。プログラムが書けるなら、言語は作れます。そして書く手順は、これから12レッスンかけて、ひとつずつ手に入れます。

完成見本に、触れてみる

これから数レッスンかけて作る言語の、すこし先の姿がこれです。式を打ちかえて、下の3つの欄がどう変わるか観察してください。

① ことばの粒(トークン)
1+計算2*計算((10-計算4))
② 構造の木
  • たす +
    • 1
    • かける ×
      • 2
      • ひく −
        • 10
        • 4
③ 評価された値
13

数式を渡すと、答えを返す——電卓です。地味に見えますか。でもこの電卓は、Pythonの心臓部と同じ構造を持っています。電卓と本物のプログラミング言語のあいだに、原理のちがいはありません。あるのは語彙の量のちがいだけです。

3つの欄は、3つの工程

上の実験室の①②③は、飾りではありません。あらゆる言語処理系が踏む、3つの工程そのものです。

  1. 粒に分ける(字句解析) — 文字の列 1+2*3 を、1 + 2 * 3 という意味の粒(トークン)に切り分ける。日本語を読むとき、あなたが無意識に「言語/の/庭」と区切るのと同じ仕事
  2. 木にする(構文解析) — 粒の並びから、文の構造を組み立てる。コース1のレッスン6で見た、あの木
  3. 意味にする(評価) — 木を根もとへ向かって畳んで、値にする

文字列 → 粒 → 木 → 値。この一本道が、見取り図のすべてです。迷子になったら、いつでもここに戻ってきてください。

よりみち:コンパイラとインタプリタ

木まで作ったあと、その場で意味にするのが「インタプリタ」、別の言語(たとえば機械語)に書き出しておくのが「コンパイラ」です。前半の工程は同じ。このコースで作るのはインタプリタですが、あなたはコンパイラの前半分も同時に学んでいることになります。

壊して、工程を見分ける

どの工程で困ったかによって、エラーの出方が変わります。実験です。上の実験室に、次の3つを順に打ちこんでください。

  1. 1 ? 2 — ①の工程が困ります。「?」という粒を知らない
  2. 1 + + 2 — ②の工程が困ります。粒は全部知っているのに、木が組めない
  3. 1 / 0 — ③の工程が困ります。木はできたのに、意味にできない

コース1で「エラーは返事」と学びました。作る側から見ると、もう一歩踏みこめます。エラーとは、どの工程のどこで困ったかの報告です。そして数レッスン後には、その報告文を書くのはあなたになります。

演習:工程あてクイズ

次の入力は、それぞれ①②③のどの工程を困らせるでしょう。予想してから、実験室で確かめてください。 (あ)(1 + 2 (い)1 @ 2 (う)(10 - 10) / (5 - 5)

ヒント1(考え方)

①が困るのは「知らない文字」。②が困るのは「並び方」。③が困るのは「計算の実行中」です。

こたえ

(あ)②——粒はぜんぶ読めるが、閉じかっこが来ないので木が組めない。(い)①——「@」という粒を知らない。(う)③——木は組める。畳んでいくと 0 ÷ 0 になった瞬間、意味にできなくなる。

(う)を②と答えた人へ:かっこの中が0になるかどうかは、計算してみるまで分かりません。だから構文解析では見抜けないのです。これはとても良いまちがいです。

このレッスンで分かったこと

  • 言語処理系の正体は、翻訳の手順を書いたプログラム
  • 工程は3つ:粒に分ける → 木にする → 意味にする
  • 電卓と本物の言語のちがいは、原理ではなく語彙の量
  • エラーは「どの工程のどこで困ったか」の報告