ジュード・ジ・オブスキュアの香りは最高
一ヶ月ほど前に、またまたバラの家でジュード・ジ・オブスキュア(Jude the obsure)とルージュ・ピエール・ドゥ・ロンサール(Rouge Pierre de Ronsard)を買ってしまいました。届いた苗は丈が50cm以上もあるしっかりとした苗で、蕾もたくさん付けていました。いつもながら、バラの家から届く苗はとても状態が良く、安心できます。
もう、どちらのバラも花が咲ききってしまったのですが、ジュード・ジ・オブスキュアの香りがとても良かったので、日記に書き留めたくなりました。花の色は写真の通り杏色、5cmくらいのカップ咲きで、とにかく香りが強く、花に鼻を近づけると濃厚な甘い香りが漂ってきます。これだけ香りが強いなら、花びらをポプリにしても良いかも知れませんね。また、花もちもそこそこ良く4〜5日は楽しめます。チョット枝ぶりが華奢なのが玉に瑕ですが。
一方、ルージュ・ピエール・ドゥ・ロンサールは、なんと言っても花の赤色がきれいです。それが房咲きになるので、なんともリッチな気分になります。香りはチョット弱いかな。枝ぶりがとてもよく、丈夫そうなので、花が終わった枝で挿し木にトライしてみようと思います。
「実践プログラミングDSL」が出版された!
翔泳社から「実践プログラミングDSL」が出版されたようですね。これって、Manning社の「DSLs in Action」の翻訳本ですよね。う〜む、Manningで原本のeBookを購入したけど全然読んでなかった。確かJava,Scala,Clojure,Ruby,Groovyの5言語でのDSLのインプリメントに触れているとの事で、特にそのころClojureに興味があったのでディスカウントクーポンを利用して手に入れたのに‥‥時間を見つけて読まなきゃね。
ところで、翻訳本のこの表紙って何をイメージしてるんでしょうね? 原本のパイプを加えたオヤジの方が親しみがあって良いように思うのですが*1。
実践プログラミングDSL ドメイン特化言語の設計と実装のノウハウ (Programmer’s SELECTION)
- 作者: Debasish Ghosh,佐藤竜一
- 出版社/メーカー: 翔泳社
- 発売日: 2012/06/08
- メディア: 大型本
- 購入: 4人 クリック: 82回
- この商品を含むブログ (13件) を見る
軽量RubyをVisual C++でビルドしてみました
軽量RubyのファイルセットにCMakeの環境が準備されたようなので、Visual C++ 2008*1でのビルドにトライしてみました。
下準備しましょう
まず最初に、必要なツール類をネットから集めましょう。
- CMake ⇒ CMake - Cross Platform Make の"Windows (Win32 Installer)"
- Bison ⇒ Bison for Windows の"Complete package, except sources"
- stdint.h ⇒ http://code.google.com/p/msinttypes/downloads/list の"msinttypes-r26.zip"
CMakeとBisonはインストーラー付きなので、ダウンロードしたファイルを実行してPCにインストールします。stdint.hはダウンロードしたzipファイルを適当なフォルダ(下の例ではC:\home\shozo\CPP\msinttypes)に解凍して、そのフォルダをVisual C++のインクルード・サーチPATHに加えておきます。
CMakeでビルド環境を構築しよう
下準備ができたら早速CMakeを起動しましょう。下の様なダイアログが表示されるので、
- Where is the source code: に mrubyのファイルセットのルートフォルダ
- Where to build the binaries: に mruby/build フォルダ
ツールセットの選択の問合せには、"Visual Studio 9 2008"を選択、"Use default native compilers"をチェックして、[Finish]ボタンをプッシュします。
ツールセットの問合せに答えると、おもむろにConfigureが始まります。一回目のConfigureが終わると、下のように未完了の項目が赤色で表示されますが、迷わずもう一度[Configure]ボタンをプッシュしましょう。
二回目のConfigureでVisual C++向けの設定はOKとなります(下図)。あと一息です。
Visual C++のプロジェクトファイルを作りましょう。と言っても、[Generate]ボタンをプッシュするだけです。Generateが終わると、先ほどの"Where to build the binaries"に設定したフォルダに、mrubyのファイルセットのコピーと共にVisual C++のプロジェクトファイルが出来上がっています。
CMakeでの作業はこれで終わりです。
さぁ、ビルドにトライ
CMakeでビルド環境の構築が終わると、"mruby\build"フォルダに次の3つのプロジェクトが出来上がっています。
- ALL_BUILD - コンパイル/リンクを実行しmruby\toolsの下のmrbc、mruby、mirbの各コマンドをビルドします
- INSTALL - ALL_BUILDでビルドした各コマンドをmruby\binフォルダにインストールします
- PACKAGE - bin、include、libフォルダを圧縮し配布用パッケージを作ります
さぁ、ビルドにトライしましょう。ALL_BUILDプロジェクトをダブルクリックしてVisual Studioを起動します。"ソリューション エクスプローラー"のペインでALL_BUILDを選択してビルドします。いくつかワーニングが出ましたが、無事ビルドは成功しました。出来上がった実行形式(コマンド)は、mruby\toolsの下のそれぞれのフォルダのDebugフォルダの中にあります。INSTALLプロジェクトを実行すると、これらのコマンドがmruby\binにコピーされます。
おっと、Bisonは出番がなかったのでしょうか? Bisonは人知れずCMakeの作業の中で呼ばれていたようです。
ミュリエル・ロバンが咲いていました
先日、福岡の自宅に戻ったら、今年手に入れたミュリエル・ロバンが咲いていました。妻の話によるといくつも花が咲いたそうで、これが最後の花のようです。花の形もさることながら、紫っぽい色合いがとても個性的です。深い緑色の葉から期待する濃い花の色を見事に裏切ってくれるおもしろいバラです。名前の由来はフランスのユーモリストMuriel Robinさんのようです。ユーモリストですか、なるほどね。
ARMマイコンに軽量Rubyを(その2)
ちょっと寄り道
暫くmrubyの総本山GitHubを訪れていなかったのですが、おや! "mirb"と言うインタラクティブRuby Shellが追加されてますね。Cygwin下では tools/mirb/mrib.exeを実行すると、入力プロンプトが表示され、Rubyプログラムをインタラクティブに実行できるようです。
$ ./tools/mirb/mirb.exe mirb - Embeddable Interactive Ruby Shell This is a very early version, please test and report errors. Thanks :) > print "Hello" Hello => nil
その他に変わったところは、srcディレクトリにmath.c,time.cが追加された、testスイートのディレクトリが用意された、そしてMakefileが整理されたといったところでしょうか。
最初の一歩はビルドスクリプトから
さて、ARMマイコンへのポーティングは遅々として進んでいませんが、まずはMakefileを調べてビルドのファイル依存関係を整理してみました。ビルドツールにmakeを選ぶと、大概Makefileの中身がマクロだらけになるので、私的には好きになれないんですよね。
lib/libmruby.a: array.c ascii.c cdump.c class.c codegen.c compar.c crc.c dump.c encoding.c enum.c error.c etc.c gc.c hash.c init.c init_ext.c kernel.c load.c math.c numeric.c object.c pool.c print.c proc.c range.c re.c regcomp.c regenc.c regerror.c regexec.c regparse.c sprintf.c st.c state.c string.c struct.c symbol.c time.c transcode.c unicode.c us_ascii.c utf_8.c variable.c version.c vm.c init_mrblib.c parse.y ; tools/mrbc/mrbc.exe: mrbc.c lib/libmruby.a ; tools/mruby/mruby.exe: mruby.c init_mrblib.c array.rb compar.rb enum.rb error.rb hash.rb kernel.rb numeric.rb print.rb range.rb string.rb struct.rb lib/libmruby.a ; tools/mirb/mirb.exe: mirb.c init_mrblib.c array.rb compar.rb enum.rb error.rb hash.rb kernel.rb numeric.rb print.rb range.rb string.rb struct.rb lib/libmruby.a ;
この依存関係を、私のお気に入りのビルドツールFTJam*1で書き換えると次のようになります。ねっ、スッキリするでしょ‥‥そーでもないか :-p
mruby/Jamfile
SubDir PROJ ; # # アプリケーション依存のコマンド・オプション指定 # if $(OS) = CYGWIN { PRE = CY_ ; CCFLAGS += -Wall -Werror-implicit-function-declaration ; OPTIM = -g -O3 ; NOARSCAN = true ; CAT ?= cat ; } # # カスタム・ルール # *.rb => *.c rule Mrbc { local _t = [ FGristSourceFiles $(<) ] ; local _r = [ FAppendSuffix mrbc : $(SUFEXE) ] ; Depends $(_t) : $(_r) $(>) ; Mrbc1 $(_t) : $(_r) $(>) ; Clean clean : $(_t) ; } rule Mrbc1 { MakeLocate $(<) : $(LOCATE_SOURCE) ; SEARCH on $(>) = $(SEARCH_SOURCE) ; } actions Mrbc1 { $(CAT) $(>[2-]) > mrblib_tmp.rb $(>[1]) -Bmrblib_irep -o$(<) mrblib_tmp.rb $(RM) mrblib_tmp.rb } # # ビルドスクリプト # HDRS = include src ; MRBDIR = mrblib ; BINDIR = bin ; LIB = lib/libmruby ; SubInclude PROJ src ; SubInclude PROJ mrblib ; SubInclude PROJ tools mrbc ; SubInclude PROJ tools mruby ; SubInclude PROJ tools mirb ;
src/Jamfile
SubDir PROJ src ; Library $(LIB) : array.c ascii.c cdump.c class.c codegen.c compar.c crc.c dump.c encoding.c enum.c error.c etc.c gc.c hash.c init.c init_ext.c kernel.c load.c math.c numeric.c object.c pool.c print.c proc.c range.c re.c regcomp.c regenc.c regerror.c regexec.c regparse.c sprintf.c st.c state.c string.c struct.c symbol.c time.c transcode.c unicode.c us_ascii.c utf_8.c variable.c version.c vm.c parse.y ;
mrblib/Jamfile
SubDir PROJ mrblib ;
Library $(LIB) :
init_mrblib.c
;
tools/mrbc/Jamfile
SubDir PROJ tools mrbc ; Main mrbc : mrbc.c ; LinkLibraries mrbc : $(LIB) ; InstallBin $(BINDIR) : mrbc ;
tools/mruby/Jamfile
SubDir PROJ tools mruby ; SEARCH_SOURCE += $(MRBDIR) ; Mrbc mrblib_irep.c : array.rb compar.rb enum.rb error.rb hash.rb kernel.rb numeric.rb print.rb range.rb string.rb struct.rb ; Main mruby : mruby.c mrblib_irep.c ; LinkLibraries mruby : $(LIB) ; InstallBin $(BINDIR) : mruby ;
tools/mirb/Jamfile
SubDir PROJ tools mirb ; SEARCH_SOURCE += $(MRBDIR) ; Mrbc mrblib_irep.c : array.rb compar.rb enum.rb error.rb hash.rb kernel.rb numeric.rb print.rb range.rb string.rb struct.rb ; Main mirb : mirb.c mrblib_irep.c ; LinkLibraries mirb : $(LIB) ; InstallBin $(BINDIR) : mirb ;
ARMマイコンに軽量Rubyを(その1)
CQ出版の雑誌インターフェース2012年6月号にARMマイコンの付録がついていたので、これにmrubyをポーティングできないかトライすることにしました。
付属FM3マイコン基板特設ページ|Interface
まずはコンパイラ等の開発環境を揃える必要があります。インターフェース6月号ではgccではなく*1、市販品のKEIL MDK-ARMとIARの評価版が紹介されています。私のPC環境(Windows XP)では、IARの30日限定版しか上手くインストールできなかったので、これを使うことにしました。
コンパイル環境を整え、エイッやぁ〜とmrubyのvm.cをコンパイルしてみました...みごとにコンパイル・エラーします。エラーの原因は、
です。前者はvm.c内にあるDIRECT_THREADEDシンボルの#defineをコメントアウトすればOKです*2。
304 //#define DIRECT_THREADED <-- ここをコメント・アウト 305 #ifndef DIRECT_THREADED 306 307 #define INIT_DISPACTH for (;;) { i = *pc; switch (GET_OPCODE(i)) { 308 #define CASE(op) case op: 309 #define NEXT mrb->arena_idx = ai; pc++; break 310 #define JUMP break 311 #define END_DISPACTH }}
後者は、正しくはターゲット・ボードに合わせたI/Oをインプリメントすべきですが、該当のコードはエラーメッセージの出力なので、今日のところはコメント・アウトすることにします。
さて、コンパイル結果のオブジェクト・ファイルのサイズですが、最適化を掛けなけれ仮想マシン・コアvm.oで約28KBでした。仮想マシン・コアだけでは文字列や正規表現の処理、クラス機能等は全く無く使いものにならないので、オブジェクトのサイズを睨みながら必要な機能を追加していくことになります。
はてさて、予想通りメモリ容量とのシビアな戦いになりそうです。
果たしてゴールに辿り着けるのでしょうか。
(つづく)