理論上最好的編程語言: 封裝定則篇
接上篇:
王博文:理論上最好的編程語言: 讀寫省略篇這裡先用 C 語言寫一個 Hello World 並介紹自己姓名和年齡的小程序:
int main(void){char MyName[] = "Wang Bowen";int MyAge = 25;printf("Hello world, my name is %s, my age is %d", MyName, MyAge);return 0;}
而用 lisp 的寫法,可以如下表示:
(setq MyName "Wang Bowen" MyAge 25)(System_CommandLine_Output (strcat "Hello, world, my name is " MyName ", my age is " (int2str MyAge)))
System_CommandLine_Output 是我杜撰出來的函數,該函數將其後的參數輸出到命令行的顯示區域;
strcat 代表著粘合其後的多個字元串參數;
int2str 的意思是將 int 類型的整數變成顯示整數的字元串;
C 語言寫出的小程序,比起 lisp 語言寫出的小程序,多出了一個操作,那就是解析
"Hello world, my name is %s, my age is %d"
這段字元串。因此 C 語言的這種寫法,比起 lisp 的那種寫法,其編譯速度會相對慢一些。
除去編譯速度相對較慢的這種缺點,其實 printf 的這種格式模板封裝,是沒有必要的。
在這段程序里,printf 的實際輸入是 MyName 和 MyAge,它的輸出則是一串友好的字元串,也就是這個過程如下所示:
從圖裡可以看出,要完成轉換,最直接的方式是使用編程語言(RDS),而不是在這之上再增添一種數據結構。所以,像 printf 以及和其類似的,可以說是由其演化出的各種模板(template)語法,像 jsp、php、asp 等等,都是有封裝問題的。假如這種封裝的目的是減少暴露給客戶的不必要複雜性,那麼在這種封裝上衍生出的語言就可以說是適得其反了。
這裡要談到的問題就是"封裝",編程過程中,對程序的封裝有很多種。"怎樣才是好的封裝?",這對編程語言本身也是一個問題。
在使用 C 語言編程的過程中,往往一個函數內部的另一個函數調用就能改變一個程序的全局狀態,而不用通過該函數的輸入輸出(比如說 malloc() 和 free())。這給程序調試帶來了極大的不方便。
因此在 OOWA 中,子 RDS-IR 必須通過輸出來改變存在於 父 RDS-IR 的公用狀態變數(雖然 子 RDS-IR 的狀態可能本身就是 父 RDS-IR 的狀態變數之一,但這裡談的是非子 RDS-IR 狀態的"公用狀態變數")。
根據 When we share, everyone wins - Creative Commons 網站的協議,本文
署名-非商業性使用-相同方式共享
CC BY-NC-SA
推薦閱讀:
※如何編寫優質的API文檔?
※為什麼要學習編程設計
※理論上最好的編程語言: 讀寫省略篇
※AppleScript類自然語言與非英語語法設計
※科普向:編程語言發展
TAG:編程語言 |