標籤:

哪種編程語言的語法最漂亮?

一直關注編程語言的簡潔漂亮,簡潔沒等到,看到 Haskell 的介紹:

Haskell 是世界上公認的語法最優美最簡潔的一種語言。

這句話是否足夠有道理?如果不是,你認為最漂亮的語言是哪一門?


我敢打賭這份名單上不會出現perl……


Lisp

Clojure

Java

C

Perl

Python

C++


我以為會有人說Brainfuck...


++++++++++[&>+++++++&>++++++++++&>+++&>+&<&<&<&<-] &>++.&>+.+++++++..+++.&>++.&<&<+++++++++++++++. &>.+++.------.--------.&>+.&>.


Lisp幾乎沒有語法,因為Lisp最重要的特點是程序可以對自己的abstract syntax tree進行操作。要具有這個特性,程序的abstract syntax tree必須暴露給程序員。這就是為什麼Lisp對自己的S-expression(相當於abstract syntax tree)不提供任何語法包裝。Lisp和Scheme程序員經常呼籲「always use s-expression, never do syntax」,這個呼籲只對Lisp這種支持對自身abstract syntax tree進行操作的語言有意義,對其它語言並沒有借鑒價值。

Standard ML是我見過的對語法設計最深思熟慮並且非常簡潔的語言。它的語法和OCaml相似(後者其實是源自前者), 兩者的比較可以參見:Comparing Objective Caml and Standard ML


當然是Ruby了。


感覺Scala還行,有case類和模式匹配,寫解釋器比較方便;同時又支持OOP,不像Haskell那樣寫賦值語句都困難。不過基於JVM的,速度有點慢,當然也可能是我的機器該換代了……


lisp吧。python沒有辦法像lisp一樣優雅的處理代碼。

Lisp最最最優美的特性是什麼?弱類型?FP?GC?互動式REPL?NO!

Lisp最重要的特性便是「代碼即數據」。

代碼可以生成代碼,編譯時和運行時並沒有絕對的區分,這才是Lisp的殺手鐧。

作為歷史上第二個高級語言,Lisp的特性被後來的很多語言所借鑒。

Java和Python學藝不精,前者只學得GC,後者雖多了一個REPL,但依舊不得其要領。

Ruby甚好,所說也是基於C系的語法,但是已經深得Lisp要領了。

Ruby的metaprogramming能力之強大,直接催生了RoR的誕生,風靡全球。

那麼回到Lisp,曾經有過這麼一個故事:

在 ILC 2002 大會上前Lisp大神,當今的Python倡導者Peter Norvig,由於某些原因,做一個類似於馬丁路德在梵蒂岡宣揚新教的主題演講,因為他在演講中大膽地聲稱Python就是一種Lisp。

講完後進入提問環節,出乎我意料的是,Peter點了我過道另一側,靠上面幾排座位的一個老頭,他衣著皺褶,在演講剛開始的時候踱步進來,然後就靠在了那個座位上面。

這老頭滿頭凌亂的白髮,邋遢的白鬍須,像是從旅行團中落下的遊客,已經完全迷路了,閑逛到這裡來歇歇腳,隨便看看我們都在這裡幹什麼。我的第一個念頭是,他會因為我們的奇怪的話題感到相當失望;接著,我意識到這位老頭的年紀,想到斯坦福就在附近,而且我想那人也在斯坦福 —— 難道他是……

「嗨,John,有什麼問題?」 Peter說。

雖然這只是10個字左右的問題,我不會假裝自己記住了Lisp之父約翰麥卡錫說的每一個字。他在問Python程序能不能像處理數據一樣,優雅地處理Python代碼。

「不行。John, Python做不到。」 Peter就回答了這一句,然後靜靜地等待,準備接受教授的質疑,但老人沒有再說什麼了。此時,無語已勝千言。

(轉載自:http://article.yeeyan.org/view/legendsland/209584)


  • 學術派最喜歡的是 Lisp:簡單、同像性和正交性
  • 用家最喜歡的是 Python:直觀、符合直覺


經常被貶的語法糖,在JavaScript的襯托下,在CoffeeScript身上顯得無比光亮。以 YCombinator 為例:

Javascript:

var yc =
function(gen) {
return (function(magic) {
return magic(magic);
})(
function(magic) {
return gen(function(n){ return magic(magic)(n) } );
}
);
}

CoffeeScript (不要寫下面這種令數學家欣喜若狂,但即使加100行注釋都解釋不了的代碼):

yc = (x) -&>
((f) -&> f(f))( (f) -&>
x( (n) -&>
f(f)(n) ))

這個例子不夠說明問題,但 CoffeeScript 上面已經有了足夠多的 application 場景的例子。

從fp角度來看,Coffee的語法省略掉了很多「無用、繁瑣、妨礙表達fp」的關鍵字,比如 function, return. 和無聊的 ; 和 }。Coffee 是經過減肥、整容和脫得一絲不掛的 js,"CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way." Exactly.

誰能比一絲不掛更美 :)

順便說一句,一絲不掛的反義詞是 Java.


