- 高質量程序設計指南:C++/C語言
- 林銳 韓永泉編著
- 2115字
- 2019-01-09 14:08:57
3.2 語言實現
雖然C++/C并沒有提供對I/O的直接支持,但是由于類似的函數庫和標準的類庫對于實際開發工作太重要了,所以C++/C標準(ANSI/ISO C++/C)規定了這些庫的標準接口,但是并沒有提供其實現,因為這是語言實現的任務。
那么什么是語言實現呢?語言實現就是具體地實現一種語言的各種特征并支持特定編程模式的技術和工具。一般地講,編程語言的實現就是編譯器(compiler)和連接器(linker)(編譯—連接模式)或者解釋器(interpreter)(解釋模式)的實現,即用來分析你的源代碼并生成最終的可執行機器指令集合的技術和工具,以及一套標準庫實現。
語言最終要表現為某個或某些具體的實現版本,但是語言實現并不就是語言本身,因為對于那些允許擴展的標準化語言,它們的實現往往會對那些可擴展的部分進行必要的修改和擴展,這就產生了方言(dialect)。C++/C就是允許擴展的語言,即它的標準規范文本中定義和說明了許多實現相關的及平臺相關的特征細節,這就要求語言實現根據具體的平臺環境和實現技術來修改或定義自己的解決辦法。比如在C++/C標準規范中,程序的行為就有一種“實現定義的行為(即依賴于實現的行為)”,就是程序在運行時某些情況下的行為要靠具體的語言實現來定義,而標準規范不會強加定義。C++/C語言有許多的方言,如Turbo C++/C、Borland C++/C、Microsoft C++/C、GNU C++/C等,都是C++/C不同的實現版本。所以,要根據你所使用的C++/C語言實現來確定那些“實現定義的行為”的具體含義。
另外,語言標準可能會要求實現提供可用的標準化庫(Standard Library)。庫增加了語言的靈活性和可擴展性。各種庫的實現方法可能不同,但是其接口必須是標準化的(一致的),否則會給用戶帶來不便。編譯器開發商在提供語言實現的同時可能還會提供集成開發環境(IDE),不論是可視化的還是非可視化的IDE,其目的都是幫助程序員提高編程效率。
一個具體的語言實現必須支持語言規范所定義的核心特征,除此之外的特征和對核心特征的修改都屬于擴展。例如,Microsoft C++/C就分別對ANSI/ISO C++/C進行了必要的擴展,具體表現在關鍵字、類型轉換、單行注釋、變長參數列表、作用域規則及增加的編譯器選項等方面(詳見其編譯器文檔)。此外,隨著技術的發展,解決了一些問題,而到了需要對語言本身進行修訂的時候,例如,增加一些新的特征和刪除一些過時的特征,就需要對語言的核心進行擴展,當然語言的實現也要做出相應的修訂。例如,C++希望將來能夠增加對象持久性、并行處理等特征,而這些恐怕無法通過庫來實現,必須對語言的核心特征進行必要的擴展才能解決,但是現在的技術水平還無法完成這個任務。
由于存在著“依賴于實現的行為”等諸多因素,不同語言實現之間可能并不完全兼容。這種不兼容包括代碼的不兼容、特征實現的不兼容、庫的不兼容、編譯器和連接器的不兼容,以及它們生成的中間文件的不兼容(即二進制不兼容),等等。就拿標識符重命名(Name-Mangling)方案來說,Microsoft C++采用的方案就和Borland C++的不同(C++標準并沒有規定這些,但是C標準規定了),從而導致一方編譯生成的目標文件(.obj)拿到另一方的連接器上無法連接的問題,還有不能同時使用不同實現的庫等問題。
雖然一種語言可能存在不同的實現,但是學好標準語言本身無疑是最重要的!過去經常聽說“某某人在鉆研Visual C++”,我不知道他是在學習C++語言還是在學習Visual C++的IDE和MFC或者兼而有之。有些人甚至錯誤地認為學會使用Visual C++ IDE就是學會了C++語言。這又是一個誤區!
首先掌握語言的特征及其使用方法,再學習具體的語言實現才是語言學習的正道!
實際上,語言實現要解決的根本問題是如何才能高效地使用這種語言開發程序,這不僅包括對實現一個程序(編譯—連接)的支持,還包括對程序開發設計活動的支持。比如C++/C頭文件與實現文件的分離、多源文件程序的組織、單獨編譯技術、調試技術等都是特定的語言實現開發出來的標準技術,現在已經被廣泛采用,它們并非作為語言的C++/C本身所關心的問題。
我們不能因為Bjarne說過那樣的話就不去使用甚至不去學習C++/C的高級特性。你可能認為:即使不使用它們,也照樣能夠實現需要的功能。是的,你能夠!因為任何問題都不可能只存在一種解決辦法。但是能夠做一件事情和做好一件事情是完全不同的兩碼事兒!你是否認真考慮過你這樣做的代價和結果呢?
要想高效地使用一種語言,毫無疑問你首先必須了解它的各個特征和它們的使用方法,以及使用它們有什么樣的利弊。此外,你還必須學習幾種編程方法和編程模式,以及高效地和高質量地把它們組合起來的技巧,比如結構化編程、模塊化編程及過程式編程是基本的編程方法和編程模式,而基于對象、面向對象、面向組件、泛型編程乃至事件驅動編程和基于規則的編程則是高級的編程模式。可以預見,模塊化的面向對象程序設計模式、面向組件的程序設計模式、泛型編程都將是未來的主流模式。這還不夠,最后你要學習各種編程環境和標準庫或其他庫的使用方法,要充分利用現有的資源而不要做重復勞動,這樣才能用好一門語言,才能開發出高質量的程序。
【教你一招】: 你要學會在特定的平臺下學習具體的語言實現,除了要了解其編譯器手冊和幫助外,你還可以編寫一些簡短的程序來測試C++/C的每一個特性,觀察其輸出結果(其他語言也是類似的方法)。
最后要說的是,僅僅學習一門程序設計語言是不夠的,你必須至少學會兩門語言并逐步培養運用它們解決實際問題的能力和水平,才能在實際工作中做到游刃有余。
- C語言程序設計案例教程
- Learning Chef
- Hands-On Image Processing with Python
- R語言數據可視化之美:專業圖表繪制指南
- 實用防銹油配方與制備200例
- MATLAB實用教程
- 軟件測試實用教程
- Flowable流程引擎實戰
- 開源項目成功之道
- Elasticsearch Essentials
- Python商務數據分析(微課版)
- Web編程基礎:HTML5、CSS3、JavaScript(第2版)
- Spring Boot從入門到實戰
- Developing Java Applications with Spring and Spring Boot
- Building a Media Center with Raspberry Pi