帰って来たプログラミング言語「DT」ゴールデンウィークを利用して久々にろくでもないものができたので晒しておく。「ごっこじゃないよ、兄ちゃん!」「才能の無駄遣いじゃなくて、無駄そのものだよ、お兄ちゃん。前のと何が違うの?そもそもの発端についてはプログラミング言語「DT」という記事を、実際の言語仕様についてはREADMEでも読んでもらうとして、何で再実装したのかという話。3年前に作ったのは「Whitespaceのトークンを置換した処理系をインタプリタとしてRubyで実装」したものなんだけど、何を思ったかコンパイルしてみたいと思い立ってしまい、んでそれ自体はLLVMが良く分かんなかったとか、llvmruby自体がプロジェクトとして大分アレな感じになってしまっていたとか、そういう事情で挫折してたんだけど、時は流れ、なんか見返してみたら普通にLLVMアセンブリ読み書きできるようになってたし、ruby-llvmがちゃんと動くようになってるみたいだし、ということで再実装してみることにした。そんで作り直す過程で「Whitespaceの置換ってのもなんだか面白くないな」と思ってVMのアーキテクチャと言語仕様を見直すことにした(ぱっと見だと全然分かんないけど、旧DTと新DTの間に互換性は無い)。そのせいで実際にはチューリング完全じゃなくなってると思うし、そもそもちゃんと出来てるのかどうか怪しいものだけど、とりあえず「Hi!」って出力するのとフィボナッチ数を出すのは動いたので良しとする。当初の目標だった「DTコードをネイティブのバイナリにまでコンパイルして高速に実行」ってのも実現して、DTインタプリタで250msくらいかかるfib.dtをコンパイルすると4msくらいで結果が出るようになった。似たようなRubyのコードだと大体100msくらいだったので素敵に速い。コンパイル自体はLLVMとコンパイラに任せているので大して威張れるあれでもないのだけども。高速に動いたからなんだという話なのだけども。ぶっちゃけDTよりLLVMアセンブリの方が遥かに記述力高いし書きやすい。当たり前のように構造体とか関数ポインタとか使えるのな。最初Cで書いてたVMを途中でLLVMアセンブリ直接書くようにしたけど、大して変わらない。DTで書くくらいならLLVMアセンブリ書いた方がいいです。LLVMの無駄遣いタグを付けていただきたい。DTの存在意義については疑問を差し挟む余地もなく皆無だと言っていいけど、その過程でレジスタマシンについて色々調べて、はー、こんぴゅーたーってこうやってうごいてるのかー、と勉強になったのでそれはそれで良かった。こんなの考えられるよなぁ。CPUとかコンパイラとか作ってる人達、本当に俺と同じ種類の生き物なのだろうか。Tweet2010年09月17日うどんげQuineに対抗して遊んでみた「RubyKaigiが終わったら真面目にやろう」とか言ってたくせに、中々やる暇無くて放置してたら大変に分かりやすい作り方講座が出てしまった上、弾さんまで乗ってきてしまって完全にタイミングを逃したfaultierですこんばんは。悔しいので対抗してみるうどんげが出たならてゐもいてもいいだろう、ということでてゐ。AAは上記の記事同様こちらを使わせてもらった。初春もいいなーと思ったんだけど表示してみたら大き過ぎて自分のターミナルで表示できなかったのでやめといた。he31231139e3939substrjoin3939split09azAZs02009lengthschr3939join39omapttsplittsubstre03939chr32xnfor134spliceo810chr10printjoin3939ochr10o10110244403841834633213361012330217141'.joinGistにも置いてあります。-Z]/,$s)),0,(2009-length($s)))).chr(39).'.join';@o=map{$t=!$t;split(//,((!$t)?substr($e,0,$_,''):chr(32)x$_))}@$n;for(1..34){splice(@o,$_*81,0,chr(10))};print(join('',@o).chr(10))}))ええはい。良く見てもらえると分かると思うけど、実はこのコードは自分自身を出力してない。何を出力してるかと言うと、Perlのコードを出力している。そのPerlのコードは何をするかというと、最初のRubyのコードを出力する。最初のコードは「『このRubyのコードを出力するPerlのコード』を出力するRubyのコード」で、後のコードは「『このPerlのコードを出力するRubyのコード』を出力するPerl」のコードになっていて、お互いがお互いの自分自身を相手に出力させるという、「人は一人では生きて行けないんだ」というメッセージ性を持った難読コードなわけです。RubyもPerlもやられちゃったので、そのまま真似してもつまらなかっただけです。ruby何をしたの?実のところ別になんということはなくて、やってることは基本的にはうどんげQuineと一緒。配列リテラルとjoinとevalを使ったQuineはPerlでもRubyでも全く同じ要領でできるので、自分自身を吐く代わりに相手のコードを吐くように書き換えると簡単に行ったり来たりできるようになる。任意に加工できるRubyコードの例eval$s=%w'puts("eval(join("<<39<<39<<",qw{print("<<39<<"eval$s=%w"<<39<<".chr(39)."<<39<<$s<<39<<".chr(39)."<<39<<".join"<<39<<")}))")'.joinあとは、二言語分のコードが一つのAAの中に入ることになるし、PerlとRubyだとリテラルがそっくりなのでデータ部は共有したいので生のデータを書きたい、となると流石に元のAAデータだと文字数の制限がキツいから、反転して白抜きのAAにした。ちなみに、てゐの方はうどんげのとはAAデータ持ち方は換えてる(元記事のロジックをPerlで実装するのが面倒だっただけ)。あとはまぁ、出力時に尻尾に適当なゴミを付けて文字数調整してるんだけど、文字列リテラルの入れ子が簡単に崩れるので面倒臭いとかそんな程度。chr(39)濫用しまくり。あとドットがRubyのドットなのかPerlのドットなのか良くわかんなくなったりします。まとめ途中で「俺は一体何をやってるんだ」と思ったら多分負けなんだと思います。一度ベースができちゃうと後はデバッグと文字数の調整が面倒なだけで、割と簡単にできます。あと段々哲学的な気分になります。噛みまみた最近ブログ更新してないなーと思ってふと最終更新日見たら3ヶ月も前の日付になっていた。ブログ書いてないということはブログに書けるような馬鹿なことをしてないということで、3ヶ月間一日も休まず馬鹿であったにもかかわらず馬鹿なことをしてないというのはとても良くない。これはアイデンティティの危機である。いうことで久々に馬鹿なことをしないとと思い立ったわけでは全然なくて、ただただ単純に八九寺が可愛過ぎるので、八九寺に名前を噛みまみたしてもらえるモジュールを作ってみた。結果的にだいぶ馬鹿になった。GitHubこんな風にして使います。(ほねかわさん)名前とその読みを入れるとカミママイズされた名前が出てきます。カミママイズだなんていやらしいです。それだけですが、何か?一応ちょっとだけ解説すると、引数にプラグインの設定を入れてKamimamize::Converterをnewすると、kamimamizeするときにそのプラグインのどれかを使って名前を変換します。priorityが高い奴から順に処理されて、自分が処理できない名前のときは次のプラグインに任せます。throughが設定されてると大体それぐらいの割合で答えられるときでもスルーして次に渡します。上の例だとrepeatプラグインは4割くらいの確率で処理できるときでもスルーします。全部のプラグインがスルーすると最後にdefaultのプラグインが拾います。何も設定されてないとrandomプラグインがdefaultで、ランダムで八九寺にひどいことを言われます。プラグインはとりあえず4つ作ってあって、HashかYAMLファイルのパスで名前とそれに対応する変換結果のリストを渡すと、対応する名前が来たとき変換結果リストの中からランダムで返すpatternプラグイン。何もリストを渡さないと「八九寺」にだけ反応する。同じ文字が続く名前、もしくは「々」が含まれる名前のときにその数を増やしたり減らしたりして噛むrepeatプラグイン。名前の読みの母音や子音を適当に置き換えるswapプラグイン。Yahoo!のテキスト解析APIを使うのでアプリケーションIDが必要。ちなみに、名前の字面を見ているわけではなく読みを適当に置き換えるだけなので、そんなに上手いことは言わない。返答リストからランダムに返すだけのrandomプラグイン。返答リストは初期化時に設定できるけど、しないと八九寺にひどいことを言われる。Converterをnewするときに明示的にdefaultを設定しない場合、このプラグインがthrough=0で一番後ろに設定される(つまり上の例ではdefaultの設定は意味ない)。上の例だと阿良々々々木さんはrepeatプラグインで、骨川さんはswapプラグインの変換結果。何かと適当なので多分そんなに面白い結果は出ないと思うけど(例えば戦場が原とか入れると意味不明すぎて噛んだのかどうかすら怪しいのが出てくるとか、阿良々木さんをカミママイズすると木が消えちゃうとか)、個人的には羽川が骨川とか花沢に変換されたのが面白かったので満足です。ひらがなの音を置き換えるのって結構面倒なのよ。いうか八九寺の神懸ったセンスに勝てる気がしない。あとは類義語に置き換えるとか、名前の中の語彙の分割を真面目にやるとか、specくらい書くとかしたいけど、多分飽きてやんないだろう気配がします。なんというか、カミママイズするためだけにY!のAPIを使うという無駄遣いをしたかっただけだったりする。Y!のAPI面白かった。途中で形態素解析とかして遊んでた。盛大に無駄遣いしてみたいなあ。http://bit.ly/diO4SCと八九寺が教えてくれるという素敵展開が。@mayoi_hachikujiには足を向けて寝れそうにないと思いながらどこにいるか知らないので普通に寝ました。