導航:首頁 > 源碼編譯 > lisp編譯器性能

lisp編譯器性能

發布時間:2022-05-03 11:59:39

A. lisp和ml哪個更適合寫編譯

如果是寫lisp的編譯器, 當然是lisp自舉更容易.
如果寫其他語言編譯器, 差距不會太大, 差不多.

B. 為什麼 Lisp 大多用於人工智慧領域

能你寫了一些AI程序後就會明白,很多(早期)AI演算法都是在一個樹形的狀態空間中搜索的,而Lisp的遞歸非常適合樹這樣的數據結構。順便說一下,支持遞歸的語言寫編譯器也是特別地順手

C. Lisp 值得去學習嗎

Lisp值得去學習。


LISP語言適用於符號處理、自動推理、硬體描述和超大規模集成電路設計等。


特點是,使用表結構來表達非數值計算問題,實現技術簡單。LISP語言已成為最有影響,使用十分廣泛的人工智慧語言。


在LISP語言中,數據和函數都是採用符號表達式定義的,這種符號表達式稱為S一表達式,它是原予和表的總稱。原子分為符號原子和數原子。


符號原子是指有限個大寫字母和數字組成的字元串,其中第一個符號必須是字母。原子NIL和T分別表示邏輯假(或空表)和邏輯真。數原子是指一串數字,通過符號表示其正負。



(3)lisp編譯器性能擴展閱讀:


Lisp語言剛出現的時候,它的思想與其他編程語言大相徑庭。後者的設計思想主要由50年代後期的硬體決定。隨著時間流逝,流行的編程語言不斷更新換代,語言設計思想逐漸向Lisp靠攏。


思想1到思想5已經被廣泛接受,思想6開始在主流編程語言中出現,思想7在Python語言中有所實現,不過似乎沒有專用的語法。


思想8可能是最有意思的一點。它與思想9隻是由於偶然原因,才成為Lisp語言的一部分,因為它們不屬於John
McCarthy的原始構想,是由他的學生Steve
Russell自行添加的。它們從此使得Lisp看上去很古怪,但也成為了這種語言最獨一無二的特點。


Lisp古怪的形式,倒不是因為它的語法很古怪,而
是因為它根本沒有語法,程序直接以解析樹的形式表達出來。在其他語言中,這種形式只是經過解析在後台產生,但是Lisp直接採用它作為表達形式。它由列表構成,而列表則是Lisp的基
本數據結構。

D. 為什麼Lisp語言如此先進

一、

如果我們把流行的編程語言,以這樣的順序排列:Java、Perl、Python、Ruby。你會發現,排在越後面的語言,越像Lisp。Python模仿Lisp,甚至把許多Lisp黑客認為屬於設計錯誤的功能,也一起模仿了。至於Ruby,如果回到1975年,你聲稱它是一種Lisp方言,沒有人會反對。編程語言現在的發展,不過剛剛趕上1958年Lisp語言的水平。

二、

1958年,John McCarthy設計了Lisp語言。我認為,當前最新潮的編程語言,只是實現了他在1958年的設想而已。

這怎麼可能呢?計算機技術的發展,不是日新月異嗎?1958年的技術,怎麼可能超過今天的水平呢?

讓我告訴你原因。

這是因為John McCarthy本來沒打算把Lisp設計成編程語言,至少不是我們現在意義上的編程語言。他的原意只是想做一種理論演算,用更簡潔的方式定義圖靈機。

所以,為什麼上個世紀50年代的編程語言,到現在還沒有過時?簡單說,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。你不 應該把Lisp語言與50年代的硬體聯系在一起,而是應該把它與快速排序(Quicksort)演算法進行類比。這種演算法是1960年提出的,至今仍然是最 快的通用排序方法。

三、

Fortran語言也是上個世紀50年代出現的,並且一直使用至今。它代表了語言設計的一種完全不同的方向。Lisp是無意中從純理論發展 為編程語言,而Fortran從一開始就是作為編程語言設計出來的。但是,今天我們把Lisp看成高級語言,而把Fortran看成一種相當低層次的語 言。

1956年,Fortran剛誕生的時候,叫做Fortran I,與今天的Fortran語言差別極大。Fortran I實際上是匯編語言加上數學,在某些方面,還不如今天的匯編語言強大。比如,它不支持子程序,只有分支跳轉結構(branch)。

