可扩展编程
可扩展编程(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.