热门问题
时间线
聊天
视角
可扩展编程
来自维基百科,自由的百科全书
Remove ads
可扩展编程(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原来是翻译上的术语)。
Remove ads
Standish认为当时可扩展编程的失败是因为若程式有数层的扩展,在撰写时会格外困难。程式设计师可以在基础语言上加上第一层的巨集。若要在此语言上加上第二层的扩展,后续的程式设计者需要熟悉基础语言,以及第一层的扩展。若要加上第三层的扩展,程式设计者需要熟悉基础语言、第一层扩展以及第二层扩展。取代可扩展编程运动的抽象化,其本意就是让程式设计者 不用接触低阶的细节。
Standish虽然在1975年时将Simula归类为可扩展程式语言,但其研究似乎没有将比较新的,以抽象化为基础技术算在可扩展程式语言内(只是其中对可扩展的定义,使用了非常宽的定义,抽象化在技术上是在该定义范围内)。1978年有一份文献提到程式抽象化的历史,说明从电脑发明以来的相关演进,其中没有提到巨集,也没有提及可扩展编程运动[9]。一直到1980年代末期,才试验性的将巨集列在抽象化运动中(可能是因为卫生巨集的出现),其名称为“句法抽象化”(syntactic abstraction)[10]。
现代的发展
现代支援可扩展编程的系统需要提供以下的所有功能[来源请求]。
这是指所编辑的来源程式语言不能是封闭、固定、静态不能变化的。要支援在来源程式语言加入新关键字、新概念或是结构的功能。有些程式语言可以用使用者定义语法加入组成元素,例如Coq[11]、Racket、Camlp4、OpenC++、Seed7[12]、 Red、Rebol及Felix。可延伸的语法可以接受一些基础以及固有的程式语言特性是不变的,但系统不可能只依赖这些程式语言的功能,需可以加入新的程式语言功能。
在可延伸程式设计中的编译器,不是一个将程式原始码转换为二进制可执行输出的单层系统。编译器本身也要是可延伸的,编译器在实质上是许多插件的组合,这些插件可以将原始程式语言的输入转换为任何想要的输出。例如,可延伸的编译器可以支援产生目的码、程式文件、重新调整格式的原始码,或是其他想要的输出。编译器的架构需允许使用者进入其编译流程内,在编译流程的各步骤可以提供其他的处理任务。
若考虑将原始程码翻译成电脑可以执行档案的这个任务,可延伸编译器需要有:
- 在其功能的绝大部份层面,使用插件或是元件架构。
- 确认要编译的语言(或是语言变体),配置适当的插件来的辨认及确认其语言。
- 依各来源语言的型式语言规范,在句法及结构上确认。
- 呼叫适当的确认插件,以协助来源语言的语意确认
- 允许用户者在不同种类的程式码产生器中选择,可以依处理器、作业系统、虚拟机及其他作业环境的不同,生成适合的执行档。
- 提供错误讯息产生的功能,以及相关的延伸。
- 可以在抽象语法树(AST)中加入新的节点种类。
- 抽象语法树的节点中允许有新的值。
- 允许其他种类,连接节点的边。
- 允许输入抽象语法树的转换,可以部份或全部来自外部的程式。
- 允许输入抽象语法树的翻译,可以部份或全部交由外部的程式。
- 协助内部和外部程式之间的资讯流,因为他们都会将抽象语法树转换或是翻译为其他的抽象语法树,或是其他表现方式。
Remove ads
可延伸程式系统在执行时的环境要允许程式语言增加可处理的运算。例如,某个使用字节码直译器的系统,需要允许定义新的字节码。在可延伸语法下,可以接受少数基础运算或是固有运算是不能变的,不过这些固有运算要可以重载或是扩充,以便支援新增的行为。
可延伸程式系统需将程式视为要处理的资料。程式中需要完全没有格式化相关的资讯。要给使用者的程式 视觉显示以及编辑都应该是可延伸编译器所支持的翻译函式,将程式资料转换成适合显示或是编辑的格式。此翻译会是双向的翻译。双向翻译的特性很重要,因为需要可以用许多不同的方式,轻松的处理可延伸程式。若只能用来源语言来编辑及检视,然后就翻译成机械码,无法再翻译成其他的格式,这是无法接受的。透过将来源输入和其处理(格式、储存、显示及编辑)的格式分离,可以对程式进行各种不同的处理。
可延伸程式系统需要可以用原始来源语言来进行除错,即使是程式在变成可执行档的过程有进行转换或是延伸也是一样。最为人知的是:不可以假设运行时资料只能用结构或是阵列的方式显示。除错器(更准确的说法是“程式检查器”)需要让运行时资料以适合其来源语言的形式来呈现。例如,若程式语言支援业务过程或是工作流的资料结构,需要将资料结构用插件表示为流程图或是其他适合的型式。
相关的软体或程式语言
相关条目
参考资料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads