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). 

外部連結