SlideShare a Scribd company logo
1 of 33
Download to read offline
mruby を C# に
組み込んでみる
2016/08/20 川崎Ruby会議01
秋山 亮介
自己紹介
名前 : 秋山 亮介
お仕事 : 業界向けパッケージソフトウェアを作ってる会社で
設計したりコード書いたり
好きな言語 : Ruby、Golang、C#
Kawasaki.rb : 初めて参加して1年半くらい経ちました
Twitter, GitHub : @kechako
今日お話しすること
● C# って?
● mruby って?
● C# に mruby 組み込むってどうやるの?
● まとめ
C# って?
C# とは
● マイクロソフトが開発したプログラミング言語
● 共通中間言語(CIL)にコンパイルされ、共通言語ランタイム(CLR)上で実行される
● この辺の仕様が共通言語基盤(CLI)
● CLR は JIT コンパイラによってネイティブコードに変換しつつプログラムを実行する
● 実装としては .NET Framework、Mono、.NET Core
● 開発環境は Microsoft Visual Studio など
● 現在、C# のバージョンは 6.0
● C# の名前の由来は「C++++」らしい
C# のバージョン
● C# 1.0 (2002年)
● C# 1.1 (2003年)
● C# 2.0 (2005年)
○ ジェネリック、イテレーター、匿名メソッド、 Nullable...
● C# 3.0 (2007年)
○ LINQ、ラムダ式、暗黙的片付け、拡張メソッド ...
● C# 4.0 (2010年)
○ dynamic、オプション引数、名前付き引数、( Task)...
● C# 5.0 (2012年)
○ 非同期メソッド(async、await)...
● C# 6.0 (2015年)
○ オープンソース化、null 条件演算子、nameof 演算子、その他いろいろたくさん機能追加 ...
C# で Hello, World
using System;
namespace Hello
{
class Program
{
static void Main(string[] args)
{
Console. WriteLine("Hello, World!" );
}
}
}
ところで
Rubyist の皆さんはダックタイピング
したいですよね?
C# でもできます!
C# で Duck Typing
using System;
namespace DuckTyping
{
class Ruby
{
public void Hello()
{
Console.WriteLine("Hello, Ruby!");
}
}
class CSharp
{
public void Hello()
{
Console.WriteLine("Hello, CSharp!");
}
}
C# で Duck Typing
class Program
{
static void Hello(dynamic lang)
{
lang.Hello();
}
static void Main(string[] args)
{
Hello(new Ruby());
Hello(new CSharp());
}
}
}
// => Hello, Ruby!
// => Hello, CSharp!
C# の実行環境
Windows Linux OS X
Microsoft
.NET Framework
✔
Mono ✔ ✔ ✔
.NET Core ✔ ✔ ✔
.NET Core
● 2016/06/27 .NET Core 1.0 リリース!
● オープンソース、マルチプラットフォームの .NET Framework 実装
● Windows のほか、Linux、OS X でも動作
● Web フレームワークとして、ASP.NET Core
mruby って?
mruby とは
● mruby は ISO 規格の一部にしがった Ruby の軽量な実装
● 必要最小限のクラス、メソッドしか定義されていない
○ mrbgem として拡張可能
○ mruby に組み込まれる
● 組み込み機器や、アプリケーションへの埋め込みを想定している
● 組み込み機器を想定しているだけあって、使用メモリが少ない
● mruby は、Ruby のコードをバイトコードに変換し、mrubyVM 上で逐次実行
● C言語で書かれている
mruby で Hello World
#include "mruby.h"
#include "mruby/compile.h"
int main(void)
{
mrb_state *mrb = mrb_open();
mrb_load_string(mrb, "puts 'Hello, World!'");
mrb_close(mrb);
}
mruby に機能追加するために
● モジュール定義
○ mrb_define_module
● モジュール関数を定義
○ mrb_define_module_function
● クラスを定義
○ mrb_define_class、mrb_define_class_under
● インスタンスメソッドを定義
○ mrb_define_method
● クラスメソッドを定義
○ mrb_define_class_method
C# に mruby 組み込むってどうやるの?
そもそもなんでそんなこととやろうと思ったのか
● これまでの人生で一番コードを書いたのは C#
● その C# と Ruby を絡めてみたかった
○ IronRuby なんてものもありましたが
○ 最終リリースが2011年
● 実行時に Ruby で簡単な制御を入れたり、コンフィグを Ruby で書いたり
かっとなってやった
C# に mruby 組み込むってどうやるの?
C#
mruby
(C Library)
C# に mruby 組み込むってどうやるの?
C#
mruby
(C Library)
C++/CLI
C++/CLI ってなんなのさー!?
C++/CLI とは
● CLI 上で動作するプログラムを作るために C++ を拡張した言語
● C++ の上位互換
● ビルドされたライブラリは、C# からそのまま参照可能
● C のヘッダーファイルを include して、普通に使える
● 当然、スタティックリンクライブラリをリンクできる
● .NET の参照型はハンドルで保持する
○ List<String^>^ list = gcnew List<String^>();
● マネージドとアンマネージドの2つの世界を繋ぐためにいろいろとおまじないが必要
● 現状、Windows でしか使えないようです
つまり
mruby を
C++/CLI でラップして
C# から呼び出す
C++/CLI C#
mruby
DLL DLL
実際にやったこと(CSharp モジュール)
● C# のクラスを、Ruby のコードから呼び出せるようにするためのあれこれ
● アセンブリ(DLL)のロード
○ あるDLLに実装されているクラスなどを使うには、アセンブリをロードする必要がある
○ アセンブリ厳密名または DLLのフルパスを指定してアセンブリをロードする
● C# のクラスを Ruby のクラスとして mruby に定義する
○ クラスのフルネーム( Namespace + クラス名)から、クラスの型情報を取得
○ 型情報からメソッドやプロパティなどの情報を取得できる
○ 型情報からクラスのインスタンスを生成できる
○ メソッドやプロパティーの情報と生成されたインスタンスを組み合わせてメソッドをコールできる
○ これらを C++/CLI で mruby に登録する
● mruby で(mruby が埋め込まれた .NET アプリケーション)で Ruby のコードを実
行
まとめ
まとめ
● C++/CLI を絡めれば、mruby 以外も C# と C言語の世界をつなげられる
● mruby から C# のクラスにアクセスする部分がリフレクションで実現しているので、
パフォーマンスは期待しないほうが良さそう
● Ruby と C# の型の相互変換が悩ましい
● ほんとはデモ見せたかったんです……
○ いつか Kawasaki.rb で……
● 今回一番苦労したのは C# でも mruby でもなく C++/CLI。
● C 言語が多少読めてかければ、mruby はそれなりに動かせる
○ あくまでもそれなりにです
ところで、Windows 以外はどうなの?
Windows 以外でどうするか
● .NET Core には残念ながら C++/CLI がないっぽいです
● C の共有ライブラリーであれば、.NET Core からもコールできるっぽい
○ ごめんなさい、試してません。
● mruby であれば、共有ライブラリーとしてビルドして、各関数を呼び出す的な
● 構造体の定義を C# 側でやるとか、つらい未来しか待っていない予感
ご清聴ありがとうございました

