秘められたところでわたしは造られ
深い地の底で織りなされた。
あなたには、わたしの骨も隠されてはいない。
胎児であったわたしをあなたの目は見ておられた。
わたしの日々はあなたの書にすべて記されている
まだその一日も造られないうちから。
- 詩編 139編 15-16節(新共同訳)
2022年8月、みなさんおなじみGitHubに「神のプログラミング言語」が公開されました。それがこちら、Genesis (創世記)です。† HOLLY LICENSE † のもとに公開されています。
Genesisはチューリング完全な手続き型言語であり、インタプリタ上で実行されます。その最大の特徴は古ヘブライ語で記述されるということです。
予約語
命令・構文 | キーワード |
---|---|
𐤄𐤃𐤐𐤎 | |
Print Line | 𐤄𐤃𐤐𐤎𐤇 |
変数の宣言・初期化 | 𐤄𐤂𐤃𐤓 |
関数宣言 | 𐤐𐤅𐤍𐤒𐤑𐤉𐤄 |
If | 𐤀𐤌 |
Then | 𐤀𐤆 |
While | 𐤁𐤏𐤅𐤃 |
For | 𐤏𐤁𐤅𐤓 |
For Each | 𐤏𐤁𐤅𐤓𐤊𐤋 |
Sleep | 𐤉𐤔𐤍 |
「聖別」 | 𐤒-𐤃-𐤔 |
最後に出てくる聖別とかいう違和感しかないワードですが、これはループや関数などのスコープを閉じるのに用いられるようです。
演算子
完全なリストはREADME.mdに書いてありますが、算術演算子・比較演算子・論理演算子・代入演算子などオーソドックスなものが定義されています。ただしヘブライ語は右から左に記述される都合上、ほとんどの演算子は右結合となっています。
データ型
データ型も整数・実数・ブーリアン・文字列などおなじみのものが取り揃えられていますが、数の表記法はゲマトリアと呼ばれる独特なものとなっています。この表記法はSamaria Ostracaおよび死海文書 4Q252に依ります。
まず以下の文字と数の対応が存在しています。
数 | 対応するヘブライ文字 | Genesisにおける表記 |
---|---|---|
1 | Alep | 𐤀 |
2 | Bet | 𐤁 |
3 | Gimel | 𐤂 |
4 | Dalet | 𐤃 |
5 | He | 𐤄 |
6 | Waw | 𐤅 |
7 | Zayin | 𐤆 |
8 | Het | 𐤇 |
9 | Tet | 𐤈 |
10 | Yod | 𐤉 |
20 | Kaf | 𐤊 |
30 | Lamed | 𐤋 |
40 | Mem | 𐤌 |
50 | Nun | 𐤍 |
60 | Samek | 𐤎 |
70 | Ayin | 𐤏 |
80 | Pe | 𐤐 |
90 | Sade | 𐤑 |
100 | Qop | 𐤒 |
200 | Res | 𐤓 |
300 | Sin | 𐤔 |
400 | Taw | 𐤕 |
1-999までの数はこれらの文字を並べ、その総和によってあらわします。また、その際には最後の文字(左端の文字)の前(右側)に ״
(U+05F4, ダブルクォーテーションではありません)を挿入します。また、1000-999999までの数を表記するときは上の表における1-9, 10-90, 100-400を表す文字を、それぞれ1000-9000,10000-90000, 100000-400000を表す文字として使うようです。ちょっとこの辺はあんまり自信ない
また、数字が一文字だけの時は後ろ(左側)に ׳
(U+05F3)を挿入します。例として、100は 𐤒׳
となります。
制御フロー
主を尋ね求めよ、見いだしうるときに。 呼び求めよ、近くにいますうちに。
- イザヤ書55章6節(新共同訳)
Genesisではループ構文も使えます。以下がフィボナッチ数列の最初の10項をプリントするプログラムになります。
See the Pen Genesis Loop Sumple by reika727 (@reika727) on CodePen.
このコードの現代語訳は以下のようになります。
See the Pen Genesis Loop Sumple Translated by reika727 (@reika727) on CodePen.
関数
わたしはある。わたしはあるという者だ
- 出エジプト記 3章14節(新共同訳)
Genesisによる関数は全て引数無し、返り値なしです。再帰呼び出しは少なくとも文法上は可能ではありますが、しかし傲慢と利己による取り返しのつかない危険を退けるため、再帰から抜け出す方法は一切ありません。
この設計は、ピーター・ドイチュも指摘したように、「再帰というものは神聖不可侵なものであって、人間のプログラマに扱えるものではない。このことは神が自らを再帰的に認識していることからも明らかである」という主張に依ります。
以下は体重70キログラムの人間が1メートル離れた290グラムの欽定訳聖書から受ける重力を計算するプログラムです。
See the Pen Genesis Subroutine Sample by reika727 (@reika727) on CodePen.
このコードの現代語訳はこのようになります。
See the Pen Genesis Subroutine Sumple Translated by reika727 (@reika727) on CodePen.
データ構造
固定長の型なし配列が使えます。配列の初期化には波括弧 {}
を使い、要素へのアクセスには角括弧 []
を使うシンプルなものです。
ライブラリ
平方根、三角関数、指数対数など基本的な算術関数がそなわっていますが、特筆すべきなのが 𐤁𐤓𐤀
関数です。聖書からランダムに引用を返します。
FAQ
Q. なんで現代ヘブライ語じゃないの?
A. あなたがこの言語でプログラミングできるなら、私はすでに失敗していることになるからです。(If you are able to program in this language, I have failed.)
この質問↑についてはちょっと返答の意味が分かりかねました...
Q. なんでインタプリタ言語(Java)1の上でインタプリタ言語を動かしてるの?
A.このようなわけで、一人の人によって罪が世に入り、罪によって死が入り込んだように、死はすべての人に及んだのです。すべての人が罪を犯したからです。
- ローマの信徒への手紙 5章12節(新共同訳)
傑作なのが次の質問です。
Q. なんでオブジェクト指向にしなかったの?
A. この提案には大いに驚かされました。Genesisが将来的にオブジェクト指向になることは決してありません、なぜなら聖書は明確に偶像崇拝(object worship)を禁じているからです。偶像を形づくる者は皆、無力で彼らが慕うものも役に立たない。彼ら自身が証人だ。見ることも、知ることもなく、恥を受ける。
無力な神を造り役に立たない偶像を鋳る者はすべて
その仲間と共に恥を受ける。職人も皆、人間にすぎず皆集まって立ち、恐れ、恥を受ける。
鉄工は金槌と炭火を使って仕事をする。槌でたたいて形を造り、強い腕を振るって働くが飢えれば力も減り、水を飲まなければ疲れる。
木工は寸法を計り、石筆で図を描きのみで削り、コンパスで図を描き人の形に似せ、人間の美しさに似せて作り神殿に置く。
彼は林の中で力を尽くし樅を切り、柏や樫の木を選びまた、樅の木を植え、雨が育てるのを待つ。
木は薪になるもの。人はその一部を取って体を温め一部を燃やしてパンを焼きその木で神を造ってそれにひれ伏し木像に仕立ててそれを拝むのか。
また、木材の半分を燃やして火にし肉を食べようとしてその半分の上であぶり食べ飽きて身が温まると「ああ、温かい、炎が見える」などと言う。
残りの木で神を、自分のための偶像を造りひれ伏して拝み、祈って言う。「お救いください、あなたはわたしの神」と。
彼らは悟ることもなく、理解することもない。目はふさがれていて見えず心もふさがれていて、目覚めることはない。
反省することもなく、知識も英知もなく「わたしは半分を燃やして火にしその炭火でパンを焼き、肉をあぶって食べた。残りの木で忌むべきものを造ったり木の切れ端を拝んだりできようか」とは言わない。
- イザヤ書 44章9-19節(新共同訳)
所感
ヘブライ語は右から左に書かれるので、日本語に混ぜて入力するのはなんかすごい大変でした。イスラエルで販売されているパソコンのキーボードってどうなってるんでしょうか?
-
Javaがインタプリタ言語かどうかは微妙なところですが。 ↩