LuaJIT-tcc 学習:利用法まとめ

2017-05-20 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-05-13)の記事「LuaJIT-tcc:例題から学習」で、
幾つかのパターンについて学習したが、
その後の学習結果を含め、“tcc.lua”の利用パターンをまとめた。


最初に、'tcc.lua' モジュールを解読(?)した結果から、・・・・・

'libtcc.dll' の内部にある関数は以下の19個か?
TCCState* tcc_new( void );
void tcc_delete( TCCState* s );
void tcc_set_lib_path( TCCState* s, const char* path );
void tcc_set_error_func( TCCState* s, void* error_opaque, void ( *error_func )( void* opaque, const char* msg ) );
int tcc_set_options( TCCState* s, const char* str );
int tcc_add_include_path( TCCState* s, const char* pathname );
int tcc_add_sysinclude_path( TCCState* s, const char* pathname );
void tcc_define_symbol( TCCState* s, const char* sym, const char* value );
void tcc_undefine_symbol( TCCState* s, const char* sym );
int tcc_add_file( TCCState* s, const char* filename );
int tcc_compile_string( TCCState* s, const char* buf );
int tcc_set_output_type( TCCState* s, int output_type );
int tcc_add_library_path( TCCState* s, const char* pathname );
int tcc_add_library( TCCState* s, const char* libraryname );
int tcc_add_symbol( TCCState* s, const char* name, const void* val );
int tcc_output_file( TCCState* s, const char* filename );
int tcc_run( TCCState* s, int argc, char* *argv );
int tcc_relocate( TCCState* s1, void* ptr );
void* tcc_get_symbol( TCCState* s, const char* name );
これに対して、
'tcc.lua' が公開している関数は19個で、
大半(以下の14)は右から左:
TCCState* tcc_new()
void tcc_delete( s )
void tcc_set_lib_path( s, path )
void tcc_set_error_func( s, opaque, error_func )
int tcc_set_options( s, str )
int tcc_add_include_path( s, pathname )
int tcc_add_sysinclude_path( s, pathname )
void tcc_define_symbol( s, sym, value )
void tcc_undefine_symbol( s, sym )
int tcc_add_file( s, filename )
int tcc_compile_string( s, buf )
int tcc_add_library_path( s, pathname )
int tcc_add_library( s, libraryname )
int tcc_output_file( s, filename )
だが、
以下の5つでは若干の処理を行っている。
set_output_type( s, type )         -- 第2引数は、変換している
relocate( s, ptr ) -- 第2引数は、変換している
add_symbol( s, name, val, ctype ) -- 第3、4引数で処理をしている
get_symbol( s, name, ctype ) -- 第3引数で処理をしている
run( s, t ) -- 第2引数で処理をしている
'libtcc.dll' 直接使用では、
追加の処理が必要。

それで、 <紙>が欲しいのは以下の9個かナ?
TCCState* tcc_new( void );
void tcc_delete( TCCState* s );
int tcc_set_output_type( TCCState* s, int output_type );
int tcc_add_file( TCCState* s, const char* filename );
int tcc_add_symbol( TCCState* s, const char* name, const void* val );
int tcc_compile_string( TCCState* s, const char* buf );
int tcc_relocate( TCCState* s1, void* ptr );
int tcc_output_file( TCCState* s, const char* filename );
void* tcc_get_symbol( TCCState* s, const char* name );
以上を使ったもののまとめ。


初めに、単に DLL ファイルを作るパターンについて、・・・・・
これは、
先日の記事の(2)DLL ファイル( 'k_lib.dll' )を作るパターン

“Add”関数1つを定義した“k_lib.dll”を作る場合:
-------- make_dll.gsl -----------
tcc = require'tcc' ('libtcc')
TCL = tcc.new()
TCL:set_output_type( 'output_dll' )

-- ===== Cコード ===============
TCL:compile_string[[
#include <windows.h>
#define DLLExport __declspec ( dllexport )
DLLExport int Add( int x, int y ){
return x + y;
}
]]
TCL:output_file( 'k_lib.dll' )
TCL:delete()
とする。


次に、Cコードをコンパイルして即時に実行するパターン

当面考えられる全てのパターンを集めた場合を考える。

即ち、Cコードで、SUB 関数を定義し、即時に実行する。

この時、SUB 関数は、
パターンA:C の AAA 関数を呼ぶ
パターンX:Lua の 標準関数(例:math.sin)を呼ぶ
パターンB:Lua の 自作 BBB 関数を呼ぶ
パターンC:既存DLL にある CCC 関数を呼ぶ
これらのパターンを含めるとすると、
----- 以下2行は必須。
tcc = require'tcc' ('libtcc')
TCL = tcc.new()
----------

-- function BBB( x ) return ~ end -- 関数定義 -- パターンB の場合

TCL:set_output_type( 'output_memory' )

-- TCL:add_file( 'k_lib.dll' ) 既存 DLL ファイル -- パターンC の場合

-- TCL:add_symbol( 'BBB', BBB, 'int(*)( int, int )' ) -- パターンB の場合

-- TCL:add_symbol( 'sin', math.sin, 'double(*)(double)' ) -- パターンX の場合

TCL:compile_string [[

// -- double sin( double ) -- プロトタイプ宣言 -- パターンX の場合

// -- ここに、CCC 関数 のプロトタイプ宣言 -- パターンC の場合

// -- ここに、AAA 関数定義の Cコード -- パターンA の場合

double SUB( double x, double y ){ // SUB 関数のコード

double z;

// 各パターン( A, X, B, C ) の関数を利用するCコード

return z;
}
]]

TCL:relocate( 'relocate_auto' )
SUB = TCL:get_symbol( 'SUB', 'double(*)( double, double )' )

----- ここで、SUB を使う LuaJIT のコード

以上。
些か分かりにくいかナ?



ここで、パターンC の場合 に、
add_file 関数で指定するファイル名は、
既存の DLL ファイルの方が良かった。
つまり、
以前(2017-05-13)の記事「LuaJIT-tcc:例題から学習」の様に、
def ファイルを指定すると、
両方のファイルが必要となってしまう。


本日はここまで。


luajit-tcc 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170406,19
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク