「Rubyで作る奇妙なプログラミング言語」
Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
posted with amazlet at 09.01.04
原 悠
毎日コミュニケーションズ
売り上げランキング: 1488
毎日コミュニケーションズ
売り上げランキング: 1488
Brainf*ckとかWhitespaceとかGrassとかの「奇怪語」(Esoteric Language)を紹介するとともに実装方法を解説する本。LL系カンファレンスの発表のように軽妙な感じで語られていくので、「Brainf*ck」「Yコンビネータ」といった言葉になじみがあれば、するすると読めて楽しい。
キモは「表現」「計算モデル」「実装」の3つに分けられそうだな、と思いながら読んでいたら、著者も2-1節で次のように書いていた。
まず、プログラミング言語というものは構文(syntax、シンタックス)と意味論(semantics、セマンティクス)からできている。
まあ、仕様が比較的簡単なEsoteric Languageに限ってしまえば、「『見た目』と『中身』を決めることが必要だ」と言い換えてしまってもいい。
というわけで、本書で解説された言語について、本書に書かれた範囲で「見た目」「中身」「実装」をまとめてみる。
| 言語 | 見た目 | 中身 | 実装 |
|---|---|---|---|
| HQ9+ | 4つの命令だけからなる | 「Hello, World」「Quine」「99 bottles of beer」「カウントのインクリメント」の各1命令のみ | それぞれの命令をメソッドとして実装 |
| Brainf*ck | 8つの命令だけからなる | チューリングマシンのようにデータをテープとして表現 |
|
| Ook! | Brainf*ckを「Ook」の文字で表現。オランウータンのための言語 | Brainf*ckに同じ | バナナは美味しいです |
| Whitespace | スペース、タブ、改行だけで表現 | スタック(+ヒープ)ベースで機械語相当の処理 |
|
| Starry(著者作) | 星空のように、空白の中に「+」「*」「.」などをちりばめる。各文字が命令の分類、その前の空白の数が命令の種類を示す | スタックベースで機械語相当の処理 | 中間言語に変換して実行 |
| Bolic(著者作) | Unicodeの記号文字からなる | 記号文字がAlgol系の構文語に対応する | 再帰下降型パーサ |
| Befunge | ソースを読む方向が上下左右に変化 | スタックベース | ? |
| Wierd | 「*」を2次元に並べて、線の角度で命令を表現 | 簡単な5命令のみ | ? |
| Shakespeare | シェークスピア劇の戯曲として表現 | ? | ? |
| Chef | 料理のレシピとして表現 | ? | ? |
| Unlambda | 1文字に関数が対応 | すべてs/k/iコンビネータで表現 | ? |
| Grass | 「W」「w」「v」のみで表現 | スタックベースのλ計算 | ? |
| False | 1キロバイトでコンパイラが書ける | スタックベース。無名関数やインラインアセンブラもあり | ? |
| NULL | 1つの整数で1つのプログラム。素数に対応する命令を掛けた値 | キューベース | 実装は困難 |
| AAAAAAAAAAAAAA!!!! | 「A」「AA」「AAA」「AAAA」で表現 | 前置記法 | ? |
| INTERCAL | 一見普通、驚き最大の原則 | ? | ? |
| Malbolge | 悪魔のような読みづらさ | 数値は3進数、命令はメモリ上の値にアドレス値を足して94で割った余り | Hello, Worldが書かれるのに2年かかった |
| KEMURI | 「|」と、上につく記号(「^」「'」など)のみで表現 | スタックベース。スタックに積める値は「Hello, World!」のみ | ? |
| Taxi | タクシーの行動を説明する英文 | データドリブン。データがタクシーのように土地(命令)に立ち寄る。給油も必要 | ? |
コメント
コメントの投稿
トラックバック
http://emasaka.blog65.fc2.com/tb.php/528-859ce4ec