More Related Content

What's hot

RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境KiyotomoHiroyasu
 
Rustで3D graphics programming
Rustで3D graphics programmingRustで3D graphics programming
Rustで3D graphics programmingKiyotomoHiroyasu
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)Takehiko YOSHIDA
 
Rubyとプログラミング言語の潮流
Rubyとプログラミング言語の潮流Rubyとプログラミング言語の潮流
Rubyとプログラミング言語の潮流Kazuhiko Kato
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Takashi Sogabe
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2Kuniaki Igarashi
 
Rustのテストやエコシステム
RustのテストやエコシステムRustのテストやエコシステム
RustのテストやエコシステムKiyotomoHiroyasu
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Yoshiyuki Nakamura
 
mruby IoTプラットフォーム
mruby IoTプラットフォームmruby IoTプラットフォーム
mruby IoTプラットフォームHiromasa Ishii
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
Feature StoreをRustで実装した話
Feature StoreをRustで実装した話Feature StoreをRustで実装した話
Feature StoreをRustで実装した話emakryo
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりYuya Rin
 
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会openrtm
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計Shinnosuke Tokuda
 
NuxtでChrome拡張作ってみた
NuxtでChrome拡張作ってみたNuxtでChrome拡張作ってみた
NuxtでChrome拡張作ってみたkyoheichida
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCYoshifumi Kawai
 
Nuxt+TypeScript+Class構文のはなし
Nuxt+TypeScript+Class構文のはなしNuxt+TypeScript+Class構文のはなし
Nuxt+TypeScript+Class構文のはなしkyoheichida
 

What's hot (20)

RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境
 
Rustで3D graphics programming
Rustで3D graphics programmingRustで3D graphics programming
Rustで3D graphics programming
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
 
