
270
|
第 8 章
程式碼就是資料
程式都有兩種人生。除了控制特定系統的指令,我們還可以將程式視為純粹的資料:運
算式的樹狀結構、字元的原始字串,或甚至是單一大型數值。一般都認為身為程式開發
人員的我們應該瞭解這種二元性,但是對於通用型的電腦來說,可以將程式表示成資料
則十分重要,因此就可以將它們用作其他程式的輸入;程式碼和資料一致之後,讓軟體
在一開始變得可能。
在通用圖靈機的例子,我們已經看到了程式即資料,另一個圖靈機的規則手冊預期會在
它的磁帶寫入一組字元。在像是 Lisp
3
和 XSLT 之類的華麗
同像性
(
homoiconic
)程式語
言,我們要明確的將程式寫成語言本身可以操作的資料結構:每個 Lisp 程式都是稱為
s-expression
的巢狀串列,而每個 XSLT 樣式表則都是 XML 文件。
在 Ruby 中通常只有直譯器(至少就 MRI 這種情況,不是以 Ruby 本身編寫)可以看到
程式的結構化表示,但程式碼即資料的原則仍然適用。例如這個簡單的 Ruby 程式:
puts 'hello world'
對於瞭解 Ruby 語法和語意的觀察者來說,這個程式將
puts
訊息和
'hello world'
字串
傳給
main
物件,這會讓
Kernel#puts
方法將
hello world
列印到標準輸出。但在較低的
層次來看,那只是一組字元序列,而且因為將字元表示成位元組,因此最後可以將那個
序列視為大型的數值:
>> program = "puts 'hello world'"
=> "puts 'hello ...