2010年06月17日

組み込み向け Python バイトコード実行環境 PyMite

hik さんのコメント で存在を知りました。ありがとうございます。

python-on-a-chip プロジェクトの成果物のようです。これは一言でいうと、組み込み向けの Python VM で、ROM 化のためのしくみ (Python ライブラリのバイナリイメージ、あるいはそれをバイト配列で表現した C コードを生成するしくみ) なども含んでいるようです。

README を読んでみると、最小要求 AVR などの 8 bit MPU、64 KiB フラッシュメモリ、4 KiB RAM からのターゲット上で、OS レスで Python 2.5 (のサブセット文法に相当するバイトコード) が動くそうです。ライセンスは GPL v2。

PC 上でも動くようなので、とりあえずビルドして動かしてみます。



cygwin でビルドできると書いてありますが、いつものように手元の MinGW + MSYS 環境で試してみます。

ここから pymite-08.tar.gz をダウンロードして展開します。

pymite-08/src/platform/desktop/plat.c で signal.h が使われていますが、手元の環境ではこのヘッダの関数 (signal()/ualarm()) が使えなかったので適当にコメントアウト ※ しました。

※ 1000 マイクロ秒ごとに SIGALRM とありますが、PC 上ならば定期的にハンドラが動けば十分だと思いますので、Win32 API の SetTimer() などで代替できると思います。今は実験的に PC 上で動かしてみるだけなので、とりあえず置いておきます。

また、/usr/bin/env なども MSYS には無いので、pymite-08/src/tools 以下の pmImgCreatoor.py や ipm.py などの Python スクリプトの先頭の shebang を、Python26 の python.exe の絶対パス (/c/Python26/python.exe) に書き換えました。

ちなみにこれらの Python スクリプトは、ROM 化可能な Python のライブラリイメージの生成などに使用されるようです。

後は普通にビルドして実行できました。make ipm で、ビルド後に interactive PyMite (ipm) の REPL (Read-Eval-Print Loop) が立ち上がります。

