- JavaScript語言精髓與編程實踐(第3版)
- 周愛民
- 1599字
- 2020-07-02 15:37:30
第3版 代序
什么叫“會編程”
—《程序原本》節選—
程序設計語言—這種工具有什么性質呢?又或者,究竟是什么決定了一門語言稱為Java,而另一門叫作C#呢?它們之間存有何種不同,又存有哪些淵源呢?
有趣的是,通過分析現有的種種程序設計語言,(正因為這些語言是我們人類自己創造的,所以)我們發現如同人類的自然語言一樣,程序設計語言也總是有著三種基本性質:語法、語義與語用。正是這三種性質,使得一種語言區別于其他語言,而又能從其他語言那里有所借鑒,以及實現彼此溝通。
那么我們先來談談什么是語法。語法,是指我們表達內容的形式。這一形式首先與不同的表達手段有關,例如同一個意思,口頭表達和書面表達是不同的。其次,即使表達手段相同,也會因為介質的材料性質存有差異而導致形式不同,例如鐘鼎文和白話文都用于書寫,但顯然鐘鼎文不能像白話文那樣冗長。類似地,在我們的程序設計語言中,早期的程序輸入就是電子開關的開合,因此代碼會是一些操作命令,而現在我們可以將之輸入為接近自然語言的程序文本;早期的運行環境要求代碼必須盡量精簡,而現在我們則考慮通過規整而冗長的代碼來降低工程整體的復雜性。
所以,語法是對語言的表達手段,以及對該表達手段的條件限制加以綜合考慮而設定的一種形式化的規則。而所謂語義,則是指我們表達內容的邏輯含義。語義有以下基本性質:
■ 一、必須是一個含義。
■ 二、該含義必須能夠以某種基本的邏輯形式予以闡述。
語義還有一項非必需的性質,即:
■ 三、上述邏輯所表達的含義可以為語言的接受者所知。
略為討論一下第二項性質。為何語義必須要能闡述為一種基本邏輯呢?因為語義定義為內容的含義,而這種含義可以由多種形式來表現,因此,如果它不能用一種基本邏輯來表達,也就沒有辦法在多種表現形式之間對它互做驗證。例如,不能用書寫的方式來確定口頭轉述的正確性,反之也不能通過口傳心授來傳播書本知識。自然語言中的這種性質(部分地)可以由基本邏輯的矛盾律來約束,即“一個概念不能既是該概念,而又非該概念”。正是因為我們的文字記錄與對話交流等內容中存在著這樣的一些基本邏輯,所以它才可能科學、嚴謹及正確。
第三項性質對自然語言來說是非必需的—如果一個人自言自語,那么他的言語可能仍然是有語義的,只是這個語義不為他人所知。但這一點對于程序設計語言來說卻是必需的,因為我們設計這樣一門語言的目的,正是要讓我們所表達的含義為計算機所知。
正是這第三項性質,加入了對“接受者的理解能力”的限制。出于語義的前兩項基本性質,這種理解能力也必然由兩個方面構成,一是指含義,二是指邏輯。于是我們看到了我們曾經討論過的全部內容:計算系統的要素,包括數、數據和邏輯,以及在此基礎上進行正確計算的方法的抽象,即計算范式。只有通過這些組織起來的語義,才可能被(我們此前所述的)計算系統理解。
這些語義與其表現形式(即語法)是無關的,有其基本邏輯存在。我們所謂的“會編程”,正是指對這種語義的理解,而非對某種語法的熟悉。正因如此,我們才可以在Java上實現某個程序,又在C#上同樣實現它,在(使用這些語言的)類似的仿制過程中,不變的是語義。
因此再進一步觀察,編程這樣的行為也就無非是將我們的意圖表達為計算系統的理解能力范圍內的語義罷了。歸納起來看,這種語義:
■ 由計算系統與程序員共同確知的數據與邏輯構成;且,
■ 最終可以由某種計算方法在指定計算系統上實施以得到計算結果。
這里的計算方法并不是指“算法”,而是指對某種計算實施過程的抽象,例如“命令式”和“函數式”這兩種計算范式。所以,會編程與掌握某種語言的語法形式是無關的。
編程實質上是一種在語義描述上的能力修養。具備這種能力之后,語法也就只存在一些規則、限制和對不同計算系統的理解能力上的差別了。所以,“計算機程序設計”這門功課應該教你編程,而不是教你使用一門具體的語言—我們現在大多把它當成語言課,實在是本末倒置了。
周愛民
2012年6月于《程序原本》
- Practical Data Analysis Cookbook
- Microsoft Exchange Server PowerShell Cookbook(Third Edition)
- Unity 2D Game Development Cookbook
- PySpark Cookbook
- Spring Boot+MVC實戰指南
- Hands-On JavaScript for Python Developers
- PyQt編程快速上手
- Data Science Algorithms in a Week
- Julia數據科學應用
- Web程序設計:ASP.NET(第2版)
- C/C++代碼調試的藝術(第2版)
- SFML Game Development
- Python程序設計:基礎與實踐
- 菜鳥成長之路
- LabVIEW數據采集(第2版)