數(shù)控那些事(2)_庫,和調(diào)用,動態(tài)反饋
我們打開計算機(jī)系統(tǒng)中的安裝列表,會發(fā)現(xiàn)一個事物,叫做“運(yùn)行庫”
我們會在學(xué)校中看到一個東西,它叫“圖書館”
我們毅會在工程數(shù)據(jù)中看到一個東西,叫設(shè)計圖
這些都可以被統(tǒng)稱為“庫”
那么,什么是庫那?

庫是既定事實的集合,是絕對物理,視覺,符號信息的歸類,復(fù)刻

計算機(jī)中那就是函數(shù)的調(diào)用,圖書館中,那就是知識的調(diào)用


工程數(shù)據(jù)中,那就是經(jīng)驗的調(diào)用。
可能是熱脹冷縮,可能因為氣候你的現(xiàn)有烹調(diào)配方理論失效了?
可能工間加工出現(xiàn)累計誤差? 可能低于預(yù)期? 可能超值運(yùn)作?
可能那個標(biāo)準(zhǔn)一開始就是錯的?

設(shè)計圖

永遠(yuǎn)的命題就是,是先有了,要“創(chuàng)造”和“傳播”
這個兩個主旨。
設(shè)計圖才有了意義
而不是設(shè)計圖本身存在意義
而庫就是這樣的東西
我們所使用的映像加工,數(shù)據(jù)庫處理,音頻處理,行政處事方案,社區(qū)經(jīng)濟(jì)管理模型。
同樣都是建立在這個基礎(chǔ)上的東西

當(dāng)我們需要實現(xiàn)一個“自動化”功能,或者一個“現(xiàn)象級作品”的時候
我們往往,優(yōu)先聯(lián)想到的,是“專業(yè)的人和專業(yè)工具”
所以,我們回歸“專業(yè)的本質(zhì)是什么?”
那個本質(zhì)就是對現(xiàn)有成型“現(xiàn)象”,“功能”的深度解讀
而這個過程,被稱為“專業(yè)化”
也就是,無論以何種形式去對現(xiàn)象,人,事物,工具,氣候,社會導(dǎo)向
做出解讀
本質(zhì)上,都是需要建立在“發(fā)生”和“成立”兩個基礎(chǔ)上的事物
而解讀并沒有意義
意義在于,記錄和復(fù)刻
以及對于后人的影響
所以,庫就是是對物理現(xiàn)象,既定關(guān)系的總結(jié)和復(fù)刻

也就是“需要先對目標(biāo)的物理現(xiàn)象,或達(dá)成結(jié)果做出認(rèn)知”
并對其進(jìn)行邏輯細(xì)分
“庫”和“書”才會誕生
那里是喜悅的? 還是悲傷的? 亦或是驚動而無往的?
我們是不可知的
它做的只是記錄,轉(zhuǎn)譯,編碼
并沒有任何生命,對于再次推演的過程有興趣
動態(tài)鏈接

