可扩展编程
可扩展编程(Extensible programming)是计算机科学的词语,是指程式设计的风格会著重在可以扩展程式语言、编译器、运行时系统的相关机制。可延伸程式语言(Extensible programming languages)是可以支援这种程式设计方式的程式语言,在1960年代曾是热门研究主题,而此运动在1970年代就已边缘化[1],在21世纪时此一主题又受到关注[2]。
以往的发展
编辑第一篇和可扩展编程运动有关的论文[1][3]是道格拉斯·麦克罗伊在1960撰写,有关高阶程式语言巨集的论文[4]。另一个早期对可扩展原则的说明,出现在Brooker和Morris所著,有关编译器编译程式(compiler-compiler)的论文[5]。此运动中有二个具代表性,分别在1969年及1971年举行的学术座谈会,是此运动发展最热的时期[6][7]。Thomas A. Standish在1975年发表对此运动的调查文章,在本质上属于事后的剖析[1]。Forth算是此一运动的例外,不过也没有被人注意到。
特点
编辑可延伸程式语言会包括提供基础计算功能的基础语言(base language),以及可以修改基础语言的元语言。程式会包括元语言所进行的修改,以及以修改后基础语言所撰写的程式码。
在此波潮流中,最著名的语言扩展技术就是巨集定义。语法修改也和可扩展编程运动有密切的关系,最终发展成适应型文法形式主义。Lisp程式语言的群体仍和可扩展程式语言群体分开,其原因显然如下:
任何程式语言,只要程式码和资料在本质上可以互换,就可以视为是可延伸程式语言...由Lisp已长久当作可延伸程式语言来使用,就可以轻易的看出此一事实。[8]
在1969的研讨会中,认为Simula是可延伸程式语言。
Standish描述了三类不同的语言延伸,称为paraphrase、orthophrase和metaphrase。(paraphrase和metaphrase原来是翻译上的术语)。
- paraphrase(改写)会说明新功能如何用以前定义(或是将要定义)的事物来表示,以此定义新的功能。Standish的举例提到了巨集定义、一般程序定义、语法延伸、资料定义、运算子定义以及控制结构的延伸。
- Orthophrase在语言中加入一些基础语言无法达成的功能,例如在没有输出入指令的基础语言中加入输入及输出功能。因为此功能无法用此基础语言表示,因此一定要用其他的语言来定义。这些扩展功能对原语言来说就是Orthophrase。这对应现代的插件。
- Metaphrase会修改诠释表示式时所用的规则。这对应现代的反射式编程。
以往发展的终止
编辑Standish认为当时可扩展编程的失败是因为若程式有数层的扩展,在撰写时会格外困难。程式设计师可以在基础语言上加上第一层的巨集。若要在此语言上加上第二层的扩展,后续的程式设计者需要熟悉基础语言,以及第一层的扩展。若要加上第三层的扩展,程式设计者需要熟悉基础语言、第一层扩展以及第二层扩展。取代可扩展编程运动的抽象化,其本意就是让程式设计者 不用接触低阶的细节。
Standish虽然在1975年时将Simula归类为可扩展程式语言,但其研究似乎没有将比较新的,以抽象化为基础技术算在可扩展程式语言内(只是其中对可扩展的定义,使用了非常宽的定义,抽象化在技术上是在该定义范围内)。1978年有一份文献提到程式抽象化的历史,说明从电脑发明以来的相关演进,其中没有提到巨集,也没有提及可扩展编程运动[9]。一直到1980年代末期,才试验性的将巨集列在抽象化运动中(可能是因为卫生巨集的出现),其名称为“句法抽象化”(syntactic abstraction)[10]。
现代的发展
编辑现代支援可扩展编程的系统需要提供以下的所有功能[来源请求]。
可延伸的语法
编辑这是指所编辑的来源程式语言不能是封闭、固定、静态不能变化的。要支援在来源程式语言加入新关键字、新概念或是结构的功能。有些程式语言可以用使用者定义语法加入组成元素,例如Coq[11]、Racket、Camlp4、OpenC++、Seed7[12]、 Red、Rebol及Felix。可延伸的语法可以接受一些基础以及固有的程式语言特性是不变的,但系统不可能只依赖这些程式语言的功能,需可以加入新的程式语言功能。
可延伸的编译器
编辑在可延伸程式设计中的编译器,不是一个将程式原始码转换为二进制可执行输出的单层系统。编译器本身也要是可延伸的,编译器在实质上是许多插件的组合,这些插件可以将原始程式语言的输入转换为任何想要的输出。例如,可延伸的编译器可以支援产生目的码、程式文件、重新调整格式的原始码,或是其他想要的输出。编译器的架构需允许使用者进入其编译流程内,在编译流程的各步骤可以提供其他的处理任务。
若考虑将原始程码翻译成电脑可以执行档案的这个任务,可延伸编译器需要有:
- 在其功能的绝大部份层面,使用插件或是元件架构。
- 确认要编译的语言(或是语言变体),配置适当的插件来的辨认及确认其语言。
- 依各来源语言的型式语言规范,在句法及结构上确认。
- 呼叫适当的确认插件,以协助来源语言的语意确认
- 允许用户者在不同种类的程式码产生器中选择,可以依处理器、作业系统、虚拟机及其他作业环境的不同,生成适合的执行档。
- 提供错误讯息产生的功能,以及相关的延伸。
- 可以在抽象语法树(AST)中加入新的节点种类。
- 抽象语法树的节点中允许有新的值。
- 允许其他种类,连接节点的边。
- 允许输入抽象语法树的转换,可以部份或全部来自外部的程式。
- 允许输入抽象语法树的翻译,可以部份或全部交由外部的程式。
- 协助内部和外部程式之间的资讯流,因为他们都会将抽象语法树转换或是翻译为其他的抽象语法树,或是其他表现方式。
可延伸的执行时环境
编辑可延伸程式系统在执行时的环境要允许程式语言增加可处理的运算。例如,某个使用字节码直译器的系统,需要允许定义新的字节码。在可延伸语法下,可以接受少数基础运算或是固有运算是不能变的,不过这些固有运算要可以重载或是扩充,以便支援新增的行为。
内容和形式分离
编辑可延伸程式系统需将程式视为要处理的资料。程式中需要完全没有格式化相关的资讯。要给使用者的程式 视觉显示以及编辑都应该是可延伸编译器所支持的翻译函式,将程式资料转换成适合显示或是编辑的格式。此翻译会是双向的翻译。双向翻译的特性很重要,因为需要可以用许多不同的方式,轻松的处理可延伸程式。若只能用来源语言来编辑及检视,然后就翻译成机械码,无法再翻译成其他的格式,这是无法接受的。透过将来源输入和其处理(格式、储存、显示及编辑)的格式分离,可以对程式进行各种不同的处理。
支援用原始语言除错
编辑可延伸程式系统需要可以用原始来源语言来进行除错,即使是程式在变成可执行档的过程有进行转换或是延伸也是一样。最为人知的是:不可以假设运行时资料只能用结构或是阵列的方式显示。除错器(更准确的说法是“程式检查器”)需要让运行时资料以适合其来源语言的形式来呈现。例如,若程式语言支援业务过程或是工作流的资料结构,需要将资料结构用插件表示为流程图或是其他适合的型式。
相关的软体或程式语言
编辑相关条目
编辑参考资料
编辑- ^ 1.0 1.1 1.2 Standish, Thomas A., "Extensibility in Programming Language Design", SIGPLAN Notices 10 no. 7 (July 1975), pp. 18–21.
- ^ Gregory V. Wilson, "Extensible Programming for the 21st Century (页面存档备份,存于互联网档案馆)", ACM Queue 2 no. 9 (Dec/Jan 2004–2005).
- ^ Sammet, Jean E., Programming Languages: History and Fundamentals, Prentice-Hall, 1969, section III.7.2
- ^ McIlroy, M.D., "Macro Instruction Extensions of Compiler Languages", Communications of the ACM 3 no. 4 (April 1960), pp. 214–220.
- ^ Brooker, R.A. and Morris, D., "A General Translation Program for Phrase Structure Languages", Journal of the ACM 9 no. 1 (January 1962), pp. 1–10. The paper was received in 1960.
- ^ Christensen, C. and Shaw, C.J., eds., Proceedings of the Extensible Languages Symposium, SIGPLAN Notices 4 no. 8 (August 1969).
- ^ Schuman, S.A., ed., Proceedings of the International Symposium on Extensible Languages, SIGPLAN Notices 6 no. 12 (December 1971).
- ^ Harrison, M.C., in "Panel on the Concept of Extensibility", pp. 53–54 of the 1969 symposium.
- ^ Guarino, L.R., "The Evolution of Abstraction in Programming Languages[失效链接]", CMU-CS-78-120, Department of Computer Science, Carnegie-Mellon University, Pennsylvania, 22 May 1978.
- ^ Gabriel, Richard P., ed., "Draft Report on Requirements for a Common Prototyping System", SIGPLAN Notices 24 no. 3 (March 1989), pp. 93ff.
- ^ Syntax extensions and notation scopes – Coq 8.17.0 documentation. coq.inria.fr. [2023-05-25]. (原始内容存档于2023-12-12).
- ^ Zingaro, Daniel, "Modern Extensible Languages (页面存档备份,存于互联网档案馆)", SQRL Report 47 McMaster University (October 2007), page 16.