【お知らせ】プログラミング記事の投稿はQiitaに移行しました。Python複素数でラプラシアンの平方根としてディラック作用素を考えます。Python2013/7/27(土)に開催されたスタート低レイヤー#2でELFについて発表して来ました。私自身とても勉強になりました。主催のmasterqさんはじめ、他の発表者の方々、参加者の方々、お疲れ様でした。JIT前回はELFファイルの構造を示しながら、動的リンクに必要な処理を説明しました。今回はPythonで実装した簡易ローダを見ながら、実際の処理を追っていきます。Windows上でELFファイルを読み込み、動的リンクを解決...ELFの動的リンク(2)2012-07-01PythonでスクレイピングPythonPythonでスクレイピングをやってみました。個人的にはプル型パーサが使いやすいのですが、pulldomは妥当性チェックが厳しくHTMLにはそのまま使えないことが多いため、自作パーサを移植しました。JIT前回、Pythonで文字列配列をJITで表示しました。マーシャリング(ポインタの変換など)はctypesに任せていたので、そこを手動でやってみます。前回と共通の部分(JIT)は、前回のコードを呼び出して処理しています。argvをJITで表示しました。これをそのままPythonに移植しました。jitモジュールは以下を使用しています。x86x86の分岐命令は相対アドレス指定のため、分岐元と分岐先のアドレスが決まらなければ相対アドレスを求められません。Brainf*ckではループの先頭と末尾で分岐が出てきます。相互に分岐しているので少し複雑です。x86前回、Pythonでポインタアクセスする方法が分かりました。これを使ってC言語で書いたJITをPythonに移植してみます。コードの詳細は以下を参照してください。JITPythonでmalloc()したメモリへのアクセスを試しました。キャストするとアクセスできます。Windows限定のコードです。UNIX系ではlibcのロード方法が少し違います。コンパイラ実装会で@uho_iiotokoさんがBrainf*ckのトランスレータを実装されているとき、ちょっと面白いことが起きました。元はC言語で実装されたBrainf*ckからアセンブラへのトランスレータです。トランスレート対象がC言語でも同じ結果となるため、P...Brainf*ckでループ展開2012-05-13CFunctionTypeから関数ポインタを取り出すPythonPythonでは関数のアドレスを指定して呼び出せます。以下の例は適当なアドレスなので、呼び出してもエラーになります。x64先日、PythonでJITをやりましたが、32bitのWindowsに依存していました。mmapの戻り値や、munmapの引数に型を指定しているのがポイントです。x86PythonでJITから文字出力するため、sys.stdout.writeのラッパーを定義してコールバックさせてみました。ラッパーのアドレスを引数で渡しています。ctypesチュートリアルにも記載されているように、libcの標準出力関数を使うとIDLEなどで正常に動作しません。x86前回、PythonでJITという遊びをやりました。IronPythonでもそのまま動きました。思った以上に互換性があるので驚きました。32)を使用していました。x86PythonでJITをしてみました。Windowsに依存したコードです。【注】PyPyのようにPythonのコードをJITコンパイルしたわけではありません。CPythonからバイナリ直書きでネイティブコードを生成して実行しました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。