Pxem

Pxemは2008年にぬこによって作られたジョーク向け難解プログラミング言語である。実用言語ではない。
なお、「Pxem」と言う名前については、特に意味は無く、ただキーボードで打ちやすいというだけである。
ファイル名をもコードとして解釈する特徴により、0バイトでのプログラミングを可能にするとして紹介されている。元々はコードゴルフ用に設計された。
本家ページにアクセスできなくなる2012年頃までは本家ページでC++により開発されたインタプリタが公開されていた。その後約6年間、そのインタプリタの入手が不可能となっていたが、2018年9月に、作者のブログにおいてオリジナルインタプリタのソースコードが再公開された。
言語仕様.
Pxemのプログラムは、二つのレジスタを持つ仮想機械で処理される。片方は整数型のスタック、もう片方は同じく整数型で、データを保持しているかどうかを区別し、ただ一つの値を保持する一時領域用のレジスタである。プログラム起動時、どちらも空の状態で初期化される。
このプログラミング言語はファイル名をメインルーチン、ファイルの中身をサブルーチンとして解釈する。そのため最初はファイル名の最初の文字から順に実行される。ファイル名の最後まで実行、またはファイル名上の終止コマンドcodice_1を実行した際にプログラムが終了される。この際ファイルの中身を処理するコマンドがファイル名にない、または実行されないとファイルの中身は無視される。
ファイル名上でサブルーチン実行コマンドcodice_2を実行すると新たな仮想機械が作成され、その機械上でサブルーチンが実行される。この際、その機械のレジスタについて、
サブルーチンの処理終了は終止コマンドcodice_1が実行される場合、またはファイルの中身を解釈し終えた場合に行われる。サブルーチン終了時、前の仮想機械上でサブルーチン呼び出し元のルーチンを処理する。この際、呼び出されたサブルーチンを処理していた仮想機械について、
コマンドである部分が解釈される際、それより前にコマンド以外の部分がある場合、その部分が文字列として解釈され、スタックに逆順にプッシュされる。
例えばファイル名がcodice_4であるファイルでインタプリタを実行した場合は、コマンドである部分はcodice_5の部分で、それより前のcodice_6という部分が文字列として解釈され、スタックにcodice_7、codice_8、codice_9、codice_10、codice_11、codice_12、codice_13、codice_14、codice_11、codice_9、codice_9、codice_18、codice_19、の順にプッシュされる。その後、codice_5というコマンドは「スタックが空になるまでポップし、ポップした値を文字として出力する」ため、結果として"Hello, world!"と出力される。なお、codice_21のcodice_22もスタックにプッシュされるが、そのままプログラムが終了する。
制御構造.
制御構造として条件制御ループのみが使用できる。それらの内容は次の通りである。
演算.
算術演算を行う五つのコマンドが利用可能で、それらはcodice_23、codice_24、codice_25、codice_26、codice_27（順に加算、減算、乗算、除算（商を得る）、剰余演算）である。どれも、スタック最上位二つのデータに関して行われ、結果がスタックにプッシュされる。このうち減算、除算、剰余演算はどちらが上位にあるのかに関係なく、大きい値を小さい値で減算、除算、剰余演算する。またゼロ除算については明確な仕様がない。
乱数.
乱数を生成するコマンドとしてcodice_28が利用可能である。
実例.
Hello, worldを出力する場合.
Hello world を出力するには、ファイル名をcodice_4とする。ファイルの中身は任意。このためファイルのサイズを0とすることも可能である。
Fizzbuzzを出力する場合.
Fizzbuzz を出力するには、ファイル名をcodice_30とする。ファイルの中身は任意である。
実装.
Pxemのインタプリタはもともと、設計者のページで"pxemi.exe"として公開されていた。同ページのサイト消失後は新たなサイトでソースコードが配布されている。
また、コードジェネレータ"text2pxem.pl"も配布されていた。こちらはテキストファイルをPxemのコードファイルに変換するツールである。こちらも、新たなサイトで配布されている。