現代編程語言需要具備什麼要素?
額,朋友吐槽說C++是個古老的語言,很多理念太落後,想過來問問一個現代編程語言究竟應該長什麼樣子。
後現代的編程語言,一般都不用寫測試,直接寫證明。
現代的編程語言之所以現代,就是因為編譯技術比以前牛逼,很多以前人肉做的事情現在不需要人肉作業可以做的一樣好(那些不能做的一樣好的,那算超前的)。
舉個例子,大概有
最最基本的,缺少了就不現代的有:GC,lambda表達式。
Computation Expression,這是F#的概念,Lisp的宏也差不多,C#的yield/await是這個要素的特例,但是因為yield/await不通用,所以await編譯出來的結果要比通用的結構高效很多。
Concept Mapping和相關的類型推導,僅對強類型語言說的。
Pattern Matching,這個就不用我解釋了,函數式語言來都很喜歡。
Multiple Dispatching,這算是Pattern Matching的一種,基本沒什麼語言支持。如果帶OO的語言支持這個,那幾乎所有設計模式都可以扔掉了。
讓人少關心細節。@vczh 說的都是。@邵成 提及的形式證明也是讓人不用再關心「我的程序是否正確」——編譯器會幫你證明正確性。
一個足夠現代的語言的語言做到下面這些就夠了:
- GADT + 自動類型推導
- 匿名函數 / Lambda Expression
- 遞歸 + TCO
剩下的完全可以通過造輪子來實現。
這樣看起來其實C++很modern的嘛。目標:高效運行、高效編碼、結果正確
對多態的支持:
ad-hoc polymorphism,比如函數重載,C語言就不支持,。(當然可用函數指針模擬)parametric polymorphism(generic),如Java的泛型(逃。。inclusion polymorphism(subtyping)如C++基於虛函數的多態,不過它是late binding和single dispatch。Common Lisp的CLOS提供multiple dispatch,可以更自然(or強大?)對並行、並發的支持:
可以從event和thread之爭開始說(省略),。譬如Lua/Go的Coroutine, Erlang的Actor, Node.jS的Event。。
模塊化支持:
如SML/Ocaml的module systemC#的namespace也算,。數據抽象與過程抽象abstract data type, ADT在很多應用(如parser)中確實能方便很多 first class functionpattern matchinglist comprehension,scala的for comprehension算它的變種...現代編程語言除去之前大家說的語言上的要素, 我認為還應該要有以下幾個要素:
- 一個高效的編譯器,解譯器;
- 一個方便的 package manager, 或者 build system;
- 一個活躍的 community.
雖然 package manager 不是一個很複雜的東西,技術上並沒有多少進步, 他的最主要的功能就是讓大家的 project layout 變得一致(create a religion on how to build a package), 但是有了 package manager, 可以減輕很多程序員的負擔,使得使用開源代碼變得十分方便. Node.js這方面做得很好.可以預見以後成功的語言都會有 pm.
cache oblivious :cache oblivious 大法吼啊
multi-core oblivious :spawn-sync式並行
file oblivious :話說到底為啥需要文件。。。求大神打醒
type oblivious :給類型推導強行起個新名字。。。
serialization oblivious : 這不就是內存置換區么。。。吃了沒文化的虧。
XXX oblivious:
編程語言就是方便描述計算過程的。可以看作是機器的抽象,而且是最接近用戶的一層。
用起來爽固然好,但是抽象中損失太多機器的性能就得不償失了。所以確實需要「現代」 編程語言/Model 啊。
The main trade-off to keep in mind,though,is that a new model should both be a reasonable approximation to the actual hardware,as well as usable for both the developer of algorithms,and for programmer who implements the algorithm.
——http://www.cs.cornell.edu/courses/cs612/2005sp/papers/thesis.pdf
.....我覺得他應該把++這個東西去掉,C語言還差不多.=====================解釋============================C++有lambda表達式。C++有基於引用計數的GC,shared_ptr,weak_ptr你說shared循環引用?誰告訴你有GC了就可以無腦使用- -C++的內存控制一直都不是無腦new就可以的C++有RAII資源析構時自動清理,像C#什麼的還要實現介面和使用using.C++寫個析構函數就OK了.modern的C++確實是一個現代的編程語言.只要你不要沒事用C的那部分就OK了數組用vector, new用make_XXX,資源管理用智能指針+RAII非要把C++用成C那樣,回頭覺得這語言真落後啊....我讀書少你不要騙我 - -
簡單無歧義的語法
推薦閱讀:
※int 和 long int 的區別在哪裡?
※VR需要掌握什麼編程語言?
※有哪些比較好的關於編譯原理 ,操作系統的網路公開課?
※精通機器學習為什麼同時也必須精通一門編程語言?
※C++11 中為什麼是auto,而不是var?