aloha@WAKATSUKI /c/work/pymite/pymite-08
$ CC=gcc make ipm
make -C src/platform/desktop
make[1]: Entering directory `/c/work/pymite/pymite-08/src/platform/desktop'
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o main.o main.c
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o plat.o plat.c
../../tools/pmImgCreator.py -c -u -o main_img.c --native-file=main_nat.c main.py

gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o main_nat.o main_nat.c
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o main_img.o main_img.c
make -C ../../vm
make[2]: Entering directory `/c/work/pymite/pymite-08/src/vm'
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o codeobj.o codeobj.c
ar rcs libpmvm_desktop.a codeobj.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o dict.o dict.c
ar rcs libpmvm_desktop.a dict.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o float.o float.c
ar rcs libpmvm_desktop.a float.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o frame.o frame.c
ar rcs libpmvm_desktop.a frame.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o func.o func.c
ar rcs libpmvm_desktop.a func.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o global.o global.c
ar rcs libpmvm_desktop.a global.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o heap.o heap.c
ar rcs libpmvm_desktop.a heap.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o img.o img.c
ar rcs libpmvm_desktop.a img.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o int.o int.c
ar rcs libpmvm_desktop.a int.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o interp.o interp.c
ar rcs libpmvm_desktop.a interp.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o list.o list.c
ar rcs libpmvm_desktop.a list.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o mem.o mem.c
ar rcs libpmvm_desktop.a mem.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o module.o module.c
ar rcs libpmvm_desktop.a module.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o obj.o obj.c
ar rcs libpmvm_desktop.a obj.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o pm.o pm.c
ar rcs libpmvm_desktop.a pm.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o seglist.o seglist.c
ar rcs libpmvm_desktop.a seglist.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o seq.o seq.c
ar rcs libpmvm_desktop.a seq.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o sli.o sli.c
ar rcs libpmvm_desktop.a sli.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o strobj.o strobj.c
ar rcs libpmvm_desktop.a strobj.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o thread.o thread.c
ar rcs libpmvm_desktop.a thread.o
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o tuple.o tuple.c
ar rcs libpmvm_desktop.a tuple.o
../tools/pmImgCreator.py -c -s --memspace=flash -o pmstdlib_img.c --native-file=
pmstdlib_nat.c ../lib/list.py ../lib/dict.py ../lib/__bi.py ../lib/sys.py ../lib
/string.py ../lib/ipm.py
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o pmstdlib_img.o pmstdlib_img.c
ar rcs libpmvm_desktop.a pmstdlib_img.o
../tools/pmImgCreator.py -c -s --memspace=flash -o pmstdlib_img.c --native-file=
pmstdlib_nat.c ../lib/list.py ../lib/dict.py ../lib/__bi.py ../lib/sys.py ../lib
/string.py ../lib/ipm.py
gcc -Os -Wall -gstabs -Wstrict-prototypes -Werror -I../../vm  -I/c/work/pymite/p
ymite-08/src/platform/desktop   -c -o pmstdlib_nat.o pmstdlib_nat.c
ar rcs libpmvm_desktop.a pmstdlib_nat.o
rm pmstdlib_nat.c pmstdlib_img.o frame.o func.o module.o pmstdlib_img.c tuple.o
pm.o codeobj.o dict.o mem.o sli.o heap.o seglist.o pmstdlib_nat.o list.o global.
o thread.o strobj.o int.o float.o obj.o seq.o img.o interp.o
make[2]: Leaving directory `/c/work/pymite/pymite-08/src/vm'
gcc -o main.out main.o plat.o main_nat.o main_img.o ../../vm/libpmvm_desktop.a
make[1]: Leaving directory `/c/work/pymite/pymite-08/src/platform/desktop'
cd src/tools && ./ipm.py -d
PyMite is Copyright 2002 Dean Hall.  See LICENSE for details.
This software is licensed under the GNU GPL Version 2 with NO WARRANTY.
Type the Python code that you want to run on the target device.
If you see no prompt, type two consecutive returns to exit multiline mode.
Type Ctrl+C to interrupt and Ctrl+D to quit (or Ctrl+Z <enter> on Win32).
ipm> print "hello, world!\n"
hello, world!

ipm> make: *** [ipm] Interrupt

ipm は ipm.py スクリプトをホストの Python インタプリタで動かしています。任意の Python スクリプトを Python の compile メソッドでコンパイルして、生成されたバイトコードを PyMite VM にロードして実行しているようです。(VM の実体は src/platform/desktop/main.out で、プロセス間通信してるようですね。)

まだ構成がよくわかってないのですが、ターゲットの上で動かす場合も同様に、ライブラリが ROM 化された PyMite VM を動かしておいて、ホスト PC からシリアルコンソールなどでバイトコードを送り込んで実行するような形になるのでしょうか。確かにこれならば、ターゲット上でコンパイルなどの重い処理は不要になりますね。



トラックバックURL

コメント一覧

1. Posted by hik   2010年06月17日 12:26
さっそく取り上げて、いただきまして、ありがとうございます。
どんな application が動くか、どのようなデモがあるかを検討したり、
みて頂きまして、いけるかもしれない、ということでしたら、
VM interpreter 実装に必要な最低限の interface をみることに
なるかと思っていました。

llvm が 16 bit mode のようなものもあれば、いいのですが、
  あったと思ったときの妄想です。
  二段重ねになりますが、VM interpreter/C -> VM interpreter/LLVM
  (うまく t bar code がかけません :-) という c compiler を
  使って、compile しつつ、target 16 bit llvm interpreter を
  assembler で書く。
2. Posted by 若槻   2010年06月18日 11:02
> hik さん

16 bit ターゲットということになりますと、VM 層のオーバーヘッドが増える LLVM 的なアプローチは厳しいと思いますし、十分な効果も期待できないと思います。
(最初から最適化コンパイラや、人手によるチューニングを行う方が良さそう。)

LLVM 的なアプローチが有効になるのは、比較的リッチなターゲットだと思います。例えば iPhone が有名ですが、GPU の差異を吸収するために LLVM を採用するとか。

http://www.dodgson.org/omo/t/?date=20080119

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード