見出し画像

Retro-gaming and so on

Lispはないないづくし

急に書きたくなったので書く。

Lispは実用性が無いだけでなくって、フツーのプログラミング言語に当たるリテラルも無い。
と言う事は、Lispをparseする際に、フツーのプログラミング言語における「字句解析」の対象がない、と言う事だ。そう、Lispにはそういう意味でいうとまさしくデータ型しかない。データ型だらけである(※1)。「データ型を組み合わせてプログラムしていくプログラミング言語」、それがLispなのである。
もっと恐ろしい事に、Lispにはフツーのプログラミング言語における「構文」も存在しない。つまり、文法的なモノさえ存在しないのである。
反面、Lispには抽象構文木が存在する。そう、プログラミング言語的な意味で言うと「構文」がなくって抽象構文木が存在する、ってヘンじゃね?とか思うかもしれないけど、事実上そうなのだ。
ここで抽象構文木が何か知らない人の為にザックリ説明してみる。
インタプリタやコンパイラを実装する際、さっき書いた通り、フツー、プログラムが書かれたテキストを「字句解析」したあと「構文解析」する。そしてそこでインタプリタなりコンパイラなりが作り出すデータ構造を「抽象構文木」(※2)と呼ぶ。
ところが、Lispの場合、フツーのプログラミング言語で言う場合での「字句解析」が存在しない、そして「構文」が存在しない。
と言う事はどういう事なのか、と言うと、Lispと言うのはこのテのインタプリタやコンパイラが「内部的に最初にやる事」を全部すっ飛ばして、ユーザーに

「直接抽象構文木を弄ってプログラミングしませんか?」

と問いかける割とホラーなプログラミング言語なのである(笑)。
あの、例えば美女がプログラミング言語だとすれば、Lispは、いきなり、

「ワタシの内蔵を直接触りませんか?」

とか言いながら自ら腹かっさばいて迫ってくるホラーな女なのである(笑)。

詳しい話とすれば、例えばこのページではC言語で実装する簡単なプログラミング言語の作り方が解説されている。
ところが、どんな言語でもアタマから一々キチンとやっていかないといけないけど、Lispの場合は、そのページで言うとアタマ3節くらいいきなりすっ飛ばして、ユーザーに「BNFと構文木」の節の構文木をいきなり書かせようとする。 
言い換えると、通常プログラミング言語は、上から処理していって、字句解析と構文解析を終わらせた時点で抽象構文木を作り出す。そのページで言うとこういう「木」だよな。


ところが、Lispはこういう手順を踏まない。いきなりプログラマに抽象構文木を書き下してプログラミングせよ、と要求する。
つまり、上の図の構文木の例だとこれだ。

(- (+ 12 3) 4)

もうちょっと抽象構文木っぽく表現すればこうなるだろう(無駄だが)。

(-
 (+ 
  12
  3)
 4)

上の図を左右反転させて縦と横を交換してるだけ、に見えるだろう。
いずれにせよ。
そう、これがLispの抽象構文木、いわゆるS式(※3)である。
前置記法が「構文だ」と思われてて、嫌われているが、実際のトコ、インタプリタやコンパイラの前段階の色々をすっ飛ばして、

「データ型を用いて抽象構文木と言うデータ構造」

を直接書き込ませている。
そして二分木等、木(ツリー構造)を表現するのにはリストが向いている。
そう、Lispのリストに密着した表現は構文と言うよりも構文木を表現する為に用いられてる、と言って良い。

何故にLispはこんなに恥ずかしげもなく中身を曝け出したような構造になってるのか。
それは、元々、Lispはアセンブリないしは機械語の代わりとなるようにデザインされた言語だからだ(※4)。
だから他のプログラミング言語のような「字句解析」や「構文解析」を要求しないのだ。
発想は低レベル言語に近く、やってる中身は超高級言語。それがLispなのである。
言い換えると、Lispが人気がない一つの理由は、こうやってプログラマに直接抽象構文木を入力するように要求する、つまり低レベルな事を要求し、アセンブリを直接コーディングするような気色悪さをプログラマに感じさせるからなのかもしれない。

※1: ここで、例えばフツーのプログラミング言語に於けるリテラル、例えば条件文を構成する"if"と言う字面がLisp内だと何になるのか、と言うと、こういうのをLispではシンボルと呼ぶ。ただ、これは内部的にはシンボル型、と言うデータ型である、と考えて良い。
※2: 英名でそのままAbstruct Syntax Treeと言い、略称でAST等と呼んだりする。
※3: S式。Symbolic Expressionが語源。シンボルで構成された式、である。
※4: これは事実。実際Lispは論文として発表され、その意図は「読みやすい機械語の代替とは?」だった。
つまり、言い換えると、Lispは元々、「コンパイルされ吐き出される対象」だったのである。従って、内部表現的なモノに留まっている。
と言う事は、別のプログラミング言語からLispにコンパイルされる事を元々意図してたのか?と問われると「全くその通り」としか言いようがない。
しかし、論文によるLispの発表者、ジョン・マッカーシー博士は「言語デザイナーになる」事には全く興味がなかったみたいで(笑)、上に被せるプログラミング言語を「M式」と表現して、実際それがどんなモンだったかは具体的には何も言及していない(文書的には例えばcar[1; NIL]の様に表現してるが、仕様がどうなのかはサッパリ分からん、と言う事)。
Lispを実際にはじめて実装したのはマッカーシー博士の弟子(笑)、スティーブ・ラッセルで、実はこの人、「世界ではじめてビデオゲームを作った人」である。この人が作ってMITで展示してた「スペースウォー!」を見て、ビックリして商用テレビゲームを作った人がアタリの創業者ノラン・ブッシュネルで、ここにアップルの創業者スティーブ・ジョブスが勤めていて・・・と言う流れが出来るのである。
いずれにせよ、スティーブ・ラッセルも「Lispの上に何か言語を作ろう」よりも「直接構文木を弄る方が楽しいや」ってぇんで何も言語をデザインしようとは思わなかった。と言うわけで、「裸のLisp」を愛用する人がMITを中心に増えていくのである。
なお、後にLispマシンと言う「ハードウェア丸ごとLisp」と言う機械が開発され、一部の好事家用のニッチなCGマシンとして使われるが(プレイステーションのファイナル・ファンタジーVIIのグラフィックスはこれで作られている)、ここに搭載されたC言語なんかは、まさしくM式になってたようで、そこのC言語はLispにコンパイルされる運命になってた模様だ。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事