ポータブルコンポーネント
  マネージャの実装
     松坂要佐
  産業技術総合研究所



         SI2011 RTミドルウェアコンテスト
Portable?
• Port = 港
 – 大航海時代、各国に様々な規格の港が存在
 – うまく作られた船でないと入港できない
 – Portable = 様々な規格に対応可能の意


• 類語
 – Porting = 移植作業
コンポーネント開発&配布の問題
• OpenHRIの例
 – 開発当初(2009年半ば)の想定環境
   • サポートプラットフォームはLinuxのみ
   • ロボット(組み込み)向けパッケージング
 – ユーザの声
   • Windows版も欲しい!
 – 現在の想定環境
   • LinuxとWindowsをサポート
   • 両環境のインストーラ
コンポーネント開発&配布の問題
結果としてこの判断は正しかった:
• 玄人と思っていたユーザも使っているのは
  Windows版
• ロボット以外のアプリケーション

しかしながら負担も大きい:
• 開発環境(GCCからVC)をスイッチする手間
• 新しい環境(例えばARM)にどれだけ対応?
Javaの世界
   - Write once. Run anywhere. -
• Javaソースコードを中間コード(Javaバイト
  コード)にコンパイル
• 中間コードはプラットフォームに非依存
• 各プラットフォーム上で動く中間コード実行器
  (JVM)
⇒中間コードはどのプラットフォームでも動く!

リアルタイムシステムでは問題も、、、
リアルタイムシステムとJava
• Javaはガベージコレクションを基幹部分に持
  つ言語
• ガベージコレクション中はすべてのスレッドが
  停止
• ガベージコレクションは非同期で起動

• リアルタイムシステム構築には特別な配慮が
  必要
JavaとRTミドルウェア
• OpenRTM-aistはJava用も存在
• リアルタイムシステム用の配慮(平野ら)
 S.Hirano, R.Qu, T.Kubota et al., “RTM on
 Java/HORB: Eclipse meets RT Components,” OMG
 Robotics DTF meeting, Washington DC, 2006.

• 一般開発者がどれだけ配慮可能かは不確実
中間コードはJavaのもの?
• Javaバイトコードはあまりに有名

• 中間コード=Javaの専売特許という誤解

• 近年、非常に注目を集めつつあるコンパイラ
  技術「LLVM」
LLVM
  - Low-Level Virtual Machine -
• 2000年にイリノイ大学で開発が開始
• 背景
 – 複雑になりすぎたGCCのソースコードを整理
 – アルゴリズムレベルの最適化とプロセッサレベルの最適
   化を分離(中間コードの導入)
 – C, C++, Objective-C, Fortranをサポート
 – x86, ARM, ....をサポート
• 現状
 – iOS開発の標準コンパイラ
 – FreeBSDの次期標準コンパイラ
LLVM
   - Low-Level Virtual Machine -


  C++                                      x86
          C++用LLVM            x86用LLVM
ソースコード                LLVM
         フロントエンド              バックエンド     ターゲット
                     バイトコード




       フロントエンド開発者            バックエンド開発者
  (アルゴリズムレベルの最適化に注力)    (プロセッサレベルの最適化に注力)
JVMと比較したLLVM
• C, C++, Objective-C, Fortranをサポート
• ガベージコレクション「も」サポート
  – ガベージコレクションを排除可能
• 逐次コンパイルと事前コンパイルによる実行

• ガベージコレクション排除&事前コンパイル
  条件であればリアルタイム要件を達成可能
(参考)LLVMのリアルタイム性能評価




模擬的に作成したPID制御コンポーネントで計測@Intel Core i7 2.8GHz
LLVMは本格的なコンパイラ技術でありGCCとほぼ変わらない性能を持っている
OpenRTM-aistのマネージャ機構へ
 のLLVMバックエンドの組み込み
• 既存のマネージャ機構


  x86-Linux用      ロード
                            CORBA     コンポーネント   x86-Linux
 コンポーネント
                            サービス       マネージャ    ターゲット
    バイナリ




           RT-SystemEditorやrtshell等
                 の管理ツール
x86-Linux用
             CORBA    コンポーネント       x86-Linux
             サービス      マネージャ        ターゲット
   C++             (LLVMバックエンド)
コンポーネント
 ソースコード


                      ARM-Linux用     ARM-
     LLVM    CORBA    コンポーネント        Linux
    バイトコード   サービス      マネージャ        ターゲット
                   (LLVMバックエンド)




                     x86-Windows用
             CORBA                    x86-
                      コンポーネント
             サービス                   Windows
                       マネージャ
                   (LLVMバックエンド)     ターゲット
デモンストレーション


• インストール方法については付録A



• 実行方法については付録Bを参照
まとめ
• Portability(移植性)の高いRTコンポーネント
  実現の手段として
 – LLVMバイトコードへのコンパイル環境の整備
 – マネージャへのLLVMバックエンドの組み込み
 – プラットフォームに依存しないコンポーネント配布
   が可能に
• 想い
 – そろそろ組み込みボードでもコンポーネントを動
   かしたい
 – コンポーネントのクローズドソース配布にも案外メ
   リットは多い
付録A:インストール方法
1.gitレポジトリからのチェックアウト
 $ git clone git://github.com/yosuke/OpenRTM-aist-portable.git

2.コンパイルとインストール
 $ cd OpenRTM-aist-portable
 $ ./build/autogen
 $ ./configure
 $ make
 $ sudo make install

3.LLVMのインストール
 http://llvm.orgを参照(要バージョン2.9以上)
付録B:実行方法
1.コンポーネントのLLVMバイトコードへのコン
 パイル
 $ prtcc PIDComp.cpp

2.マネージャの起動
 $ rtcd -d (各ホストで)

3.コンポーネントのロード(要rtshellの最新版)
 $ rtmgr manager.mgr -l PIDComp.bc

ポータブルコンポーネントマネージャの実装