Rubyとプログラミング言語の潮流
Rubyとプログラミング言語の潮流Rubyとプログラミング言語の潮流
Rubyとプログラミング言語の潮流
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
Rustのテストやエコシステム
RustのテストやエコシステムRustのテストやエコシステム
Rustのテストやエコシステム
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
mruby IoTプラットフォーム
mruby IoTプラットフォームmruby IoTプラットフォーム
mruby IoTプラットフォーム
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
PyCharm入門
PyCharm入門PyCharm入門
PyCharm入門
 
Feature StoreをRustで実装した話
Feature StoreをRustで実装した話Feature StoreをRustで実装した話
Feature StoreをRustで実装した話
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつり
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
 
NuxtでChrome拡張作ってみた
NuxtでChrome拡張作ってみたNuxtでChrome拡張作ってみた
NuxtでChrome拡張作ってみた
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
 
Nuxt+TypeScript+Class構文のはなし
Nuxt+TypeScript+Class構文のはなしNuxt+TypeScript+Class構文のはなし
Nuxt+TypeScript+Class構文のはなし
 

Similar to mruby を C# に 組み込んでみる

C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発Shuto Suzuki
 
Using or not using magic onion
Using or not using magic onionUsing or not using magic onion
Using or not using magic onionGoichi Shinohara
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Takashi Sogabe
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発m ishizaki
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Developers Summit
 
Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201Tomohiro Ichimura
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成shigeki_ohtsu
 
MobiRubyでiOSアプリをつくろう
MobiRubyでiOSアプリをつくろうMobiRubyでiOSアプリをつくろう
MobiRubyでiOSアプリをつくろうJunya Murabe
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしRubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしyamanekko
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)tamtam180
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1Takuya Mukohira
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 ClojureYoshitaka Kawashima
 

Similar to mruby を C# に 組み込んでみる (20)

C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発
 
Mrubyの始め方
Mrubyの始め方Mrubyの始め方
Mrubyの始め方
 
Using or not using magic onion
Using or not using magic onionUsing or not using magic onion
Using or not using magic onion
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201Myfirst buildpack session_mgmt_20161201
Myfirst buildpack session_mgmt_20161201
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
 
MobiRubyでiOSアプリをつくろう
MobiRubyでiOSアプリをつくろうMobiRubyでiOSアプリをつくろう
MobiRubyでiOSアプリをつくろう
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしRubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
 
Hello Ruby
Hello RubyHello Ruby
Hello Ruby
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 

