歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

淺談現代編程語言語法與標准庫緊綁定現象

在C語言時代,語法與庫的實現基本上是完全獨立的。幾乎所有的C語言標准庫都是與編譯器實現相對獨立的,僅與當前系統環境耦合。這裡只有函數不定參數的實現是需要根據語言規范,結合當前系統環境,由庫<stdarg.h>自己實現的。

C++98也基本如此。我們可以看到typeid是以關鍵字的形式出現的。盡管它返回一個類的對象,我們可以用typeid(expr).name()來訪問表達式expr的類型名,不過它仍然可由編譯器全權負責實現。

而Java作為半動態語言,它就已經把自己的庫與語法融合在了一起。我們可以看到在Java中對字符串String對象的操作可以簡單地使用操作符+、+=進行操作。然而String本身並不是關鍵字,但是可被編譯器識別。因為你換成其它對象可能就無法用這些操作符來進行操作了。而對String類的實現本身可用一個用Java編寫的相對獨立的庫進行實現。

所以,我們可以看到現在很多編程語言都采用了編譯器與自己的標准庫相互負責的模式進行實現,這兩者被逐步融合。

這一點在Objective-C中也十分明顯,比如我之前寫的《Objective-C如何自己實現一個for-each語法形式》以及《Objective-C如何自己實現一個基於數組下標的屬性訪問模式》。另外,比如編譯器對屬性(property)自動生成getter/setter方法有一定的命名規則,setter方法是前面加set,然後屬性名的首字母大寫;而getter方法則是與屬性名完全一致。通過這種規則,開發者可以自己實現已被編譯器生成的屬性方法,從而重寫相應的getter及/或setter方法。這種伎倆雖然不嚴密,但也簡單實用,呵呵。

C++11中這個特點也被凸顯出來了。我們可以看到,通過將std::initializer_list<>作為類的構造函數參數,我們即可通過{ }初始化列表來初始化一個類的對象。通過在自定義的類中實現返回值為std::iterator的begin()與end()函數,我們直接可以使用for-each的循環形式——for(type &t : iteratableObj){ }。

其實將語法體系與語言自帶標准庫綁定還是有不少好處的。首先,這容易被擴展,開發者可以根據自己的需求來自定義某些語法的行為。其次,對編譯器而言可以減輕壓力。某些運行時行為可以交給標准庫進行實現。這樣,編程語言可以比較方便地被打造成比較完備的語法體系。這種耦合也增強了編程語言的運行時能力,包括靈活性、可擴展性。

 

Copyright © Linux教程網 All Rights Reserved