曾經(jīng)有很長一段時(shí)間我不知道.NET的應(yīng)用價(jià)值在哪里。剛學(xué)習(xí)的時(shí)候以為它能獨(dú)立運(yùn)行,運(yùn)行出錯(cuò)了才知道它需要.NET環(huán)境,不是拿幾個(gè)DLL就可以。于是我想不通啊,為什么有很多同學(xué)想用它編寫病毒呢?別人的計(jì)算機(jī)沒出問題他自己編寫的程序倒先出問題了。
我想起了VB6.0。我沒有意識到它可以調(diào)用WINDOWS API,而且微軟已經(jīng)寫好了很多引用API的代碼,我全沒看到,我也沒有意識到許多問題是因?yàn)樗枰腄LL沒有跟隨,因?yàn)镈LL版本不同導(dǎo)致報(bào)表只顯示有多少數(shù)據(jù)卻不顯示數(shù)據(jù)的具體內(nèi)容,說白了,當(dāng)時(shí)不知道DLL是什么東西,一個(gè)出錯(cuò),兩個(gè)出錯(cuò),這也做不出來,那也做不出來,于是點(diǎn)到即止。直到找不到WINDOWS API而詢問江歡老師時(shí)才意識到三個(gè)平臺的相互獨(dú)立性——WINDOWS、.NET、JVM。
實(shí)際上沒有絕對獨(dú)立運(yùn)行的程序。即使直接面向硬件編寫不需要任何環(huán)境能直接被硬件識別而運(yùn)行的程序也需要程序員熟悉芯片結(jié)構(gòu)。程序受制于硬件,所謂的程序是受硬件支持的指令序列,順著說,它給了程序員相當(dāng)多的功能,反著說,它只給了程序員這些有限的功能。它不能給程序員無限的功能,否則不是機(jī)器了。
Windows也是一個(gè)平臺,它也有它自己的環(huán)境,微軟定義了許多圖形化界面,將組成這些界面的共性部分稱為控件,如按鈕等等,在系統(tǒng)運(yùn)行環(huán)境庫內(nèi)提供了的繪制代碼。目前常見的Windows、Linux、Unix基于都有人編寫了基于x86指令集的系統(tǒng),可執(zhí)行文件除了文件格式有所不同之外,其可執(zhí)行部分在三個(gè)平臺都可以運(yùn)行。這一點(diǎn),Java和.Net有很大的區(qū)別。
微軟自行研發(fā)的處理器目前我停留在道聽途說的階段,假設(shè)正在研究之中??梢試L試猜測MSIL指令能不能被它研究的處理器執(zhí)行,但是有一點(diǎn)是肯定的, x86指令集與它是不能兼容的,軟件不能空想,它要有實(shí)現(xiàn)基礎(chǔ)。每一條指令都有惟一電流信號序列指代著。當(dāng)前Intel和AMD公司的芯片不能識別,MSIL指揮不了主板的其它的電子元件。
無論兩個(gè)軟件平臺有多大區(qū)別,如果它們使用的硬件平臺相同,那么兩個(gè)平臺下一程序文件僅僅因?yàn)楦髯宰R別處理可執(zhí)行文件的方式不同而不能直接運(yùn)行。在這兩個(gè)平臺之間移植是可行的。曾經(jīng)我錯(cuò)把WIN32軟件平臺上可以獨(dú)立運(yùn)行的程序當(dāng)成可以在任何平臺任何環(huán)境都可以運(yùn)行的程序。我沒有意識到編寫一個(gè)程序有哪些用到了別人的程序,哪些才是自己的程序。把自己的程序搬到第三方平臺運(yùn)行時(shí)有沒有把用到的別人的程序搬過去。實(shí)際上,我們處處在用別人現(xiàn)有的程序,哪怕是一個(gè)按鈕的圖形繪制代碼,至于基礎(chǔ)程序類如內(nèi)存管理、圖形繪制等等不用說了,有現(xiàn)成的就不想自己編寫了,更何況不知道自己有沒有這個(gè)能力、有沒有這個(gè)精力、有沒有這個(gè)時(shí)間把它編寫出來。當(dāng)時(shí)沒有環(huán)境、平臺、軟件平臺、硬件平臺的概念。軟件平臺的作用可以有很多,比如它可以翻譯MSIL指令到X86指令,也可以僅僅提供配置環(huán)境?!盁o論在哪里”,顯然我沒有意識到什么是平臺。應(yīng)當(dāng)學(xué)習(xí)一下WINDOWS PE以及PE國際標(biāo)準(zhǔn)以及這個(gè)國際標(biāo)準(zhǔn)是怎樣制訂的。
我一一思考ASP、ASP.NET、JSP、PHP互聯(lián)網(wǎng)信息技術(shù)的商業(yè)取向。它們是世界公認(rèn)的從XML衍生的HTML代碼外加特定的服務(wù)端執(zhí)行的程序。客戶端腳本常見的是ECMAScript(JavaScipt、JScript、VBScript等等)。服務(wù)端程序編寫語言有C#、Java、PHP、VB.NET。腳本受瀏覽器支持,用來提高頁面響應(yīng)速度和減輕服務(wù)器壓力。使用腳本可以與服務(wù)器通信。
在Windows上運(yùn)行Java程序Sun公司做到了,前提是必須安裝JVM。底層的實(shí)現(xiàn)工作別人已經(jīng)做好了。曾經(jīng)我不知道,Java跨平臺究竟是怎樣實(shí)現(xiàn)的?當(dāng)我遇到手機(jī)功能列表中有支持Java擴(kuò)展才能運(yùn)行Java程序的情況,我漸漸意識到Sun公司把它想要做生意的手機(jī)的JVM編寫好了,跨平臺這樣實(shí)現(xiàn)的。手機(jī)程序員需要做的工作Sun公司大部分已經(jīng)做好了。JVM把字節(jié)碼翻譯成能被當(dāng)前所在機(jī)器識別的機(jī)器指令,就像不能同語言的兩個(gè)人交流一樣,翻譯需要學(xué)習(xí)兩種語言才能獨(dú)立工作,使用翻譯的只需要學(xué)習(xí)其中一門語言,就可以借助翻譯溝通,手機(jī)識別機(jī)器指令,人識別Java指令,JVM這個(gè)翻譯它都懂,于是人間接和手機(jī)溝通,指揮手機(jī)工作。
至于Win32與DOS互不兼容,這個(gè)是表面現(xiàn)象,從商業(yè)目的來講是微軟當(dāng)初為了推廣它的圖形化界面系統(tǒng)Windows3.0而設(shè)置的限制,解除限制之后注意配置環(huán)境。尤其注意圖形繪制代碼有沒有跟隨到位。否則一個(gè)程序缺少一部分,可想而知。嫌它麻煩,就不要使用微軟的程序,自己從圖形開始,面向硬件編程,而不要這用微軟的,那用微軟的。使用別人的東西就要遵守別人的規(guī)則。我們不僅僅要使用別人的東西,還要學(xué)會使用別人的東西的技巧。
使用什么樣的東西就要遵守什么樣的規(guī)則。如果不喜歡這個(gè)規(guī)則就找個(gè)替代方案。規(guī)則可以是程序運(yùn)行過程反映的處理數(shù)據(jù)的辦法或方法以及思想。操作系統(tǒng)也是軟件。使用Windows就得遵守Windows的規(guī)則。又愛又恨,就要想辦法突破規(guī)則。但不要嘗試突破法律保護(hù)的規(guī)則。如果編寫的程序面向Windows平臺,那么突破規(guī)則之前必須遵守它的規(guī)則。在任何操作系統(tǒng)上使用任何資源都要有相應(yīng)的權(quán)限。每個(gè)程序啟動時(shí)都有默認(rèn)的權(quán)限。我一直以管理員身份編寫運(yùn)行程序,所以容易忽視權(quán)限的問題。
字節(jié)碼究竟是字節(jié)碼,中間語言究竟是中間語言,它們不屬于X86指令集(通用指令集還有IA64、X64,多媒體方面還有SSE等等,這里以X86為例),主流芯片沒有能識別它們的。它們的底層實(shí)現(xiàn)工作(將非X86指令翻譯成X86指令)已經(jīng)由推銷這個(gè)產(chǎn)品的商家實(shí)現(xiàn)了。它減輕了從事這個(gè)行業(yè)的程序員的工作壓力,降低了工作難度(這也是當(dāng)今社會高端程序員稀缺的原因之一)。這的確是跨平臺一個(gè)比較好的選擇。獨(dú)立運(yùn)行與跨平臺就像魚與熊掌不可兼得。它們各自都有各自的應(yīng)用價(jià)值。
從目前潮流來看,處理器速度快得撐不死,內(nèi)存大得撐不完。和計(jì)算機(jī)剛面世時(shí)不可同日而語。當(dāng)時(shí)追求速度,現(xiàn)在追求體驗(yàn)。所以不要擔(dān)心這些中間語言耗費(fèi)額外的時(shí)間。界面做好,功能做全,就可以了。