Factor语言
Factor是Slava Pestov创建的面向堆栈编程语言。Factor是动态类型的并拥有自动内存管理,还有强力的元编程特征。语言有一个单一的实现,特征包括自宿主的优化编译器和一个集成开发环境。Factor发行包括一个大型的标准库。
编程范型 | 多范型: 面向堆栈, 串接式, 函数式 |
---|---|
实现者 | Slava Pestov |
发行时间 | 2003年 |
当前版本 |
|
类型系统 | 强类型, 动态 |
操作系统 | 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
不是所有数据都必须只通过堆栈来传递。词法作用域的局部变量,在过程内可用作临时变量来存储和访问。动态作用域的变量被用于在过程调用之间传递东西而不使用堆栈。例如,当前输入和输出流被存储在动态作用域的变量中[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]。
引用
编辑- ^ 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