一門語言是不是好,當然不是看語法本身,而是看針對各種問題寫出來的程序的最終的形式的。所以最漂亮的語言,都是能夠在語言內部自帶DSL的。於是就只有下面幾個了

C++

Lisp

Haskell

Ruby

不過個人來講,還是Haskell寫出來的程序比較容易看懂,於是我推薦Haskell


  1. c,啟蒙,肯定會有情感
  2. c#,工作使用,沒有讓我覺得寫起來很彆扭,應該設計的還蠻漂亮的
  3. python,平時純粹寫寫玩玩,覺得縮進是一種美

都還不錯


QML,描述性編程語言。

import QtQuick 2.0

Rectagnel {
id: item
color: "red"
border.color: "black"
border.width: 10
width: 100
height: 100
MouseArea {
anchors.fill: parent
onClicked: {
item.color = "yellow";
}
}
}

C++ Qt 框架下的 DSL,專註於界面描述和交互。


lua 簡單明了


原答案:``當然是行雲流水一般的Lisp語言"",當時出於對CL的熱愛而寫上的答案。

新答案(更新於2012-12-10):我覺得語法最漂亮的是OCaml。(儘管我是OCaml菜鳥)首先我講講自己對語法的理解,根據從維基百科獲得的知識,語法其實就是指編程語言中對基本的詞法元素的組織方法,即能夠反應元素結構的一種東西,那麼就應該從組織方法和結構入手。編程語言的語法結構一般有這麼幾類:

  1. 原子類型的數據
  2. 變數聲明語句
  3. 函數調用語句
  4. 賦值語句
  5. 分支結構

原子類型指直接在語言中支持的數據類型。OCaml支持的類型包括數字(有限精度的整數和浮點數)、字元(用單引號括住)和字元串(用雙引號括住)、布爾類型(true和false)、單元(用()表示)、元組(用括弧包裹,用逗號分隔各元素)以及列表(用方括弧括住,用分號分隔各元素)等。

變數聲明語句單一,只有let這一種。所以只要是let表達式出現的地方,都可以一目了然地視為變數聲明語句。而且不僅是定義變數,定義函數同樣是用let,這一點和Scheme的define的感覺很像。它們的形式看起來分別是下面這樣的:

let的感覺是綁定而不是定義,就猶如是定義了一種模式。例如告訴編譯器,接下來遇到單個的詞法單元a的時候,就把它替換為1;遇到形如double x這樣的代碼時,就替換為x*2,頗有模式匹配的感覺。let語法的漂亮在於它的統一性:let加上模式匹配的寫法,完成對變數和函數的定義的語法,而且表意清楚,可以讀作let XXX be YYY這樣XD。

函數調用的形式就是把函數名寫在左邊,然後後面的元素就會全部成為這個函數的參數,接著就是函數調用。不需要使用括弧,除非有的參數是複合的子表達式需要先進行求值,才需要用括弧改變運算優先順序。可能有人會說,二元運算符如+、-、*和/沒辦法寫成函數調用形式。其實是可以的,和Haskell的方法一樣,加上括弧就可以了,例如:

函數調用語法同樣統一,加上currying特性可以輕鬆構造很多即興使用的函數;-P代碼量少,簡潔。

賦值語句:let進行的操作叫做綁定,而不能叫賦值。要進行過程式的賦值操作,OCaml中有引用類型,它們通過ref操作來產生,用!(感嘆號)來取其指向的值,用:=(冒號等號)來進行修改操作。對於數組和字元串中的元素的修改,則用&<-(小於號連字元)來進行。

分支控制結構,也就是if這樣的操作,其形式和大眾所認可的是一樣的,不過對於其consequence和alternative部分,分別需要寫上then和else罷了。而且如果用上模式匹配,那麼就可以像寫分段函數那樣書寫分支結構,代碼更清晰易懂。至於迭代,儘管可以用遞歸來實現,不過OCaml還是提供了for和while這樣的控制結構。模式匹配的語法優點同樣是表意清晰,因為並列而帶來的層次性同樣有視覺美感。

事實上我這裡列舉的OCaml的語法優點,很多也是Haskell的語法優點。不過Haskell的函數定義看起來和變數綁定差別比較大,所以我更喜歡OCaml的語法。以上。


沒人說Mathematica?人家也是一門很簡潔、優美、強大的語言啊。


我喜歡 ruby


家鄉話~


這是要挑起第一次程序猿大戰的節奏?


排個序的話我認為是J &> Lisp &> Self &> Factor


我修改之前的答案,之前是python/coffeescript,其實看來看去,一直吸引我的還是lisp的語法,中魔法似的甩不掉啊...


推薦閱讀:

你最喜歡、熟練的編程語言中最讓你不爽的是什麼東西?
Rust 語法很醜陋嗎?如果是,為什麼醜陋呢?為什麼設計成這樣呢?
最噁心的語言是 Objective-C么?
Objective-C 語法上有任何的優點嗎?
有哪些令人拍案叫絕的代碼/優化?

TAG:編程語言 |