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? (調査中)

mrubyでC使う? Cでmruby使う?