編程中的庫(包)是具體怎麼實現的,庫對於一個語言而言是不是非常重要?

具備"各種庫的支持"已經是各種編程語言的一個共有特性,那麼庫是怎麼實現的,它對於一個語言來說重要性有多大?


編程中的庫是怎麼實現的?這個問題問得不好。。到底是指從語言/編譯器的角度怎樣實現「庫」/包管理機制?還是說為一門語言編寫庫有哪些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,變數作用域

TAG:編程語言 | Python庫 | 庫計算機 |