動態(tài)鏈接英文是Dynamic Linking,他是使得不同的程序開發(fā)者和部門能夠相對獨立地開發(fā)和測試自己的程序模塊,從某種意義上來講大大促進(jìn)了程序的開發(fā)效率,原先限制程序的規(guī)模也隨之?dāng)U大。但是慢慢地靜態(tài)鏈接的諸多缺點也逐步暴露出來,比如浪費內(nèi)存和磁盤空間、模塊更新困難等問題,使得人們不得不尋找一種更好的方式來組織程序的模塊。
動態(tài)鏈接,在可執(zhí)行文件裝載時或運(yùn)行時,由操作系統(tǒng)的裝載程序加載庫。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫)作為加載過程的一部分。在這些系統(tǒng)上,可執(zhí)行文件包含一個叫做import directory的表,該表的每一項包含一個庫的名字。根據(jù)表中記錄的名字,裝載程序在硬盤上搜索需要的庫,然后將其加載到內(nèi)存中預(yù)先不確定的位置,之后根據(jù)加載庫后確定的庫的地址更新可執(zhí)行程序??蓤?zhí)行程序根據(jù)更新后的庫信息調(diào)用庫中的函數(shù)或引用庫中的數(shù)據(jù)。這種類型的動態(tài)加載成為裝載時加載 ,被包括Windows和Linux的大多數(shù)系統(tǒng)采用。
操作系統(tǒng)在加載應(yīng)用軟件時要完成的最復(fù)雜的工作之一就是加載時鏈接。
其他操作系統(tǒng)可能在運(yùn)行時解析引用。在這些系統(tǒng)上,可執(zhí)行程序調(diào)用操作系統(tǒng)API,將庫的名字,函數(shù)在庫中的編號和函數(shù)參數(shù)一同傳遞。操作系統(tǒng)負(fù)責(zé)立即解析然后代表應(yīng)用調(diào)用合適的函數(shù)。這種動態(tài)鏈接叫做運(yùn)行時鏈接 。因為每個調(diào)用都會有系統(tǒng)開銷,運(yùn)行時鏈接要慢得多,對應(yīng)用的性能有負(fù)面影響。現(xiàn)代操作系統(tǒng)已經(jīng)很少使用運(yùn)行時鏈接。
可以動態(tài)鏈接的庫,在Windows上是dynamic link library (DLL),在UNIX或Linux上是Shared Library。庫文件是預(yù)先編譯鏈接好的可執(zhí)行文件,存儲在計算機(jī)的硬盤上。大多數(shù)情況下,同一時間多個應(yīng)用可以使用一個庫的同一份拷貝,操作系統(tǒng)不需要加載這個庫的多個實例。

優(yōu)點:
① 代碼裝載速度快,執(zhí)行速度略比動態(tài)鏈接庫快;
② 只需保證在開發(fā)者的計算機(jī)中有正確的.LIB文件,在以二進(jìn)制形式發(fā)布程序時不需考慮在用戶的計算機(jī)上.LIB文件是否存在及版本問題,可避免DLL地獄等問題。
缺點:
使用靜態(tài)鏈接生成的可執(zhí)行文件體積較大,包含相同的公共代碼,造成浪費;
動態(tài)鏈接
優(yōu)點:
①更加節(jié)省內(nèi)存并減少頁面交換;
② DLL文件與EXE文件獨立,只要輸出接口不變(即名稱、參數(shù)、返回值類型和調(diào)用約定不變),更換DLL文件不會對EXE文件造成任何影響,因而極大地提高了可維護(hù)性和可擴(kuò)展性;
③不同編程語言編寫的程序只要按照函數(shù)調(diào)用約定就可以調(diào)用同一個DLL函數(shù);
④適用于大規(guī)模的軟件開發(fā),使開發(fā)過程獨立、耦合度小,便于不同開發(fā)者和開發(fā)組織之間進(jìn)行開發(fā)和測試。
缺點:
使用動態(tài)鏈接庫的應(yīng)用程序不是自完備的,它依賴的DLL模塊也要存在,如果使用載入時動態(tài)鏈接,程序啟動時發(fā)現(xiàn)DLL不存在,系統(tǒng)將終止程序并給出錯誤信息。而使用運(yùn)行時動態(tài)鏈接,系統(tǒng)不會終止,但由于DLL中的導(dǎo)出函數(shù)不可用,程序會加載失敗;速度比靜態(tài)鏈接慢。當(dāng)某個模塊更新后,如果新模塊與舊的模塊不兼容,那么那些需要該模塊才能運(yùn)行的軟件,統(tǒng)統(tǒng)撕掉。這在早期Windows中很常見。
1.鏈接
2.dll文件?
DLL(Dynamic Link Library)文件為動態(tài)鏈接庫文件,又稱"應(yīng)用程序拓展",是軟件文件類型。在Windows中,許多應(yīng)用程序并不是一個完整的可執(zhí)行文件,它們被分割成一些相對獨立的動態(tài)鏈接庫,即DLL文件,放置于系統(tǒng)中。
當(dāng)我們執(zhí)行某一個程序時,相應(yīng)的DLL文件就會被調(diào)用。一個應(yīng)用程序可使用多個DLL文件,一個DLL文件也可能被不同的應(yīng)用程序使用,這樣的DLL文件被稱為共享DLL文件。
DLL文件中存放的是各類程序的函數(shù)(子過程)實現(xiàn)過程,當(dāng)程序需要調(diào)用函數(shù)時需要先載入DLL,然后取得函數(shù)的地址,最后進(jìn)行調(diào)用。使用DLL文件的好處是程序不需要在運(yùn)行之初加載所有代碼,只有在程序需要某個函數(shù)的時候才從DLL中取出。另外,使用DLL文件還可以減小程序的體積。