Lisp和Fortran代表了編程語言發展的兩大方向。前者的基礎是數學,後者的基礎是硬體架構。從那時起,這兩大方向一直在互相靠攏。 Lisp剛設計出來的時候,就很強大,接下來的二十年,它提高了自己的運行速度。而那些所謂的主流語言,把更快的運行速度作為設計的出發點,然後再用超過 四十年的時間,一步步變得更強大。

直到今天,最高級的主流語言,也只是剛剛接近Lisp的水平。雖然已經很接近了,但還是沒有Lisp那樣強大。

四、

Lisp語言誕生的時候,就包含了9種新思想。其中一些我們今天已經習以為常,另一些則剛剛在其他高級語言中出現,至今還有2種是Lisp獨有的。按照被大眾接受的程度,這9種思想依次是:

1. 條件結構(即"if-then-else"結構)。現在大家都覺得這是理所當然的,但是Fortran I就沒有這個結構,它只有基於底層機器指令的goto結構。

2. 函數也是一種數據類型。在Lisp語言中,函數與整數或字元串一樣,也屬於數據類型的一種。它有自己的字面表示形式(literal representation),能夠儲存在變數中,也能當作參數傳遞。一種數據類型應該有的功能,它都有。

3. 遞歸。Lisp是第一種支持遞歸函數的高級語言。

4. 變數的動態類型。在Lisp語言中,所有變數實際上都是指針,所指向的值有類型之分,而變數本身沒有。復制變數就相當於復制指針,而不是復制它們指向的數據。

5. 垃圾回收機制。

6. 程序由表達式(expression)組成。Lisp程序是一些表達式區塊的集合,每個表達式都返回一個值。這與Fortran和大多數後來的語言都截然不同,它們的程序由表達式和語句(statement)組成。

區分表達式和語句,在Fortran I中是很自然的,因為它不支持語句嵌套。所以,如果你需要用數學式子計算一個值,那就只有用表達式返回這個值,沒有其他語法結構可用,因為否則就無法處理這個值。

後來,新的編程語言支持區塊結構(block),這種限制當然也就不存在了。但是為時已晚,表達式和語句的區分已經根深蒂固。它從Fortran擴散到Algol語言,接著又擴散到它們兩者的後繼語言。

7. 符號(symbol)類型。符號實際上是一種指針,指向儲存在哈希表中的字元串。所以,比較兩個符號是否相等,只要看它們的指針是否一樣就行了,不用逐個字元地比較。

8. 代碼使用符號和常量組成的樹形表示法(notation)。

9. 無論什麼時候,整個語言都是可用的。Lisp並不真正區分讀取期、編譯期和運行期。你可以在讀取期編譯或運行代碼;也可以在編譯期讀取或運行代碼;還可以在運行期讀取或者編譯代碼。

在讀取期運行代碼,使得用戶可以重新調整(reprogram)Lisp的語法;在編譯期運行代碼,則是Lisp宏的工作基礎;在運行期編 譯代碼,使得Lisp可以在Emacs這樣的程序中,充當擴展語言(extension language);在運行期讀取代碼,使得程序之間可以用S-表達式(S-expression)通信,近來XML格式的出現使得這個概念被重新"發 明"出來了。

五、

Lisp語言剛出現的時候,它的思想與其他編程語言大相徑庭。後者的設計思想主要由50年代後期的硬體決定。隨著時間流逝,流行的編程語言不斷更新換代,語言設計思想逐漸向Lisp靠攏。

思想1到思想5已經被廣泛接受,思想6開始在主流編程語言中出現,思想7在Python語言中有所實現,不過似乎沒有專用的語法。

思想8可能是最有意思的一點。它與思想9隻是由於偶然原因,才成為Lisp語言的一部分,因為它們不屬於John McCarthy的原始構想,是由他的學生Steve Russell自行添加的。它們從此使得Lisp看上去很古怪,但也成為了這種語言最獨一無二的特點。Lisp古怪的形式,倒不是因為它的語法很古怪,而 是因為它根本沒有語法,程序直接以解析樹(parse tree)的形式表達出來。在其他語言中,這種形式只是經過解析在後台產生,但是Lisp直接採用它作為表達形式。它由列表構成,而列表則是Lisp的基 本數據結構。

