LL Future 「古い言語、 新しい

LowLevel Future
2008
~ 低レイヤー技術が生み出す可能性とその未来 ~
プログラム 「古い言語,新しい言語」 セクション
(パネルディスカッション資料)
2008.8.30
なかの ZERO
若槻俊宏 (alohakun)
自己紹介
• 普通の大学院生 (D1)
– 北海道大学 大学院 情報科学研究科 複合情報学専攻
– プログラム構築における形式的仕様記述からア
ルゴリズム探索,実コード生成までの統一的な理
論化に興味を持っている
• 現在は低レイヤーの方の理論化に関わっている
• 研究テーマ 「等価変換の原理に基づいたアルゴリズ
ム探索により実行環境や実行例に適応するプログラ
ムの理論と構築」
– 要するに進化適応するプログラムを作るための理論
– blog : http://alohakun.blog7.fc2.com/
なぜ今回呼んでいただいた ?
(根本的過ぎる疑問 w)
• OSC 2008 do で GCC Hacks という発表をした縁 ?
– 今回は llvm-gcc 関係で呼ばれた ?
• GCC や LLVM は趣味兼サーベイ (しろうと)
• 低レイヤーの方の既存研究として興味を持っている (だけ)
• しかも,実は GCC はあんまり今回関係ない
– LLVMはomoさんとかsyoyoさんの方が明らかに詳しい
• Syoyo さん : LLVM 勉強会の主催者
• 人選ミスの可能性大
• いらない子ですいません!!
いろいろ素人ですががんばります
よろしく
お願いします
ここから LLVM の話
• ちなみに LL Future の LL とは全く関係無い
– LLVM is NOT a Lightweight Virtual Machine.
– LLVM is NOT a Virtual Machine design for
Lightweight Language.
• ようこそ LowLevel の世界に !
– 話者のレベルが LL という噂も
LLVM (Low-Level Virtual Machine)
•
RISC ライクな低水準命令セット
–
about 49 opcedes (llvm 2.3)
•
–
•
•
llvm 2.3 で多値サポートのための getresult 命令が追加
豊富なビルトイン関数 ( Intrinsic Function) llvm.*
レジスタマシン (SSA)
– 特定の言語やオブジェクトモデルをサポートしない
プログラムのライフサイクル全体に渡る変換と最適化
– Offline code generation and optimization
•
•
Install-time target-specific optimization
Link-Time interprocedural Optimization (LTO)
–
–
whole program analysis
User-based profiling and optimization
•
run-time & idle time
参考文献
• The LLVM Compiler Infrastructure
– http://llvm.org/
• "LLVM: A Compilation Framework for Lifelong
Program Analysis & Transformation", Chris Lattner and
Vikram Adve. Proceedings of the 2004 International Symposium on Code Generation
and Optimization (CGO'04), Palo Alto, California, Mar. 2004.)
– http://llvm.org/pubs/2004-01-30-CGO-LLVM.html
– この時点では only 31 opecodes という記述が
• LLVM 勉強会資料 (syoyo さん,omo さん)
– http://groups.google.co.jp/group/llvm_study/web/
LLVM の使いどころ
• 設定ファイルやオプションが多い環境で有利
– 多様な環境に配布されるアプリケーション
• 毎回毎回,起動するたびに設定ファイル読んで,環境依存のオプショ
ン設定して… (無駄無駄無駄)
– バイナリ自体を書き換えて最適化してしまう!
• offline optimization
– (Java などのような) JIT に限定されない部分計算
• Mac OS X Leopard の OpenGL スタックなどに採用
– デスクトップ ⇔ iPhone などで同じアプリを使える可能性
• 多様な実行環境において
• 移植性と効率性を両立できる可能性
パネルディスカッションの元ネタ
• Running C and Python Code on The Web
– http://www.toolness.com/wp/?p=52
– Scott Peterson (Adobe) ‘s toolchain
– C code to be targeted to the Tamarin VM
• C言語をブラウザで実行、Ruby/Python/Perlも然り
– http://journal.mycom.co.jp/news/2008/07/10/031/ind
ex.html
• 移植性 ⇔ 効率性のトレードオフを解消できる技術と
来たら,ブラウザへの応用は自然と言える
ちなみに
• 私は LL とかウェブアプリケーションとか完全
に素人なので
• 識者からのツッコミ前提の資料です
– 私より詳しい人,いくらでも会場にいるような…
• ABC コード ?
– http://gihyo.jp/dev/serial/01/ll-future/0006
– 3 度の飯よりも ABC が好きな大人が多いらしい
• 何それ Concurrent Clean ? (って人)
– ActionScript Byte Code らしいですよ
背景知識 (ぁゃしぃ )
• from Adobe, Mozilla, and Tamarin
–
http://hecker.org/mozilla/adobe-mozilla-and-tamarin
• Tamarin プロジェクト
– Flash player 9 から採用された新しい JIT VM が AVM2
– コードネーム Tamarin として OpenSource 化し Mozilla プロジェクトに提供
• Flash player 9 = AVM2 + graphics, musics, videos, networking, etc components
– JRE (Java Runtime Environment) が JVM + 膨大な標準クラスライブラリなのと同じ ?
• ActionScript 3.0 (Flash 5 から ActionScript と呼ばれるように)
– JavaScript の兄弟 (プロトタイプベース vs クラスベース)
– ECMAScript 4 (ECMA-262) に準拠 (完全ではない)
– クラスベース (Java / C# に近い ?)
• Free Flex 2. SDK などで foo.as を foo.swf にコンパイル (javac に相当 ?)
• Flash player 9 により foo.swf 内部の abc file が実行される
Tamarin Project
•
http://www.mozilla-japan.org/projects/tamarin/
• 目標
– ECMAScript 第4版 (ES4) をパフォーマンスの高いオープンソースの
コードとして実装すること
– Tamarin VM は Mozilla の JavaScript コアエンジン SpiderMonkey
内部と Adobe Flash Player の AVM の一部として利用されている
• AVMPlus のソースコードを公開している
– http://developer.mozilla.org/ja/docs/Tamarin_Build_Documentation
– AVMPlus (VM library), MMgc (garbage collection library),
avmplus (実行ファイル) を提供
– avmplus コマンドは ABC file format を JIT 実行
– Adobe Flex 2 SDK に含まれる ASC (ActionScript Compiler) など
で foo.as を foo.abc に変換
• asc.jar のために jdk 1.4 以降が必要
– Mozilla SpiderMonkey ベースの JavaScript コンパイラ esc で
foo.js から foo.abc を生成できる (まだ完璧ではないらしい ?)
Scott Petersen’s toolchain
1. C プログラム→ LLVM 命令 (bitcode file format)
– llvm-gcc (既存) でコンパイル
2. LLVM コード → AVM2 命令 (ABC file format)
• Flash にアクセスする API など,マルチメディア
API
– カスタム POSIX システムコール
3. AVM2 命令 → ネイティブコード
• ブラウザ上
– Tamarinで JIT 実行 (既存)
過去の C 資産の再利用を重視 ?
• C で書くメリット自体は (ほとんど) 無い
– どのみち Flash 上で実行 (効率は変わらない)
– 使える API も限定される
• ブラウザ上で C 資産がそのまま活用できる
– 安全なサンドボックス実行が可能
• ゲームなどが有力 ? (Scott 氏による Quake デモ)
• エミュレータよりも効率的に実行できる可能性
– Python など,言語処理系はその一部
なぜ LLVM コードを一度生成する?
Q. C, Perl, Python, Ruby, Lua, etc… → 直接 ABC
コードを出力するコンパイラでも良くない ?
A. llvm-gcc が既に存在しているのが大きい ?
– GCC のバックエンドだけが LLVM target 対応
• 他は全て普通の (?) GCC
• C/C++ 以外の言語も使える
– Ada, Fortran, Objective-C,Objective-C++
– GNU C にまで対応する C コンパイラを作るのは大変 (既
に stable が存在しているのは大きい)
– バイトコード to バイトコード translator の方が実装が楽 ?
関連プロジェクト
• Nested VM
– http://www.cs.rit.edu/~bja8464/NestedVM.pdf
– 実マシンコード(機械語)をJavaプログラムに逆コンパイル
– 既存資産の再利用,サンドボックス実行
• IKVM.NET
– http://www.ikvm.net/
– .NET MSIL (CIL) ⇔ JVM バイトコード
– Mono や Microsoft .NET Framework 上で動く JRE
• JVM, class libraries, 相互運用のためのツール郡を含む
空気読まない疑問
• ブラウザの上で既存言語資産を動かして未来
が開けるのか ?
– 相互運用技術で,既存の資産に縛られなくなる ?
– 純粋に言語の能力でシステムの記述言語を選択す
ることができるようになる ?
– Software As A Service (SaaS) ブームの時も Paul
Graham が似たようなこと言ってたけど…
• 結局世界は Java だよね
• Java との相互運用がキー ? JRuby, Jython, Scala など
• そもそも LL に Future はあるのか ?
個人的なうれしさ
• GCC フロントエンドの重要性が増す ?
– 他の VM や環境への相互変換が確立されれば
– llvm バックエンドさえあれば良くなる
• http://gcc.gnu.org/ml/gcc/2005-11/msg00888.html
• LLVM ⇔ GIMPLE トランスレータ ?
• LLVM to RTL なんていう話も
• 俺言語 GCC フロントエンド向けに書いたコー
ドが,ブラウザなどでも動くようになる ?
– GCC : コンパイラインフラ
– LLVM : 実行環境インフラ