[ 戻る ]
VM Pluginへ戻る

プラグイン作成Tutorial

↑上記リンクをクリック!

プラグイン作成手順

ソースの記述

初期化・終了処理

VM Pluginロード時・アンロード時に行いたい初期化・終了処理は#initialiseModule,#shutdownModuleで実装します.

  • initialiseModule
    load時に呼び出される.callInitializersIn(sqNamedPrims.c)関数参照.falseで初期化失敗.
    initialiseModule
    	self export: true.
    	^true
    
  • shutdownModule
    unload時に呼び出される.shutdownModule(sqNamedPrims.c)関数参照.falseで初期化失敗.
    shutdownModule
    	self export: true.
    	^true
    

独自ヘッダを付けたい時

下記メソッドをプラグインクラスのクラス側に実装すると該モジュール名+'.h'をインクルードするようにCソースを生成する.

hasHeaderFile
	^true

後は自分でモジュール名+'.h'をエディターなどで作成します.

SmartSyntaxInterpreterPluginとInterpreterPluginとの違い

SmartSyntaxInterpreterPluginはInterpreterPluginより簡易にコーディングできます.具体的にInterpreterPluginは引数の処理および戻り値の処理を書く必要があります.例えば,InterpreterPluginから継承してFloatArrayのインスタンスを引数にもつ平均を求めるプリミティブメソッドを示します.黄色部分はSmartSyntaxInterpreterPluginから継承する場合必要がなくなります*1.

primitiveAverage
	| size floatObj aFloatArrayOop ave |
	
	self var: #floatObj declareC: 'float *floatObj'.
	self var: #ave declareC: 'double ave'.
	
	self cCode: '' inSmalltalk: [self halt.].
	aFloatArrayOop := interpreterProxy stackObjectValue: 0.
	size := interpreterProxy stSizeOf: aFloatArrayOop.
	floatObj := interpreterProxy cCoerce: (interpreterProxy firstIndexableField: aFloatArrayOop) to: 'float *'.
	ave := 0.
	0 to: size - 1 do: [ :idx |
		ave := ave + (floatObj at: idx)].
	ave := ave / size.
	interpreterProxy pop: 2.
	interpreterProxy pushFloat: ave.

VMMaker

VMMakerはSlangで記述したプリミティブメソッドをC言語に変換します.

ビルド

ビルドはディレクトリ\<インストールディレクトリ>\3.7.1\win32で次のバッチプログラムに引数<プラグイン名>.dllをつけて起動します.

build <プラグイン名>.dll

次にSqueakデフォルトディレクトリへ作成されたDLLをコピーします.

[TIPS]プラグインDLLをデフォルトディレクトリへコピー時にSqueakプロセスで使用しているためコピーが失敗する場合があります.この場合は下記Smalltalk式をdo itしてください.

Smalltalk unloadModule: '<プラグイン名>'.

補足

上記'build.bat'はmakeコマンドでメイクファイルMakefile.mingw32を使ってビルドしています.

Cygwin+mingw環境で作成したスタティックライブラリとのリンクも可能でした*2.GSL*3などを利用することも可能かもしれません.

[Cygwin+mingw]
gcc -o hoge.o -mwindows -c hoge.c
ar rc libhoge.lib hoge.o

AMD*4から出ているACML 2.5.0(AMD Core Math Library)をVM Plugin経由で呼び出すことに成功しました.


参考図書



コメント・つっこみ


*1 若干まじないが必要ですが...
*2 単純な関数のみなので全てOKかは不明です.
*3 GNU Scientific Library
*4 うちのPCがAMD Athlon XPなので

Last-modified: 2006-07-29 (土) 19:04:12 (4828d)