mruby を C# に 組み込んでみる

  • 1. mruby を C# に 組み込んでみる 2016/08/20 川崎Ruby会議01 秋山 亮介
  • 2. 自己紹介 名前 : 秋山 亮介 お仕事 : 業界向けパッケージソフトウェアを作ってる会社で 設計したりコード書いたり 好きな言語 : Ruby、Golang、C# Kawasaki.rb : 初めて参加して1年半くらい経ちました Twitter, GitHub : @kechako
  • 3. 今日お話しすること ● C# って? ● mruby って? ● C# に mruby 組み込むってどうやるの? ● まとめ
  • 5. C# とは ● マイクロソフトが開発したプログラミング言語 ● 共通中間言語(CIL)にコンパイルされ、共通言語ランタイム(CLR)上で実行される ● この辺の仕様が共通言語基盤(CLI) ● CLR は JIT コンパイラによってネイティブコードに変換しつつプログラムを実行する ● 実装としては .NET Framework、Mono、.NET Core ● 開発環境は Microsoft Visual Studio など ● 現在、C# のバージョンは 6.0 ● C# の名前の由来は「C++++」らしい
  • 6. C# のバージョン ● C# 1.0 (2002年) ● C# 1.1 (2003年) ● C# 2.0 (2005年) ○ ジェネリック、イテレーター、匿名メソッド、 Nullable... ● C# 3.0 (2007年) ○ LINQ、ラムダ式、暗黙的片付け、拡張メソッド ... ● C# 4.0 (2010年) ○ dynamic、オプション引数、名前付き引数、( Task)... ● C# 5.0 (2012年) ○ 非同期メソッド(async、await)... ● C# 6.0 (2015年) ○ オープンソース化、null 条件演算子、nameof 演算子、その他いろいろたくさん機能追加 ...
  • 7. C# で Hello, World using System; namespace Hello { class Program { static void Main(string[] args) { Console. WriteLine("Hello, World!" ); } } }
  • 11. C# で Duck Typing using System; namespace DuckTyping { class Ruby { public void Hello() { Console.WriteLine("Hello, Ruby!"); } } class CSharp { public void Hello() { Console.WriteLine("Hello, CSharp!"); } }
  • 12. C# で Duck Typing class Program { static void Hello(dynamic lang) { lang.Hello(); } static void Main(string[] args) { Hello(new Ruby()); Hello(new CSharp()); } } } // => Hello, Ruby! // => Hello, CSharp!
  • 13. C# の実行環境 Windows Linux OS X Microsoft .NET Framework ✔ Mono ✔ ✔ ✔ .NET Core ✔ ✔ ✔
  • 14. .NET Core ● 2016/06/27 .NET Core 1.0 リリース! ● オープンソース、マルチプラットフォームの .NET Framework 実装 ● Windows のほか、Linux、OS X でも動作 ● Web フレームワークとして、ASP.NET Core
  • 16. mruby とは ● mruby は ISO 規格の一部にしがった Ruby の軽量な実装 ● 必要最小限のクラス、メソッドしか定義されていない ○ mrbgem として拡張可能 ○ mruby に組み込まれる ● 組み込み機器や、アプリケーションへの埋め込みを想定している ● 組み込み機器を想定しているだけあって、使用メモリが少ない ● mruby は、Ruby のコードをバイトコードに変換し、mrubyVM 上で逐次実行 ● C言語で書かれている
  • 17. mruby で Hello World #include "mruby.h" #include "mruby/compile.h" int main(void) { mrb_state *mrb = mrb_open(); mrb_load_string(mrb, "puts 'Hello, World!'"); mrb_close(mrb); }
  • 18. mruby に機能追加するために ● モジュール定義 ○ mrb_define_module ● モジュール関数を定義 ○ mrb_define_module_function ● クラスを定義 ○ mrb_define_class、mrb_define_class_under ● インスタンスメソッドを定義 ○ mrb_define_method ● クラスメソッドを定義 ○ mrb_define_class_method
  • 19. C# に mruby 組み込むってどうやるの?
  • 20. そもそもなんでそんなこととやろうと思ったのか ● これまでの人生で一番コードを書いたのは C# ● その C# と Ruby を絡めてみたかった ○ IronRuby なんてものもありましたが ○ 最終リリースが2011年 ● 実行時に Ruby で簡単な制御を入れたり、コンフィグを Ruby で書いたり かっとなってやった
  • 21. C# に mruby 組み込むってどうやるの? C# mruby (C Library)
  • 22. C# に mruby 組み込むってどうやるの? C# mruby (C Library) C++/CLI
  • 24. C++/CLI とは ● CLI 上で動作するプログラムを作るために C++ を拡張した言語 ● C++ の上位互換 ● ビルドされたライブラリは、C# からそのまま参照可能 ● C のヘッダーファイルを include して、普通に使える ● 当然、スタティックリンクライブラリをリンクできる ● .NET の参照型はハンドルで保持する ○ List<String^>^ list = gcnew List<String^>(); ● マネージドとアンマネージドの2つの世界を繋ぐためにいろいろとおまじないが必要 ● 現状、Windows でしか使えないようです
  • 28. 実際にやったこと(CSharp モジュール) ● C# のクラスを、Ruby のコードから呼び出せるようにするためのあれこれ ● アセンブリ(DLL)のロード ○ あるDLLに実装されているクラスなどを使うには、アセンブリをロードする必要がある ○ アセンブリ厳密名または DLLのフルパスを指定してアセンブリをロードする ● C# のクラスを Ruby のクラスとして mruby に定義する ○ クラスのフルネーム( Namespace + クラス名)から、クラスの型情報を取得 ○ 型情報からメソッドやプロパティなどの情報を取得できる ○ 型情報からクラスのインスタンスを生成できる ○ メソッドやプロパティーの情報と生成されたインスタンスを組み合わせてメソッドをコールできる ○ これらを C++/CLI で mruby に登録する ● mruby で(mruby が埋め込まれた .NET アプリケーション)で Ruby のコードを実 行
  • 30. まとめ ● C++/CLI を絡めれば、mruby 以外も C# と C言語の世界をつなげられる ● mruby から C# のクラスにアクセスする部分がリフレクションで実現しているので、 パフォーマンスは期待しないほうが良さそう ● Ruby と C# の型の相互変換が悩ましい ● ほんとはデモ見せたかったんです…… ○ いつか Kawasaki.rb で…… ● 今回一番苦労したのは C# でも mruby でもなく C++/CLI。 ● C 言語が多少読めてかければ、mruby はそれなりに動かせる ○ あくまでもそれなりにです
  • 32. Windows 以外でどうするか ● .NET Core には残念ながら C++/CLI がないっぽいです ● C の共有ライブラリーであれば、.NET Core からもコールできるっぽい ○ ごめんなさい、試してません。 ● mruby であれば、共有ライブラリーとしてビルドして、各関数を呼び出す的な ● 構造体の定義を C# 側でやるとか、つらい未来しか待っていない予感