Factor語言

(重新導向自Factor (编程语言)

Factor是Slava Pestov建立的堆疊導向程式語言。Factor是動態型別的並擁有自動記憶體管理,還有強力的元程式設計特徵。語言有一個單一的實現,特徵包括自宿主的最佳化編譯器和一個整合式開發環境。Factor發行包括一個大型的標準庫

Factor
編程範型多範式: 堆疊導向, 串接式, 函數式
實作者Slava Pestov
釋出時間2003年,​21年前​(2003
目前版本
  • 0.99 (2023年8月24日)[1]
編輯維基數據連結
型態系統強型別, 動態
作業系統Windows, macOS, Linux
許可證BSD許可證
網站factorcode.org
啟發語言
Joy, Forth, Lisp, Self

歷史 編輯

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

不是所有數據都必須只通過堆疊來傳遞。詞法作用域的局部變數,在過程內可用作臨時變數英語Temporary variable來儲存和訪問。動態作用域的變數被用於在過程呼叫之間傳遞東西而不使用堆疊。例如,當前輸入和輸出流被儲存在動態作用域的變數中[3]

Factor強調靈活性和擴充語言的能力[3]。有宏系統,還有對Factor語法的任意擴充。Factor的語法經常被擴充來允許新類型的單詞定義和用於數據結構的新類型的文字英語Literal (computer programming)。它還被用在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]
  • 繫結到多個資料庫函數庫,包括PostgreSQLSQLite[5]
  • 一個HTTP伺服器和客戶端,具有Furnace web框架[6]
  • 高效的同質的整數、浮點數和C結構的陣列[7]
  • 實現正則表達式的一個庫,生成機械碼來進行匹配[8]

Factor內建了外界函數介面英語foreign function interface,允許同CObjective-CFortran程式進行通訊。還支援執行用GLSL書寫的着色器並與之通訊[3][9]

Factor是用Factor和C++實現的。它最初自舉於早期的Java實現。現在,解析器和最佳化編譯器都用本語言書寫。語言的特定的基礎部分是用C++實現的,比如垃圾回收器和特定原始操作(primitive)。

Factor使用基於映像英語system image的模型,類似於很多Smalltalk實現,這裏編譯的代碼和數據都儲存在映像之中[10]。要編譯一個程式,這個程式被裝載入一個映像並儲存這個映像。一個特殊工具輔助建立最小映像來執行一個特定程式的過程,包裝這個結果進入可以被部署為一個獨立應用的某個東西中[3][11]

Factor編譯器實現了很多進階最佳化並被用於新最佳化技術研究中的目標[3][12]

參照 編輯

  1. ^ https://github.com/factor/factor/releases/tag/0.99.
  2. ^ Pestov, Slava. Slava Pestov's corner of the web. [2021-03-08]. (原始內容存檔於2021-02-25). 
  3. ^ 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. 
  4. ^ Pestov, Slava. Factor documentation: UI framework. [2021-03-08]. (原始內容存檔於2018-06-26). 
  5. ^ Coleman, Doug. Factor documentation: Database library. [2021-03-08]. (原始內容存檔於2018-01-12). 
  6. ^ Pestov, Slava. Factor documentation: HTTP server. [2021-03-08]. (原始內容存檔於2021-02-25). 
  7. ^ Pestov, Slava. Factor documentation: Specialized arrays. [2021-03-08]. (原始內容存檔於2020-10-25). 
  8. ^ Coleman, Doug; Ehrenberg, Daniel. Factor documentation: Regular expressions. [2021-03-08]. (原始內容存檔於2018-08-07). 
  9. ^ Pestov, Slava. Overhauling Factor's C library interface. [2021-03-08]. (原始內容存檔於2020-11-09). 
  10. ^ Pestov, Slava. Factor's bootstrap process explained. [2021-03-08]. (原始內容存檔於2021-04-28). 
  11. ^ Pestov, Slava. On shaking trees. [2021-03-08]. (原始內容存檔於2020-11-09). 
  12. ^ Ehrenberg, Daniel. Closure elimination as constant propagation (PDF). 2010. (原始內容 (PDF)存檔於2011-07-26). 

外部連結 編輯