********************************************************************** セッション S3-c テーマ: 組込みRubyとその開発事例 日時: 2012/8/31 10:30~12:00 講師: 田中 和明 (九州工業大学) 参加人数:約40名 ********************************************************************** ・通常はソフトウェアでやっている ・組み込みで話す機会がないので、なにかあれば質疑などでご進言を ・軽量Ruby のフォーラムがある ・一般会員であれば無料なので、ぜひ登録していただければ   - http://forum.mruby.org/   - 福岡県と一緒に進めている 自己紹介 ・九州大学 情報工学研究院 ・修論はJPEGの圧縮方式の最適化などを行っておりました ・大学院に残り、機械をコントロールするソフトウェアを研究 軽量Rubyの概要 ・経産省の地域イノベーションの開発事業 ・福岡は車とかロボットなどコントロール系が充実している ・Rubyを元々扱っていて、組み込みもやっているらしいですね  ということからメンバーが組織された 軽量Rubyの開発チーム ・福岡CSK   - 安川のロボット関係のファームウェアなどをしている ・ネットワーク応用研究所 ・九州工業大学 ・東芝情報システム   - セルフプロセッサを扱う部署 ・福岡県 ・SCSK 軽量Ruby開発目標 ・FPGAに乗るような小型なもの ・ロボット制御を行えるリアルタイム性 なぜRubyを使うのか ・コードが書きやすく、読みやすい ・時間が短縮できる ・書き間違いが減る   - 行数が減ればバグも減る(経験則的に) ・読みやすくなるので、他人のコードを利用できる ・コードのメンテナンス   - 大学では、先輩のコードが読めないと困る   - コードを後から継承できるように ・Rubyが扱えるときはRuby,できないとこはC、C++で Rubyの良さ ・記述がわかりやすい   - 他人のプログラムが理解しやすい ・多くのライブラリが提供されている   - プログラム行数が短い   - プログラムが安全になる ・アルゴリズムの記述に近い   - アルゴリズムの推定を行いやすい ・配列に入っている型が変わってもOK ・データの型に関係無く記述できる   - 理解につながりやすい 動的なライブラリのリンクができる ・組み込みに関係してくる ・動的(実行時)にリンクされる   - 読み出す寸前に名前解決を行う ・アドレス解決ではなく、名前解決を行う ・何に役に立つかは後程 軽量とは ・実行に必要な資源が少ない   - 特にメモリを少なくてすむように ・言語仕様(文法規則)をJIS規格(JISX 3017)とする ・開発期間を短く、簡単に組み込めるように 実行の仕組み ・従来のRuby1.8はインタープリタ式 ・軽量Rubyはコンパイラ+VMに分ける方式 ・実行するときにはVMのみが必要 ・Javaによく似た感じ   - Javaのバイトコード+JavaのVMで動く ・従来のRubyではプログラム実行の前処理に多くのメモリ  (実行に使用するうち2/3程)を使ってしまう ・前処理のみを事前にしておけば、使用メモリの大幅削減となる ・バイト列を読み込むための部品が追加される   - 開発環境と異なる環境でもロードできるようにするため ・読み込めばあとは実行するだけ ・Rubyプログラム⇒コンパイラ  ⇒バイトコード(バイナリ形式)⇒実行環境へ ・バイトコードは機種などハードウェアに依存しない ・RubyVMのレジスタはすべてオブジェクトを格納できる ・すべてがオブジェクトで実行する ・メッセージパッシングを行うときはメッセージパッシング用の  名前をよびだす ・高いレベルの演算を行う 軽量Rubyで何がしたいのか ・少ないメモリ・小さなプロセッサで動作するRubyを作成したい ・アセンブラやC言語を使わなくても、Rubyで動作できるようにしたい ・メモリサイズとして1MB以下に ・安全にバイナリで実現したい(これからの課題)   - バイナリベースで動くように   - Rubyはソースコードが見えてしまう   - 企業はソースコードが見えるのを嫌がる 組み込みシステム開発 ・従来はC/C++/Javaでプログラムを作成   - コンパイル・ライブラリのリンク・ターゲットデバイスで実行   - クロスコンパイル環境   - 実行デバイスに対応したコンパイラが必要   - ライブラリをリンクする   - 実行環境に置く(実行ファイルは開発環境では実行できない)   - プログラムをテストする ・ターゲットデバイスにプログラムを載せないとチェックできない ・軽量Rubyでの開発   - Rubyでプログラムを作成   - コンパイルする(バイトコードを得る)   - 開発環境のVMを使ってバイトコードを実行(テストができる)   - 開発環境用のライブラリが動的にリンクされる   - バイトコードを実行デバイスに書き込む   - 実行デバイス用のライブラリが動的にリンクされる ・ライブラリの名前だけ合わせておくと、名前解決してくれる   - 開発環境用のクラスライブラリと実行環境用のクラスライブラリ    の名前を合わせておけば良い なぜこのようなことができるのか ・Rubyプログラム+ライブラリをVMが実行する   - VMにライブラリを用意しておくと、Rubyプログラムだけを    載せ変えるだけでよい ・Rubyプログラムはプラットホームに依存しない ・VM部分にライブラリを含む   - 実行環境ごとのVMを最初に用意しておく   - この時だけ実行環境ごとのクロス開発が必要になる ライブラリは2種類 ・Cによるライブラリ:ハードウェアをいじる、など ・Rubyによるライブラリ ・シームレスにつながる   - CとRubyが混在していて構わない ・この辺の詰め込みが甘い   - CのライブラリをRubyで呼び出す際などは注意が必要   - Rubyは引数の数も型も自由なので、安全を保障できない 軽量Rubyを使うメリット ・クロスコンパイルが不要 ・開発環境でテストできる   - 実行デバイスに書き込む前にテストができる ・必要なのはVMとデバイスドライバ ・ライブラリの動的リンク ・クロス開発に慣れていない人にも扱いやすい   - 環境構築も簡単に 軽量Rubyを使う上での注意点 ・速度が遅い   - メソッド関数呼び出しを名前解決するので   - c/c++よりも二けたは遅い   - Ruby1.8よりは少し早い程度   - ガーベージコレクションも起こるので、完了までの時間を保証できない ・VMはシングルスレッド   - ターゲットとするマイコンがシングルスレッドの可能性がある   - そのため、マルチスレッドを想定していない   - 複数のVM を実行すればマルチスレッドに   - タスク間通信によって解決できるはず ・割り込みに非対応   - 現在はCで割り込みを受け取り、Rubyからポーリングすることで    割り込みのような動作はできる   - ソフト割り込みを検討している 軽量Rubyの適用例 ・シリアル通信のような低速通信 ・ユーザーインタフェース   - 製品ごとにカスタマイズしたいときには、とても簡単に作れる ・ネットワークとの連携   - Rubyの得意分野   - ソフトウェアのデプロイメントに使える ・ファームウェア   - システム起動時の処理(1回しか執行されない)   - 書き直し・アップデートが容易 軽量Rubyの評価協力 ・東芝情報システム   - 電力制御関連のユーザーインタフェースで使っている ・富士電機   - 杭州の子会社が作成する自販機の中のマイコン   - 客・地域・施設ごとのカスタマイズに ・IIJ   - ネットワーク装置   - ハイエンドルーターの挙動を変えたいとき   - VPNのアドレスを定期的に変える、一斉にシャットアウトするなどの    ファームウェア   - ルーターの情報をTwitterに挙げる事例も ・Manycolors   - 遺伝子解析のソフト   - 特定遺伝子に関してのシーケンサを容易に構築できるように   - 医学生や医者が簡単に作れるようにという試作品が ・ILC   - GUIのインタフェースライブラリなど   - インタフェースの部分の変更 ・容易にカスタマイズしたいという事例でよく用いられる ・ただし、速度を重視しない環境 研究開発の様子 ・FPGAにCPUコア、RubyVMを載せ、ハードウェアアクセラレーションを  して動かす ・リアルタイムOS(VxWorks)上で軽量Rubyが動作する多関節ロボット ・ロボットアームで絵をかくアプリケーションを作成 ・シングルタスクなので 5個のVMが必要   - PCからデータを受けとるタスク、PCにデータを返すタスク、    ロボットアームに指令を与えるタスク、ロボットアームから貰うタスク、    4つのタスクをコントロールするタスク 最近の動作実験 ・SH-4 ・H8+DRAM ・NIOS II ・BeagleBoard ・GR-SAURA RX63N   - メモリが128kで動く 今後のmruby ・mrubyのコミュニティ  成果物の管理   - ライブラリのリファレンスやクラス階層の作り込みなどの設計   - ライセンスの管理ではない  ライブラリなどの制作支援   - リファレンスボード・講習会など  著作権管理   - 著作権者の定義・表示など  普及活動 現状 ・オープンソースmrubyとして公開中   - https://github.com/mruby ・MITライセンス   - 著作権者とライセンスの記載が必要 ・ソースコード非公開で自由に利用できる ・Cコンパイラがあれば動く デモンストレーション ・mrubyがどのようになっているのか ・提供されるもの4つ   - mirb:インタラクティブにmrubyを動かすためのもの   - mrbc:mruby用のコンパイラ   - mruby:mrubyのVMに相当するもの   - libmruby.a:ライブラリ ・フィボナッチをmrubyで実行すると1秒ほど   - ruby1.8だと5秒   - 1.9ならもっと早いはず   - Cだと0.1以下になるはず ・データ型がダイナミックに変わる例   - 整数、文字列、シンボル、配列が同じ命令で呼び出せる   - 内部で判断して、適切な表示方式が適用される   - バイナリになった状態でもダイナミックに動いている ・関数そのものを引数として渡すことができる   - ポインタで渡すのではなく   - 関数そのものが変数となっている   - 応用するとコールバック関数が作りやすくなる ・型をダイナミックに変えるプログラムをバイナリに変換する   - $mrbc p02.rb   - とするとp02.rbに対して、p02mrbが生成される   - 今はバイナリの方がサイズが多い    - デバックのためHexをつけているため ・Cのファイルを生成する   - -Cをつけてコンパイル   - ファイルシステムなくても動く(静的に動くため)   - -Bをつけてコンパイル   - Cのファイルを生成する   - ROMイメージを作成し、実行する ・いろいろ作ってみて、皆さんにいろいろ提案してほしい ○質疑応答 <質問者1:O氏> リアルタイムOSに対応するOSは何があるか >VX WORKの他に、TOPPERS、H8などのリアルタイムOSがある <質問者1:O氏> VMは、ひとつのタスクとして動作するという意味でよいか >その通りです <質問者2:M氏> 組み込みだと事前チェックを行いたいことが多いがどうすればよいか >スクリプトは動的言語なため、テストが重要になる  アイデアとして、Rubyにはユニットテストのライブラリが豊富なので、  そちらで十分テストしてほしい  結合テストがしにくいが、それについては今後の課題。  他にはチェック機能を入れる、網羅テストなど <質問者1:O氏>  速度性能のデモを行ったが、mrubyで直接実行していたので  バイナリの実行時間を見せてほしい   >mrubyでは直接行ってもコンパイルを行う  ソースコードが短いので、今回のコンパイル時間は少ない  mrubyは使用するメモリが少ない ・もしよろしればmrubyのフォーラムにご参加ください   - 設立認可に時間がかかるので10月ごろかと   - TOPPERSプロジェクトを参考とした組織体系になっている ・今日はこれで終わりたいと思います、ありがとうございました 以上。