動態(tài)鏈接庫是早期Windows系統(tǒng)由于受限于當(dāng)時計算機(jī)內(nèi)存空間較小的問題而出現(xiàn)的一種內(nèi)存優(yōu)化方法。當(dāng)一段相同的子程序被多個程序調(diào)用時,為了減少內(nèi)存消耗,可以將這段子程序存儲為一個可執(zhí)行文件,當(dāng)被多個程序調(diào)用時只在內(nèi)存中生成和使用同一個實例。
在 Windows操作系統(tǒng)中,每個程序都可以使用該 DLL 中包含的功能來實現(xiàn)"打開"對話框。這有助于促進(jìn)代碼重用和內(nèi)存的有效使用。
通過使用 DLL,程序可以實現(xiàn)模塊化,由相對獨立的組件組成。例如,一個記賬程序可以按模塊來銷售??梢栽谶\(yùn)行時將各個模塊加載到主程序中(如果安裝了相應(yīng)模塊)。因為模塊是彼此獨立的,所以程序的加載速度更快,而且模塊只在相應(yīng)的功能被請求時才加載。
此外,可以更為容易地將更新應(yīng)用于各個模塊,而不會影響該程序的其他部分。例如,您可能具有一個工資計算程序,而稅率每年都會更改。當(dāng)這些更改被隔離到 DLL 中以后,您無需重新生成或安裝整個程序就可以應(yīng)用更新。
當(dāng)您在應(yīng)用程序中加載 DLL 時,可以使用兩種鏈接方法來調(diào)用導(dǎo)出的 DLL 函數(shù)。這兩種鏈接方法是加載時動態(tài)鏈接和運(yùn)行時動態(tài)鏈接。
在運(yùn)行時動態(tài)鏈接中,應(yīng)用程序調(diào)用 LoadLibrary 函數(shù)或 LoadLibraryEx 函數(shù)以在運(yùn)行時加載 DLL。成功加載?DLL?后,可以使用 GetProcAddress 函數(shù)獲得要調(diào)用的導(dǎo)出的 DLL 函數(shù)的地址。在使用運(yùn)行時動態(tài)鏈接時,無需使用導(dǎo)入庫文件。
Win32 DLL的特點
Win32 DLL與 Win16 DLL有很大的區(qū)別,這主要是由操作系統(tǒng)的設(shè)計思想決定的。一方面,在Win16 DLL中程序入口點函數(shù)和出口點函數(shù)(LibMain和WEP)是分別實現(xiàn)的;而在Win32 DLL中卻由同一函數(shù)DLLMain來實現(xiàn)。無論何時,當(dāng)一個進(jìn)程或線程載入和卸載DLL時,都要調(diào)用該函數(shù),它的原型是
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD FdwReason, LPVOID lpvReserved);
其中,第一個參數(shù)表示DLL的實例句柄;第三個參數(shù)系統(tǒng)保留;這里主要介紹一下第二個參數(shù),它有四個可能的值:DLL_PROCESS_ATTACH(進(jìn)程載入),DLL_THREAD_ATTACH(線程載入),DLL_THREAD_DETACH(線程卸載),DLL_PROCESS_DETACH(進(jìn)程卸載),在DLLMain函數(shù)中可以對傳遞進(jìn)來的這個參數(shù)的值進(jìn)行判別,并根據(jù)不同的參數(shù)值對DLL進(jìn)行必要的初始化或清理工作。舉個例子來說,當(dāng)有一個進(jìn)程載入一個DLL時,系統(tǒng)分派給DLL的第二個參數(shù)為DLL_PROCESS_ATTACH,這時,你可以根據(jù)這個參數(shù)初始化特定的數(shù)據(jù)。另一方面,在Win16環(huán)境下,所有應(yīng)用程序都在同一地址空間;而在Win32環(huán)境下,所有應(yīng)用程序都有自己的私有空間,每個進(jìn)程的空間都是相互獨立的,這減少了應(yīng)用程序間的相互影響,但同時也增加了編程的難度。大家知道,在Win16環(huán)境中,DLL的全局?jǐn)?shù)據(jù)對每個載入它的進(jìn)程來說都是相同的;而在Win32環(huán)境中,情況卻發(fā)生了變化,當(dāng)進(jìn)程在載入DLL時,系統(tǒng)自動把DLL地址映射到該進(jìn)程的私有空間,而且也復(fù)制該DLL的全局?jǐn)?shù)據(jù)的一份拷貝到該進(jìn)程空間,也就是說每個進(jìn)程所擁有的相同的DLL的全局?jǐn)?shù)據(jù)其值卻并不一定是相同的。因此,在Win32環(huán)境下要想在多個進(jìn)程中共享數(shù)據(jù),就必須進(jìn)行必要的設(shè)置。亦即把這些需要共享的數(shù)據(jù)分離出來,放置在一個獨立的數(shù)據(jù)段里,并把該段的屬性設(shè)置為共享。
3.pdb?
PDB(Program Database File,程序數(shù)據(jù)庫文件)文件物理結(jié)構(gòu)在我們目前使用的掌上電腦中,Palm操作系統(tǒng)由于其功能強(qiáng)大、應(yīng)用軟件多等特點,占有很大的比例。PDB文件是Palm OS操作系統(tǒng)上數(shù)據(jù)文件類型。一般我們在使用Palm系統(tǒng)的電子書時都會遇到這種文件,一般用于電子書或手機(jī)電子書 pdb是Palm DataBase的縮寫,Palm OS所用文件的擴(kuò)展名為".pdb"。還表示碳氧同位素標(biāo)準(zhǔn)樣品以及可編程延遲模塊,是DSP中的一種模塊,可以用來計數(shù)和延時。
PDB(Program Database File,程序數(shù)據(jù)庫文件)文件物理結(jié)構(gòu)在我們目前使用的掌上電腦中,Palm操作系統(tǒng)由于其功能強(qiáng)大、應(yīng)用軟件多等特點,占有很大的比例。PDB文件是Palm OS操作系統(tǒng)上數(shù)據(jù)文件類型。一般我們在使用Palm系統(tǒng)的電子書時都會遇到這種文件,一般用于電子書或手機(jī)電子書 pdb是Palm DataBase的縮寫,Palm OS所用文件的擴(kuò)展名為".pdb"。還表示碳氧同位素標(biāo)準(zhǔn)樣品以及可編程延遲模塊,是DSP中的一種模塊,可以用來計數(shù)和延時。

