標籤:

現代編程語言需要具備什麼要素?

額,朋友吐槽說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 system

C#的namespace也算,。

數據抽象與過程抽象

abstract data type, ADT在很多應用(如parser)中確實能方便很多

first class function

pattern matching

list 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?

TAG:編程語言 | C |