关于语言定义的思考
??? 最近沉迷于定義腳本語言,在一些簡單實踐后,發現如何設計一門語言本身就十分有講究。錯誤的定義,往往會導致后期實現和應用腳本時,工作量的翻倍的增長。
??? 那么首先來分析一下c#,java,js在語言級別的基礎定義,和他們的區別吧。
語言的基礎類型對比
??? 先說說java,就個人而言我不喜歡這門語言,但是把它放在第一個,就可以清晰的看到語言是如何“進化”的。
??? Java的基礎類型是什么?所有引用類型的基礎類型Object,以及那些所謂的原生類型(int等),當然,還有接口類型,以及一個無法用Object解釋其某些行為的數組類型,和一個用于描述對象類型的Class類。
??? 這些就完整的定義出Java語言的基礎要素。關于annotation,枚舉,泛型之類的,都是Java的周邊組成,沒有這些,Java依然還是Java。
??? 看完Java,再看看c#。
??? c#號稱一切都是Object,這確實沒錯,Object是c#的重要基礎之一。為了讓Java中的那些所謂的原生類型看起來不那么特例獨行,c#耍了個小小的花招,提出了一個值類型的概念。定義值類型時,必須直接繼承自ValueType或者Enum這兩個類,變相的回到了繼承Object的路線(從本質上說,只有boxing form才走這條繼承路線,unboxing form下,完全是另一馬事)。
??? 另外,接口類型和數組類型,以及Type類型依然是c#中重要語言要素。
??? 不過,除了這些Java中有的要素外,c#提出了個新的要素Delegate,委托是什么,委托就是指代一個或多個方法,c#雖然沒能讓函數成為語言的第一類成員(First class function,不知道這個該怎么說),但是通過Delegate至少讓函數成為了第1.5類成員吧。這導致的直接結果是:在函數式編程領域,人們至少能用c#寫出那些不怎么優雅的寫法(3.0引入了lambda和Linq則使寫法變得優雅了很多),而Java則完全沒有發言權。
??? 看了c#后,發現ms雖然統一了原生類型,但是新增加了不少的概念,使看起來簡化了的模型,用起來又感覺到復雜。
??? 然后,再看看古老的js,或者說ECMAScript。
??? 由于js是動態類型的,所以類的類型和接口類型就是相對不這么重要的東西了。
??? js的基礎類型(為了方便說明,暫且稱之為類型)也是Object,關于原生的數值,js提供了一個Number類型,處理方式與c#很類似,使原生的數值類型看起來并不是整個語言中孤立的一塊,而更像是Number類型支持字面量。
??? 而在函數方面,js做的比c#更好,使用了繼承Object的Function類型,非常好的做到了first class function。
??? 當然,js的數組也是js中比較特殊的一個類型。
語言的類型自描述
??? 這里說的語言的類型自描述,是指語言化了多少的代價,描述了自己用到的所有類型,包括那些需要特殊處理的類型。
??? Java擁有最混亂的語言自描述體系,基礎類型有Object,int等原生類型,接口類型;和繼承自Object的數組類型和Class類型。
??? c#用最多的概念來維護語言的自描述體系,基礎類型有Object,接口類型,值類型unboxing form(如果不關心如何實現的話,可以不知道它的存在);和繼承自Object的值類型boxing form,數組類型,Class類型和委托類型。
??? js用最少的概念就完成了這個任務,Object,和繼承自Object的Array和Function。
? ? 通過上述的比較,可以發現,js語言方面設計得非常出色。
? ? 為了更好的定義自己的語言,決定在未來的3個月內仔細的讀一下ECMA-262,吸取其中的核心思想。
轉載于:https://www.cnblogs.com/vwxyzh/archive/2011/02/19/1958506.html
總結
- 上一篇: iPhone/Mac Objective
- 下一篇: J-LINK7 固件修复