Build Programming Language Runtime with LLVM
Build Programming Language Runtime with LLVM
Build Programming Language Runtime with LLVM
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Build</strong> <strong>Programming</strong> <strong>Language</strong><br />
<strong>Runtime</strong> <strong>with</strong> <strong>LLVM</strong><br />
Jim Huang ( 黃 敬 群 )<br />
Developer & Co-founder, 0xlab<br />
jserv@0xlab.org<br />
@ 1500 / March 27, 2011
<strong>Build</strong> <strong>Programming</strong> <strong>Language</strong><br />
<strong>Runtime</strong> <strong>with</strong> <strong>LLVM</strong><br />
Jim Huang ( 黃 敬 群 )<br />
Developer & Co-founder, 0xlab<br />
jserv@0xlab.org<br />
@ 1500 (!) / March 27, 2011
1500 10<br />
= 05DC 16<br />
• OSDC !<br />
• Open Source Developer Conference<br />
• 0x05DC<br />
• About 0xlab<br />
• The meaning of open<br />
• 0x1ab 16<br />
= 427 10<br />
→ 2009/04/27<br />
• About me<br />
• http://about.me/jserv<br />
• 最 大 的 專 長 就 是 培 養 興 趣
姊 妹 議 程 :<br />
〈 窮 得 只 剩 下 Compiler 〉<br />
OSDC.tw 2009<br />
http://www.slideshare.net/jserv/what-can-compilers-do-for-us
姊 妹 議 程 :<br />
〈 身 騎 <strong>LLVM</strong> , 過 三 關 :<br />
淺 談 編 譯 器 技 術 的 嶄 新 應 用 〉<br />
TOSSUG 2009<br />
http://www.slideshare.net/jserv/llvm-introduction<br />
姊 妹 議 程 :<br />
〈 Applied Computer Science Concepts in Android 〉<br />
台 大 資 訊 系 2010<br />
http://www.slideshare.net/jserv/applied-computer-science-concepts-in-android<br />
姊 妹 議 程 :<br />
〈 from Source to Binary -- How GNU Toolchain Works 〉<br />
臺 北 科 技 大 學 資 訊 工 程 所 2011/03/31<br />
既 然 這 麼 多 「 姊 妹 」, 依 據 慣 例 , 簡 報 也 會 出 現 一 些 姊 妹 XD<br />
既 然 這 麼 多 「 姊 妹 」, 依 據 慣 例 , 簡 報 也 會 出 現 一 些 姊 妹 XD
提 綱<br />
(1) Compilers on Rails 的 時 代<br />
(2) 探 索 <strong>LLVM</strong><br />
(3) 程 式 語 言 的 變 遷 (Low-Level 觀 點 )<br />
傳 統 -> 動 態 -> 移 動 運 算<br />
(4) <strong>LLVM</strong> 實 例
Compilers on Rails 的 時 代
Compilers on Rails 的 時 代<br />
[ 詞 彙 ] on the rails: 正 常 運 行 ; 在 正 常 軌 道<br />
[ 啟 發 ] Ruby on Rails:<br />
(1) convention over configuration<br />
(2) less software<br />
(3) programmer happiness ultimately leads to better productivity
隱 藏 在 我 們 身 邊 的 Compiler<br />
• Java / .Net ( 虛 擬 機 器 +Just-In-Time compiler)<br />
• 網 路 瀏 覽 器<br />
• Mozilla/Firefox (ActionMonkey/Tamarin)<br />
• WebKit (SquirrelFish)<br />
• Google Chrome (V8 engine)<br />
• Web 應 用 程 式 : JSP/Servlet, SilverLight/.Net<br />
• 移 動 通 訊 平 台 : Java ME, Android, iPhone,<br />
Portable Native Client<br />
• 繪 圖 軟 體 : Adobe PixelBender, Shader<br />
• 3D 高 品 質 圖 形 處 理 : Gallium3D / OpenGL /<br />
Direct3D / RenderScript (Android)
傳 統 的 Compiler 流 程<br />
Source Code Assembly Code Runnable Code<br />
Compiler Assembler Loader System User<br />
Intermediate Code Binary Code DATA<br />
IR (Intermediate Representation) 可 說 是 Compiler 的 心 臟<br />
IR (Intermediate Representation) 可 說 是 Compiler 的 心 臟<br />
<strong>LLVM</strong> = Low Level Virtual Machine<br />
<strong>LLVM</strong> = Low Level Virtual Machine
Specialize 技 巧<br />
以 color space 轉 換 來 說 , 執 行<br />
時 期 得 負 擔 大 量 且 繁 瑣 的 運 算 ,<br />
如 BGRA 444R →<br />
RGBA 8888<br />
Speedup depends on src/dest format:<br />
–– 5.4x speedup average, 19.3x speedup max<br />
(13.3MB/s to 257.7MB/s)
Compiler 領 導 技 術 的 時 代<br />
• 運 算 模 式 已 大 幅 改 觀<br />
• Framework-driven<br />
• SIMD/vectorization, Cell, SMP/multi-core<br />
• 虛 擬 化 (Virtualization) 技 術 的 時 代<br />
→ 更 多 元 、 更 安 全 、 更 有 效 率 地 使 用 硬 體<br />
• 資 訊 技 術 的 雜 交 (cross-over)<br />
• <strong>LLVM</strong> 的 大 一 統 宏 願<br />
案 例 :<br />
Portable Native Client, OpenCL (GPGPU)
到 處 都 有 VM<br />
Java Virtual Machine (JVM)<br />
.NET Common <strong>Language</strong><br />
<strong>Runtime</strong> (CLR)<br />
Smalltalk<br />
Squeak<br />
Parrot (Perl 6)<br />
Python<br />
YARV (Ruby 1.9)<br />
Rubinius<br />
Tamarin (ActionScript)<br />
Valgrind (C++)<br />
Lua<br />
TrueType<br />
Dalvik<br />
Adobe Flash (AVM2)<br />
p-code (USCD Pascal)<br />
Zend<br />
<strong>LLVM</strong> 可 作 為 上 述 的 編 譯 器 應 用 的 根 基<br />
<strong>LLVM</strong> 可 作 為 上 述 的 編 譯 器 應 用 的 根 基<br />
13
探 索 <strong>LLVM</strong>
<strong>LLVM</strong><br />
• Low-Level VM → bit-code<br />
• 完 整 的 編 譯 器 基 礎 建 設<br />
• 可 重 用 的 、 用 以 建 構 編 譯 器 的 軟 體 元 件<br />
• 允 許 更 快 更 完 整 的 打 造 新 的 編 譯 器<br />
• static compiler, JIT, trace-based optimizer, …<br />
• 開 放 的 編 譯 器 框 架<br />
• 多 種 程 式 語 言 支 援<br />
• 高 彈 性 的 自 由 軟 體 授 權 模 式 (BSD License)<br />
• 活 躍 的 開 發 (50% 開 發 者 來 自 Apple Inc.)<br />
• 豐 富 的 編 譯 輸 出 : C, ARM, x86, PowerPC, …
豐 富 的 工 具 集<br />
Assemblers, automatic debugger, linker, code<br />
generator, compiler driver, modular optimizer, …<br />
Eric Schmidt 是 UNIX lex 共 同 作 者<br />
Eric Schmidt 是 UNIX lex 共 同 作 者
GCC vs. <strong>LLVM</strong><br />
GCC<br />
C, C++, Obj-C, Fortran, Java, Ada, ...<br />
<strong>LLVM</strong><br />
C, C++, Obj-C<br />
x86, ARM, MIPS, PowerPC, …<br />
binutils (ld as)<br />
BSD-Style License<br />
JIT/Interpreter<br />
Compiler Driver<br />
Compiler Driver
Frontend <strong>LLVM</strong> IR Backend
Frontend <strong>LLVM</strong> IR Backend
Pentium4 3.0GHz Ubuntu: -Os -O3 -fast<br />
size: kbytes<br />
CodeMark 參 考 數 據<br />
10000<br />
40<br />
9000<br />
<strong>LLVM</strong><br />
GCC<br />
Intel CC Intel CC<br />
35<br />
8000<br />
30<br />
7000<br />
6000<br />
25<br />
5000<br />
20<br />
4000<br />
15<br />
3000<br />
10<br />
2000<br />
1000<br />
5<br />
0<br />
clang-2.8 Os clang-2.6 O3 clang-2.8 fast gcc-4.4.3 Os gcc-4.4.3 O3 gcc-4.4.3 fast icc-12 Os icc-12 O3 icc-12 fast<br />
0
看 起 來 , <strong>LLVM</strong> 效 能 還 不 是 最 好 ,<br />
那 為 何 我 們 還 要 關 注
[ 告 白 名 言 ]<br />
第 001 個 理 由 ~~ 因 為 妳 是 我 第 一 個 動 心 的 人<br />
第 002 個 理 由 ~~ 因 為 妳 是 我 遇 過 最 最 善 良 又 幽 默 的 女 孩<br />
第 003 個 理 由 ~~ 因 為 除 了 妳 我 不 知 道 我 還 會 愛 誰<br />
第 004 個 理 由 ~~ 因 為 我 想 讓 妳 幸 福 快 樂<br />
…<br />
第 151 個 理 由 ~~ 因 為 再 也 沒 有 人 可 以 讓 我 想 到 那 麼 多 理 由 了<br />
通 往 未 來 的 路 才 要 開 始<br />
通 往 未 來 的 路 才 要 開 始
美 妙 的 <strong>LLVM</strong> + Clang
Clang: <strong>LLVM</strong> 的 程 式 語 言 前 端<br />
C<br />
C++<br />
Clang<br />
$ clang main.c mod.c<br />
x86 機 械 碼<br />
ARM 機 械 碼<br />
Obj-C<br />
Clang driver<br />
libClang<br />
ld<br />
lib<strong>LLVM</strong><br />
as
Clang 與 <strong>LLVM</strong> 的 關 聯<br />
[C]<br />
main.c<br />
[C]<br />
mod.c<br />
libClang<br />
Source →<br />
BitCode<br />
BitCode<br />
main.bc<br />
BitCode<br />
mod.bc<br />
Optimizer<br />
lib<strong>LLVM</strong><br />
Code<br />
Generator<br />
x86 組 語<br />
main.s
Clang 功 能 示 意<br />
[C]<br />
main.c<br />
[C]<br />
mod.c<br />
lex<br />
parse<br />
semantics<br />
AST<br />
Serialize/<br />
Deserialize<br />
libClang<br />
Checker<br />
codegen<br />
Analysis<br />
Indexer<br />
BitCode<br />
main.bc<br />
BitCode<br />
mod.bc<br />
AST<br />
main.ast<br />
AST<br />
mod.ast<br />
輸 出 / 解 析<br />
IDE 整 合<br />
(Xcode)
BitCode + Optimizer<br />
BitCode<br />
main.bc<br />
BitCode<br />
mod.bc<br />
BitCode<br />
parser<br />
BitCode<br />
Linker<br />
BitCode<br />
Inter-precedual<br />
Analysis Transforms<br />
LTO: Link-Time Optimization<br />
LTO: Link-Time Optimization<br />
BitCode<br />
writer<br />
BitCode<br />
main.lto.bc<br />
Analysis Transforms<br />
BitCode<br />
main.opt.bc<br />
BitCode<br />
mod.opt.bc
<strong>LLVM</strong> Code Generation<br />
lib<strong>LLVM</strong><br />
BitCode<br />
main.lto.bc<br />
BitCode<br />
parser<br />
BitCode<br />
Machine<br />
Instr<br />
Machine<br />
Analysis<br />
Machine<br />
Transforms<br />
Asm<br />
Emitter<br />
x86 組 語<br />
main.s<br />
Execution<br />
Engine<br />
InterPreter<br />
CodeGen<br />
Transform<br />
SDNode<br />
Transform<br />
Machine<br />
Instr<br />
Register<br />
Allocation<br />
[C++]<br />
main.cpp<br />
[C]<br />
main.c<br />
Instruction<br />
Selection<br />
SDNode<br />
Selection DAG<br />
Selection DAG<br />
Instruction<br />
Scheduler<br />
ARM.td<br />
InstrInfo<br />
Register<br />
X86.td<br />
Subtarget<br />
InstrInfo<br />
Frame<br />
Register<br />
Lowering x86<br />
Subtarget<br />
CallingConv CallbackUtils<br />
Frame Transforms<br />
Lowering<br />
CallingConv
「 要 來 一 碗 <strong>LLVM</strong> 豆 花 嗎 」
• 完 整 的 Compiler Driver<br />
$ clang hello.c o hello<br />
• 生 成 IR<br />
先 從 Hello World 開 始<br />
$ clang O3 emitllvm hello.c c o hello.bc<br />
• 以 Just-In-Time compiler 模 式 執 行 BitCode<br />
$ lli hello.bc<br />
Getting Started <strong>with</strong> the <strong>LLVM</strong> System<br />
http://llvm.org/docs/GettingStarted.html
#include <br />
int main(int argc, char *argv[])<br />
{<br />
printf("Hello world!\n");<br />
return 0;<br />
}<br />
函 式 printf() 後 方 僅 有 一 個<br />
字 串 參 數 , 前 端 預 設 將 其<br />
轉 換 為 puts() puts()<br />
• 反 組 譯 BitCode<br />
$ llvmdis < hello.bc<br />
; ModuleID = ''<br />
target datalayout = "ep:32:32:32...<br />
target triple = "i386pclinuxgnu"<br />
@str = internal constant [13 x i8] c"Hello world!\00"<br />
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {<br />
entry:<br />
%puts = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @str, i32 0, i32 0))<br />
ret i32 0<br />
}<br />
Declare i32 @puts(i8* nocapture) nounwind<br />
• 輸 出 x86 後 端 組 合 語 言<br />
$ llc hello.bc o hello.s
<strong>LLVM</strong> in Google Android 3.0 SDK<br />
$ cd androidsdklinux_x86/platformtools<br />
$ ./llvmrscc version<br />
Low Level Virtual Machine (http://llvm.org/):<br />
llvm version 2.8svn<br />
Optimized build.<br />
Built Feb 16 2011 (19:26:29).<br />
Host: i386unknownlinux<br />
Host CPU: penryn<br />
Android SDK (3.0 = API version 11)<br />
http://developer.android.com/sdk/<br />
Registered Targets:<br />
arm ARM<br />
thumb Thumb<br />
x86 32bit X86: PentiumPro and above<br />
x8664 64bit X86: EM64T and AMD64<br />
$ ./llvmrscc help<br />
OVERVIEW: RenderScript source compiler<br />
32
<strong>LLVM</strong> in Google Android 3.0 SDK<br />
$ ./llvmrscc help<br />
OVERVIEW: RenderScript source compiler<br />
USAGE: llvmrscc [options] <br />
• OPTIONS:<br />
I Add directory to include search path<br />
additionaldeptarget <br />
Additional targets to show up in dependencies output<br />
allowrsprefix Allow userdefined function prefixed <strong>with</strong> 'rs'<br />
bitcodestorage <br />
should be 'ar' or 'jc'<br />
emitasm<br />
Emit target assembly files<br />
emitbc<br />
<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, emit .bc file<br />
emitllvm<br />
<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, emit .ll file<br />
emitnothing<br />
<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, but emit nothing<br />
help<br />
Print this help text<br />
javareflectionpackagename <br />
Specify the package name that reflected Java files belong to<br />
javareflectionpathbase <br />
Base directory for output reflected Java files<br />
33
測 試 SDK 內 建 範 例 RenderScript<br />
androidsdklinux_x86/platformtools$ ./llvmrscc \<br />
../samples/android11/<br />
RenderScript/HelloWorld/src/com/android/rs/helloworld/helloworld.rs \<br />
I ../platforms/android11/renderscript/include \<br />
I ../platforms/android11/renderscript/clanginclude<br />
Llvmdis < helloworld.bc<br />
@gTouchX = common global i32 0, align 4<br />
@gTouchY = common global i32 0, align 4<br />
// helloworld.rs<br />
// This is invoked automatically<br />
// when the script is created<br />
void init() {<br />
gTouchX = 50.0f;<br />
gTouchY = 50.0f;<br />
}<br />
define void @init() nounwind {<br />
store i32 50, i32* @gTouchX, align 4<br />
store i32 50, i32* @gTouchY, align 4<br />
ret void<br />
}<br />
34
<strong>LLVM</strong> 給 予 無 限 可 能<br />
C/C++/<br />
Obj-C<br />
libClang<br />
AST<br />
BitCode<br />
Lib<strong>LLVM</strong><br />
Optimizer<br />
BitCode<br />
Arch.td<br />
lib<strong>LLVM</strong><br />
CodeGenerator<br />
xxx.s
可 用 許 多 程 式 語 言<br />
撰 寫 BitCode 生 成<br />
器 ( 前 端 編 譯 器 )<br />
C/C++/<br />
Obj-C<br />
, 如 Perl module<br />
提 供 IDE 的 模 組 化<br />
靜 態 編 譯 解 析 器<br />
libClang<br />
有 了 AST 後 , 即 可 針 對<br />
語 言 特 性 , 做 出 特 定 的 應 用<br />
AST<br />
其 他 語 言<br />
特 定 的 後 端 架 構 。<br />
可 以 是 硬 體 或 軟 體<br />
BitCode<br />
Lib<strong>LLVM</strong><br />
Optimizer<br />
BitCode<br />
系 統 優 化 處 理<br />
作 為 其 他 語 言 的<br />
Source-to-source<br />
其 他 語 言 轉 換 器<br />
Arch.td<br />
可 增 添 其 他 模 組 , 如<br />
Polyhedral optimization<br />
Lib<strong>LLVM</strong><br />
CodeGenerator<br />
xxx.s<br />
針 對 後 端 硬 體 的 Selection DAG
OpenCL →<br />
Haskell →<br />
Clay →<br />
Crack →<br />
FPGA;<br />
GPGPU<br />
C/C++/<br />
Obj-C<br />
其 他 語 言<br />
Xcode<br />
libClang<br />
BitCode<br />
Lib<strong>LLVM</strong><br />
Optimizer<br />
BitCode<br />
StrengthReduction<br />
Profile-gen/use<br />
AliasAnalysis<br />
OpenCL Compiler<br />
AST<br />
→ JavaScript<br />
→ Java ByteCode<br />
其 他 語 言<br />
→ CLI<br />
→ PTX<br />
Arch.td<br />
Polly<br />
Lib<strong>LLVM</strong><br />
CodeGenerator<br />
regaloc=Pazzle|Graph<br />
xxx.s<br />
ObjectCodeEmitter
將 <strong>LLVM</strong> 應 用 在 非 編 譯 器 領 域
<strong>LLVM</strong> 力 :<br />
「 不 是 為 了 取 悅 硬 體 而 寫 編 譯 器 , 而 為 自 己 寫 編 譯 器 」<br />
• <strong>LLVM</strong> + Gallium3D: Mixing a Compiler With a<br />
Graphics Framework<br />
• http://people.freedesktop.org/~marcheu/fosdem09-g3dllvm.pdf<br />
• <strong>Runtime</strong> Code Generation for Huffman Decoders<br />
• “The speedup improvement is 23.2% at<br />
average and ranges from 32.2% to 14.2%.”<br />
http://solar.cslab.ece.ntua.gr/~kkourt/papers/huff-jit-report.pdf<br />
• A method for JIT’ing algorithms and data<br />
structures <strong>with</strong> <strong>LLVM</strong><br />
• “For small AVL Trees (<strong>with</strong> less than ~3.000<br />
nodes), we can get an average performance<br />
of 26% over traditional method”<br />
• http://pyevolve.sourceforge.net/wordpress/p=914
程 式 語 言 的 變 遷<br />
(Low-Level 觀 點 )
程 式 語 言 的 變 遷 ( 低 階 觀 點 )<br />
• 職 業 無 貴 賤 , 程 式 語 言 是 提 出 來 解 決 人 類 面 臨 的<br />
問 題 之 用<br />
System Bus<br />
DMA CPU DSP<br />
CPU DSP DMA Memory<br />
Interconnection network (BUS)<br />
DSP<br />
Dedicated<br />
IP<br />
I/O<br />
Memory<br />
controller<br />
Peripherals<br />
<strong>Programming</strong> <strong>Language</strong><br />
Bridge<br />
Peripheral Bus
“All problems in computer<br />
science can be solved by<br />
Indirection<br />
another level of indirection."<br />
~ Butler Lampson, 1972 ~<br />
• UNIX v6 (1976) 提 供 以 C 語 言 重 寫 的 作 業 系 統<br />
• 需 求 驅 使 的 發 展 模 式<br />
• 數 學 / 工 程 → Lisp → Lisp machine ()<br />
• 軟 體 工 程 → Smalltalk<br />
• 網 際 網 路 → Java
遊 戲 產 業 驅 使 <strong>Programming</strong> <strong>Language</strong><br />
1972 Pong ( 硬 體 )<br />
1980 Zork ( 高 階 直 譯 語 言 )<br />
1993 DOOM (C)<br />
1998 Unreal (C++, Java-style scripting)<br />
2005-6 Xbox 360, PlayStation 3<br />
<strong>with</strong> 6-8 hardware threads<br />
2009 Next console generation.<br />
Unification of the CPU, GPU.<br />
Massive multi-core, data parallelism, etc.
今 日 的 Indirection 以 VM 形 式 存 在<br />
Charles Oliver Nutter (JRuby)<br />
“<strong>Build</strong>ing a Multilanguage VM” (2009)<br />
• Today, it is silly for a compiler to target actual hardware<br />
• Much more effective to target a VM<br />
• Writing a native compiler is lots more work!<br />
• <strong>Language</strong>s need runtime support<br />
• C runtime is tiny and portable (and wimpy)<br />
• More sophisticated language runtimes need<br />
• Memory management<br />
• Security<br />
• Reflection<br />
• Concurrency control<br />
• Libraries<br />
• Tools (debuggers, profilers, etc)<br />
• Many of these features are baked into VMs
JVM vs. Java <strong>Language</strong> vs. Ruby<br />
Java language<br />
Ruby language<br />
JVM 特 徵<br />
Primitive types+ops<br />
Object model<br />
Memory model<br />
Dynamic linking<br />
Access control<br />
GC<br />
Unicode<br />
Checked exceptions<br />
Generics<br />
Enums<br />
Overloading<br />
Constructor chaining<br />
Program analysis<br />
Primitive types+ops<br />
Object model<br />
Memory model<br />
Dynamic linking<br />
Access control<br />
GC<br />
Unicode<br />
Open classes<br />
Dynamic typing<br />
'eval'<br />
Closures<br />
Mixins<br />
Rich set of literals<br />
Primitive types+ops<br />
Object model<br />
Memory model<br />
Dynamic linking<br />
Access control<br />
GC<br />
Unicode<br />
46
在 JVM 上 實 做 Ruby 語 言 (JRuby)<br />
• 好 處 :<br />
• 利 用 既 有 JVM 在 平 台 優 化 的 效 能 與 彈 性<br />
• 存 取 豐 富 的 Java 資 源<br />
• 難 處 :<br />
• Dynamic typing 讓 已 有 優 化 技 術 變 得 難 以 發 揮<br />
• JRuby 必 須 維 護 自 己 的 type system<br />
• Reflection overhead<br />
• 無 法 以 有 效 率 且 健 全 的 方 式 來 實 做 Ruby<br />
”eval”<br />
The Da Vinci Machine Project<br />
http://openjdk.java.net/projects/mlvm/<br />
OpenJDK Multi-language VM<br />
47
在 <strong>LLVM</strong> 上 實 做 Ruby 語 言<br />
• 開 放 實 做 :<br />
• MacRuby : http://www.macruby.org/<br />
• Rubinius : http://rubini.us/<br />
• 若 充 分 對 應 到 <strong>LLVM</strong> 的 設 計 , 應 可 發 揮 若 干 效 能<br />
的 改 善 與 runtime support<br />
• Out-source'd JIT <strong>Runtime</strong><br />
• Why MacRuby Matters (Present & Future)<br />
http://programmingzen.com/2009/03/29/why-macruby-matters/<br />
48
http://programmingzen.com/images/macruby-large-chart.png<br />
49
<strong>LLVM</strong> 與 程 式 語 言 實 做<br />
• <strong>LLVM</strong> 在 bitcode 層 面 即 考 慮 到 動 態 語 言 的 需 求<br />
• VMKit: Java, .Net<br />
• 允 許 多 個 階 段 的 優 化 : profiler, offline optimizing<br />
• 提 供 Accurate Garbage Collection<br />
• 在 移 動 裝 置 上 的 JIT compiler<br />
• [RenderScript] Android 3.0: 實 做 code<br />
cache , 試 圖 降 低 編 譯 的 成 本<br />
• 目 前 <strong>LLVM</strong> 的 效 能 仍 無 法 趕 上 若 干 特 製 的<br />
VM 。 案 例 : IcedTea/Shark, Dalvik<br />
50
<strong>Build</strong> <strong>Programming</strong> <strong>Language</strong><br />
<strong>Runtime</strong> <strong>with</strong> <strong>LLVM</strong> 實 例
「 快 跟 我 玩 <strong>LLVM</strong> 」
Brainfuck<br />
• Brainfuck 是 種 極 為 精 簡 的 程 式 語 言 , 由 Urban<br />
Müller 發 展 。 當 初 的 目 標 為 提 出 一 種 簡 單 的 、 可<br />
用 最 小 的 編 譯 器 來 實 現 、 符 合 Turing complete<br />
的 程 式<br />
• Brainfuck 僅 有 八 個 指 令 , 其 中 兩 個 是 I/O 動 作<br />
53
Brainfuck<br />
• 對 應 到 C 語 言 : 若 char *p 指 向 記 憶 體 區 塊 的<br />
話 , Brainfuck 語 言 的 八 個 指 令 可 對 照 為 以 下 :<br />
• Brainfuck C<br />
> ++p;<br />
< p;<br />
+ ++*p;<br />
*p;<br />
. putchar(*p);<br />
, *p = getchar();<br />
[ while (*p) {<br />
] }<br />
54
Brainfuck<br />
• Brainfuck 語 言<br />
+++++[]<br />
• 等 價 於 C 語 言<br />
*p+=5;<br />
while(*p != 0){<br />
}<br />
*p;<br />
Brainfuck C<br />
> ++p;<br />
< p;<br />
+ ++*p;<br />
*p;<br />
. putchar(*p);<br />
, *p = getchar();<br />
[ while (*p) {<br />
] }<br />
55
#include <br />
void foo(char c) { putchar(c); }<br />
define void @foo(i8 signext %c) nounwind {<br />
%1 = alloca i8, align 1 ; [#uses=2]<br />
store i8 %c, i8* %1<br />
%2 = load i8* %1 ; [#uses=1]<br />
%3 = sext i8 %2 to i32 ; [#uses=1]<br />
%4 = call i32 @putchar(i32 %3) ; [#uses=0]<br />
ret void<br />
}<br />
declare i32 @putchar(i32)<br />
// declare i32 @putchar(i32)<br />
Function* putchar = cast(<br />
module>getOrInsertFunction(<br />
"putchar", voidType, cellType, NULL));<br />
putchar>setCallingConv(CallingConv::C);<br />
呼 叫 底 層 系 統 libc 的 putchar 函 式<br />
呼 叫 底 層 系 統 libc 的 putchar 函 式<br />
56
架 構 於 <strong>LLVM</strong> 的 程 式 語 言 實 做 (1)<br />
• Unladen Swallow (Google): faster Python<br />
$ ./perf.py -r -b call_simple --args "-j always," \<br />
../q2/python ../q3/python<br />
• Min: 1.618273 -> 0.908331: 78.16% faster<br />
• Avg: 1.632256 -> 0.924890: 76.48% faster<br />
http://code.google.com/p/unladen-swallow<br />
• GHC/Haskell's <strong>LLVM</strong> codegen<br />
• 3x faster in some cases<br />
http://donsbot.wordpress.com/2010/02/21/<br />
smoking-fast-haskell-code-using-ghcs-new-llvm-codegen/<br />
• <strong>LLVM</strong>-Lua : JIT and static Lua compiler using<br />
<strong>LLVM</strong><br />
• http://code.google.com/p/llvm-lua/<br />
57
架 構 於 <strong>LLVM</strong> 的 程 式 語 言 實 做 (2)<br />
• IcedTea Version of Sun's OpenJDK (RedHat)<br />
• Zero: processor-independent layer that allows<br />
OpenJDK to build and run using any processor<br />
• Shark: Zero's JIT compiler: uses <strong>LLVM</strong> to provide<br />
native code generation <strong>with</strong>out introducing<br />
processor-dependent code.<br />
http://icedtea.classpath.org<br />
• Emscripten<br />
• <strong>LLVM</strong>-to-JavaScript compiler<br />
• It takes <strong>LLVM</strong> bitcode and compiles that into<br />
JavaScript, which can be run on the web (or<br />
anywhere else JavaScript can run).<br />
http://code.google.com/p/emscripten/<br />
58
http://0xlab.org