PyPy Sudden Death Calendar 27日目 - JVM Backend に完敗した件を受けて
昨日の PyPy Sudden Death Calendarにて[twitter:@rokujyouhitoma]総帥が挑戦した PyPy の JVM Backend での失敗と、その後の Skype での議論をまとめて一エントリまかなえそうです。
なのでとりあえず書いてみました。
PyPy Sudden Death Calendar 27日目です。
そもそも何で失敗したの?
失敗したときのログはこんな感じ。
(_)ike-no-MacBook-Air% java -jar ./ook-jvm.jar Exception in thread "main" java.lang.VerifyError: (class: pypy/ConstantInit_0, method: constant_init signature: ()V) Expecting to find long on stack at pypy.ConstantInit.init(ConstantInit.j:6) at pypy.Main.<clinit>(Main.j:26)
で、そのエントリのコメントで[twitter:@cocoatomo]氏が言うところによると
VerifyError ってことは吐かれたクラスファイルがどこか壊れてるんじゃないのかなぁ.
と言いつつ細かいことは追えてないですが. すんません.
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/VerifyError.html
ということのようです。
どうやら出力されたクラスファイルがおかしいと。
で、そのエントリでは PyPy の ML も参考にしつつ、
『64bit バイナリな Python での int(
という感じで締められています。
そして、 [twitter:@aodag]先生もCLI での敗北での経験から
[23時37分30秒 JST] aodag: > 32bitじゃないといけないの...( ̄д ̄)エー
[23時37分39秒 JST] aodag: cliと同じ結果に....
[23時38分38秒 JST] aodag: cliでは、 longlong == long なのがひっかかった[23時40分44秒 JST] aodag: 多分コンパイルするときに longlongとlongを実行系からとってくるんじゃないかな
[23時46分42秒 JST] aodag: cliのエラーはオーバーライドできんよってエラーだった
[23時46分46秒 JST] aodag: MLで見ると
[23時47分08秒 JST] aodag: 64bit環境では、longlong == long になってしまうので
[23時47分28秒 JST] aodag: 違いがなくてオーバーロードがあいまいになってしまうとかなんとか
とコメントしています。
Python における int のデータ長と 64bit 環境での C における long のデータ長などの環境による影響なのではないか、ということらしいです。
と言っても
Target | エラー発生タイミング | 原因 |
---|---|---|
JVM | JVM での実行時 | Python での int と JVM での int のデータ長の齟齬? |
CLI | Backend バイナリの出力処理 | sizeof(long) == sizeof(long long) が true であるためにオーバロードが曖昧になった |
という部分で若干違いがあります。
ただし、この症状はあくまでも x64 環境でそれぞれのバックエンド向けに出力をしようとした際の問題です。
これに加えてさらに [twitter:@cocoatomo] 氏がバイナリを弄ったりして試行錯誤して処理を進めてみても
[0時22分59秒 JST] tomopenguin: なんか
49: invokestatic #17; //Method pypy/PyPy._ll_resize:(Ljava/util/ArrayList;J)V
のシグネチャが変な気がする
[0時27分19秒 JST] tomopenguin: javap -c pypy.PyPy してもそんな シグネチャを持つメソッドは無い
なんて言っていたので、どうやらデータ長以外の問題もありそうです。
[twitter:@aodag]先生が CLI 向けにビルドしてみたときも
[23時56分33秒] aodag: まとめ
[23時56分43秒] aodag: on win
[23時56分59秒] aodag: unicode_reprのll_getlengthがないってエラー
なんて発言をしていたので、 ootypesystem あたりになんか問題がありそうではあります。
32bit 環境だとどうなの?
Ubuntu 10.04 で 32bit な環境が手元にあるので、試してみました。
$ hg clone https://bitbucket.org/rokujyouhitoma/lang-ook $ cd lang-ook $ ~/files/pypy/translate.sh --backend=jvm ook.py [version:WARNING] Errors getting Mercurial information: command does not identify itself as Mercurial [platform:msg] Setting platform to 'host' cc=None [translation:info] Translating target as defined by ook [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/gcctest.c -o /tmp/usession-unknown-4/gcctest.o [platform:execute] gcc /tmp/usession-unknown-4/gcctest.o -pthread -lrt -o /tmp/usession-unknown-4/gcctest [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_0.c -o /tmp/usession-unknown-4/platcheck_0.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_0.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_0 [translation] translate.py configuration: [translation] [translate] [translation] targetspec = ook [translation] translation configuration: [translation] [translation] [translation] backend = jvm [translation] [backendopt] [translation] clever_malloc_removal = False [translation] constfold = False [translation] continuation = False [translation] gc = boehm [translation] gcremovetypeptr = False [translation] gcrootfinder = n/a [translation] gctransformer = boehm [translation] list_comprehension_operations = True [translation] type_system = ootype [translation] withsmallfuncsets = 5 [translation:info] Annotating&simplifying... [translation:info] with policy: pypy.annotation.policy.AnnotatorPolicy [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_1.c -o /tmp/usession-unknown-4/platcheck_1.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_1.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_1 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_2.c -o /tmp/usession-unknown-4/platcheck_2.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_2.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_2 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_3.c -o /tmp/usession-unknown-4/platcheck_3.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_4.c -o /tmp/usession-unknown-4/platcheck_4.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_5.c -o /tmp/usession-unknown-4/platcheck_5.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_5.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_5 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_6.c -o /tmp/usession-unknown-4/platcheck_6.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_6.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_6 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_7.c -o /tmp/usession-unknown-4/platcheck_7.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_7.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_7 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_8.c -o /tmp/usession-unknown-4/platcheck_8.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_8.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_8 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_9.c -o /tmp/usession-unknown-4/platcheck_9.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_9.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_9 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_10.c -o /tmp/usession-unknown-4/platcheck_10.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_11.c -o /tmp/usession-unknown-4/platcheck_11.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_11.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_11 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_12.c -o /tmp/usession-unknown-4/platcheck_12.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_12.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_12 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_13.c -o /tmp/usession-unknown-4/platcheck_13.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_13.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_13 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused -I/home/shoma/files/pypy/pypy/translator/c /tmp/usession-unknown-4/platcheck_14.c -o /tmp/usession-unknown-4/platcheck_14.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused -I/home/shoma/files/pypy/pypy/translator/c /tmp/usession-unknown-4/module_cache/module_0.c -o /tmp/usession-unknown-4/module_cache/module_0.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_14.o /tmp/usession-unknown-4/module_cache/module_0.o -pthread -Wl,--export-dynamic,--version-script=/tmp/usession-unknown-4/dynamic-symbols-0 -lrt -o /tmp/usession-unknown-4/platcheck_14 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_15.c -o /tmp/usession-unknown-4/platcheck_15.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_15.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_15 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_16.c -o /tmp/usession-unknown-4/platcheck_16.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_16.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_16 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_17.c -o /tmp/usession-unknown-4/platcheck_17.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_17.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_17 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_18.c -o /tmp/usession-unknown-4/platcheck_18.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_18.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_18 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_19.c -o /tmp/usession-unknown-4/platcheck_19.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_19.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_19 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-4/platcheck_20.c -o /tmp/usession-unknown-4/platcheck_20.o [platform:execute] gcc /tmp/usession-unknown-4/platcheck_20.o -pthread -lrt -o /tmp/usession-unknown-4/platcheck_20 +++++++++++++* [translation:info] -- someobjectness 0% (0 of 14 functions polluted by SomeObjects) [translation:info] ootyping... +++++++++++++**********************%%%%%%%%% [rtyper] specializing: 100 / 204 blocks (49%) [rtyper] specializing: 200 / 204 blocks (98%) v[rtyper] -=- specialized 204 blocks -=- +++ [rtyper] -=- specialized 8 more blocks -=- [translation:info] ootype back-end optimisations... [backendopt:inlining] phase with threshold factor: 32.4 [backendopt:inlining] heuristic: pypy.translator.backendopt.inline.inlining_heuristic +++++++++++++**********************%%%%%%%%% [backendopt:inlining] inlined 75 callsites. [backendopt:malloc] starting malloc removal ++++ [backendopt:malloc] removed 6 simple mallocs in total [backendopt:mergeifblocks] starting to merge if blocks [translation:info] Generating JVM source... +++++++++++ [rtyper] -=- specialized 22 more blocks -=- [translation:info] Wrote JVM code [translation:info] Compiling JVM source... [jvm] Compiling java classes [translation:info] Compiled JVM source [translation:info] Creating jar file [Timer] Timings: [Timer] annotate --- 8.6 s [Timer] rtype_ootype --- 3.2 s [Timer] backendopt_ootype --- 1.1 s [Timer] source_jvm --- 0.9 s [Timer] compile_jvm --- 11.6 s [Timer] ========================================= [Timer] Total: --- 25.4 s
コンパイルできました。
で、 samples に helloworld.ook なんてものがあるので実行してみます。
$ ./ook-jvm samples/helloworld.ook Hello, world!s
お、なんと実行できてしまいました。
で、これとは別に ook-jit2.py というファイルもあったので、こちらも実行してみたところ、
$ ./ook-jit2-jvm samples/helloworld.ook Exception in thread "main" java.lang.ClassFormatError: Field "tape_0" in class pypy/mainloop_46 has illegal signature "Lpypy/ook-jit2/Tape_53;" at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:634) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at java.net.URLClassLoader.access$000(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:212) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at pypy.run_39.invoke(run_39.j:113) at pypy.entry_point_38.invoke(entry_point_38.j:74) at pypy.Main.main(Main.j:40)
tape_0 なんてシグネチャねーよと怒られてしまいました。
まあ、 jit 付ける前は動いたようですし、いいんじゃないでしょうか。
CLI も試してみる
折角なので cli も試してみます。
$ ~/files/pypy/translate.sh --backend=cli ook.py [version:WARNING] Errors getting Mercurial information: command does not identify itself as Mercurial [platform:msg] Setting platform to 'host' cc=None [translation:info] Translating target as defined by ook [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/gcctest.c -o /tmp/usession-unknown-7/gcctest.o [platform:execute] gcc /tmp/usession-unknown-7/gcctest.o -pthread -lrt -o /tmp/usession-unknown-7/gcctest [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_0.c -o /tmp/usession-unknown-7/platcheck_0.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_0.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_0 [translation] translate.py configuration: [translation] [translate] [translation] targetspec = ook [translation] translation configuration: [translation] [translation] [translation] backend = cli [translation] [backendopt] [translation] clever_malloc_removal = False [translation] constfold = False [translation] continuation = False [translation] gc = boehm [translation] gcremovetypeptr = False [translation] gcrootfinder = n/a [translation] gctransformer = boehm [translation] list_comprehension_operations = True [translation] type_system = ootype [translation] withsmallfuncsets = 5 [translation:info] Annotating&simplifying... [translation:info] with policy: pypy.annotation.policy.AnnotatorPolicy [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_1.c -o /tmp/usession-unknown-7/platcheck_1.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_1.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_1 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_2.c -o /tmp/usession-unknown-7/platcheck_2.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_2.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_2 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_3.c -o /tmp/usession-unknown-7/platcheck_3.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_4.c -o /tmp/usession-unknown-7/platcheck_4.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_5.c -o /tmp/usession-unknown-7/platcheck_5.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_5.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_5 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_6.c -o /tmp/usession-unknown-7/platcheck_6.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_6.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_6 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_7.c -o /tmp/usession-unknown-7/platcheck_7.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_7.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_7 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_8.c -o /tmp/usession-unknown-7/platcheck_8.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_8.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_8 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_9.c -o /tmp/usession-unknown-7/platcheck_9.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_9.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_9 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_10.c -o /tmp/usession-unknown-7/platcheck_10.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_11.c -o /tmp/usession-unknown-7/platcheck_11.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_11.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_11 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_12.c -o /tmp/usession-unknown-7/platcheck_12.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_12.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_12 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_13.c -o /tmp/usession-unknown-7/platcheck_13.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_13.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_13 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused -I/home/shoma/files/pypy/pypy/translator/c /tmp/usession-unknown-7/platcheck_14.c -o /tmp/usession-unknown-7/platcheck_14.o [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused -I/home/shoma/files/pypy/pypy/translator/c /tmp/usession-unknown-7/module_cache/module_0.c -o /tmp/usession-unknown-7/module_cache/module_0.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_14.o /tmp/usession-unknown-7/module_cache/module_0.o -pthread -Wl,--export-dynamic,--version-script=/tmp/usession-unknown-7/dynamic-symbols-0 -lrt -o /tmp/usession-unknown-7/platcheck_14 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_15.c -o /tmp/usession-unknown-7/platcheck_15.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_15.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_15 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_16.c -o /tmp/usession-unknown-7/platcheck_16.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_16.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_16 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_17.c -o /tmp/usession-unknown-7/platcheck_17.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_17.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_17 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_18.c -o /tmp/usession-unknown-7/platcheck_18.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_18.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_18 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_19.c -o /tmp/usession-unknown-7/platcheck_19.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_19.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_19 [platform:execute] gcc -c -O3 -pthread -fomit-frame-pointer -Wall -Wno-unused /tmp/usession-unknown-7/platcheck_20.c -o /tmp/usession-unknown-7/platcheck_20.o [platform:execute] gcc /tmp/usession-unknown-7/platcheck_20.o -pthread -lrt -o /tmp/usession-unknown-7/platcheck_20 +++++++++++++* [translation:info] -- someobjectness 0% (0 of 14 functions polluted by SomeObjects) [translation:info] ootyping... +++++++++++++**********************%%%%%%%%% [rtyper] specializing: 100 / 204 blocks (49%) [rtyper] specializing: 200 / 204 blocks (98%) [rtyper] -=- specialized 204 blocks -=- +++ [rtyper] -=- specialized 8 more blocks -=- [translation:info] ootype back-end optimisations... [backendopt:inlining] phase with threshold factor: 32.4 [backendopt:inlining] heuristic: pypy.translator.backendopt.inline.inlining_heuristic +++++++++++++**********************%%%%%%%%% [backendopt:inlining] inlined 75 callsites. [backendopt:malloc] starting malloc removal ++++ [backendopt:malloc] removed 6 simple mallocs in total [backendopt:mergeifblocks] starting to merge if blocks [translation:info] Generating CLI source... [cli] Compiling query.exe [cli] Compiling main.exe [cli] Compiling pypylib.dll +++++ [rtyper] -=- specialized 10 more blocks -=- [translation:info] Wrote /tmp/usession-unknown-7/main.il [translation:info] Compiling CLI source... [translation:info] Compiled /tmp/usession-unknown-7/main.exe [Timer] Timings: [Timer] annotate --- 8.7 s [Timer] rtype_ootype --- 3.4 s [Timer] backendopt_ootype --- 1.1 s [Timer] source_cli --- 9.4 s [Timer] compile_cli --- 1.1 s [Timer] ========================================= [Timer] Total: --- 23.7 s
はい、コンパイルできました。
で、実行します。
$ ./ook-cli samples/helloworld.ook Hello, world!
はい、事も無げに動きやがりました。
うーん、 64bit 環境でのテストが足りないのかな。