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

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

インタプリタを作る(3)電卓は入力された「534」からどうやって534という数値を求めているのか

 ぼくたちは「534」を見るとすぐ「五百三十四」のことだと理解できます。一瞬で「3桁だから先頭の5は100の位で……」と分かるわけです。しかしコンピュータには、先頭から順に読んで「5」「3」「4」と並んでいるようにしか見えません。534と思わせるには
5を読む→10倍して50にする→3を加えて53にする→10倍して530にする→4を加えて534にする
とでもやるしかありません(5→50→53→530→534)。
 電卓では式を順にキーで押し、Excelなどの表計算ソフトでは「534*123」(*はかけ算の記号)などと(ワープロみたいに)入力すればその場で計算して「65682」と表示されます。Googleで「534*123」を検索しても同じです。想像ですがどちらも多分、ここに書いたような方法で「5」「3」「4」を534と解釈しているのだと思います。Excelは「534」の次の「*」を読むと、「お、かけ算ですね」と解釈。そして次の123を(もちろん「1」「2」「3」を123と解釈して)さっきの534とかけ算して答えの65682を表示します。
 もっと複雑な式、456+897÷(534*123)ではさらに大変です。こういう計算はExcelはうまくやるけれど普通の電卓は「456+897÷」までキーを押した段階で「1353」を表示してしまいます。式の計算のルール通りに(×÷が先、+-は後。カッコが最優先)計算させるには何か工夫が必要だということです。式の構造を調べ、それに従って適切な順番で計算をするのです。プログラムを達者に書けても、テキストで与えられた式(「534*123」など)から、その式を計算させることはそれなりに難しいはずです。構文解析などの分野をきちんと勉強しなければなりません。この辺の話は前回書いたプログラミング言語インタプリタコンパイラ)作成や、形式的文法といった分野につながります。

 

 プログラミング言語を作る、ぼくは凄く面白い話だと思うんですが、どうも世間ではあまり話題になりません。プログラミング言語を使う話はあっても、作る話は少ないのです。ハードルが高い部分はあり、雑誌の記事でも滅多にありませんがだいぶ前『日系ソフトウェア2010年8号』に載っていました。

スクリプト言語をゼロから作ろう
・言語処理系の作成は難しくない!
・字句解析、仮想マシン、パーサーがわかれば作れる!
・コードを完全掲載、実装の中身を見てみよう

という内容。小さなシステムで分かりやすく、「おお、こうやって作るものなのか……」と感動しました。でも結局自分でそれなりの言語を作ったのは『明快入門 インタプリタ開発 基本技術から処理系の実装まで』(林晴比古2012ソフトバンククリエイティブ)を読んでからでした。

 自分で簡単な言語を作れるようになれば、前回の記事のようにシューティングゲームを書いているときに敵戦闘機の動きをその簡単な言語でコントロールすることも可能です。でもそれより何より、プログラミング言語を作ることはコンピュータの世界に1歩、深く踏み込むことです。プログラミング言語を作ること、これ自体ももちろんプログラミングですが、「全然違う」と言っておきましょう。勉強中はずっと「自分は新しい考え方に触れている」という実感がありました。コンピュータに関わる人には是非味わって欲しい気がします。