Factor語言
編程範型 | 多範式: 堆疊導向, 串接式, 函數式 |
---|---|
實作者 | Slava Pestov |
面市時間 | 2003年 |
目前版本 |
|
型態系統 | 強型別, 動態 |
作業系統 | Windows, macOS, Linux |
許可證 | BSD許可證 |
網站 | factorcode.org |
啟發語言 | |
Joy, Forth, Lisp, Self |
Factor是Slava Pestov建立的堆疊導向程式語言。Factor是動態型別的並擁有自動主記憶體管理,還有強力的元程式設計特徵。語言有一個單一的實現,特徵包括自宿主的最佳化編譯器和一個整合式開發環境。Factor發行包括一個大型的標準庫。
歷史
[編輯]Slava Pestov在2003年建立Factor作為電動遊戲的手稿語言[2]。最初的實現,現在稱為JFactor,是用Java實現的並執行在Java虛擬機器上。儘管在語法方面早期的語言表面上類似現代的Factor,現代的語言在實踐方面是非常不同的,並且當前實現更加快速。
概述
[編輯]Factor是動態型別的、函數式和物件導向的程式語言。代碼可以圍繞叫做單詞的小型過程來構造。在典型的代碼中,這些過程一般1–3行長,多於7行長的過程是非常少見的。在其他程式語言中習慣上表達為一個過程的某個東西,在Factor中可以寫為多個單詞[3]。
每個單詞接受固定數目的實際參數並有固定數目的返回值。給單詞的實際參數被傳遞到資料棧上,使用逆波蘭表示法。這個堆疊只用來組織到單詞的呼叫,並非用作資料結構。在Factor中以類似於Forth中堆疊的方式使用堆疊;因此它們都被當作是堆疊語言。例如,下面的代碼片段列印「hello world」到當前輸出流:
"hello world" print
print
是在io
詞彙表中的一個單詞,它從堆疊接受一個字串而不返回東西。它列印這個字串到當前輸出流(預設的是終端或圖形收聽器)[3]。
階乘函式,在Factor中可以用如下方式實現:
: factorial ( n -- n! ) dup 1 > [ [1,b] product ] [ drop 1 ] if
不是所有資料都必須只通過堆疊來傳遞。詞法作用域的局部變數,在過程內可用作臨時變數來儲存和訪問。動態作用域的變數被用於在過程呼叫之間傳遞東西而不使用堆疊。例如,當前輸入和輸出流被儲存在動態作用域的變數中[3]。
Factor強調靈活性和擴充語言的能力[3]。有宏系統,還有對Factor語法的任意擴充。Factor的語法經常被擴充來允許新類型的單詞定義和用於資料結構的新類型的文字。它還被用在XML庫中提供生成XML的文字語法。例如,下列單詞接受一個字串並產生一個XML文件對象,它是強調這個字串的一個HTML文件:
: make-html ( string -- xml )
dup
<XML
<html>
<head><title><-></title></head>
<body><h1><-></h1></body>
</html>
XML> ;
單詞dup
重複在堆疊上的頂部元素。<->
表示將來自堆疊的一個專案填入XML文件的指定部份。
實現和庫
[編輯]Factor包括一個大型的標準庫,完全用本語言寫成。包括有:
- 跨平台GUI工具箱,建造在OpenGL和各種窗口系統之上,用於開發環境[4]。
- 繫結到多個資料庫函式庫,包括PostgreSQL和SQLite[5]。
- 一個HTTP伺服器和客戶端,具有Furnace web框架[6]。
- 高效的同質的整數、浮點數和C結構的陣列[7]。
- 實現正規表示式的一個庫,生成機器碼來進行匹配[8]。
Factor內建了外界函式介面,允許同C、Objective-C和Fortran程式進行通訊。還支援執行用GLSL書寫的著色器並與之通訊[3][9]。
Factor是用Factor和C++實現的。它最初自舉於早期的Java實現。現在,解析器和最佳化編譯器都用本語言書寫。語言的特定的基礎部分是用C++實現的,比如垃圾回收器和特定原始操作(primitive)。
Factor使用基於映像的模型,類似於很多Smalltalk實現,這裡編譯的代碼和資料都儲存在映像之中[10]。要編譯一個程式,這個程式被裝載入一個映像並儲存這個映像。一個特殊工具輔助建立最小映像來執行一個特定程式的過程,包裝這個結果進入可以被部署為一個獨立應用的某個東西中[3][11]。
Factor編譯器實現了很多進階最佳化並被用於新最佳化技術研究中的目標[3][12]。
參照
[編輯]- ^ https://github.com/factor/factor/releases/tag/0.99.
- ^ Pestov, Slava. Slava Pestov's corner of the web. [2021-03-08]. (原始內容存檔於2021-02-25).
- ^ 3.0 3.1 3.2 3.3 3.4 3.5 3.6 Pestov, Sviatoslav; Ehrenberg, Daniel. Factor: a dynamic stack-based programming language. ACM SIGPLAN Notices (ACM). 2010, 45 (12): 43–58. doi:10.1145/1899661.1869637.
- ^ Pestov, Slava. Factor documentation: UI framework. [2021-03-08]. (原始內容存檔於2018-06-26).
- ^ Coleman, Doug. Factor documentation: Database library. [2021-03-08]. (原始內容存檔於2018-01-12).
- ^ Pestov, Slava. Factor documentation: HTTP server. [2021-03-08]. (原始內容存檔於2021-02-25).
- ^ Pestov, Slava. Factor documentation: Specialized arrays. [2021-03-08]. (原始內容存檔於2020-10-25).
- ^ Coleman, Doug; Ehrenberg, Daniel. Factor documentation: Regular expressions. [2021-03-08]. (原始內容存檔於2018-08-07).
- ^ Pestov, Slava. Overhauling Factor's C library interface. [2021-03-08]. (原始內容存檔於2020-11-09).
- ^ Pestov, Slava. Factor's bootstrap process explained. [2021-03-08]. (原始內容存檔於2021-04-28).
- ^ Pestov, Slava. On shaking trees. [2021-03-08]. (原始內容存檔於2020-11-09).
- ^ Ehrenberg, Daniel. Closure elimination as constant propagation (PDF). 2010. (原始內容 (PDF)存檔於2011-07-26).
外部連結
[編輯]- 官方網站
- Slava Pestov. Factor: An Extensible Interactive Language (Tech talk). Google. October 27, 2008 [2021-03-07]. (原始內容 (flv)存檔於2021-01-15).
- Zed Shaw. The ACL is Dead (CUSEC 2008). CUSEC. 2008 [2021-03-07]. (原始內容 (flv)存檔於2020-11-19). – a presentation written in Factor which mentions and praises Factor