標籤:

理論上最好的編程語言: 封裝定則篇

接上篇:

王博文:理論上最好的編程語言: 讀寫省略篇?

zhuanlan.zhihu.com圖標

這裡先用 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:編程語言 |