文章目錄
- ◇順應大趨勢
- ◇瞭解新思維、新理念
- ◇能夠化繁為簡
上次的文章介紹了指令碼語言的優缺點,然後又拿Python和其它指令碼語言PK了一下。今天主要是忽悠一下動態語言,捎帶忽悠一下Python。如果你看完本貼,覺得動態語言不錯,那俺建議你從Python開始入手。
★動態語言掃盲
考慮到還有很多同學對動態語言瞭解不深入,有必要先來普及一下它的基本常識。已經瞭解的同學,請略過本節。
通俗地說:能夠在運行時修改自身程式結構的語言,就屬於動態語言。那怎樣才算是“運行時修改自身程式結構”捏?比如下面這幾個例子都 算:在運行時給某個類增加成員函數及成員變數;在運行時改變某個類的父類;在運行時建立出某個函數......
從這些例子,你應該對動態語言有一個初步的感覺了吧?畢竟傳統的靜態語言(比如C、C++、Java),是很難達到這些效果滴。
另外,有個誤區需要澄清一下。很多同學以為指令碼語言也就是動態語言。其實兩者是不等價滴——雖然兩者有很大的交集。比如C#在4.0之後,就可以算是動態語言了,但它不能算是指令碼語言;另外,有很多Shell指令碼語言(比如DOS & Windows下的bat),不能算是動態語言。
關於動態語言更深入的介紹,大伙兒可以看“這裡”。
★為啥要學習動態語言?
掃盲之後,就該來說一下,學習動態語言的動機了。搞明白動機,學起來才有幹勁嘛
◇順應大趨勢
假如你經常關注TIOBE的排名,那你應該能察覺出來,動態語言近兩年的發展勢頭比較迅猛(在Top10裡面,至少佔了半壁江山)。這能從某個側面反映出動態語言的影響力在擴大。
假使你不相信TIOBE的排名,俺再舉一個例子。兩大開發陣營(Java和dotNet)最近幾年也加大了對動態語言的支援力度。比如,dotNet的CLR加入了對IronPython和IronRuby的支援;Sun當然也不甘示弱,JVM也開始支援Groovy,JRuby等語言。
俺費了這許多口水,列位看官應該明白動態語言是大勢所趨吧。在這動態語言大行其道的日子裡,你如果連一門動態語言都沒搞懂,那出門都不好意思跟人打招呼。
不過,話又說回來,靜態語言也是不會消亡滴。畢竟,靜態語言有自己的優勢(比如嚴謹、效能)。長期來說,必定是動態語言和靜態語言並存。各自彌補對方的缺點。
◇瞭解新思維、新理念
學習一門動態語言還有一個好處:。有很多時候,多學習一門語言,並不一定是為了在工作中用它,而是為了學習新的思維方式、體會新的理念。比如俺就曾經花時間去看Prolog,但是俺在工作中,從來不需要用到它。(以後有空的話,俺會介紹一下這玩意兒)
由於動態語言可以在運行時修改自身結構,因此就會產生很多靜態語言所沒有編程範式和手法(比如eval、Mixin,後面會順帶介紹這兩個玩意兒)。如果你以前只使用靜態語言,那你在學習了動態語言之後,多半會從它身上領略到很多新的思想和理念。
◇能夠化繁為簡
可能有些同學覺得,前面說的都有些務虛,那咱再來說點具體實在的。大牛Edsger Dijkstra(圖靈獎得主)曾經說過:“編程的藝術就是處理複雜性的藝術。”咱們來看看,動態語言是如何處理複雜問題滴。
假設要你實現一個函數,用來完成兩個數的某種運算,具體的運算類型作為函數的參數傳入,然後該函數返回運算結果。比如:
Foo("+", 2, 4) 返回 6
Foo("*", 2, 2) 返回 4
對於上述需求,你會如何?捏?
請先暗自盤算1分鐘,然後再往下看。
......
Thinking
......
如果你用靜態語言(比如C、C++、Java)來實現,你可能會在函數內使用一個switch,根據不同的運算子,進行計算,然後返回計算結果。
對於某些比較OO的語言(例如C++、Java),你或許還會抽象出一個運算的介面類(純虛類),然後分別派生出若干個不同的計算類(比如加法類、乘法類),看起來似乎比switch要優雅一些。
當然,用靜態語言還有其它一些玩法,但是代碼量都不會少。具體詳情可以看很早以前的一個老故事:4個程式員的一天。(其實俺這個例子的靈感就是從那個老故事剽竊滴)
現在,咱們來看看Python是如何?該需求滴。用Python只需要兩行代碼即可。請看:
def Foo(op, n1, n2) : return eval( "%d %s %d" % (n1, op, n2) )
不懂Python的同學可能要問了,這兩行代碼是啥子意思呀?
其實,第一行代碼只不過是定義了一個函數頭,第2行代碼才是精華。這裡面利用了動態語言常見的eval手法(具體參見“這裡”)。在python裡面,內建的eval函數可以把某個字串當成一個運算式,並對其求值。而語句
"%d %s %d" % (n1, op, n2) 只不過格式化出一個運算式的字串。
順便再插一句,Python還有一個exec的內建函數,可以把一段Python原始碼作為字串參數傳遞給它,讓該函數去執行。兩個函數結合起來,就能玩出很多花樣。具體的花樣可以參見“這裡”
★為什麼是Python?
說了動態語言的種種好話,有同學會問了,動態語言有很多種,為啥非要學習Python捏?
首先,俺在本系列的上一個文章,已經對比過Python和另外幾種指令碼語言。那幾種指令碼語言正好也是知名的動態語言。Python相對於他們的優勢,此處就不再重複囉嗦了。
其次,單就文法本身而言,Python的文法對動態性的支援是很優雅、很簡潔滴。通過剛才那個eval小例子,大夥應該已經看出來了。為了更形象一點,咱拿前面提到的Mixin來Show一下Python的文法是如何的簡潔。
通俗地說,Mixin手法需要在運行時給某個類增加基類(也就是父類)。對於Python而言,每一個類都有一個內建屬性“__bases__”,裡麵包含這個類當前的所有基類。假如要在運行時增加基類,操作“__bases__”這個屬性即可。
比如有一個類A和類B。如果要在運行時把B加為A的父類,可以用如下語句:
A.__bases__ += (B, )
是不是也很簡潔,而且可讀性也不差?相比而言,有些動態語言(比如JavaScript),要實作類別似的效果,代碼就相對複雜了。
由於Mixin不是今天的重點,就不再深入展開了。
最後,來個總結髮言:如果你之前沒有接觸過動態語言,建議去學習一下;如果你已經打定主意要學,Python是比較好的候選者。
好了,今天就聊到這裡。下一個文章,咱們來講講Python作為一個純粹的物件導向語言,有些啥特色。
回到本系列的目錄
著作權聲明
本部落格所有的原創文章,作者皆保留著作權。轉載必須包含本聲明,保持本文完整,並以超連結形式註明作者編程隨想和本文原始地址:
http://program-think.blogspot.com/2009/08/why-choose-python-2-dynamic.html