本を読む

読書やコンピュータなどに関するメモ

「Rubyで作る奇妙なプログラミング言語」

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ
売り上げランキング: 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つの命令だけからなる チューリングマシンのようにデータをテープとして表現
  • 1文字が1トークン
  • 「[」「]」は対応する位置をあらかじめハッシュで持っておく
  • Rubyへのトランスレータもあり
Ook! Brainf*ckを「Ook」の文字で表現。オランウータンのための言語 Brainf*ckに同じ バナナは美味しいです
Whitespace スペース、タブ、改行だけで表現 スタック(+ヒープ)ベースで機械語相当の処理
  • 中間言語に変換して実行
  • StringScanner
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

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad