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

外部链接

编辑