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() は 64bit だけど、 JVM 上の int は 32bit 固定だからそこら辺でなんかおかしいんじゃねーの?』
という感じで締められています。

そして、 [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 環境でのテストが足りないのかな。

まとめ

  • JVM, CLI のバックエンドは Linux 32bit 環境だと割とまともに動くっぽい?
  • 64bit 環境は鬼門
  • Windows も鬼門っぽい

なんだか釈然としませんが以上です。

あと、折角コンパイルできたのでバイナリは以下に置いておきます。
ook-jvm.tgz
ook-cli.tgz