用一門語言自己的數據結構來表達該語言,這被證明是非常強大的功能。思想8和思想9,意味著你可以寫出一種能夠自己編程的程序。這可能聽起來很怪異,但是對於Lisp語言卻是再普通不過。最常用的做法就是使用宏。

術語"宏"在Lisp語言中,與其他語言中的意思不一樣。Lisp宏無所不包,它既可能是某樣表達式的縮略形式,也可能是一種新語言的編譯器。如果你想真正地理解Lisp語言,或者想拓寬你的編程視野,那麼你必須學習宏。

就我所知,宏(採用Lisp語言的定義)目前仍然是Lisp獨有的。一個原因是為了使用宏,你大概不得不讓你的語言看上去像Lisp一樣古 怪。另一個可能的原因是,如果你想為自己的語言添上這種終極武器,你從此就不能聲稱自己發明了新語言,只能說發明了一種Lisp的新方言。

我把這件事當作笑話說出來,但是事實就是如此。如果你創造了一種新語言,其中有car、cdr、cons、quote、cond、 atom、eq這樣的功能,還有一種把函數寫成列表的表示方法,那麼在它們的基礎上,你完全可以推導出Lisp語言的所有其他部分。事實上,Lisp語言 就是這樣定義的,John McCarthy把語言設計成這個樣子,就是為了讓這種推導成為可能。

六、

就算Lisp確實代表了目前主流編程語言不斷靠近的一個方向,這是否意味著你就應該用它編程呢?

如果使用一種不那麼強大的語言,你又會有多少損失呢?有時不採用最尖端的技術,不也是一種明智的選擇嗎?這么多人使用主流編程語言,這本身不也說明那些語言有可取之處嗎?

另一方面,選擇哪一種編程語言,許多項目是無所謂的,反正不同的語言都能完成工作。一般來說,條件越苛刻的項目,強大的編程語言就越能發揮 作用。但是,無數的項目根本沒有苛刻條件的限制。大多數的編程任務,可能只要寫一些很小的程序,然後用膠水語言把這些小程序連起來就行了。你可以用自己熟 悉的編程語言,或者用對於特定項目來說有著最強大函數庫的語言,來寫這些小程序。如果你只是需要在Windows應用程序之間傳遞數據,使用Visual Basic照樣能達到目的。

那麼,Lisp的編程優勢體現在哪裡呢?

七、

語言的編程能力越強大,寫出來的程序就越短(當然不是指字元數量,而是指獨立的語法單位)。

代碼的數量很重要,因為開發一個程序耗費的時間,主要取決於程序的長度。如果同一個軟體,一種語言寫出來的代碼比另一種語言長三倍,這意味 著你開發它耗費的時間也會多三倍。而且即使你多雇傭人手,也無助於減少開發時間,因為當團隊規模超過某個門檻時,再增加人手只會帶來凈損失。Fred Brooks在他的名著《人月神話》(The Mythical Man-Month)中,描述了這種現象,我的所見所聞印證了他的說法。

如果使用Lisp語言,能讓程序變得多短?以Lisp和C的比較為例,我聽到的大多數說法是C代碼的長度是Lisp的7倍到10倍。但是最 近,New Architect雜志上有一篇介紹ITA軟體公司的文章,裡面說"一行Lisp代碼相當於20行C代碼",因為此文都是引用ITA總裁的話,所以我想這 個數字來自ITA的編程實踐。 如果真是這樣,那麼我們可以相信這句話。ITA的軟體,不僅使用Lisp語言,還同時大量使用C和C++,所以這是他們的經驗談。

根據上面的這個數字,如果你與ITA競爭,而且你使用C語言開發軟體,那麼ITA的開發速度將比你快20倍。如果你需要一年時間實現某個功能,它只需要不到三星期。反過來說,如果某個新功能,它開發了三個月,那麼你需要五年才能做出來。

你知道嗎?上面的對比,還只是考慮到最好的情況。當我們只比較代碼數量的時候,言下之意就是假設使用功能較弱的語言,也能開發出同樣的軟 件。但是事實上,程序員使用某種語言能做到的事情,是有極限的。如果你想用一種低層次的語言,解決一個很難的問題,那麼你將會面臨各種情況極其復雜、乃至 想不清楚的窘境。

