1. 開放源代碼的必要性 在介紹編程語(yǔ)言之前,先說說開放源代碼的必要性?,F(xiàn)在,在軟件生產(chǎn)領(lǐng)域存在巨大的智利浪費(fèi),大家把大量的精力用在編寫別人已經(jīng)實(shí)現(xiàn)的程序代碼上??纯?,文本編輯器有多少,看看ftp程序有多少,看看字處理程序有多少,這些程序雖然有差別,但主要的功能都是一樣的。要實(shí)現(xiàn)個(gè)性化的功能,在已有的軟件基礎(chǔ)上修改會(huì)節(jié)省多少時(shí)間呀!而每個(gè)程序各編一套,又浪費(fèi)多少時(shí)間?如果,沒有這些重復(fù)的工作量,世界上的程序員至少可以節(jié)省80%的工作量。同時(shí),開放源代碼也方便了大家的交流,閱讀源代碼應(yīng)該是最直接最有效的學(xué)習(xí)途徑,尤其是比較專業(yè)的領(lǐng)域。 要開放源代碼,下面幾點(diǎn)比較重要: 語(yǔ)言的可重用性、功能、友好性。 2. 簡(jiǎn)介各種程序語(yǔ)言 注︰在程序語(yǔ)言前劃有☆號(hào)者,表示它有重大影響,但不代表它優(yōu)良。 2.1 適合編寫商業(yè)程序、對(duì)效能有所要求。 編寫商業(yè)程序的程序語(yǔ)言,最基本的要求就是不是直譯的,令使用者不能看到源碼;第二就是有良好的性能、語(yǔ)法,適合編寫大程序而效率不會(huì)過慢。 2.1.1 ☆C/C++ 自從C發(fā)明了以后,它就取代了匯編語(yǔ)言在操作系統(tǒng)編程的領(lǐng)導(dǎo)地位。從性能上說,除了匯編語(yǔ)言,C語(yǔ)言是最接近機(jī)器的語(yǔ)言。各種操作系統(tǒng)的編程接口的默認(rèn)語(yǔ)言都是C語(yǔ)言。因此,用C語(yǔ)言編程,可以最大限度發(fā)揮操作系統(tǒng)的能力。同時(shí),由于絕大部分的商品軟件都是C或與C兼容的C++實(shí)現(xiàn)的,都有C編程接口,可以說,沒有C不能實(shí)現(xiàn)的功能。 C++是C語(yǔ)言的加強(qiáng)版,C++增加了面向?qū)ο蠛推渌杏玫墓δ?,但它的效能并沒有大減,編程更方便輕松;而C++亦支援大部分C的程序,令C++和C變得近乎不可分割,大部分的C編譯器也支援C++。假如要在學(xué)C或?qū)WC++選擇,學(xué)C++是明智的選擇。 在Unix-like的操作系統(tǒng)中,C具有很好的開放源代碼的條件,它有統(tǒng)一的編譯器gcc,有強(qiáng)大但比較難掌握的編程環(huán)境emacs,有統(tǒng)一的API:posix和Linux接口。并且大部分編譯器和API是開放源代碼的。在Unix-like上編寫圖形界面程序,有兩個(gè)選擇KDE和Gnome∶KDE更成熟,但它使用了不是開源的Qt函數(shù)庫(kù);Gnome支持多語(yǔ)言和面向?qū)ο蟮某绦蜷g的協(xié)同,有它的GUI工具GTK。 在Windows環(huán)境中,現(xiàn)在通常使用VC,但有一個(gè)缺點(diǎn),Windows的升級(jí)換代太快,從dos環(huán)境到Windows31 ,從Windows31到Windows95,到Windows2000,到.NET。API常常變換,這樣,在Windows上的程序代碼的壽命會(huì)比較短。并且vC的編譯器和API太復(fù)雜,難于掌握,并非開放源代碼的工具。其他選擇有從Unix-like系統(tǒng)移植過來的djgpp、mingw。 由于C/C++具有現(xiàn)代語(yǔ)言的大量特征,現(xiàn)在常常代替Pascal作為教學(xué)的編程語(yǔ)言。實(shí)際上,如果不深入學(xué)習(xí),C也是一種很簡(jiǎn)單的語(yǔ)言。不學(xué)Basic,直接學(xué)C完全沒有問題。和其他語(yǔ)言相比,雖然C和C++都已經(jīng)定下了其標(biāo)準(zhǔn),但編譯器、函數(shù)庫(kù)、操作系統(tǒng)API五花八門,有些又未必全面支援最新的標(biāo)準(zhǔn),造成學(xué)習(xí)的難度大、統(tǒng)一性差的問題。 2.1.2 ☆Visual Basic(簡(jiǎn)稱VB) VB是快速的界面生成語(yǔ)言,是快速的數(shù)據(jù)庫(kù)程序開發(fā)語(yǔ)言。vba是vb的應(yīng)用版,嵌入在MS office中。編寫MS office上的程序很好用。缺點(diǎn)是只能在Windows平臺(tái)運(yùn)作。 2.1.3 Delphi/Kylix 和vb一樣是快速開發(fā)環(huán)境,但性能更好,功能更強(qiáng)大,亦可以用于Linux平臺(tái)。語(yǔ)法建基于Pascal,是面向?qū)ο蟮某绦蛘Z(yǔ)言。 2.1.4 ☆Java 相對(duì)C,Java作為現(xiàn)代語(yǔ)言,具有非常豐富的語(yǔ)法特征,如模塊和類,不像C隨操作系統(tǒng)和編譯器的不同有極大差異,Java是一個(gè)公司的產(chǎn)品,具有唯一的API,因此,Java程序員沒有語(yǔ)言隔閡。有人認(rèn)為Java根本是一個(gè)平臺(tái),并非真正的跨平臺(tái)。 相對(duì)跨平臺(tái)的語(yǔ)言來說,Java具有最好的圖形界面編程API。Java所有的API都是類庫(kù),相對(duì)C的函數(shù)來說,是非常大的進(jìn)步。Java具有現(xiàn)代語(yǔ)言幾乎所有的特征。Java最大的缺點(diǎn),是它被一所公司控制著。 2.1.5 Ada Ada語(yǔ)言和C/C++是一種編譯語(yǔ)言,他們最后編譯出的執(zhí)行文件的機(jī)器碼都很小。因此現(xiàn)在眾多的語(yǔ)言只有C/C++能夠與Ada相提并論。和C/C++相比,Ada的特點(diǎn)是可靠、可移植。他的可靠是通過比其他語(yǔ)言都強(qiáng)大的類型,每種類型還都可以象數(shù)據(jù)庫(kù)字段一樣進(jìn)行強(qiáng)類型、范圍的檢查。以此來保證在編譯中就發(fā)現(xiàn)錯(cuò)誤。它有強(qiáng)大的標(biāo)準(zhǔn)化組織,嚴(yán)格認(rèn)證Ada編譯器的標(biāo)準(zhǔn)。有多線程能力。適于編寫實(shí)時(shí)程序。但和C/C++相比太復(fù)雜、羅嗦,因此注定不能流行。 2.2 Scripting Language 如果不在乎商業(yè)機(jī)密,應(yīng)用目標(biāo)也不是太苛刻的話,編寫大型跨平臺(tái)程序的最佳就是腳本語(yǔ)言。有些腳本語(yǔ)言具有全面的庫(kù)的支持,有和C語(yǔ)言的方便的交互能力。他們和Java相比,編程效率更高。同時(shí)因?yàn)闆]有編譯,程序更方便修改。因?yàn)樗麄兊膸?kù)都是C實(shí)現(xiàn)的,也比Java有更高性能。同時(shí),他們都是開源的,都是對(duì)商業(yè)應(yīng)用友好的,也是簡(jiǎn)單的、方便定制的。也是不滿意Java的不可控制的越來越龐大的庫(kù)的又一個(gè)選擇。 2.2.1 Basic 現(xiàn)在最著名的Basic版本是vb,Basic是簡(jiǎn)單的初級(jí)語(yǔ)言。Basic的丑陋在于參數(shù)還是默認(rèn)傳地址。太危險(xiǎn)。 2.2.2 ☆Perl Perl的最大特點(diǎn)是有強(qiáng)大的字符串模式匹配,是最好的文本文件的讀取和生成語(yǔ)言,亦是Unix系統(tǒng)管理者的好幫手,因?yàn)樗樟薬wk、sed、grep等工具的功能。Perl具有很大的自由性,象英語(yǔ)一樣有很大的隨意性,在Perl里基本上無(wú)Type Error這回事,它的”Type”就是純量和串行。Perl有一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)接口和其他各種接口。Perl有大量的程序庫(kù)(CPAN)。因?yàn)镻erl較早出現(xiàn),某些功能是后期加上去,顯得不協(xié)調(diào),例如它的面向?qū)ο蠊δ芫捅灰暈椴皇钦嬲拿嫦驅(qū)ο?。Perl有個(gè)著名的缺點(diǎn)是難讀懂,維護(hù)困難,被認(rèn)為不適合編寫大程序,只適合一千行以下的程序,也有個(gè)著名的優(yōu)點(diǎn)是簡(jiǎn)練。 2.2.3 Python 首先,Python是和Basic一樣面向初學(xué)者的語(yǔ)言,和英語(yǔ)一樣容易懂。Python有和Perl類似的簡(jiǎn)單性,但沒有模式匹配。Python有和Lisp相似的地方,它有將字符串作為程序執(zhí)行的ev 2.2.4 Tcl Tcl具有最簡(jiǎn)單的語(yǔ)法,最好的和其他程序交互的能力,有編寫圖形界面程序的Tk?;旧弦呀?jīng)沒有個(gè)人用戶學(xué)習(xí)Tcl語(yǔ)言,但是中國(guó)一些大型的嵌入式軟件公司至今一直使用該語(yǔ)言進(jìn)行軟件測(cè)試工作,而且Tcl的工具包Tk也是很多Scripting Language的GUI工具。 2.2.5 Ruby Ruby是吸取了所有語(yǔ)言精華的語(yǔ)言。Ruby雖然是純面向?qū)ο笳Z(yǔ)言,但可以”扮成”程序式的程序語(yǔ)言;它的文件主要都是日文和英文。Ruby有: * Perl的正則表達(dá)式 * Python的語(yǔ)言的簡(jiǎn)單性可讀性、最容易的擴(kuò)展能力,強(qiáng)大的可移植性。 * PHP的嵌入功能和多種客戶端 * smalltalk的純面向?qū)ο笳Z(yǔ)法和單繼承 * Lisp的無(wú)窮嵌套的語(yǔ)法,也就是函數(shù)式的語(yǔ)法。 * 用“塊”來實(shí)現(xiàn)更快捷的數(shù)據(jù)結(jié)構(gòu)的處理。不知道是不是sCheme的宏功能。用塊能更清楚的實(shí)現(xiàn)Python的表處理功能。 * Java和Ada的線程編程 * Java的安全編程 不得不承認(rèn)Ruby確實(shí)是個(gè)精彩的語(yǔ)言,它完全學(xué)會(huì)了Lisp的所有編程都是函數(shù)的思想,smalltalk的所有東西都是對(duì)象的思想,Perl的一個(gè)目的多種手段的方法,Python的簡(jiǎn)單化的“最少驚喜”的原則,Java的多線程和安全控制的功能,Tcl的容易擴(kuò)展的功能,PHP的嵌入功能和強(qiáng)大客戶端的功能,最方便的shell命令的調(diào)用。 2.2.6 Lua Lua是一個(gè)小巧強(qiáng)大的腳本語(yǔ)言。第一眼看到Lua的介紹,感覺它象Tcl的替代品,因?yàn)樗闹饕康氖亲鳛槟_本語(yǔ)言。但接下來就看到它不是象Tcl那樣是命令行式的函數(shù)語(yǔ)言,它和其它語(yǔ)言一樣有語(yǔ)句結(jié)構(gòu)。它實(shí)現(xiàn)和C程序互動(dòng)的方式和Python類似,具有和Python一樣的和C結(jié)合的能力。并且Lua全部是用ansi C實(shí)現(xiàn)的,可以實(shí)現(xiàn)完全的跨平臺(tái)。 然后,看到Lua的一個(gè)顯著的特點(diǎn)就是具有對(duì)象數(shù)據(jù)庫(kù)功能,可以實(shí)現(xiàn)變量的永恒存儲(chǔ)。這個(gè)特點(diǎn)讓人首先聯(lián)想到fish,fish的最重要的特點(diǎn)也是語(yǔ)言內(nèi)含一個(gè)對(duì)象數(shù)據(jù)庫(kù),不過fish有outline的可視界面,和數(shù)據(jù)庫(kù)瀏覽能力。但fish不是開源的,因此,如果需要一個(gè)非內(nèi)存的變量存儲(chǔ)空間可以選擇Lua。這種對(duì)象數(shù)據(jù)庫(kù)都是不但能存儲(chǔ)數(shù)據(jù),也能存儲(chǔ)操作數(shù)據(jù)的函數(shù)。實(shí)際Python也具有一個(gè)將整個(gè)內(nèi)存存儲(chǔ)在一個(gè)磁盤文件的功能,另外,還有zope的zodb可以實(shí)現(xiàn)專業(yè)的永恒變量功能。另外,sCheme天然具有永恒存儲(chǔ)能力,它只要把表變量輸出到一個(gè)文件中就可以了。因?yàn)閟Cheme是不分?jǐn)?shù)據(jù)和程序的,因此可以實(shí)現(xiàn)將程序和數(shù)據(jù)同樣存儲(chǔ)在文件中。 Lua和Python相比規(guī)模比較小,因?yàn)樗呛虲緊密結(jié)合的,可以完全使用各種C庫(kù),就不需要有自己的庫(kù)。Lua給人的印象是小規(guī)模的Python。Lua也是動(dòng)態(tài)數(shù)據(jù)類型,也有內(nèi)存管理功能。只是Python自帶強(qiáng)大的庫(kù),而Lua只攜帶一個(gè)小型的庫(kù),具有字符串和數(shù)學(xué)計(jì)算能力,同時(shí)Lua標(biāo)準(zhǔn)攜帶一個(gè)對(duì)象數(shù)據(jù)庫(kù)。另外,可以把C庫(kù)隨時(shí)編譯到Lua中。Lua引以自豪的是它的速度很快。 Lua的語(yǔ)法比較簡(jiǎn)單,它把數(shù)組、字典、結(jié)構(gòu)等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)都統(tǒng)一為表。另外,Lua具有正則表達(dá)式功能。 2.3 網(wǎng)頁(yè)編寫∶客戶端程序 2.3.1
JavaS 編寫動(dòng)態(tài)網(wǎng)頁(yè)的最佳工具,可以造到很多效果,亦是Mozilla擴(kuò)充套件的語(yǔ)言。 2.3.2 VBScript VBScript是vb的腳本語(yǔ)言,可以產(chǎn)生服務(wù)器端和客戶端的動(dòng)態(tài)網(wǎng)頁(yè)。客戶端的動(dòng)態(tài)網(wǎng)頁(yè)暫時(shí)只有IE系列瀏覽器支援,所以VBScript兼容性很低,不及JavaS 2.4 服務(wù)器端程序 2.4.1 PHP PHP是專門寫網(wǎng)頁(yè)程序的語(yǔ)言,它的語(yǔ)法和Perl極之接近。PHP可以嵌入HTML,更容易編寫服務(wù)器端程序。PHP天然和web服務(wù)器以及mysql數(shù)據(jù)庫(kù)相結(jié)合。PHP可以動(dòng)態(tài)生成圖像。 但我最近看書才了解PHP獨(dú)特的開發(fā)目標(biāo)。 PHP為什么不直接用Perl作腳本語(yǔ)言。是因?yàn)镻erl是一種Unix語(yǔ)言,帶有Unix傳統(tǒng)的字符神秘高深,讓人難于學(xué)習(xí)。而編動(dòng)態(tài)網(wǎng)頁(yè)得人不見得會(huì)用Perl這種Unix工具,他們可能只有HTML知識(shí)。PHP就簡(jiǎn)化了Perl得語(yǔ)言,變成了一種簡(jiǎn)單友好得語(yǔ)言,免去了人們學(xué)習(xí)Perl得困難。 PHP定位于以HTML為用戶界面,充當(dāng)各種服務(wù)器得客戶端,實(shí)現(xiàn)得是傳統(tǒng)得客戶端編程得任務(wù)。它有pop、smtp、ftp、多種數(shù)據(jù)庫(kù)等各種服務(wù)器得客戶端得函數(shù),也有圖片、pdf生成,XML處理等這種必要得功能。這些都是其他腳本比不上PHP得地方。 2.4.2 Java、.NET、Zope 在商業(yè)開發(fā)中流行的是Java和.NET,其實(shí)zope也是選擇之一,zope的特點(diǎn)就是全部開源,層次少,簡(jiǎn)單。并且集成一個(gè)內(nèi)容管理器和眾多的附加產(chǎn)品。附加產(chǎn)品多是開源軟件必然的優(yōu)勢(shì)。zope之前的一些缺點(diǎn)在zope3中將得到解決。另外,zope的組件架構(gòu)和Cmf開發(fā)架構(gòu),并不必Java的組件開發(fā)環(huán)境差多少(我沒接觸很多Java,只是評(píng)感覺說,其他人可以有不同意見)。PHP雖然看起來不適合大程序開發(fā),但在PHP平臺(tái)上已經(jīng)有了很多大規(guī)模的程序,比如puke。tiki。 2.5 其他 2.5.1 Lisp Lisp的語(yǔ)法非常簡(jiǎn)單統(tǒng)一,只有簡(jiǎn)單的函數(shù)和參數(shù)的語(yǔ)句結(jié)構(gòu)。Lisp用上極多括號(hào),不太方便。Lisp數(shù)據(jù)和程序的界限模糊。Lisp可以深度嵌套。 2.5.2 prolog prolog是由R. Kowalsk首次提出,全稱是Programming in Logic。1972年誕生世界上第一個(gè)Prolog系統(tǒng)。它基于邏輯程序設(shè)計(jì),能自動(dòng)實(shí)現(xiàn)模式匹配和回溯,且適合于并行處理。PROLOG以一階謂詞演算為基礎(chǔ)。由于采用了合一、置換、回溯和匹配等機(jī)制來搜索解答,所以用戶不必要編寫求解搜索程序,只要把待解決的問題輸入計(jì)算機(jī)系統(tǒng)就可以了。PROLOG的功能還不如LISP強(qiáng),但它具有較好的發(fā)展前景,曾被用作第五代計(jì)算機(jī)開發(fā)研究的核心語(yǔ)言。 2.5.3 .NET 支持多種語(yǔ)言的統(tǒng)一的API類庫(kù),可以編寫webform程序,即所有的邏輯都在服務(wù)器端,傳到客戶端的是標(biāo)準(zhǔn)的HTML3.0,可以被各種瀏覽器支持。各程序組件間通過soap交換消息。 2.6 其他編程概念 2.6.1 Turing-complete programming: * Brainfuck: Brainfuck,是一種極小化的計(jì)算機(jī)語(yǔ)言,它是由Urban Müller在1993年創(chuàng)建的。這種語(yǔ)言有時(shí)被稱為brainf*ck或brainf***,在一些嚴(yán)肅的場(chǎng)合也被稱為BF。Müller的目標(biāo)是建立一種簡(jiǎn)單的、可以用最小的編譯器來實(shí)現(xiàn)的、符合Turing complete思想的編程語(yǔ)言。這種語(yǔ)言由八種狀態(tài)構(gòu)成,為Amiga機(jī)器編寫的編譯器(第二版)只有240個(gè)字節(jié)大??!就象它的名字所暗示的,brainfuck程序很難讀懂。盡管如此,brainfuck圖靈機(jī)一樣可以完成任何計(jì)算任務(wù)。雖然brainfuck的計(jì)算方式如此與眾不同,但它確實(shí)能夠正確運(yùn)行。 2.6.2 ☆Functional Programming: * Haskell: Haskell,是一門純正的函數(shù)式程序設(shè)計(jì)語(yǔ)言。特式是利用很簡(jiǎn)單的敘述就可以完成 Linked List、矩陣等數(shù)據(jù)結(jié)構(gòu)。 * Clean: Concurrent Clean,簡(jiǎn)稱Clean,是純函數(shù)式程序設(shè)計(jì)語(yǔ)言,它和Haskell有很多相似之處。Clean是用C寫成的。Clean程序很容易跨平臺(tái),在大部分情況下,要轉(zhuǎn)移到另一個(gè)平臺(tái)只需在那里重新編譯一次即可,不用改動(dòng)原始碼。 2.6.3 平行處理: * Fortran : Fortran,是由Formula Translate兩個(gè)字所組合而成,意思是公式翻譯,因此該計(jì)算機(jī)語(yǔ)言是為理工方面之計(jì)算所發(fā)展出來。1957年發(fā)展出第一套Fortran語(yǔ)言,而后1977年改進(jìn)成為較具結(jié)構(gòu)化特性之語(yǔ)言,稱為Fortran 77。1991年則加入對(duì)象導(dǎo)向的觀念與提供指針,并同時(shí)加強(qiáng)數(shù)組的功能,大幅改進(jìn)舊版Fortran的型式,稱為Fortran 90。 3. 多腳本語(yǔ)言的大統(tǒng)一及疑問 現(xiàn)在各種腳本語(yǔ)言太多了,有必要進(jìn)行整合,parrot是一個(gè)好的想法。.NET也是好的想法。它為各種腳本提供了一個(gè)統(tǒng)一的虛機(jī),為各種腳本語(yǔ)言提供了基于“類”的相互調(diào)用,為各種腳本提供了統(tǒng)一的類庫(kù)。 現(xiàn)在各種腳本語(yǔ)言只是提供了對(duì)C語(yǔ)言的交互性,這種交互也是費(fèi)勁的和效果不好的。比如Python、Perl、Ruby等都提供了對(duì)C的交互功能。腳本語(yǔ)言之間的交流障礙重重。而類似.NET的東西,提供了非常容易的各種腳本的相互利用的途徑,避免了很多的代碼的重復(fù)編寫。這種標(biāo)準(zhǔn)平臺(tái)的力量是很大的,這種標(biāo)準(zhǔn)平臺(tái)為什么沒有在開源領(lǐng)域首先出現(xiàn)呢?眾多的腳本正是開源的特點(diǎn)和優(yōu)勢(shì),為什么這種問題要微軟來解決呢?前面有人提出了類似的問題,在Linux中為什么至今沒有好用的類似ODBC的東西呢? 可能這種整合只有商業(yè)公司有能力實(shí)現(xiàn)吧。 我的理解是,如果有創(chuàng)新思想的人都拿他的想法去賣錢了,因此,在開源中只剩下了模仿的人。kde是模仿Windows,koffice是模仿office,Linux是模仿Unix,gcc、bash等也全都是模仿,以及gstep等,還有freedos、atheos等也是模仿,wxWindows、SDL也是模仿。我想知道開源社區(qū)有沒有自己的創(chuàng)新?我所知道的創(chuàng)新是zope,但zope最初也是商業(yè)產(chǎn)品,后來才開源的。Perl是創(chuàng)新,Python是創(chuàng)新,但還有什么呢?是不是開源領(lǐng)域只有haCk,沒有Creator? 4..NET平臺(tái) 4.1. .NET所實(shí)現(xiàn)的Java的功能 可控代碼、跨平臺(tái)的虛機(jī)和偽碼、免費(fèi)贈(zèng)送命令行編譯器、純面向?qū)ο笳Z(yǔ)言、對(duì)XML和XML web
serviCes的支持和jsp對(duì)應(yīng)的asp.NET、網(wǎng)頁(yè)上的程序、一套統(tǒng)一的中間件環(huán)境。 4.2. .NET實(shí)現(xiàn)的Java功能 免費(fèi)的集成開發(fā)環(huán)境 多廠家支持,跨平臺(tái)的成熟度。免費(fèi)的IDE, #develop , ASP.NET的有MS的WebMatrix 而免費(fèi)開源的CLR實(shí)現(xiàn),有MS自己的XP,F(xiàn)reeBSD,Mac OS下的 實(shí)現(xiàn)(原理演示不能進(jìn)行商業(yè)應(yīng)用), Novell下的Mono項(xiàng)目,已經(jīng)發(fā)布了Beta1版本,在2004-6-30 將會(huì)發(fā)布Release1; 還有GNU的一個(gè).NET實(shí)現(xiàn)!! 4.3. .NET實(shí)現(xiàn)的Java不具備的功能 多語(yǔ)言支持、強(qiáng)大的集成開發(fā)環(huán)境。 在Windows上媲美本機(jī)程序的速度。 對(duì)COM的支持,對(duì)vs的繼承 對(duì)widows form 、web form、服務(wù)器端程序的圖形直觀編程。 4.4. 相對(duì)vs6的改進(jìn) 統(tǒng)一了集成開發(fā)環(huán)境,使C++程序也具有了vb的友好性。 5. 幾種語(yǔ)言的點(diǎn)評(píng) 5.1. XML各種技術(shù)介紹 * XML: XML是統(tǒng)一格式的結(jié)構(gòu)化數(shù)據(jù)的文本文件?;赬ML的程序,數(shù)據(jù)結(jié)構(gòu)是開放的,方便不同程序處理同一種文件,這樣,程序之間可以達(dá)到高水平的協(xié)作。XML現(xiàn)在成為了各行各業(yè)統(tǒng)一數(shù)據(jù)格式的基礎(chǔ)。XML發(fā)展出了完善的語(yǔ)法,它用DTD或sCheme來界定XML的標(biāo)記語(yǔ)言。用uri來唯一確定一個(gè)XML格式。用Css或XLT來轉(zhuǎn)換XML格式,xlink和xpointer等來建立XML的鏈接,用xpath來定位XML中的數(shù)據(jù)。 * XHTML: 是嚴(yán)格符合XML格式的HTML。 * RDF: 基于XML的元數(shù)據(jù)描述語(yǔ)言。方便交換結(jié)構(gòu)化數(shù)據(jù)。方便交換知識(shí)。RDF是用主語(yǔ)、謂語(yǔ)、賓語(yǔ)來描述知識(shí)的。 * SVG: XML格式的矢量圖形格式。 * SMILE: XML格式的各種多媒體在時(shí)間線上的協(xié)同。 * Xmath: XML格式的公式描述語(yǔ)言。 * XML-RPC和Soap: 以http協(xié)議和XML格式來進(jìn)行網(wǎng)絡(luò)程序之間的消息通訊。 * XUL: NetScape的mazilla使用的程序界面語(yǔ)言,基于XML格式,比HTML強(qiáng)大的多的描述圖形界面的XML語(yǔ)言。它用Css來?yè)Q膚,用DTD來實(shí)現(xiàn)多語(yǔ)言界面,用Javas * XAML: MS在LongHorn平臺(tái)的最新編程語(yǔ)言, 將統(tǒng)一Windows與Web編程,直接使用。LongHorn下的瀏覽器進(jìn)行執(zhí)行,跟XUL有類比性。 5.2 最先進(jìn)的XML格式圖形界面程序開發(fā)工具-XUL 大家知道NetScape程序,一個(gè)僅次于IE的瀏覽器,也有很多人知道Mozilla,NetScape的開放源代碼版本。但很多人只是使用Mozilla,不知道Mozilla另一個(gè)重要得功能--程序開發(fā)。在NetScape開放源代碼后三年Mozilla的1.0版還沒有問世,很多人譏笑他的超慢得開發(fā)速度,實(shí)際上,Mozilla醞釀出了一個(gè)超酷的新產(chǎn)品,可以看作是軟件開發(fā)工具發(fā)展得另一個(gè)里程碑。 現(xiàn)在基于瀏覽器得三層開發(fā)結(jié)構(gòu)非常流行,微軟的.NET的思路就是基于這個(gè)結(jié)構(gòu)的。另外,不考慮服務(wù)器結(jié)構(gòu),就是基于網(wǎng)頁(yè)的JavaS XUL是對(duì)HTML的擴(kuò)展,完全兼容于HTML,XUL基于XML格式對(duì)HTML進(jìn)行了擴(kuò)展,實(shí)現(xiàn)了完整、強(qiáng)大得圖形用戶界面設(shè)計(jì)功能。可以設(shè)計(jì)出復(fù)雜得圖形界面程序。實(shí)際上mazilla整個(gè)就是由XUL設(shè)計(jì)的。XUL用Css來控制界面風(fēng)格、用DTD來替代字符串,方便的實(shí)現(xiàn)本地化,用Javas 總結(jié):XUL由于兼容HTML,提供了最強(qiáng)大的用戶界面的定制,DTD提供了最方便的本地化。XUL、Javas 5.3. 最接近人類語(yǔ)言的編程語(yǔ)言-REBOL REBOL的詳細(xì)資料見www.REBOL.org。這里談一下我的印象。 REBOL的缺點(diǎn)是明顯的。它是一個(gè)商業(yè)公司的產(chǎn)品。它只是象Java一樣免費(fèi)使用。但不開放源代碼。并且它的數(shù)據(jù)庫(kù)連接的函數(shù)庫(kù)是收費(fèi)的。但它的優(yōu)點(diǎn)也十分明顯,如果因?yàn)椴皇情_放源代碼軟件而不能放心使用,也可以欣賞和借鑒它的種種特點(diǎn),并且了解了REBOL肯定還會(huì)忍不住使用它。 首先REBOL是一個(gè)Lisp語(yǔ)言的替代品,它能實(shí)現(xiàn)Lisp的所有能力。他具有Lisp語(yǔ)言的數(shù)據(jù)和程序同等處理的特點(diǎn),也有語(yǔ)句和表達(dá)式的統(tǒng)一。但大大打破了Lisp的局限。它允許中綴運(yùn)算符的形式,沒有滿眼的括號(hào),和一般編程語(yǔ)言的表達(dá)方法完全一樣。同時(shí)具有豐富的庫(kù),有完全的圖形界面庫(kù),完全的網(wǎng)絡(luò)庫(kù)。因?yàn)槭且粋€(gè)公司的產(chǎn)品,也保證了庫(kù)的統(tǒng)一。 REBOL自稱為網(wǎng)絡(luò)編程語(yǔ)言,它的網(wǎng)絡(luò)編程能力很強(qiáng),一般一個(gè)語(yǔ)句就可以下載一個(gè)文件,或下載一個(gè)網(wǎng)頁(yè),或接受一個(gè)郵件。 REBOL一個(gè)神奇的特點(diǎn)是它的圖形界面設(shè)計(jì),它的界面編程非常簡(jiǎn)單,完全不用語(yǔ)句和函數(shù),而是和HTML一樣只要表達(dá)核心內(nèi)容就行了。這得益于REBOL的“方言”能力。 REBOL內(nèi)置了“方言”能力。就是象yacc一樣的語(yǔ)言解析能力??梢噪S時(shí)擴(kuò)展“子語(yǔ)言” REBOL內(nèi)置了幾十種數(shù)據(jù)類型,用它編程,語(yǔ)句肯定是最精煉的。 REBOL可以實(shí)現(xiàn)Java一樣的網(wǎng)絡(luò)下載程序運(yùn)行的能力,也有砂箱功能。它比Java更進(jìn)一步,有自己的桌面,在桌面上可以任意啟動(dòng)各個(gè)REBOL程序,它的桌面象HTML一樣有豐富的表達(dá)形式和超鏈接。鏈接到有REBOL功能的網(wǎng)站上就可以象瀏覽網(wǎng)頁(yè)一樣使用各種程序。由于REBOL語(yǔ)言比Java要簡(jiǎn)練的多,同時(shí)是不用編譯的腳本語(yǔ)言,它的程序文件非常小,更適合網(wǎng)絡(luò)傳輸。因?yàn)镽EBOL有這樣神奇的功能,它自稱internet操作系統(tǒng)。因?yàn)镽EBOL是腳本語(yǔ)言,因此它天然是跨平臺(tái)的。它有很多操作系統(tǒng)的實(shí)現(xiàn)。 還有一個(gè)特點(diǎn),REBOL語(yǔ)言自身只是一個(gè)幾百k的可執(zhí)行文件,因此REBOL程序的發(fā)布是非常簡(jiǎn)單的。 5.4. 我為什么選擇了Python 首先聲明,我編程只編應(yīng)用程序,就是代替自己工作的小程序。如果編寫系統(tǒng)程序總會(huì)用到C或Java的。 我喜歡腳本語(yǔ)言,腳本語(yǔ)言不用編譯就可以運(yùn)行,非常便于修改,而編程序是一種經(jīng)常性的活動(dòng),程序編完后總在不斷的修改中,沒必要搞的很隆重,還要編譯。另外,腳本程序每個(gè)使用的人都可以隨手拿來修改,不會(huì)出現(xiàn)還要去找源代碼的情況。因此,C/C++和Java就被排除了。 關(guān)于性能?,F(xiàn)在Cpu已經(jīng)很強(qiáng)大了。除了很大的程序和系統(tǒng)程序,沒必要關(guān)心性能。 至于我為什么不用vb,因?yàn)関b太龐大了。我沒必要實(shí)現(xiàn)一個(gè)小功能啟動(dòng)這么龐大的程序。太夸張。另外,vb沒有類繼承,雖然是應(yīng)用編程,但如果要編稍微大的程序,總會(huì)用到類繼承的。 5.5. 最具有現(xiàn)代感的Lisp解釋器DrScheme Lisp是一個(gè)古老的計(jì)算機(jī)編程語(yǔ)言,給人的印象是速度慢,輸入輸出能力弱,沒有圖形界面,自身攜帶的庫(kù)太少,很多功能不能實(shí)現(xiàn)。這一切在DrScheme手中改變了。 DrScheme具有大量的現(xiàn)代語(yǔ)言具有的功能,比如作為嵌入腳本的能力,圖形界面的編程能力,面向?qū)ο蟮哪芰?,組件編程能力,正則表達(dá)式能力,XML能力,作為web服務(wù)器和客戶端來輸入輸出能力及其它網(wǎng)絡(luò)能力,產(chǎn)生獨(dú)立可執(zhí)行文件的能力。一個(gè)集成的編輯調(diào)試環(huán)境。不過它的程序執(zhí)行速度還是稍慢。 當(dāng)然,它具有所有Scheme的優(yōu)點(diǎn),語(yǔ)法的宏定義能力,命名空間能力,數(shù)據(jù)和程序不分的能力,堆棧式內(nèi)存管理,無(wú)窮嵌套,用“表”來表現(xiàn)所有語(yǔ)句和數(shù)據(jù)的簡(jiǎn)單方式,也天然帶有程序環(huán)境的永恒存在能力。這些特點(diǎn)好像正在最新出現(xiàn)的編程語(yǔ)言中出現(xiàn)。好像目前的編程語(yǔ)言的發(fā)展趨勢(shì)是從C語(yǔ)言的方式向具有更多Lisp特點(diǎn)的方向發(fā)展。就像Windows逐漸具有了越來越多的Unix早已實(shí)現(xiàn)的功能。才知道Lisp的編程環(huán)境已經(jīng)這么好了。 5.6. eiffel語(yǔ)言印象 印象深的是它是全開發(fā)周期的語(yǔ)言,并且是在開發(fā)周期可回溯的。它的ContraCt和Ada類似。eiffel是和C++類似的編譯的面向?qū)ο笳Z(yǔ)言,不過更簡(jiǎn)單,能夠多繼承。eiffel是C語(yǔ)言的面向?qū)ο缶幊痰拇嫖铩? 5.7. mozart oz語(yǔ)言 oz介紹它是面向?qū)ο蟮?、能夠邏輯編程的、并發(fā)分布的語(yǔ)言。我對(duì)oz印象最深的是它的多線程能力。一個(gè)簡(jiǎn)單的Case語(yǔ)句,就可以啟動(dòng)多個(gè)線程。另外,它也是一個(gè)prolog的代替物,可以編寫分布并發(fā)的人工智能程序。 6. 各種語(yǔ)言的選擇和語(yǔ)言之間的關(guān)系 * 如果編寫對(duì)性能要求苛刻,或和操作系統(tǒng)結(jié)合緊密的程序,必然選擇C。 * 如果編寫到處可用的程序,選Java。 * 如果編寫大程序,可能的話盡量用腳本語(yǔ)言如Python、Ruby,不行了再用Java和C。因?yàn)槟_本語(yǔ)言帶來了生產(chǎn)力。 * 編寫文本的處理程序用Perl或Ruby。 * 編寫知識(shí)的處理程序用prolog。 * 編寫最靈活,最模糊的程序用Lisp。 * 編寫office程序用vba。 * 編寫服務(wù)器端程序,PHP、(采用自己熟悉的語(yǔ)言來寫,例如Perl、Python、Ruby)CGI、ASP、(熟悉Java就用)JSP都是選擇。 * 編寫數(shù)據(jù)庫(kù)程序用vb或delphi。 * 如果要追求性能和程序的能力,要完全發(fā)揮操作系統(tǒng)的能力,使用C/C++語(yǔ)言是合適的。在Windows環(huán)境下用VC,在Unix-like環(huán)境下用gcc。 * 如果不是追求和操作系統(tǒng)完美結(jié)合,而只是性能,又要追求跨平臺(tái)性,那么仍然選擇C,但可以選擇跨平臺(tái)的庫(kù),如qt、gtk、fox、wxWindows。如果要編寫游戲也有跨平臺(tái)選擇:SDL。 * 如果不滿意C領(lǐng)域標(biāo)準(zhǔn)的不統(tǒng)一,不滿意C的容易出錯(cuò),不滿意C的面向?qū)ο筇卣鞑粡氐住? * 如果不在乎跨平臺(tái),Windows平臺(tái)可以選擇C#,maC平臺(tái)可以選擇CoCo。如果需要跨平臺(tái),可以選擇Java。 * 如果需要跨平臺(tái),又要廣泛的支持的話,選擇Java。 * 在Unix-like下,最方便的工具語(yǔ)言是Perl,它有強(qiáng)大的社區(qū)和代碼庫(kù)的支持。 * 如果只作為簡(jiǎn)單應(yīng)用的工具語(yǔ)言,Python和Ruby是更好的選擇,他們的跨平臺(tái)移植性好,應(yīng)用也比較廣泛。其中Python更適合入門和交流,長(zhǎng)期使用也不錯(cuò)。Ruby是對(duì)Python不滿意的另一個(gè)選擇,它提供了很多額外的功能。 * 如果要選擇一個(gè)程序的嵌入語(yǔ)言,原來有Lisp、Basic和Java,現(xiàn)在還可以選擇Python和Ruby。 * 如果在要求動(dòng)態(tài)解釋執(zhí)行語(yǔ)言,而又不想學(xué)其他語(yǔ)言的話,C程序員的選擇是pike,Java程序員的選擇是beanshell。 * 在Java平臺(tái),又想用腳本語(yǔ)言的話,可以用Python。 * 最正統(tǒng)的基于文檔的語(yǔ)言或叫動(dòng)態(tài)頁(yè)面語(yǔ)言是JavaS * 最專門的服務(wù)器端語(yǔ)言是PHP,當(dāng)然也有很多其他選擇。 * XML語(yǔ)言以XUL為最著名,dtml也算一個(gè),你自己也可以用XML作為自己特殊用途的語(yǔ)言。比如jedit就用XML作為一種模式定制語(yǔ)言。XML語(yǔ)言是一種比較先進(jìn)的趨勢(shì),比現(xiàn)有的語(yǔ)言在特殊領(lǐng)域更高效。 * 要找容易實(shí)現(xiàn)的語(yǔ)言,Lisp和Tcl是選擇。Lisp的數(shù)據(jù)和程序融為一體的能力和自由是其他語(yǔ)言都沒有的?,F(xiàn)在出現(xiàn)了一個(gè)Lisp的現(xiàn)代化的變種:REBOL。 * 如果有基于事實(shí)的編程的需要的話,prolog和Clips是必然。 6.1 一般是使用什么軟件,就用什么軟件的語(yǔ)言 就拿我用的軟件舉例: 使用excel,就用vba編程。 使用autoCad就用autoLisp編程 使用zope就用Python編程 如果使用gimp就用Python或sCheme編程 使用gnome office就用Python或Basic編程 使用blender就用Python編程 6.2 然后看處理什么樣類型的數(shù)據(jù) 如果處理文件的操作就用shell語(yǔ)言。比如bash 如果處理文本文件,就用Perl或awk,如果喜歡Perl的風(fēng)格,又象編大程序,就要用Ruby 如果處理數(shù)據(jù)庫(kù),簡(jiǎn)單的用sed。否則用sql。 如果是對(duì)象數(shù)據(jù)庫(kù),可以使用Python+ZODB、或Lua、fish 如果一般的數(shù)據(jù)庫(kù)不能滿足要求,需要做專家系統(tǒng),就用prolog 如果處理結(jié)構(gòu)化文本,如XML,就用xslt。 處理HTML,客戶端用Javas 如果處理類似語(yǔ)言分析的文本,就用yacc 如果處理出來的結(jié)果是打印文檔或屏幕文檔,就用tex 如果是圖像、動(dòng)畫或其它二進(jìn)制的文件,一般用C語(yǔ)言。 如果處理的問題和操作系統(tǒng)底層打交道,用C語(yǔ)言 6.3 從語(yǔ)言特點(diǎn)來說 如果極端要求運(yùn)行中的多線程的并發(fā)和分布,可以考慮oz語(yǔ)言。 如果極端重視文檔,希望把程序的文檔寫出來了,程序也幾乎就完成了,那么用Cweb 復(fù)雜的程序,在編寫之前需要做uml的文檔。 如果要編寫規(guī)模較大的程序或打算只學(xué)一種編程語(yǔ)言,就要用Python 如果編寫程序來處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和算法,就用Lisp和sCheme (喜歡Lisp的風(fēng)格,并希望更簡(jiǎn)單,用REBOL) 如果想最簡(jiǎn)單的實(shí)現(xiàn)一個(gè)語(yǔ)言來作為嵌入語(yǔ)言,就用Tcl,如果Tcl有局限,就用Lua 6.4 C語(yǔ)言的改進(jìn) C語(yǔ)言是最普及的語(yǔ)言,但C語(yǔ)言有一些缺點(diǎn),因此,就產(chǎn)生了很多改進(jìn)C的語(yǔ)言。 因?yàn)镃不能編寫大程序,就產(chǎn)生了C++;因?yàn)镃++還有指針等缺點(diǎn),就產(chǎn)生了Java; 如果不喜歡C++的各種缺點(diǎn),又想使用一個(gè)編譯型語(yǔ)言,就選擇eiffel。C語(yǔ)言的一個(gè)缺點(diǎn)是標(biāo)準(zhǔn)庫(kù)規(guī)模小,不能解決所有的問題,就產(chǎn)生了大量不兼容的庫(kù),導(dǎo)致了很多不可移植的程序。如果想要一個(gè)和C用樣級(jí)別的可移植的編程語(yǔ)言,就選擇Ada。Ada的圖形用戶界面庫(kù)和各種和操作系統(tǒng)相關(guān)的庫(kù)都是標(biāo)準(zhǔn)化的,可以選擇不同賣家的解決方案。是軍隊(duì)要求的標(biāo)準(zhǔn)編程語(yǔ)言。如果不喜歡C語(yǔ)言的繁瑣,希望常做的事編程能夠簡(jiǎn)單,那么可以用Python。完成同樣的工作,Python代碼行數(shù)是C的幾分之一。 C風(fēng)格的腳本化語(yǔ)言是Javas 6.5 關(guān)于圖形用戶界面的選擇 * 最簡(jiǎn)單的圖形界面接口是tk,可以在各種平臺(tái)上可用 * 如果有更高的要求使用gtk。gtk移植性差些。 * 一個(gè)以移植性為目標(biāo)的開源C庫(kù)是wxwindow * 如果希望簡(jiǎn)單的編程,要求不很高,可以用XUL * 跨平臺(tái)的圖形用戶結(jié)構(gòu)是Java的awt和swing。如果不跨平臺(tái),還有ibm的Java解決方案。 * 如果對(duì)商業(yè)編程語(yǔ)言不排斥,可以用qt,因?yàn)閝t的程序,如果商業(yè)使用是要付費(fèi)的。 * 如果要編寫全屏的文本界面程序,emaCs是最權(quán)威的。我們可以回憶,turbo C的編程環(huán)境和圖形用戶界面一樣友好。它就是全屏的文本用戶界面。 * 如果編寫office家族類似的程序,在openoffice上也是可以考慮的選擇。gtk也可以。 6.6.Ruby和Python的比較 6.6.1. Python和Ruby的相同點(diǎn) * 都強(qiáng)調(diào)語(yǔ)法簡(jiǎn)單,都具有更一般的表達(dá)方式。Python是縮進(jìn),Ruby是類Basic的表達(dá)。都大量減少了符號(hào)。 6.6.2. 和Python相比Ruby的優(yōu)點(diǎn) *
具有正則表達(dá)式和嵌入HTML的功能。Python也有正則表達(dá)式,但沒有Ruby的應(yīng)用方便和廣泛。Python的嵌入HTML項(xiàng)目才剛起步。Ruby還有apaChe的mod模塊。Ruby本身也實(shí)現(xiàn)和很多Unix工具,如raCC,doCtools。比Python更親近Linux。 6.6.3. 和Python相比Ruby的不足 *
最大的不足正是因?yàn)镽uby的強(qiáng)大所引起的。它沒有Python的簡(jiǎn)單性好。比較復(fù)雜的面向?qū)ο笳Z(yǔ)法、“塊”語(yǔ)法的引入、正則表達(dá)式的引入、一些簡(jiǎn)寫標(biāo)記都增加了語(yǔ)言的復(fù)雜性。 6.6.4. Python和Ruby的語(yǔ)言的選擇 從簡(jiǎn)單的就是好的來說,選Python是沒錯(cuò)的。Python適合尋找簡(jiǎn)單語(yǔ)言的人,這很可能造成Python更流行,因此也有更多的支持。但如果要追求更強(qiáng)大的語(yǔ)法功能,對(duì)編程語(yǔ)言感興趣,想了解各種編程概念的人,則Ruby是好的選擇。Ruby和Python都想取代Perl,解決Perl的缺點(diǎn)--面向?qū)ο蟛蛔悖玃ython用是方法是混合面向?qū)ο蠛统绦蚴降某绦蛘Z(yǔ)言,Ruby是允許自己這個(gè)面向?qū)ο笳Z(yǔ)言扮成程序式的程序語(yǔ)言,方向很不同。 6.7 discuss 各種語(yǔ)言的選擇和語(yǔ)言之間的關(guān)系: 如果處理結(jié)構(gòu)化文本,如XML,就用xslt。 XML本身也算吧. 處理HTML,客戶端用Javas 如果要編寫全屏的文本界面程序,emaCs是最權(quán)威的。我們可以回憶,turbo C的編程環(huán)境和圖形用戶界面一樣友好。它就是全屏的文本用戶界面。 哈,EmaCs。 也許,語(yǔ)言是用來超越的.許多應(yīng)用就需要不同語(yǔ)言混合. 把Python嵌到應(yīng)用程序中,我覺得很誘人。 7.文學(xué)編程和CWEB介紹 CWEB是tex的作者創(chuàng)立的一種編程語(yǔ)言。tex是主流的文檔打印標(biāo)準(zhǔn)和文檔生成工具。tex及相關(guān)的metafont就是用Cweb編寫的軟件,同時(shí)tex體現(xiàn)了Cweb的編程特點(diǎn)。CWEB的編程思想叫“文學(xué)編程”。實(shí)際應(yīng)該叫“文章編程”,因?yàn)楹臀膶W(xué)關(guān)系不大,反而和學(xué)術(shù)著作類似。主要思想就是:編程應(yīng)該象寫學(xué)術(shù)著作那樣,有整體構(gòu)思,以部、章、節(jié)、子節(jié)、子子節(jié)那樣逐級(jí)豐富。這實(shí)際和我們說的“自頂向下”的編程方法類似。但“自頂向下”只是一種軟件工程的方式,它是以編寫文檔的方式實(shí)現(xiàn)的,沒有和編程語(yǔ)言結(jié)合起來。CWEB用我的說法是用編程語(yǔ)言實(shí)現(xiàn)了“自頂向下”。 CWEB的實(shí)現(xiàn)方式是“宏替換”,就是逐級(jí)用更具體的內(nèi)容來代替較概括較簡(jiǎn)略的內(nèi)容。我們使用的編程工具“maker”實(shí)際就是一種宏替換工具(我沒用過maker,只是聽說)。zope的TAL語(yǔ)言是一種替換工具,但不是宏替換工具,因?yàn)樗膬?nèi)容不是可執(zhí)行的,如果內(nèi)容是可執(zhí)行的,那么它也可以叫宏替換 |
|