PDB文件物理結(jié)構(gòu)如下圖所示:
PDB文件的邏輯結(jié)構(gòu)如下圖所示:
PDB文件的結(jié)構(gòu)是由下面幾個部分組成的:
數(shù)據(jù)庫頭部(Database Header)
記錄入口列表(List of Record Entries)
應(yīng)用信息塊(AppInfo Block)(可選)
排序信息塊(SortInfo Block)(可選)
數(shù)據(jù)庫記錄信息(Sequence of raw record data)
其中在數(shù)據(jù)庫頭部結(jié)構(gòu)中,確定了應(yīng)用信息塊(AppInfo Block)和排序信息塊(SortInfo Block)的位置信息。記錄入口列表中確定了所有記錄的位置相關(guān)的信息。
其中數(shù)據(jù)庫頭部的長度是固定的。應(yīng)用信息塊和排序信息塊可有可無,而且尺寸也不確定,在很多結(jié)構(gòu)簡單的PDB文件中,沒有該部分信息,本文中將不再詳細(xì)闡述。記錄入口列表的長度也隨著紀(jì)錄數(shù)量的變化發(fā)生變化。

Name 一個32字節(jié)的長度的字符串,包含有數(shù)據(jù)庫的名稱。名稱最長為31個字節(jié),使用0x00結(jié)尾。該字段也用來在同步備份時作為PDB文件的文件名。Attributes 數(shù)據(jù)庫的屬性標(biāo)志。Version 數(shù)據(jù)庫的版本。creationDate 數(shù)據(jù)庫創(chuàng)建日期,為距離1904年1月1日上午12:00的秒數(shù)。ModificationDate 最后修改日期,為距離1904年1月1日上午12:00的秒數(shù)。LastBackupDate 最后備份日期, 為距離1904年1月1日上午12:00的秒數(shù)。ModificationNumber 數(shù)據(jù)庫修改次數(shù)。AppInfoID AppInfo塊的偏移地址,如果沒有AppInfo塊數(shù)值為0x00000000 SortInfoID SortInfo塊的偏移地址,如果沒有SortInfo塊數(shù)值為0x00000000 Type 數(shù)據(jù)庫類型標(biāo)識。該值依賴創(chuàng)建該數(shù)據(jù)庫的應(yīng)用程序。Creator 數(shù)據(jù)庫創(chuàng)建者的標(biāo)識. uniqueIDSeed 被Palm OS系統(tǒng)內(nèi)部使用,用于在系統(tǒng)裝入數(shù)據(jù)庫時記錄標(biāo)識。RecordList 數(shù)據(jù)庫中資源或者記錄的列表。
可編程延遲模塊,是DSP中的一種模塊,可以用來計數(shù)和延時。 在DSP的PWM時期需要AD采樣,可用此模塊來同步時鐘。
程序調(diào)試庫
PDB:Program Debug Database(程序調(diào)試數(shù)據(jù)庫)文件
PDB(程序調(diào)試數(shù)據(jù)庫)文件保持著調(diào)試和項目狀態(tài)信息,從而可以對程序的調(diào)試配置進(jìn)行增量鏈接。當(dāng)用 /ZI ;或 /Zi ;編譯 C/C++ ;程序時或用 /debug ;編譯 Visual Basic/C# ;程序時將創(chuàng)建 PDB ;文件。
在 Visual C++ ;中,/Fd ;選項用于命名由編譯器創(chuàng)建的 PDB ;文件。當(dāng)在 Visual Studio ;中使用向?qū)?chuàng)建項目時,/Fd ;選項將被設(shè)置以創(chuàng)建名為 project.PDB ;的 PDB。
如果使用生成文件創(chuàng)建 C/C++應(yīng)用程序,并指定 /ZI ;或 /Zi ;而不指定 /Fd ;時,則最終將生成兩個 PDB ;文件:
VC70.PDB(更籠統(tǒng)地說就是 VCx0.PDB,其中 x ;表示 Visual C++ ;的版本。)該文件存儲各個 OBJ ;文件的所有調(diào)試信息并與項目生成文件駐留在同一個目錄中。
project.PDB ;該文件存儲 .exe ;文件的所有調(diào)試信息。對于本機(jī)代碼,它駐留在 \debug ;子目錄中。對于托管代碼,它駐留在 \WINDEBUG ;子目錄中。


但為了保護(hù)后人,和留下“意義”與“可行方式”的內(nèi)核
依舊會有人不停得編寫著書籍和數(shù)據(jù)庫
就像圖書館中的書一樣,它不是因為是書本身獲得了崇高感,而是它記載的“歷史”,甚至是“悲劇”本身帶給了它的嚴(yán)肅含義,換而言之,是這“人之所行”造就了,這一出出悲劇,所以帶給了你宏大悲壯感