LL Tigerでライトニングトークスに参加してきました。今回はトーナメントの勝ち抜き方式で、今までのLTで見た中で技術的にハイレベルなプレゼンが数多く行われました。我らが"殺伐Python"は、残念ながら2回戦敗退でしたが、その負けた勝負も「言語実装者vs言語実装をだます人」という、刺激的すぎる対戦でした。柴田さんも、良い試合だったと言ってくれました。@moriyoshi, @ymotongpoo、お疲れ様でした!ちなみに写真は昼休み。「shibuya.jsやべぇよ、飲んで勢いでやろうぜ」的なw(清水川さん、写真ありがとうございます)
イベントとしては、並列の話がおもしろいなぁ・・と思いました。上から下まで、コードジェネレータ、DSL、トランスレート・・・さまざまな技術がないとできない世界。そういう言語の実装はやってみたいものの一つです。良い刺激を色々受けることができました。僕も最近は時間がなくて、自分の発表をするイベント、スタッフとして召還されたイベントしか参加してませんでしたが、今回は、発表がなかったとしても楽しめたと思います。
で、僕のプレゼンについて・・・資料だけでは分からない所も多いと思いますので、今回もしゃべり原稿を清書してブログを書こうと思います。初戦はこのプレゼンで勝ち抜けることができました。相手の方のプレゼンも、なかなかおもしろかったけど、あれが動画じゃなくて、実際のインタラクティブなデモだったらもっとギリギリの戦いになっていたと思います。
最初は、メタプログラミングRubyが出版されるのにかこつけて、Rubyとの対決色を出して「Rubyが実行できるんだからPythonの方がメタプログラミングは強力だぜ」みたいなプレゼンにしようかとも思って、調査機関Gに依頼して各言語のメタプログラミング需要を調査したりもしていたのですが、まぁ、そこまであおらなくても十分「Python変態すぐる」みたいなレベルには到達したと思うので、淡々とPythonの説明だけにしました。
殺伐Pythonの渋川が、殺伐としたPEP263を通じて幸せになる方法についてご紹介します。
僕も翻訳に参加した、エキスパートPythonプログラミングです。将来、Pythonはモテモテ言語になるので、今のうちにスキルを高めてモテ度を上げたい方は是非お買い上げください。これはモテ本です。
こちらも僕が書いた本です。新しい人、若い人にやさしく教育する方法が紹介されていますので、やさしいお兄さん路線で行きたい人はこちらもオススメです。これもモテ本です。
PEPというのは、Pythonの機能拡張の提案書です。このルールの従って提案書を作り、機能拡張要望を出すというルールでPythonは開発されています。
今回紹介するのは、これの263番。ソースコードの文字列エンコードを指定するという機能拡張になります。これは2003年リリースのPython 2.3から採用されています。
ソースコードのエンコーディングを指定するものです。先頭の行のエンコーディングを設定すれば、sjis, eucでも、Pythonのコーデック集に定義されたエンコーディングでソースコードを書けるようになります。
処理の流れとしては、まずは先頭の1, 2行を見てコーデックを選択します。そのコーデックがソースコードを解釈して、ユニコード文字列を返します。次のパーサがその文字列を処理して、抽象構文木を作り、さらにバイトコードコンパイラが起動して、バイトコードが生成されます。
注意:毎回生成されるわけではありません。インタプリタの起動時に指定されたファイルは作られません。ただし、個別にコンパイル処理だけを行うことは可能です。
Pythonのドキュメントを見ると、codecsモジュールのregisterという関数を使うと、自分でコーデックを登録できることになっています。そうです。自分でコーデックを書くことができます。
コーデックは、ファイルを読み込んでユニコードを返す疑似ファイル(と、ユニコードから戻す側と2つ一組)のクラスです。コーデックを自作すると、パーサが処理する前に、文字列を加工することができます。さっそくやってみましょう。
C言語風のマクロを実現するコーデックを実装してみました。(本番ではここでデモしました)
# encoding: define #define MSG "ll tiger" print "hello", MSG
"define"というコーデックを指定すると、C言語のように、プリプロセッサとしてソースコードを加工することができます。
日本語の縦書きは美しいですよね。これは僕の裏千家の一番入門レベルのお免状です。日本文化を大切にしたいですよね。じゃあ、ソースコードも縦書きにしてみましょう!(本番ではここでデモしました)
# -*- encoding: rotate -*- f o r p i r i i n n t r " a H n e g l e l ( o 4 " ) :
ちょっと記号が寂しい感じだったりしますが、このプログラムを実行すると、helloが4回表示されます。ちなみに、2バイト文字は使えません。
次はなんだろう?何だと思いますか?
じゃあ、Rubyでも動かしてみましょうか?
コーデックの中で、トークン分析をして、抽象構文木を作って、Pythonのコードを生成しています。懇親会で聞かれたのですが、すべてPure Pythonの実装になっています。別にバイトコードを生成するのにRuby1.9を使っていたり(HotRubyのように)はしません。理由は後述します。
ちなみに、重そうな処理に見えますが、うまくバイトコードファイルができて、一度キャッシュされてしまえば時間のロスはなくなります。(本番ではここでfizzbuzzのデモをしました)
# encoding: ruby (1..100).each do |i| if i % 15 == 0 puts "fizzbuzz" elsif i % 3 == 0 puts "fizz" elsif i % 5 == 0 puts "buzz" else puts i end end
たのしいRubyを受け入れテストとして使っています。今は3章の途中まで行きました。File.readとFile#readで引っかかったので、RubyのオブジェクトモデルをPython上で作り直しています。Pythonだと、クラスメソッドとインスタンスメソッドで同名のモノを使うことはないですからー。トークン分解はほぼ100%実装終わっていますので、後はAST→Pythonコードをちまちまやるだけです。
とりあえず、クラス定義ぐらいまではできるようにして、PyPIにアップしてみようかな、と思ってます。あ、栃木の人なのでRailsには興味はありません。やりたいとすれば、dRubyを使って本家Matz Rubyと通信ですね。
PEP-263はいかがでした?たった1行でPythonの動作を大きく変えることができます。究極のメタプログラミングと言えます。
さて
先日のPythonハッカソン(このレポートは僕と@_mipo_で書きました)では、某PHPの関係者の人が、PHPはもうダメだという発表をされていました。
この時の発表はPHPでxlibを実装しました、だったのですが、LLTigerのPHPのLanguage Updateのプレゼンも、PHPからxlibを直接叩いて行っていたそうですよ。しかも、LL Tigerの夜中のチャット:
[10/07/31 6:46:24] moriyoshi: いまPHPでプレゼンツール作ってる [10/07/31 8:53:29] しぶ/shibu: w [10/07/31 8:53:35] しぶ/shibu: 何事w [10/07/31 8:53:45] moriyoshi: できた。 [10/07/31 8:53:50] moriyoshi: 今日これでやる。
夜中に思い立ってPHPでプレゼンツールを作るってどれだけ筋肉質なのPHPプログラマーw
でも、PHPはとてもすばらしい言語で、サーバプログラミングの敷居を大きく下げました。簡単にやってみよう、という気にさせる言語です。その代わりツッコミ過ぎると痛い目に会うこともあるそうですが。
「コンカツ IT」でググると出てくる、こんなけしからんブログがあります。見たことあります?まぁ、けしからんので見る必要はありませんが。その中では、ATNDによるモテ度計算でPHPの勉強会はモテ勉強会なので注意!と紹介されています。
今年はLL大河だったわけですが、
来年は誰がなんと言おうとLLみのりんだと思います。
PHPは出会いのきっかけも多いが「もうダメです」という状況なので、LLみのりんでは「この人たちをぜひうちの言語のユーザに」という、PHP互換環境の実装大会になると思われます。
今気づいたけど、エレファントカシマシタの発表で使っていたのは、MySQLじゃなくて、PostgreSQLだったのね。スライド間違えてました。すみません。
ですが、PythonにはPEP-263があるので、この勝負は絶対的にPythonの有利だと言えます。将来は「Python勉強会なんて、盛り場に行っては行けません!」とPTAで問題になるはずです。間違いありません。
(注)まだ、このデコーダは実装してません
ちなみに、既に盛り場というウェブサービスがあって、Pythonで実装されていたりします。
将来、Pythonはモテモテ言語になるのは規定路線なので、今のうちにスキルを高めてモテ度を上げたい方は是非エキスパートPythonプログラミングをお買い上げください。これはモテ本です。
こちらも僕が書いた本です。新しい人、若い人にやさしく教育する方法が紹介されていますので、やさしいお兄さん路線で行きたい人はこちらもオススメです。これもモテ本です。
まとめです。PEP-263おもしろいですよ。正規表現程度の知識があれば、自分オリジナルの文法を簡単に追加できます。ぜひぜひ。そして、将来はモテ確定ですので、モテたい人はPythonをどうぞ。そして、僕の本は一人4冊ぐらい余裕で消化できると思いますので、いっぱい買ってください。
ご静聴ありがとうございました。ちなみに、後でTwitterのハッシュタグの#lltigerを見ていたら、どう見ても一番ウケていたのは、ネタで最後に入れたLLみのりんでした。ありがとうございました。
サンプルプログラムのご利用方法
最初の2つについてはここに置いてあります。
- アーカイブを落とす or Mercurialでローカルにクローンします。
- define.py, rotate.pyをPythonのライブラリフォルダ(C:\Python\Lib\など)の中の、site-packagesにコピーします。
- 同じsite-packagesフォルダ内にsitecustomize.pyを作ります。あればそれに追記します。追記する内容はアーカイブの中のsitecustomize.pyを参考にしてください。
- これでdefineとrotateというコーデックが追加されたので、C言語ライクなマクロ(といっても、1単語置換だけですが)と、縦書きPythonが追加されます。
できれば、システムの方のPythonの方には手を加えない方が良いので、virtualenvなどを使って専用のPython環境を作って遊ぶことをおすすめします。virtualenvについて学ぶには、エキスパートPythonプログラミングがオススメです。
次にRuby on Python(仮)の方です。アーカイブはここです。フォルダ構成はまだ仮なので、変わる可能性もあります。
- easy_installかdistributeあたりをインストールします。詳しくはエキスパート(ry
- packages/ruby.tokenizerに移動し、python setup.py installを実行します。
- 次に、packages/ruby.interpreterに移動し、python setup.py installを実行します。
- コーデックを追加するときは、先ほどのCマクロや縦書きのアーカイブに入っていたsitecustomize.pyを参考にしながら、自分の環境のsitecustomizeに登録関数呼び出しを追加します。
- ちなみに、インストールすると、prubyという実行ファイルも追加されちゃったりします。これもまだ実用ではないのでvirtualenvの利用をオススメします。
デモにつかったスクリプトは、最初に説明した方のアーカイブに入ってますので、試しに実行してみてください。
(追記) この内容を受けて、さっそくPython上に言語を実装するのに挑戦してくれる人が現れました!このフットワークの軽さは、きっと武器になりますよ! http://d.hatena.ne.jp/doloopwhile/20100801/1280688409