19.01.2015 Views

Build Programming Language Runtime with LLVM

Build Programming Language Runtime with LLVM

Build Programming Language Runtime with LLVM

SHOW MORE
SHOW LESS

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 ­emit­llvm 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 />

$ llvm­dis < hello.bc<br />

; ModuleID = ''<br />

target datalayout = "e­p:32:32:32­...<br />

target triple = "i386­pc­linux­gnu"<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 android­sdk­linux_x86/platform­tools<br />

$ ./llvm­rs­cc ­­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: i386­unknown­linux<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 ­ 32­bit X86: Pentium­Pro and above<br />

x86­64 ­ 64­bit X86: EM64T and AMD64<br />

$ ./llvm­rs­cc ­­help<br />

OVERVIEW: RenderScript source compiler<br />

32


<strong>LLVM</strong> in Google Android 3.0 SDK<br />

$ ./llvm­rs­cc ­­help<br />

OVERVIEW: RenderScript source compiler<br />

USAGE: llvm­rs­cc [options] <br />

• OPTIONS:<br />

­I Add directory to include search path<br />

­additional­dep­target <br />

Additional targets to show up in dependencies output<br />

­allow­rs­prefix Allow user­defined function prefixed <strong>with</strong> 'rs'<br />

­bitcode­storage <br />

should be 'ar' or 'jc'<br />

­emit­asm<br />

Emit target assembly files<br />

­emit­bc<br />

<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, emit .bc file<br />

­emit­llvm<br />

<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, emit .ll file<br />

­emit­nothing<br />

<strong>Build</strong> ASTs then convert to <strong>LLVM</strong>, but emit nothing<br />

­help<br />

Print this help text<br />

­java­reflection­package­name <br />

Specify the package name that reflected Java files belong to<br />

­java­reflection­path­base <br />

Base directory for output reflected Java files<br />

33


測 試 SDK 內 建 範 例 RenderScript<br />

android­sdk­linux_x86/platform­tools$ ./llvm­rs­cc \<br />

../samples/android­11/<br />

RenderScript/HelloWorld/src/com/android/rs/helloworld/helloworld.rs \<br />

­I ../platforms/android­11/renderscript/include \<br />

­I ../platforms/android­11/renderscript/clang­include<br />

Llvm­dis < 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!