Edited at

【個人的雑記】Pxemのインタプリタを作りたいが設計に困っている

2018/12/22追記:ついにオリジナルインタプリタが再公開された。

2018/09/07追記:wktk氏がRubyで開発したPxemのインタプリタ「rpxem」が完成品として既にこの世に出回っていたことが判明したのでこの記事にそのレポジトリを追記する。wktk氏に多大な敬意を持ちたい。


この記事では、Pxemという、ぬこ氏考案のプログラミング言語のインタプリタの再作成について、筆者が設計に困っていることを個人的に羅列したものである。

なお、この記事は正直、「プログラミングに関する知識を記録・共有するためのサービス」を目指しているこのサイトに合わない気がする。「それならば下書き保存機能を使うべき」などと閲覧者様はおっしゃるかもしれないが、この悩みを一人で抱え込むのはどうかと思い、また、Pxemという失われそうな難解プログラミング言語の存在を知ってもらおうと思い、皆様のご覧の通り、ここに公開している。


Pxemとは何か?


要するに


  1. 2008年にぬこ氏によって作られたプログラミング言語

  2. タイトルもソースコードとして解釈されるため、ゼロバイトのファイル、すなわちファイル名だけでも、プログラミングが可能

  3. しかし作者様のサイトがダウンしているため、インタプリタの入手が恐らく不可能


Pxemのインタプリタ作成の動機

Wikipediaで偶然その記事を見つけた。しかしその記事は削除されるかもしれないと思い、しかも公式サイトがダウンしている為、そのプログラム言語が忘れ去られようとしている。

このままではせっかく素晴らしいアイデアが台無しになると思い、誠に勝手ながらではあるが、私がPxemにもう一度スポットライトを当てようと思い、作成することにした。

尚、実は志を持つ先人様が作ろうと試みられていた。以下、彼らが作られたもののレポジトリを紹介する。

尚、これらはあくまでも筆者がGitHubにて見つけたものだけである。もしも他にソースコードが公開されているものがあるならコメント欄にてお教え願う。


GitHubで見つけた、先人様によるインタプリタのレポジトリ


何が問題なのか?

Pxemのインタプリタは、先述の通り、本家様のサイトがダウンしているため本家様が作られたインタプリタが入手できない。そこで言語仕様を上記の「Pxemとは何か?」節での本家様のPxemの解説ページのアーカイブで閲覧しながら、また当ページに記載されていない、詳しい仕様を推測しながら作ろうとしている。このため、以下の点が気になる。


知名度の低さ

筆者は「Esolang」という、難解プログラミング言語のウィキのチャットサーバーにおいて、「Pxem知ってる?」とか「この点で作るのに困っているんだけど」とかとコミュニティの人達に質問したり相談したことがある。しかし、いつでも答えは「聞いたことがない」。中でもショックだったのは「ググっても出なかったぞ」という返事だった。この節での記述内容は設計とは関係ないが。


大文字と小文字の区別

Pxemでは、命令は全て

.<何か一文字>

となっている。このアーカイブされた説明ページにおいて、「コード例」という節があるが、その中のfizzbuzzプログラムの例で、


ak.-akbuzz.-ak4.-akfizz.-ak2.-1.p05.-.tab.z01.-.c.m.+.c.t05.-.%.w.s01.-.m03.-.%.W.s.m.nak.-.p00.-.c.c.c.a.wak.-fizz.p00.-.c.c.a.a.w01.-.m03.-.%.w.sak.-buzz.p00.-.c.c.a.wak.-fizzbuzz.p00.-.c.a.a.md2.-02.-.!.a.d.pxe


と紹介されていたが、この中に「.W」という文字列が含まれている。しかし、「.w」に命令はあるが、「.W」にはない。

もしかして、本家様は命令において、大文字と小文字の区別をされなかったのだろうか?


.aと.w、.x、.y、.zの規則

.w、.x、.y、.zはそれぞれ特定の条件を満たした場合、.aの次のところからコードを読み続け、そうでなければ.w、.x、.y、.z以降.a以前の内容を処理する。

.aは対応する.w、.x、.y、.zに戻る。

要するにwhile文を構成するコマンド群である。

一応気にすることではないが、.wと.xと.yと.zの数の和は.aの数に等しくならないといけないという規則を設けるべきだろうか?

例えば、以下はもしも上記の規則がなかった場合(代わりに「.aは.wなどの後ならいくつあっても構わない」)に作成することが許容されるコードの例である。


A.i.xsmaller_than_letter_A.pA.i.anot_as_smaller_than_letter_A.pA.i.a.pxe


これは「標準入力で文字を一つ入力し、それが文字Aの文字コードより小さければ"smaller_than_letter_A"と、そうでなければ"not_as_smaller_than_letter_A"と標準出力し、以下これを繰り返すだけ」のプログラムである。

すなわち、もしも規則が無ければif〜else文が作成できると思われる。

でも、おそらく上記の規則があっても書ける気がする。いや、書けることが分かった。

以下、もしも上記の規則があった場合の、上記のプログラムと全く同じ挙動をするプログラムである。


.xA.i.xsmaller_than_letter_A.pA.i.anot_smaller_than_letter_A.p.1.a.pxe


「規則を設けるべきか」と前述したが、結局、「規則を設けるべき」という結論を自ら導いた。案外上手く行くようだ。


出力に関する問題

出力に関するコマンド群は以下の3つである。


  • .p:スタックの中身を文字列として、一つずつポップしながら出力する。

  • .o:スタックを一回ポップし、ポップされたデータの内容を文字として出力する。

  • .n:スタックを一回ポップし、ポップされたデータの内容を数値として出力する。

問題は、改行についてである。これらを一度実行するたびに改行文字を出力するべきなのか、プログラムが終わるときにのみ改行文字を出力すべきか、.pを実行するときだけに改行文字を出力すべきか、はたまた改行は一切しないべきか。

とりあえず、現段階では筆者は「これらを一度実行するたびに改行文字を出力する」ことにしている。


閲覧者様へのご挨拶

この記事の閲覧に感謝する。


追記


  • 2018/09/04


    • 「.aと.w、.x、.y、.zの規則」の節における2つのプログラムのコードが僅かに間違っていたので修正



  • 2018/09/07