2011-05-03 42 views
9

很多(可能都是?)程序設計語言包含彙編語言lisp如何在彙編語言中實現?

lisp如何在彙編語言中實現?

有什麼好的參考,手冊,教程,或關鍵字爲谷歌?

任何官方規則/慣例爲建立自己的lisp實施?

如尾遞歸應該遵循一些規則實施或東西..

感謝

+2

這是沒有任何意義 – Mehrdad 2011-05-03 06:31:25

回答

21

雖然其他的文章和評論是正確的,這個問題是過於空泛,也許有點混亂,我不禁分享一些建議。我收集了許多關於實現Lisp的鏈接和書籍,因爲我最近開發了一些對語言實現的迷戀。這當然是一個很深的話題,但是閱讀與Lisp相關的東西是非常有吸引力的,因爲如果你在Lisp中實現了Lisp編譯器或解釋器,並且只使用read,你可以跳過很多關於解析的強烈解讀。這使得作者能夠快速地瞭解彙編或解釋的內容。這些建議是我已閱讀或開始或正在閱讀的書籍,主要涉及Scheme,而不是Common Lisp,但仍可能有一些興趣。

如果你有在語言的實現沒有背景,和從未有過的閱讀經典Lisp和Scheme「metacircular評估」的快感,我會建議Structure and Interpretation of Computer Programs。如果你看過Lisp-in-Lisp(或Scheme-in-Scheme ...),你可以跳過。在SICP的最後兩章中,作者爲Lisp/Scheme和幾個變體以及字節碼編譯器和虛擬機提供了幾個不同的解釋器。這只是一本精彩的書,而且是免費的。

如果您沒有時間閱讀SICP,或者不想通過閱讀SICP來解讀和編輯章節,我會推薦The Little Schemer。雖然它很短,適合Lisp和Scheme的新手,但如果你從來沒有見過用Lisp編寫的Lisp解釋器,他們只提供一個,這是一本相當令人愉快的書,但由於可愛的風格,可能不適合所有人。

還有另外一本關於Scheme類似於SICP的免費書籍,名爲An Introduction to Scheme and its Implementation,我沒有閱讀但是隻是作爲參考。那裏有解釋者和編譯器的章節,它似乎比SICP更深一點,處理像解析一樣的更有趣的事情。它可能需要一個編輯,但它仍然是一個令人印象深刻的產品。

在Lisp中如何做Lisp的一個體面的想法,你可以在更低層次上實現Lisp。

Lisp in Small Pieces經常被推薦。我已經閱讀了大部分內容,可以說它絕對是一本很棒的書,充滿了堅韌的東西。我用一把好梳子回過頭來看,因爲當你不懂東西的時候很容易剔除。我也努力從作者的網站獲取代碼來運行;如果你得到它,我推薦使用Gambit Scheme並運行Meroonet和Meroon的代碼,從this分發。 Small Pieces中的Lisp提供了一些用Scheme編寫的解釋器,以及一個字節碼編譯器和一個編譯器對C語言。

Lisp in Small Pieces移動得很快,而且非常密集。如果對您來說太多了,也許從The Essentials of Programming Languages開始。我已經閱讀了一些,它很好,但它更多的是口譯員。顯然,其中一個較舊的版本(第一?我不確定...)包含一個編譯器。這三個版本之間似乎有很多變化,但第一個在亞馬遜上是非常便宜的,所以請檢查一下。

至於彙編到C,這是一個有很多毛茸茸的主題。編譯到C帶來了所有這些奇怪的角落問題,例如如何優化尾部調用和處理閉包,一流的延續和垃圾收集,但這非常有趣,並且Scheme的很多「真正」實現都走這條路線。 Marc Feeley在這方面的介紹非常有趣,標題爲The 90 Minute Scheme to C compiler

我在彙編時一直編譯的資源較少,但有一個經常推薦的論文,介紹了編譯爲x86的方案,稱爲An Incremental Approach to Compiler Construction.它假定讀者很少,但是我發現它太快了並沒有填寫足夠的細節。也許你會有更好的運氣。

很多上述建議都來自一年多以前的黑客新聞怪誕評論,從mahmud。它引用了許多ML資源,並使用延續進行編譯。在我的研究中,我還沒有那麼遠,所以我不能說什麼是好或不好。但這是一個令人難以置信的寶貴意見。參考文獻包括Andrew Appel的「編譯連續」和Paul Wilson的「單處理器垃圾收集技術」論文。

