ジュード・ジ・オブスキュアの香りは最高

一ヶ月ほど前に、またまたバラの家ジュード・ジ・オブスキュア(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)

実践プログラミングDSL ドメイン特化言語の設計と実装のノウハウ (Programmer’s SELECTION)

*1:"in Action"シリーズは民族衣装を纏った人物のイラストが目印ですよね‥‥"Android in Action"の刺青って民族衣装かなぁ?

軽量RubyをVisual C++でビルドしてみました

軽量RubyのファイルセットにCMakeの環境が準備されたようなので、Visual C++ 2008*1でのビルドにトライしてみました。

下準備しましょう

まず最初に、必要なツール類をネットから集めましょう。

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 フォルダ

を設定して、[Configure]ボタンをプッシュします。

ツールセットの選択の問合せには、"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の作業の中で呼ばれていたようです。

*1:たぶんVisual C++ 2010でも同じ手順でOKかと。

ミュリエル・ロバンが咲いていました


先日、福岡の自宅に戻ったら、今年手に入れたミュリエル・ロバンが咲いていました。妻の話によるといくつも花が咲いたそうで、これが最後の花のようです。花の形もさることながら、紫っぽい色合いがとても個性的です。深い緑色の葉から期待する濃い花の色を見事に裏切ってくれるおもしろいバラです。名前の由来はフランスのユーモリストMuriel Robinさんのようです。ユーモリストですか、なるほどね。



他にも、プリンセス・ド・モナコやギー・サヴォアもこの初夏最後の花を咲かせていました。

クレア・オースチンが咲きました

待ち焦がれていたクレア・オースチンの花がやっと咲きました。

写真ではクリーム色に見えますが、実物はもっと白い花です。株がまだ若い為か、花の大きさは3〜4cmくらいの小輪の花でした。深いカップ咲きで、ほんのり香り、淡い緑の葉とのコントラストで愛らしく若々しい感じがします。

今のところ、病気もなくすくすくと育っています...ちょっと虫には齧られましたが。一番花は早めに摘み取り、株を大きく育てることにします。

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 ;

*1:C++の有名なライブラリBoostのビルドではJamをカスタマイズしたものが使われていたかと...

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をコンパイルしてみました...みごとにコンパイル・エラーします。エラーの原因は、

  1. gcc固有の機能を使ったDIRECT THREADEDのコード
  2. 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でした。仮想マシン・コアだけでは文字列や正規表現の処理、クラス機能等は全く無く使いものにならないので、オブジェクトのサイズを睨みながら必要な機能を追加していくことになります。

はてさて、予想通りメモリ容量とのシビアな戦いになりそうです。
果たしてゴールに辿り着けるのでしょうか。
(つづく)

*1:インターフェース7月号ではeclipse+gccの環境が紹介されるようです。

*2:コンパイルスイッチは設定専用のヘッダ・ファイルに分けるか、ビルドスクリプト/プロジェクト・ファイルの設定に入れるのが常套手段ですが...