所以,當我說假定你與ITA競爭,你用五年時間做出的東西,ITA在Lisp語言的幫助下只用三個月就完成了,我指的五年還是一切順利、沒有犯錯誤、也沒有遇到太大麻煩的五年。事實上,按照大多數公司的實際情況,計劃中五年完成的項目,很可能永遠都不會完成。

我承認,上面的例子太極端。ITA似乎有一批非常聰明的黑客,而C語言又是一種很低層次的語言。但是,在一個高度競爭的市場中,即使開發速度只相差兩三倍,也足以使得你永遠處在落後的位置。

E. lisp 可以做什麼

樓上都沒說出lisp的特點和本質,總的來說,lisp有兩個特徵:函數式編程和面向語言

  1. 函數式編程決定了它與數學有天然的契合度,因此可以利用它來表達數學思想、推演符號類型

  2. 面向語言說明lisp是一門可以生成代碼的語言。lisp對待數據和代碼均採用同一種數據結構表示,因此lisp可以優雅的處理自身的代碼。解決問題的時候,你完全可以利用lisp自己設計一門適合問題領域的語言,然後再處理


其實lisp有很多方言:

  1. Elisp:配置神器Emacs

  2. Scheme:最純的lisp,實用的庫很少,一般人只是在學習SICP的時候接觸過,應用方面當然也有, 如作為texmacs的配置語言,還有Gimp的開發。如果利用這門語言學習編譯器的設計將會是一個不錯的選擇

  3. comman lisp:lisp的集大成者,有很多庫可用,可以用來做web開發、人工智慧應用、系統應用程序(如郵件過濾器、mp3、html生成器等等)、類型符號推演

  4. clojure:做網站開發,運行在JVM上,有JAVA基礎比較好入手

  5. AutoLisp:與autocad結合用在繪圖領域

F. Lisp語言怎麼樣為什麼現在不流行與Java相比呢

很久以前,這種語言站在計算機科學研究的前沿,特別是人工智慧的研究方面。現在,它很少被用到,這一切並不是因為古老,類似古老的語言卻被廣泛應用。 其他類似的古老的語言有??FORTRAN、 COBOL、 LISP、 BASIC、 和ALGOL 家族,這些語言的唯一不同之處在於,他們為誰設計。FORTRAN是為科學家和工程師設計的,他們在計算機上編程的目的是是為了解決問題。COBOL是為了商業設計的,最好的體現在於讓商人們可以利用電腦時代。LISP是了計算機科學研究設計的,最突出的體現在計算機基本原理研究.。BASIC是為初學者設計的。最後,ALGOL語言是有計算機程序員修改,演變成其他流行的語言,如C,Pascal和Java的一個龐大的家族。上面提到的某些語言已經不像當初那麼流行了。我們在這里可以把它們稱作「失敗」。問題是它們為什麼失敗?第一站出來的是COBOL. 很不幸,它以面向商業人員的很好的可讀性就是它的失敗點。商業人員發現,他們可以僱傭程序員去管理他們的系統。程序員自然會偏向於為他們設計的語言,而不是他們的老闆。所以隨著時間推移,越來越多的商業功能都使用例如VB, C, C++ 和JAVA實現了。現在,只有很少一部分軟體仍通過COBOL語言編寫。BASIC卻有不同的命運。他是為入門人員設計的。那些在微機上學習編程,他們會使用內置的BASIC語言作為起點。隨著時間推移,微機被運行微軟操作系統的個人電腦,或者MacOS的蘋果電腦所代替。這種語言逐漸被VB所取代。雖然他是面向初級程序員,它有一段時間代替了COBOL。為什麼要耗費這么多的資源在昂貴的編譯器上,而便宜的解釋器在我們的電腦上已經存在?最近,微軟以遷移到.NET框架上,讓VB跟在後面。它的替代者, C#就是ALGOL家族中的一員,跟Java相近。這些年FORTRAN的使用起起伏伏。在某一階段,差不多所有科學方面的代碼是用它來寫的。它的優點是這門語言中沒有指針,並且不允許存在遞歸。這意味著所有數據的引用位置都可以在編譯時確定。FORTRAN編譯器利用這些額外的信息使程序運行格外地迅速。不幸的是,隨著時間的推移,固定大小的數組這種數據結構變得過時了。現在,科學要處理任意形狀的風格,甚至表述更為復雜的真實世界。這需要在語言中額外地加入指針。這些情況發生的時間段里,FORTRAN逐漸走向沒落。現在,它被轉移到高性能計算工作,其中新的並行矩陣和矢量運算最近添加到這門語言中,仍然使它擁有性能優勢。ALGOL語言家族取得了成功。其原因是,這些語言是由程序員為程序員寫的。隨著時間的推移,這些與系統和應用相關的語言成為了現在最常用的語言。它的優點是越多地程序員使用,這門語言就能得到更多地改進,並且越來越多地程序是用它們來寫就的。這提供了一個良性循環,更多的程序員們又被聘請在己編寫的程序上工作。這是一個網路效應的例子。一個系統的「價值」是它的用戶數目的平方,在於以此速率增長的用戶之間的交互作用。那麼為什麼Lisp語言家族會站在失敗者一邊呢?有些人認為是語法的錯。Lisp因為它的括弧而臭名昭著。我並不認為是這個理由。許多用戶說良好的格式可以讓他們跟上這些括弧。同時,Lisp語言被發明不久後,有一個叫「super-bracket」的語法可以讓人快速表示出任意數量的回括弧」)」。這個特性在今天已經很少有人使用了。最後,優秀的編輯器解決了大多數的語法問題。另一些人經常抱怨Lisp是一門函數式語言。