祝你好運!

+2

也看到計劃9從空白處:http://www.lulu.com/product/paperback/scheme-9-from-empty-space/13002199 – 2011-05-03 15:14:17

+0

由彼得·諾維格書PAIP(範式AI編程)含有方案編譯器在Common Lisp中。 – 2011-05-03 15:15:02

+0

是的,我想過包括PAIP,但我還沒有讀完整個東西。編譯器發出了什麼? – spacemanaki 2011-05-03 15:18:03

-2

,這是一個大問題回答好。

簡短回答:JIT

大回答:Dragon book

+3

你確定這些資源是相關的Lisp的? – 2011-05-03 08:04:09

+0

lisp編譯器(不是解釋器)它是一個帶有jit支持的常規編譯器。沒有正規的編譯器知識就無法學習jit。 – 2011-05-03 08:32:06

+4

帶編譯器的大多數Lisp實現完全不使用JIT編譯。不,Lisp編譯器也不是Dragon書中描述的「常規」編譯器。 – 2011-05-03 10:18:54

2

你的問題是基於非常過時的假設。現在,幾乎沒有語言實現是用匯編語言編寫的,我知道沒有Lisp實現。除了自託管實現之外,C還是一種常見的實現語言。

如果要查看lisp函數的彙編語言表示形式,可以使用DISASSEMBLE function

7

我在過去曾想過這件事(然後轉而使用C內核代替)。當然,沒有單一的「集結號」,但對於86位/ 32位,這是我打算:

基本值存儲在64位節點與用作標籤含義如下三個最低位:

考慮指針時,如果所有的分配被假定爲8個字節(與合理的8個字節的單元尺寸)的倍數
000 -> cell (64 bits are basically two pointers: car/cdr) 
001 -> fixnum (64-3-1 bits usable for values) 
010 -> vector (32-3 bits for size and 32 bit for pointer to first element) 
011 -> symbol (32 bits pointing to values in global env, 32 pointing to name) 
100 -> native code (32 bits pointing to executable machine code, 32 bits to args) 
101 -> float (using 64-3-1 bit by dropping 4 bits from mantissa) 
110 -> string (using 32-3 bits for size and 32 bits pointing to bytes) 
111 -> struct (32 bits pointing to definition, 32 bits pointing to content) 

3位保持可用。實現一個簡單的垃圾收集器需要一個額外的位(「活着」位)。在C實現中,我最終根據節點類型在各個部分分配了該位(例如,如果這是一個指針,則爲高32位的最低有效位)。

我的想法是擁有兩種類型的存儲器:分配在頁面中的「節點存儲器」(具有上述佈局)並且與自由列表一起使用,並且「二進制存儲器」用於可變大小的字符串/代碼/陣列。

根據節點類型需要特定的代碼來實現touch函數,該函數遞歸地標記爲活動節點引用的活動節點。所有這些當然只是一個天真的方法,但我仍然在「C」中工作,我確信我也可以在彙編中完成這項工作(我的C代碼在全世界都使用了void *,所以基本上只是一個便攜式32位彙編器)。對於我的C實現中的懶惰,我只使用了32位浮點數和整數(使用更高的32位),而不是使用所有可用位。

6

看一看Clozure Common Lisp在實施口齒不清使用匯編語言的一個例子。 Clozure CL主要在Common Lisp本身中實現,但是有一個用C編寫的內核和一些彙編中的低級功能。

例如,這裏是從編譯器/ X86/x86的lapmacros.lisp實現在x86硬件原語功能CAR的宏,其中一個彙編指令分別爲32位和64位:

(defx86lapmacro %car (src dest) 
    (target-arch-case 
     (:x8632 
      `(movl (@ x8632::cons.car (% ,src)) (% ,dest))) 
     (:x8664 
      `(movq (@ x8664::cons.car (% ,src)) (% ,dest))))) 

作爲如圖所示,彙編代碼本身是以Lisp格式編碼的。移植到另一個平臺涉及(除其他外)將這些低級操作轉換爲另一種彙編語言並交叉編譯以在新平臺上創建運行時。

ECL (Embeddable Common Lisp)需要通過編譯成C.另一種方法這可以方便地將端口實施有一個C編譯器的平臺。