腳本語言實(shí)際上著重腳本二字,而不是語言二字,因為腳本語言它的最主要的關(guān)注點(diǎn)就是為現(xiàn)有代碼準(zhǔn)備一個偽碼系統(tǒng)(opcodesystemusedtousesometh),至于你是用圖靈完備的語言或是用其它設(shè)施完成,那不是偽碼系統(tǒng)必然的性質(zhì)。

傳統(tǒng)編程

像C++,C這樣的語言都是被設(shè)計為通用(Generalpurpose)的,要通用,它必須一切從頭做起,而不能一開始就很抽象,否則它不能做它抽象之前發(fā)生的那些事兒,因為那不是他的任務(wù),它在歷史上能很好解決的問題是系統(tǒng)編程領(lǐng)域的。

通用型語言往往是系統(tǒng)編程語言因此往往基于某種靠近計算機(jī)底層的離散形式,其它的語言往往稱為自然語言,或DSL實(shí)現(xiàn)特定領(lǐng)域事情的語言(相對C++,C來說)不強(qiáng)大,不深入底層,不能控制計算機(jī)干任何通用事情,因此往往基于高層模型。

通用語言一般是嚴(yán)格語法的(就像我們見到的那樣,C,C++,JAVA都是那樣),而除了系統(tǒng)領(lǐng)域之外的應(yīng)用領(lǐng)域,一般是特定的、靈活的,并不是通用的,所以傳統(tǒng)的“通用語言語法加通用庫”的方式并不適合于解決此類問題(因為它并不是傳統(tǒng)語言能夠并已經(jīng)很好抽象了的那些領(lǐng)域)。

特定應(yīng)用領(lǐng)域往往要求更特定的抽象,并且,要求特定的語言元素特定的語法結(jié)構(gòu)才能很好表達(dá)它,比如文本處理領(lǐng)域(C++處理文本時,沒有專門的標(biāo)準(zhǔn)文本庫,也沒有語言級直接支持RegEx表達(dá)式這樣的東西),而python顯然對于這個領(lǐng)域的設(shè)施支持比C++方便。

撇開c++和python的這種對比不說,我們一定要知道,對于特定領(lǐng)域,用傳統(tǒng)的系統(tǒng)編程方法和語言來完成是不合適的,因為如果硬要這樣做,那么要么要求通用語言提供新的語法,(而這是很困難的,語言的擴(kuò)展并不現(xiàn)實(shí),它會造成語言過于復(fù)雜多變)。要么不改變語法,而提供新的庫,比如文本模式匹配問題,C++在語法級沒有直接支持,它就用boost.regex來做。換言之,這些方式只是要求在通用下求特化,讓它們干它們不擅長和始料未及的事,C,C++并不絕對“通用”(它們只是DSL,C是系統(tǒng)實(shí)現(xiàn)的DSL,C++是系統(tǒng)開發(fā)的DSL——注意,我們不考慮C++的第二層)。

腳本編程

