關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~

何謂.Net Framework? CLR? BCL? MSIL? JIT?

廣義而言, .Net Framework 2.0包含了:

程式 → JIT → MSIL → CLR

1. CLR(Common Language Runtime)

2. BCL(Base Class Library--基礎類別程式庫)

3. 使用BCL來寫程式的程式語言(如C++.Net或VB.Net或C#.Net等等)

我想我們都很清楚了程式語言可以用來開發軟體(用.Net Framework開發好的軟體我們稱它為組件--Assembly), 之所以稱它為組件的用意我想很明顯, 在用BCL以及各種.Net Framework來開發的軟體過程中, 就像堆積木一樣(積木即BCL或.Net元件), 程式人員所作的工作就像創意家一樣, 發揮它的各種想像力和創造力, 堆積出各式各樣的組合積木出來(所以所開發出來的應用程式叫做組件--組件可以是 .exe 或是 .dll), 以下我們就各別的來看看以上所提到的三點。

1. CLR (Common Language Runtime) 相信有寫過JAVA程式的人一定都知道JVM (Java Virtual Machine)—Java執行時期的虛擬機器, 其實它也是JAVA軟體的一種Runtime Environment(簡稱Runtime), 其實用過VB6的人也都知道寫好的VB6要封裝時都會順便把VB6的相關執行時期DLL順便一起封裝進去, 那個就叫做VB6的Runtime Environment, 同樣的你寫好的VC++6程式, 要可以在客戶的機器上執行無礙, 也必須在客戶的電腦上在Setup時裝上必要的C++的相關DLL(那個叫做C++的Runtime), 各位試想用VB6寫就要自己的一套Runtime, 用VC++寫也要自己的一套Runtime, 而且用VC++寫的類別程式碼無法直接被VB6繼承來使用, 必須在VC++6中寫成DLL檔或COM元件來讓VB6呼叫使用, 造成使用VB6和使用VC++不同程式語言的人極大的隔閡與不便, 而且COM或COM+這樣高深的技術也只能讓初學者望COM而興嘆, 其實JVM本身是一個用來將程式語言和底層硬體分開的一種抽象層, 所以JAVA開發者它宣稱它可以寫一次然後可以到處跑(Write once and run anywhere), 亦即良好的跨平台特性, 說了這麼多, 其實CLR就像JVM一樣, 是一個用來隔開硬體的抽象層, 所以.Net的應用程式, 可以在Windows平台上執行無礙, 也可以在LINUX中順利地執行(LINUX下的CLR是由Open Source專案Mono所實作), 將來如果其他平台上的CLR實作也有了之後, 相信.Net程式要達到和JAVA一樣的跨平台特性就指日可待了。

2. BCL (Base Class Library) 在.Net Framework中亦提供了一組定義良好的類別庫可供程式開發人員使用, 就像以前在VC++6時代有一組MFC類別庫可供使用一般, 但是, 可別把.Net Framework BCL和MFC混為一談了, MFC算是棺材已經進了一半了, MFC有太多太多的缺點和歷史的包袱, .Net Framework BCL易學易用, 如果你已經掌握了BCL的使用訣竅, 日後你遇到新的BCL CLASS時, 所需的只是查閱MSDN的功夫而已, 真的是一點都不誇大。

3. 支援.Net的程式語言目前支援.Net的程式語言多不勝數, 最常聽到的就屬C#, VC++.Net, VB.Net, J#.Net或Delphi.Net等等, 雖然這些各種不同的語言擁有各自的程式語法, 如果你習慣Basic語法, 你就選VB.Net, 如果你還是新手, 那不妨選原汁原味的C#, 如果你用慣C++, 那你可以選C++/CLI (算是第二代的C++.Net), 如果你習慣Pascal語法, 你可以選Delphi.Net。總而言之, 不管你所選的是哪一種語言, 它們用的類別庫通通都是一樣的, 都是.Net Framework BCL, 更妙的是用C++/CLI寫好的CLASS可以給任何其他的.Net語言繼承過來使用, 當然要寫成DLL類別庫供其他的語言來呼叫也是可以的。

4. MSIL(Microsoft Intermediate Language) 咦, 記得前面筆者並沒提到MSIL啊, 啊, 那一定是筆者給忘了, MSIL叫做微軟中繼語言, 算是一種中間碼, 拿JAVA作比較, MSIL就類似JAVA的byte code, 這樣如果學過JAVA的大大就懂了, 在第3點中提到的各種.Net程式語言, 經過編譯之後, 通通都會變成MSIL, 它本身並無法直接執行, 所以在.Net機制中就透過JIT式編譯(Just In Time Compiling), 在MSIL被喚起執行時, 會被JIT編譯器翻譯成目的機器的原生碼(Native Code), 然後再交給CLR去執行。

沒有留言:

張貼留言