• 沒有找到結果。

2 九十一年度工作成果

2.2 SAOL 語法及語意研究

經分析整理參考文件後,吾人已將 SAOL 重點部分,通盤了解。並已實作 SAOL 語言轉譯成 80x86 機器語言的 Compiler。Compiler 包含下列幾個步驟(參見圖三):

1. [Input data]->Translator->[Parse tree]

預計要完成兩種輸入資料,一種是從 SAOL 文字檔輸入,另一種是由 SAOL 所壓成的 bitstream,這種 bitstream 通常是放在 Server 端,經由網路傳送的。這兩種輸入資料格式,經由各 自的 Translator,轉換成為相同的內部資料型式,也就是 parse tree,再送給下層去處理。這裏使用 到的工具為 Lex&Yacc,幫助產生 parser。

2. [Parse tree]->Compiler->[Assemble code]

當要發出樂器聲之前,要先將所有用到樂器的演算法,轉換為電腦可執行的程式碼,而由於本 系統的 client 端定位在使用 80x86 CPU 的個人電腦,Compiler 所產生的組合語言,即為 80x86 組合 語言指令。每一個 Instrument,都會產生出三段組合指令碼,分別為 I-cycle、K-cycle 及 A-cycle 的 運算命令。

Compiler 還包括了變數是否宣告、變數型態檢查(陣列大小比對)、變數速度比對、最佳化這幾 個部份。宣告的變數,會存在 variable table 裡,包括變數名字、大小、速度等,而往後每當有運 算式(expression)或敘述句(statement)引用到變數,都會來這個表裡檢查。如果名字找不到,就產生 var_not_declared Exception,並告知使用者;若是陣列大小、或是速度的指定上有違規,也會產生 不同的 Exception 及錯誤訊息。

目前最佳化,包括了常數運算式最佳化、重覆指令最佳化以及乘 2 最佳化等。常數運算式最佳 化如 a=51.36+8.54; 將之轉為 a=59.9; ,即可在運算聲音時,減少運算量。重覆指令最佳化,如在 迴圈內重覆指定相同值給一個變數,但之後的運算又沒有對他的值再做改變,就將這個變數的初值 設定提到迴圈之外。乘 2 最佳化,即 b=a*2; 改為 b=a+a; 。還有其他的最佳化,將在往後的時間 陸續增加。

3. [Assemble code]->Assemabler->[Machine code]

經由 Compiler 產生的 Assemble Code,再經由組譯器,產生出 80x86 的機器碼,而此機器碼,

即為机器可執行的指令;和 Compiler 一樣,此階段也有最佳化的工作要做,但是處理的問題和最

佳化的方式,有所不同。在這個階段,我們使用 peephole 的方式做最佳化,減少一些記憶體、暫 存器的存取。

SAOL FILE instr t one () {

// va riable decla rat ion a sig a , x, y, init;

// comput ing st art s here a = 0.196307;

PARSE TREE

MACHINE CODE IN MEM 33 F F x or e di , ed i The input data maybe from local

file or bit stream from internet.

Translate various types of input data into the same format.

Convers inner stored data structure into assemble language

Translate assemable language into machine code.One important difference betweens general assemblers, it writes result (Machine code) into memory, not file.

Runnable machine code.

ASSEMABLE CODE 80X86 assemable code

includes floating point instructions.

圖(三) 實作 SAOL 語言轉成 80x86 機器語言

其次是 SAOL 語言的整合寫作環境,為了日後設計樂器聲音演算法的方便測試,所以計畫設 計這個類似 Virtual Studio 的發展環境(參見圖四),其功能包括

1. 基本文書編輯能力

提供基本的文書功能,如剪下、貼上。

2. 即時語法分析

設計每當使用者打了字後持續半秒沒再動鍵盤,就自動進行語法分析,並將分析的結果,顯示 出來。左方的樹狀結構視窗,顯示出目前的樂器、及其內部變數。

下方的列表視窗,列出分析後的警告、錯誤。

3. 即時執行測試結果

不像 Visual C++等的 IDE,需要先將修改的檔案存到磁碟內,再呼叫外部編譯器去做編譯、連 結、輸出執行檔的動作;本計畫要求,只須按一個快連鍵,即可立即測試演算結果,因為本程式,

將使用者輸入的資料,透過上述的 SAOL Compiler 技術,直接編繹到記憶體中,成為可執行的程 式碼;然後再和測試樂譜一起經下一段所述的排程器,產生出聲音。在使用方便性上,大大的提昇。

圖(四) SAOL parser 程式介面

相關文件