腳本語言是相對C這一類系統(tǒng)編程語言來說的,C最重要的特點(diǎn)就是它用數(shù)據(jù)結(jié)構(gòu)加算法來解釋系統(tǒng)底層開發(fā)的手段,用C開發(fā)絕對離不開對系統(tǒng)原理和數(shù)據(jù)結(jié)構(gòu)的理解,而這些原理,包括C本身的實(shí)現(xiàn),都是基于數(shù)據(jù)結(jié)構(gòu)跟算法來解決問題的[明白這點(diǎn)很重要,因為有人希望學(xué)習(xí)C語言作Web編程,這就有點(diǎn)南轅北轍了,而且這個認(rèn)識可以端正你學(xué)C語言解決問題的方向,所以說大思想是重要的。

而腳本語言和虛擬機(jī)語言,可以基于更高層的開發(fā)邏輯和設(shè)計方式來解決問題實(shí)現(xiàn)編程,比如Python,Ruby,可以運(yùn)用包括OO,DP在內(nèi)的高層語言邏輯[關(guān)于Python語言特點(diǎn)的介紹請參照有關(guān)章節(jié)],程序員不必涉入數(shù)據(jù)結(jié)構(gòu)這些與底層和解決大家都解決過的問題直接相關(guān)的東西,僅提倡在復(fù)用層面利用這些解決過的東西能編程就可以了抽象的語言,意味著它可以少干些輪子重造方面的事情。比如腳本式開發(fā),OO層面的復(fù)用,當(dāng)然,任何事情都是不完美的,太抽象了,往往也就同時失去了C能控制底層的那些能力。

因此,C++,C這樣的語言必須要涉及到匯編原理里面的東西,而DSL可以以任何高層的形式被體現(xiàn),比如不需要編譯的UML圖都是,POWERPOINT代碼都是DSL,根本不需要編譯器這樣的圖靈完備裝備。

傳統(tǒng)VS腳本

系統(tǒng)語言因為拖著一個系統(tǒng),其本質(zhì)上并非專用的應(yīng)用開發(fā)語言。而只是通用的系統(tǒng)開發(fā)語言,有它因為移殖和平臺問題導(dǎo)致的一系列大問題[C++唯獨(dú)用template,Boost等方法實(shí)現(xiàn)了另外一種”python”]。而腳本語言并不需要對某個平臺進(jìn)行開發(fā),從而需要考慮移殖和速率的問題。因為系統(tǒng)問題不是它的初衷和設(shè)施基礎(chǔ),它直接面向應(yīng)用編程(系統(tǒng)編程,系統(tǒng)邏輯不由這類語言直接實(shí)現(xiàn)的,它只是封裝并bind),由于整個地扔掉了系統(tǒng)這個大包袱,一切編程問題都是腳本語言內(nèi)部的事情。而且,腳本語言本身很高級,往往提供大量庫(甚至DSL相關(guān)的庫),這就對熟悉了編程的人來說,顯得尤為簡單(復(fù)用做到了極致)。

抽象語言往往比不上系統(tǒng)語言對于計算機(jī)編程方面的功能強(qiáng)大[這也就是腳本語言比不上編譯語言這樣的語言對計算機(jī)編程方面的功能強(qiáng)大。道理很簡單,因為它太抽象了,所以在它抽象了的地方,它反而不能發(fā)揮這個層面的能力,我們將在稍后談?wù)勀_本語言。腳本語言是一種抽象語言]。因為抽象語言的虛擬機(jī)往往是高級機(jī)器,根本不像我們的硬件機(jī)器那么底級,圖靈模型對應(yīng)我們的硬件機(jī)器和架構(gòu),而虛擬機(jī)往往跟硬件架構(gòu)差別過大,因此腳本語言和系統(tǒng)語言是為二個不同的機(jī)器設(shè)計他們干的事。

換言之,系統(tǒng)語言面向系統(tǒng)上的應(yīng)用,而腳本語言面向廣泛意義上的應(yīng)用(可以當(dāng)然bind系統(tǒng)語言開發(fā)的系統(tǒng)邏輯,這也往往是腳本語言的與現(xiàn)有代碼進(jìn)行工作時通常使用的方法),這就是腳本語言之于系統(tǒng)編程語言的特點(diǎn)所在。它們之間的區(qū)別正是由它們各自的任務(wù)決定的,要分清高級系統(tǒng)語言C++和腳本應(yīng)用語言之間的區(qū)別。

意義

腳本語言實(shí)際上著重腳本二字,而不是語言二字,因為腳本語言它的最主要的關(guān)注點(diǎn)就是為現(xiàn)有代碼準(zhǔn)備一個偽碼系統(tǒng)(opcodesystemusedtousesometh),至于你是用圖靈完備的語言或是用其它設(shè)施完成,那不是為碼系統(tǒng)必然的性質(zhì)。

腳本語言獨(dú)立平臺,提供高階的設(shè)計手段,和大量的隨語言一起分布的,作為語言標(biāo)準(zhǔn)的直面應(yīng)用的庫。(而系統(tǒng)編程語言強(qiáng)調(diào)事事從最基本的類型做起,因為系統(tǒng)語言要求通用和提供可定制性,所以不能提供太高的設(shè)計手段,和可供復(fù)用的庫設(shè)施,所以系統(tǒng)語言本身就被設(shè)計成那種能很好重造輪子的語言)。

在這個意義上,腳本語言其實(shí)是一種整合系統(tǒng)(提供一致的類型且開發(fā)時動態(tài)的類型,黑盒化平臺)與整合設(shè)計(提供OO或template這樣的高高階設(shè)計),整合問題(大量標(biāo)準(zhǔn)庫的出臺直面各種問題)的語言。它將一切開發(fā)上的事,做到語言中,做到庫中,不提倡一步一步實(shí)現(xiàn)解決過了的問題。

所以,編程應(yīng)是一種很有意思的事情,在腳本編程這個層面開始體現(xiàn)出來。因為這里的復(fù)用程序最高(編程幾乎等于計算機(jī)應(yīng)用能力)。庫和語言功能足夠豐富的語言,幾行代碼就可以勾勒出一個程序來,而且標(biāo)準(zhǔn)庫,它提倡事事規(guī)定以統(tǒng)一的方式來進(jìn)行(標(biāo)準(zhǔn)化編程),比如pystdlib,jdk,不需要為諸多的tricks犯迷糊。