いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

インタプリタを作る(5)雑談

 最近数学のテーマが続いたので休憩です。ここのところ、インタプリタ作成に勤しんでいます。Pythonをそのまま使っているので、できあがったインタプリタ(新しい言語)は実行速度という点では期待できません。しかし、今や多くの人がPythonは使いますし、そのPythonで「インタプリタをどうやって作るのか」というのを記録しておくことは意味があると思います。それに、新しいコンピュータ言語を作ってそれがメジャーな言語になる!……というのは相当大変でしょうが、そんなこととは関係なく、言語の作成はとにかく知的な楽しい作業です。

 さて、できあがったインタプリタはもちろん例えば数式を処理できなければなりません。つまり、テキストとして「(y+45)×3-z×(2+v)」……★のように与えられた式を評価(値を求めること)できなければなりません。もちろんカッコは最優先、×と÷は+と-より優先、文字は変数です。長い式もあるし、どこにカッコがつくのかバリエーションは無限です。こうした式を扱うのに素晴らしい方法があります。まず、「式」などよく使う用語ですが、式とは何か、ここでは全く知らないものとして以下を読んでください。

因子(factor)とは数値変数(式)(←式をカッコでくくったもの)です。

項(term)とは因子因子×因子因子/因子です。

とは項+項項ー項です。

この3つのルールだけで先の★は組み立てられており、値を求めることができます。まず、★の先頭は括弧です。次のy+45は変数と数値の和ですから因子同士の和、つまり式です。カッコを閉じていますからそこまでで因子です。それに3をかけています。3は数値、すなわち因子ですから、(y+45)×3は因子同士の積、つまり項です。……という感じに、結局①、②、③を組み合わせるとどんな数式もその中に混ざっている変数と数値から計算できるのです。これが優れているのは実は①、②、③をそのままプログラミングしてしまえばそのまま数式の解析ルーチンができあがってしまうところです。「再帰的下向き構文解析」という方法なのだそうです。これだけの説明では分かりづらいかも。いいです、イメージで。今回は休憩、休憩! さらにy+45を求めたとして、それをどこかにしまっておかなければなりません。しかもそれを使うのは式の続きをずっと先まで計算してから、ということだってあるでしょう。どうしたらよいのでしょうか。

 こういう話を全く知らずに自分で言語を作るのは、この点だけを見ても相当厳しいと分かります。「がんばれば何とかなる」とかいうことではありません。初めてこの分野を勉強したときには「ああ、今、自分は新しい考え方に触れている!」と思ったものです……。

 コンピュータは大変な道具で、使えるというのは素晴らしいことなんですが、自分でソフトウェアを書くことはより積極的にコンピュータに関わることです。趣味としても是非強く勧めたいです。これだけ勉強になって遊べて、このコスパ!! ぼくはゲームはやりません。「時間がもったいない」と思ってしまうんですね。3Dのシューティングゲームを書いて公開していたことがありますが、頭もエネルギーも時間も使って、こちらはよい経験だったと思います。どうせやるなら作った方が……という気がします。ビットコインも面白そう。勉強しなければならないことは無数にあります。