• 沒有找到結果。

師。主要目的也是簡化代碼編寫時間,像是 Garbage Collection、Memory Map 以 及 Overflow Check 等問題皆是自動處理,以減少撰寫人的負擔。

5

圖 2-1 各種語言的比較[2]

也因為如此,腳本語言要與其他程式元件之間進行通訊,所需要進行的設定 也要簡單的多,並且會提供許多可以進行高階的操作的指令碼。整體而言,就如 同圖 2-1 所顯示的,每一個腳本語言的 Statement 大約可以轉換成 100 到 1000 個 低階指令,而傳統的程式語言每個 Statement 只能轉換成 5 到 10 個低階指令[2]。

如同以上所言,腳本語言擁有開發速度更快,而且檔案大明顯小於傳統程式 語言的檔案。相對的,它在執行速度上遠遠不如傳統程式語言。腳本語言通常是 直譯式執行,速度不僅慢,而且記憶體使用量也更多。然而,由於硬體速度的大 幅演進,如果是編寫小型程式,兩者的差距並不大。即使是大型程式,也可搭配 傳統程式語言使用來縮小兩者之間的差距。在軟體程本趨高而硬體成本趨低的現 今,擁有低開發門崁的腳本語言的確在軟體設計上開拓了一片新領域。

6

2.2 Lua 介紹 介紹 介紹 介紹

在眾多腳本語言中,Lua 是一個功能強大,速度快,重量輕,可嵌入的腳本 語言[3]。其中最為特殊的一點,就是他非常容易嵌入其它程式語言中使用。只 要是宿主語言所實作出來的功能,Lua 都可以輕易的使用他們來擴充自己的功能 性。而實際上,Lua 也已經擁有許多成熟的擴充功能模組讓使用者能夠更為方便 來使用。

如同其他的腳本語言,Lua 也具有 Dynamically Typed,以及 Garbage Collection 自動處理等特性。而且相對於其他腳本語言,Lua 有著更為輕量的記憶體使用量 以及更快的執行速度,有許多的 Benchmark 測試皆顯示 Lua 的執行速度在腳本 語言中可算是最快的[3]。也因為如此,使得許多商業軟體皆選擇 Lua 作為編寫 程式的主要語言之一。

2.3 Low Level Virtual Machine

Low Level Virtual Machine,即 LLVM 是一種 Compiler 的基礎平台。其最大 的特點就是在編譯程式碼的過程中,提供了中間表示式這種獨立的中間層[4]。

利用這種機制,LLVM 可對整個編譯過程的編譯時期、鏈結時期、執行時期以及 閒置時期進行各自的最佳化。

7

圖 2-2 LLVM 前端(Frontend)與後端(Backend)架構

也因為這種設計,使得 LLVM 可使整個編譯器模組化,將編譯器分為前端 (Frontend)與後端(Backend)各別設計。使用者可以自行撰寫各種的前端來將高階 語言轉譯成中間表示式;也可以撰寫後端將中間表示式轉譯成各種機器碼。截至 目前為止,LLVM 前端已經可以支援 ActionScript、Ada、D、Fortran、GLSL、

Haskell、Java bytecode、Julia、C/C++、Python、Ruby、Rust、Scala 以及 C#[4]。

LLVM 後端則可以支援 Alpha、ARM、Blackfin、CellSPU、JavaScript、MBlaze、

MIPS、MSP430、PowerPC、PTX、Sparc、SystemZ、X86 以及 XCore 等眾多機 器碼,這也顯示了 LLVM 擁有非常強大的跨平台能力。

2.4 LLVM Backend

LLVM 後端在 LLVM 整體架構中扮演者一個十分重要的角色。由於中間表 示式無法被直接執行,故需要先由 LLVM 後端將中間表示式轉換成機器碼或指 定的語言,才能讓實體或虛擬機器進行執行工作。

因此,在一般狀況下,要實作一個 LLVM 後端,必須進行以下幾個步驟:

指令運算元對映(Instruction Operand Mapping):::

在指令集方面,首先要先定義每種指示所需使用的運算元數量,以及每個運

指令關係對映(Instruction Relation Mapping):::

除此之外,如果有些中間表示式的指令必須用複數個目標語言的 Statement 來實作;或者是多個中間表示式的指令可以用單個目標語言的 Statement 來實作 時,就必須設定兩者之間指令關系的對映。

2.5 Emscripten

Emscripten[6]是一個將 LLVM 中間表示式轉譯成 JavaScript 的轉譯系統。其 主要功能是利用 LLVM 可以支援多種語言的特性,以及大多數網頁流覽器皆支 援 JavaScript 的特點。讓許多並非使用 JavaScript 撰寫的程式,在不需要大幅改 寫的狀況下,也能夠在網頁上執行。其主要可分為三個部分:

Intertyper

將輸入的 LLVM 中間表示式轉換成 Emscripten 自己的內部格式。

Analyzer

對 Emscripten 內部格式資訊進行分析,進一步產生的各種有用的訊息,像是 變數類型和資訊,堆疊使用狀況,以及相關的優化資訊等。

Jsifier

根據 Emscripten 內部格式資訊以及 Analyzer 分析出的資訊,產生最後的 JavaScript 程式碼。

10

與我的轉譯器直接與 LLVM 搭配不同,Emscripten 是一獨立運作的轉譯系統。

而其主要優化功能則是集中在 Loop 結構的重建。由於其優秀且穩定的演算法,

我在實作 Loop Recovery 演算法時,也是根據 Emscripten 的演算法而進行修改。

11

相關文件