17
Kansai.mrb 2014 Dec 西村備山(@lipoyang) mrubyでC使う? Cでmruby使う?

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

Embed Size (px)

Citation preview

Page 1: mrubyでC使う? Cでmruby使う?

Kansai.mrb 2014 Dec

西村備山(@lipoyang)

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

Page 2: mrubyでC使う? Cでmruby使う?

自己紹介

西村備山 (@lipoyang)

Page 3: mrubyでC使う? Cでmruby使う?

mrubyは一昨日はじめたばかり

Page 4: mrubyでC使う? Cでmruby使う?

僕は組込み屋

・C/C++で文字列の切り貼り

・C/C++でWebサーバ

・C/C++でWeb APIを実装

・C/C++ でJSON解析

・C/C++ で暗号化/復号 etc.

Page 5: mrubyでC使う? Cでmruby使う?

C/C++めんどくさい

Page 6: mrubyでC使う? Cでmruby使う?

mruby使いたいけど…

末長く使えるプラットフォーム

→ ポーティングする苦労の甲斐あり

GR-SAKURA や Wakayama.rbボード

たいていの組込み系のターゲット

まいどまいど特注仕様

→ 誰がI/O周りポーティングしてくれるん?

Page 7: mrubyでC使う? Cでmruby使う?

C + mruby で行こう!

C mruby

リアルタイム性

H/Wまわり テキスト 処理

Web系

柔軟性

抽象度

Page 8: mrubyでC使う? Cでmruby使う?

どっちを主体に?

mrubyでC使う?

Cでmruby使う?

Page 9: mrubyでC使う? Cでmruby使う?

どっちを主体に?

mrubyでC使う?

Cでmruby使う? まず実務に導入しやすいのはこちら?

Page 10: 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

Page 11: mrubyでC使う? Cでmruby使う?

requireがない!

じゃあ、

どうやってライブラリを

ロードするの?

Page 12: mrubyでC使う? Cでmruby使う?

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のビルド時に抱き込む

Page 13: mrubyでC使う? Cでmruby使う?

サンプル(mruby側)

# Base64エンコード def myBase64Encode str return Base64.encode(str) end # Base64デコード def myBase64Decode str return Base64.decode(str) end

myBase64.rb

Page 14: mrubyでC使う? Cでmruby使う?

サンプル(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(抜粋)

Page 15: mrubyでC使う? Cでmruby使う?

サンプル(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(抜粋)

Page 16: mrubyでC使う? Cでmruby使う?

コンパイルと実行

$ 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!

Page 17: mrubyでC使う? Cでmruby使う?

おしまい

型 C→mruby mruby→C

整数 mrb_fixnum_value mrb_fixnum

浮動小数点 mrb_float_value mrb_float

文字列 mrb_str_new_cstr mrb_str_to_cstr

型変換のAPI? (調査中)