腳本編程

腳本編程

腳本語言實際上著重腳本二字,而不是語言二字,因為腳本語言它的最主要的關注點就是為現有代碼準備一個偽碼系統(opcodesystemusedtousesometh),至於你是用圖靈完備的語言或是用其它設施完成,那不是偽碼系統必然的性質。

傳統編程


像C++,C這樣的語言都是被設計為通用(Generalpurpose)的,要通用,它必須一切從頭做起,而不能一開始就很抽象,否則它不能做它抽象之前發生的那些事兒,因為那不是他的任務,它在歷史上能很好解決的問題是系統編程領域的。
通用型語言往往是系統編程語言因此往往基於某種靠近計算機底層的離散形式,其它的語言往往稱為自然語言,或DSL實現特定領域事情的語言(相對C++,C來說)不強大,不深入底層,不能控制計算機干任何通用事情,因此往往基於高層模型。
通用語言一般是嚴格語法的(就像我們見到的那樣,C,C++,JAVA都是那樣),而除了系統領域之外的應用領域,一般是特定的、靈活的,並不是通用的,所以傳統的“通用語言語法加通用庫”的方式並不適合於解決此類問題(因為它並不是傳統語言能夠並已經很好抽象了的那些領域)。
特定應用領域往往要求更特定的抽象,並且,要求特定的語言元素特定的語法結構才能很好表達它,比如文本處理領域(C++處理文本時,沒有專門的標準文本庫,也沒有語言級直接支持RegEx表達式這樣的東西),而python顯然對於這個領域的設施支持比C++方便。
撇開c++和python的這種對比不說,我們一定要知道,對於特定領域,用傳統的系統編程方法和語言來完成是不合適的,因為如果硬要這樣做,那麼要麼要求通用語言提供新的語法,(而這是很困難的,語言的擴展並不現實,它會造成語言過於複雜多變)。要麼不改變語法,而提供新的庫,比如文本模式匹配問題,C++在語法級沒有直接支持,它就用boost.regex來做。換言之,這些方式只是要求在通用下求特化,讓它們干它們不擅長和始料未及的事,C,C++並不絕對“通用”(它們只是DSL,C是系統實現的DSL,C++是系統開發的DSL——注意,我們不考慮C++的第二層)。

腳本編程


腳本語言是相對C這一類系統編程語言來說的,C最重要的特點就是它用數據結構加演演算法來解釋系統底層開發的手段,用C開發絕對離不開對系統原理和數據結構的理解,而這些原理,包括C本身的實現,都是基於數據結構跟演演算法來解決問題的[明白這點很重要,因為有人希望學習C語言作Web編程,這就有點南轅北轍了,而且這個認識可以端正你學C語言解決問題的方向,所以說大思想是重要的。
而腳本語言和虛擬機語言,可以基於更高層的開發邏輯和設計方式來解決問題實現編程,比如Python,Ruby,可以運用包括OO,DP在內的高層語言邏輯[關於Python語言特點的介紹請參照有關章節],程序員不必涉入數據結構這些與底層和解決大家都解決過的問題直接相關的東西,僅提倡在復用層面利用這些解決過的東西能編程就可以了抽象的語言,意味著它可以少幹些輪子重造方面的事情。比如腳本式開發,OO層面的復用,當然,任何事情都是不完美的,太抽象了,往往也就同時失去了C能控制底層的那些能力。
因此,C++,C這樣的語言必須要涉及到彙編原理裡面的東西,而DSL可以以任何高層的形式被體現,比如不需要編譯的UML圖都是,POWERPOINT代碼都是DSL,根本不需要編譯器這樣的圖靈完備裝備。

傳統VS腳本


系統語言因為拖著一個系統,其本質上並非專用的應用開發語言。而只是通用的系統開發語言,有它因為移殖和平台問題導致的一系列大問題[C++唯獨用template,Boost等方法實現了另外一種”python”]。而腳本語言並不需要對某個平台進行開發,從而需要考慮移殖和速率的問題。因為系統問題不是它的初衷和設施基礎,它直接面嚮應用編程(系統編程,系統邏輯不由這類語言直接實現的,它只是封裝並bind),由於整個地扔掉了系統這個大包袱,一切編程問題都是腳本語言內部的事情。而且,腳本語言本身很高級,往往提供大量庫(甚至DSL相關的庫),這就對熟悉了編程的人來說,顯得尤為簡單(復用做到了極致)。
抽象語言往往比不上系統語言對於計算機編程方面的功能強大[這也就是腳本語言比不上編譯語言這樣的語言對計算機編程方面的功能強大。道理很簡單,因為它太抽象了,所以在它抽象了的地方,它反而不能發揮這個層面的能力,我們將在稍後談談腳本語言。腳本語言是一種抽象語言]。因為抽象語言的虛擬機往往是高級機器,根本不像我們的硬體機器那麼底級,圖靈模型對應我們的硬體機器和架構,而虛擬機往往跟硬體架構差別過大,因此腳本語言和系統語言是為二個不同的機器設計他們乾的事。
換言之,系統語言面向系統上的應用,而腳本語言面向廣泛意義上的應用(可以當然bind系統語言開發的系統邏輯,這也往往是腳本語言的與現有代碼進行工作時通常使用的方法),這就是腳本語言之於系統編程語言的特點所在。它們之間的區別正是由它們各自的任務決定的,要分清高級系統語言C++和腳本應用語言之間的區別。

意義


腳本語言實際上著重腳本二字,而不是語言二字,因為腳本語言它的最主要的關注點就是為現有代碼準備一個偽碼系統(opcodesystemusedtousesometh),至於你是用圖靈完備的語言或是用其它設施完成,那不是為碼系統必然的性質。
腳本語言獨立平台,提供高階的設計手段,和大量的隨語言一起分佈的,作為語言標準的直面應用的庫。(而系統編程語言強調事事從最基本的類型做起,因為系統語言要求通用和提供可定製性,所以不能提供太高的設計手段,和可供復用的庫設施,所以系統語言本身就被設計成那種能很好重造輪子的語言)。
在這個意義上,腳本語言其實是一種整合系統(提供一致的類型且開發時動態的類型,黑盒化平台)與整合設計(提供OO或template這樣的高高階設計),整合問題(大量標準庫的出台直面各種問題)的語言。它將一切開發上的事,做到語言中,做到庫中,不提倡一步一步實現解決過了的問題。
所以,編程應是一種很有意思的事情,在腳本編程這個層面開始體現出來。因為這裡的復用程序最高(編程幾乎等於計算機應用能力)。庫和語言功能足夠豐富的語言,幾行代碼就可以勾勒出一個程序來,而且標準庫,它提倡事事規定以統一的方式來進行(標準化編程),比如pystdlib,jdk,不需要為諸多的tricks犯迷糊。