mrubyでC使う? Cでmruby使う?
-
Upload
bizan-nishimura -
Category
Technology
-
view
705 -
download
5
Transcript of mrubyでC使う? Cでmruby使う?
Kansai.mrb 2014 Dec
西村備山(@lipoyang)
mrubyでC使う? Cでmruby使う?
自己紹介
西村備山 (@lipoyang)
mrubyは一昨日はじめたばかり
僕は組込み屋
・C/C++で文字列の切り貼り
・C/C++でWebサーバ
・C/C++でWeb APIを実装
・C/C++ でJSON解析
・C/C++ で暗号化/復号 etc.
C/C++めんどくさい
mruby使いたいけど…
末長く使えるプラットフォーム
→ ポーティングする苦労の甲斐あり
GR-SAKURA や Wakayama.rbボード
たいていの組込み系のターゲット
まいどまいど特注仕様
→ 誰がI/O周りポーティングしてくれるん?
C + mruby で行こう!
C mruby
リアルタイム性
H/Wまわり テキスト 処理
Web系
柔軟性
抽象度
+
どっちを主体に?
mrubyでC使う?
Cでmruby使う?
どっちを主体に?
mrubyでC使う?
Cでmruby使う? まず実務に導入しやすいのはこちら?
書いてみたが…
require ’base64’ # Base64エンコード def myBase64Encode str return Base64.encode64(str) end # Base64デコード def myBase64Decode str return Base64.decode64(str) end
hoge.rb
requireがない!
じゃあ、
どうやってライブラリを
ロードするの?
build_config.rb
MRuby::Build.new do |conf|
toolchain :gcc
enable_debug
conf.bins = %w(mrbc mruby mirb)
conf.gembox 'default'
conf.gem :git => 'https://github.com/iij/mruby-io.git'
conf.gem :git => 'https://github.com/mattn/mruby-json.git'
conf.gem :git => 'https://github.com/mattn/mruby-base64.git'
end
動的にrequireするんじゃなく
mrubyのビルド時に抱き込む
サンプル(mruby側)
# Base64エンコード def myBase64Encode str return Base64.encode(str) end # Base64デコード def myBase64Decode str return Base64.decode(str) end
myBase64.rb
サンプル(C言語側)
#include "mruby.h" #include "mruby/string.h" #include "mruby/proc.h" #include "mruby/compile.h" int main(void){
mrb_state* mrb = mrb_open(); FILE* f = fopen("myBase64.rb", "r"); mrb_load_file(mrb, f); fclose(f); ・・・ mrb_close(mrb); return 0;
}
hoge.c(抜粋)
サンプル(C言語側)
char plain[] = "Hello, world!"; printf("Plain Text = %s¥n", plain); mrb_value arg = mrb_str_new_cstr(mrb, plain); mrb_value ret = mrb_funcall( mrb, mrb_top_self(mrb), "myBase64Encode", 1, arg); char *encoded = mrb_str_to_cstr(mrb, ret); printf("Encoded Text = %s¥n", encoded); arg = mrb_str_new_cstr(mrb, encoded); ret = mrb_funcall( mrb, mrb_top_self(mrb), "myBase64Decode", 1, arg); char *decoded = mrb_str_to_cstr(mrb, ret); printf("Decoded Text = %s¥n", decoded);
hoge.c(抜粋)
コンパイルと実行
$ ln -s ~/tool/mruby ./mruby $ gcc -Imruby/include -Imruby/src hoge.c mruby/build/host/lib/libmruby.a -lm $ ./a.out Plain Text = Hello, world! Encoded Text = SGVsbG8sIHdvcmxkIQ== Decoded Text = Hello, world!
おしまい
型 C→mruby mruby→C
整数 mrb_fixnum_value mrb_fixnum
浮動小数点 mrb_float_value mrb_float
文字列 mrb_str_new_cstr mrb_str_to_cstr
型変換のAPI? (調査中)