雑記
昔、まだ別のHNを使っていたころにPxemとかいうプログラミング言語を作った。
10年前らしい。これだけでいろいろとダメージを受ける。10年前よりなんかもういろいろと悪化してる気がするけどこれはそういう話じゃない。
今朝、寝ぼけ眼でGmailを開くと1通のメールが来ていた。曰く、熱心なPxemファンらしい。C++でインタプリタ書いてGitHubで公開までしてるとのこと。
Pxemて。2016年ごろにはてな匿名ダイアリーでほんのり話題になったのを複雑な気持ちで見送ってからというもの、記憶から抜けていた。
いや、実際のところは時たま思い出して「あの頃はアレだった」って感傷に浸っていた程度だった。
まあそういうメールが来たから改めてグーグル先生でエゴサーチ(使い方あってるんか知らんが)したところ、Qiitaに2件投稿があった。びっくり。ようやく時代が僕に追いついたか。
この二つ、どうやらメールくれた人の記事っぽい。
そういえば2012年にもRubyでPxemインタプリタ書いてくれた勇者もいた。ぶっちゃけ、この人ぼくよりPxemについて研究してたんちゃうかって気すらする。
あとなんか海外のフォーラムっぽいとこにも投稿があったり、久しぶりに検索してみてふるえてる。難解言語Wikiにも英語で記事作られたりしててマジでふるえてる。
GitHubにも別のインタプリタっぽいのがあった。なんかむしろ僕が時代に取り残されてる気すらする。
個人的にはPxemはBrainF*ckとHQ9+の間にできたわが子という感じだ。
HQ9+並にへろわが簡単で、BF並にプログラミングの過程がパズルっぽい言語。
開発裏話をするか。
ちょっと痛いけど10年前だからもう時効だろう。そういうことにしておいてください。
当時の僕は、anarchy golfとかいうプログラミングコードの短さを競う遊び場でPerlとかPHPとかBFとか使ってイキってたんだけど、ゴルフ場経営者のshinhさんが「ゴルフ用言語導入するわ」ってGolf Script(GS)を利用可能にした。
たぶんRubyっぽい感じの言語だとは思うけど、この言語がゴルフ用にチューニングされてて強いのと、オレオレ言語をゴルフ場にぶち込むとか野球でいえばピッチャーマウンドにピッチングマシン据え置くようなもんじゃねえかと思って憤慨(全然してなかったけど)したわけです。
じゃあいいさ。
僕もゴルフ用言語作ってやるわ。
GSが1バイトで解くコースがあるわけだし、こっちも1バイトじゃ二番煎じ感出てアレやな。
せや! 0バイトで書けるようにしたれ!!
ここからすべてが始まった。
自分は大してプログラミング能力が高いわけでもないので、言語の設計をするうえで実装が楽そうなBFが直接のモデルになっている。
それに加え、ゴルフしてて便利なようにBFのステップ実行ができるインタプリタをJavaScriptで書いたりしてたので、その経験をそのまま生かしたれってアレだった。
ゆえに、コンパイラは作れていない。
まあそんなわけでPxemとかいうネタ言語ができたわけだ。
インタプリタ
Pxemの話書いてて懐かしかった。
とりあえずオリジナルのインタプリタのソースをここにもう一回公開しておこうと思う。これたまたま昔のPCからサルベージしたデータなので結構運がよかったやつ。
“オリジナルのPxemインタプリタ(C++製)のソース” をダウンロード
pxemi.7z – 2162 回のダウンロード – 2.20 KBただ、はっきり言ってめっちゃ適当に書いてるので実行効率は絶対的に悪いと思う。
仕様だけ継承してちゃんと書き直してくれるとマジで助かる。
失われしPxemコード: Smileys Triangle
なんかSmileys Triangleだけアーカイブされてなかったのでここにコードとメモを自己剽窃しておく。
ファイル名
ファイル中身
解説で使う俺用語
- mk x
- xの値を作る。
- toreg
- レジスタ(一時領域)に値代入。
- flag X
- loopやif用のフラグをスタックに入れる。Xはラベル。
- cp
- 値のコピー。
- fromreg
- レジスタからスタックに値を積む。
- mod x
- xで割った余り
- if X
- if的なの。Xはラベル。X’になるとelse部分。
- delete flag
- いらんフラグの削除。
- exec file
- ソースファイルの中身を実行
- print “xxx”
- puts(“xxx”)
ファイル名部分
n4-).- mk ':-)' ak.- mk '\n' n4-.- mk ':-' ak.- mk '\n' n4.-.p mk ':' 01.-.t mk 0 and toreg .z loop A n4-).- mk ':-)' ak.- mk '\n' .p print .m fromreg .e exec file .v.s.v delete flag .p print .m fromreg 12.-.+ mk 1 and add .t toreg .m .a end loop A .d.pxe
ファイル中身部分
.t toreg .z loop B 01)).-.m.-.t 00.-.m .a end loop B
コード作るときの支援ツールっぽいやつ
Smileys Triangleってゴルフのお題を解いてるときに、いちいちファイル名変えるんダルすぎと思って作ったやつ。
“text2pxem.pl” をダウンロード
txt2pxem.pl_.txt – 1103 回のダウンロード – 780.00 B以下、公開当時の文を自己剽窃。
つかいかた
pxemインタプリタのあるとこにジェネレータを置いて、
「txt2pxem.pl filename
」
でおk。
そのまま実行させるには、
「txt2pxem.pl filename -e
」
でいい。-eはfilenameの後にすること。順不同にすんのめんどくさかったから。
テキストファイルの書式
まあ実際に上で公開してるソース見てくれれば話は早いんだけど。
行ごとに読み込んで、行頭のタブは無制限削除。
次にコードがきて、タブがきたらそのあとはコメント扱い。
pxemファイルの中身を書きたいときは、
「__EOF__」以前がファイル名として、以降がファイルの中身として扱われる。
まあtxt2pxem.plのソース見ればわかると思う。あとはよろしく。
質疑応答
メールできてた質問等をここでこたえることにする。ほかに気になってる人がいてもいけないし。
.pや.oや.nで改行も出力するかどうか
スタックの中身(最後)に改行がなくても出力時に改行を自動でつけるか?という質問だと解釈する。
スタックにないものは出力されないので、改行は出力されない。自前でつける。
僕が作ったコードでよく出てくる「ak.-
」ってのは改行コード(\n)を作るための定型句。
スタックにデータが一つしかない状態で.xや.yや.zを処理する際、中のデータが捨てられるか残るか
データ数が足りてない場合、中のデータは残る。
.eでファイルの内容を実行する際に一時領域のデータもコピーされるのか
覚えてないけど、当時のコードを見てる限り、されないっぽい?
新しく別の一時領域が作成されるっぽい。
外国人にPxemを紹介したらショボいと一蹴された
その外国人は悪くない。個人的にも出オチ言語だとは思ってる。
とは言え愛着がないわけではなく、パズル感覚で遊ぶにはかなり楽しい言語だとは思ってる。頭の中がミートソースになるけど。
ファイルの中身があるとき、ファイル名が優先なのか?
ファイル名優先っていうか、ファイル名側に.eがなかったらファイルの中身なんてなかったことにされる。
男は中身じゃない。名前だ。
拡張子の.pxeとか.pxemの.p部分も命令?
当然。
というか設計段階で「HelloWorld!.pxe」だけでへろわが出力されるようなのにしようと思ったの。
命令は大文字と小文字の区別をするのか?
命令は区別されない。
直接は関係ないが、Windowsみたいにファイル名で大文字小文字の区別がない場合、ファイル名をインタプリタに引数として与えるときに(ファイル名のデータ部で)誤作動が起きないように注意。
Fizzbuzzのコードで.Wが紛れ込んでいたから困惑させてしまったようだが、たぶんこちらのミス。
直前のコマンドが.%だったから流れでシフトキー押しちゃっただけだと思う。誰かしらんけど、なんかごめんね。
分岐系命令は始まり(.xとか)と終わり(.a)の数が一致する必要がある?
その通り。
ただ、オリジナルのインタプリタのコードを見てる限りでは数の不一致でエラーが出るわけではないっぽい。
要するに、一致してないとバグるだけ。バグってほしくなければつけよう。
スタックの上二つを入れ替える命令はないのか?
残念ながら、ない。指摘されて初めて気づいたが、これってスタック型言語には必須っぽいしこのクソ仕様のせいでたぶんチューリング完全じゃないと思う。わからん。
Pxem2(仮)を考えてた時はこの命令追加しなきゃなとは思ってたけどそんな日はまだ来てないわけです。
いちいちファイル名変えなきゃならないしコメント残せないしコード書くのがクソだるい
僕もそう思う。
上にある支援ツール使えば多少マシになる。
何かあればここのコメントでも受け付けます。
ただし誹謗中傷は勘弁。
Pxem2(仮)
ファイルの所有者情報とか最終更新日時とかのファイル名以外の非ファイル部もデータとして読み込めるようにしたらよりカオスでおもろそうやなwwwwwwwと昔思ったけど意味もなく使い勝手が悪いだけなのでPxem2(仮)はなかったことにされた。
最後に
半分ネタで作ったプログラミング言語だけど、面白いと感じてくれる人が一定数いたり、発想(もちろん内部的にはディスク容量食ってることぐらい承知だが)を褒められたりすると素直にうれしく思う。これからもPxemを愛してやってください。
コメント
今まで何回も思ったのですが、”Pxem”って正式的にはどう発音したらよろしいんでしょうか?
返信が遅くなって申し訳ありません。
個人的には「ペクシム」と読んでいますが正式な読み方は特に決めていません。
何かの略称ってわけでもなく、ただ頭に浮かんだ文字列です。
今更なのですが実はPxemのチューリング完全性についてEsolangの人達と議論をしようとした際に仕様を誤って訳した状態で記事にしていたことが判明しました。具体的には条件反復命令はネスト不可だと伝えていたようでした。申し訳ございません。そこで現在記事の訂正をしていますのでお待ち頂ければと思います。
連投失礼します
訂正完了しました
元の紹介ページで”.cは空の場合は何もしない”と記述していましたが、pxem.hをよく読むと、Pxem::Copy()で空の場合の処理が記述されていないようです
お久しぶりです
シェルスクリプトで、PxemをC++11に変換するトランスレータを作りました
<>
今度は、Pxemがチューリング完全であることの証明もしました
<>
ところで、公開しているインタプリタはどういうライセンスで公開しているのでしょうか?
いつもありがとうございます。
結論から申し上げますと、私が書いたPxemのインタプリタのコードに関して、自由に扱ってくれて構わない(WTFPLライセンス)という認識です。
こう考えるに至った経緯について記しておきます。
当時はライセンスのことなんて全く考えてませんでした。そもそも、こんな風に愛して遊んでくれる人がいるとも思っていませんでした。作ったのが私だとしても、もはやあなたのほうが造詣が深いと言えるでしょう。楽しんでもらえてとてもうれしく思っています。
記事で自分の子供のようだとも書きましたが、感覚的には、すでに自分の手元から巣立っているようにも思えます。私が書いたコードは、もはやPxemという言語設計に形を与えただけのものにすぎないというのが現在の認識です。
というわけで、ライセンスとして付与するならWTFPLになります。良識の範囲内で、好きに遊んでやってください。