G. Lisp 能被用來干什麼

Lisp沒有任何神奇之處,它的核心就是一個以s-expression格式為輸入的eval而已。Nothing more, nothing less
Lisp的macro功能更加不是什麼「神奇」的東西。任何解釋性語言的eval都接受動態數據,構造過程用戶可以自由發揮;用戶如果不喜歡語言內置的構造方式,自己可以寫一個,只要eval認就行。甚至C、C++、Java、C#這些編譯型的語言,只要能驅動編譯器,用戶一樣可以自己寫一個「macro」出來(或者叫做generate code on-the-fly)

Lisp由於缺乏用來區分語義的語法變化,導致最後的代碼雖然可以很「緊湊」(緊湊也不代表演算法復雜度更優),但是可讀性和提示性不夠高。《Coders at Work》裡面的使用Lisp的先驅也說了因為這個原因後來不寫Lisp了

但是Lisp是很好的思維訓練的載體,以λ演算而不是圖靈機作為計算模型對於初學者是一種思維上的飛躍,有很高的學習價值

H. lisp有什麼比較好用的編譯器么

如果你是學的是common lisp的話:可以使用 lisp in a box。
lisp in a box 是一個在emacs的基礎上擴展的ide
如果你是學的是autolisp的話:可以使用 cad裡面自帶的vlisp開發環境。
在cad的命令行輸入vlisp或者vide後回車即可進入。
如果你是學的是elisp的話:可以 直接使用emacs。
如果你是學的是scheme的話:可以 直接使用ChezScheme
如果你想自己動手做一個的話可以參考sicp後幾章或者看看王垠的如何寫解釋器那篇文章

I. LISP有多牛逼

LISP(全名LISt Processor,即列表處理語言),由 約 翰·麥 卡 錫在1960年左右創造的一種基於λ演算的函數式編程語言。

LISP有很多種方言,各個實現中的語言不完全一樣。1980年代Guy L. Steele編寫了Common Lisp試圖進行標准化,這個標准被大多數解釋器和編譯器所接受。在Unix/Linux系統中,還有一種和Emacs一起的Emacs Lisp(而Emacs正是用Lisp作為擴展語言進行功能擴展的)非常流行,並建立了自己的標准。

LISP語言的主要現代版本包括Common Lisp和Scheme。

閱讀全文

與lisp編譯器性能相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:577
python員工信息登記表 瀏覽:375
高中美術pdf 瀏覽:158
java實現排列 瀏覽:511
javavector的用法 瀏覽:980
osi實現加密的三層 瀏覽:230
大眾寶來原廠中控如何安裝app 瀏覽:912
linux內核根文件系統 瀏覽:241
3d的命令面板不見了 瀏覽:524
武漢理工大學伺服器ip地址 瀏覽:147
亞馬遜雲伺服器登錄 瀏覽:523
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:249
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348