編程中的庫(包)是具體怎麼實現的,庫對於一個語言而言是不是非常重要?
具備"各種庫的支持"已經是各種編程語言的一個共有特性,那麼庫是怎麼實現的,它對於一個語言來說重要性有多大?
編程中的庫是怎麼實現的?這個問題問得不好。。到底是指從語言/編譯器的角度怎樣實現「庫」/包管理機制?還是說為一門語言編寫庫有哪些common practice?
第一個問題,可以參考Advanced C and C++ Compiling以及Software Build Systems: Principles and Experience。庫的本質是代碼重用,而怎麼個重用法,決定於你的語言提供了哪些構造,以及你的編譯器怎樣實現這些構造。最簡單的方式是提供庫的源代碼然後import;如果支持separate compilation,可以將庫的源代碼先編譯成bytecode/動態鏈接庫;有些場合不一定支持separate compilation,比如c++ templates。
第二個問題,可以參考API Design for C++和Practical API Design,以及各種各樣的coding style guide,比如google家的。不過跟第一個問題一樣,語言基礎決定上層建築,抽象機制一坨翔的語言很難實現出優雅的庫。
對一個語言重要性有多大?決定了你這語言有多少人用。語言本身其實主要是定義了一些關鍵詞、語法、工具集的實現,要使用語言寫真正的應用,還是需要各種庫,比方說網路庫、圖像庫、數學庫等的支持,不可能每個人寫一個應用,都從最原始的功能去完成。從這種意義上來說,庫是任意一種語言都不可或缺的。簡單地說,就是對於語言的使用者(即是大部分開發人員),語言就是如何使用各種庫,完成自己的任務。
如果你想知道C庫一般怎麼寫,建議你看看這本書Learn C The Hard Way,作者循序漸進寫了一個通用數據結構(array, list, hashmap...)的庫
其實這個問題有歧義。一種理解是怎樣開發一個庫,另一種是編程語言怎麼實現庫的機制。前一種大家都知道我就不說了。我講講後面那個。
用過一些Python、Lua這樣的語言的都知道,這些語言提供了調用其他語言寫成的程序的機制。一般我們把這種機制,叫做FFI(Foreign function interface)。那怎麼實現這樣的機制?我先說說我比較喜歡的那種做法。首先給語言提供一個特性,類似Python中的decorater,C#中的attribute,Java的annotation。就像這樣,給這個方法一個標記:
@RedirectToNativeMethod
func foo();
之後解釋器解析這一段代碼,把foo函數的定義加入到已知的函數表中去。調用這個foo函數的時候,發現這個方法帶的標記是一個RedirectToNativeMethod,就在NativeMethod列表中尋找對應名字的方法。這樣就把這個方法重定向到用host language寫的方法中去了。
代碼就像燒菜的食譜,編譯器就是一幫掌勺烹飪的廚子,這幫廚子還自帶刀鏟鍋灶。庫,可以算是食材了。
與你自己編寫的程序類似,編程中的庫(包)也是通過編程實現的。
當自己編寫代碼時,可以通過(手動或編譯器自動)設定鏈接方式來使用相應的庫函數。
庫對一個語言而言是非常重要的。沒有STL、boost庫,可想程序員需要自己編寫多少代碼。python最簡單的庫,就是一個*.py文件,裡面用def 定量了一些函數。只要在同一個目錄,其他的程序文件可以直接用import 調用。
比如,python 自帶的os.py, 就是一個700行的腳本。
推薦閱讀:
※TIOBE:全球編程語言最新排名(Kotlin排名進入前50名
※TIOBE 10月編程語言排行榜 : GO 問鼎本年度語言 ?
※答讀者問:函數重載
※Erlang入門教程 - 10. 模式匹配,Guard,變數作用域