程序语言是否具有足够的延展性以允许程序扩展语言语义


15

关于诸如ruby(和javascript)之类的语言的功能,允许程序员在定义类后随时扩展/覆盖类(包括诸如String之类的类),从理论上讲,设计一种允许程序在以后扩展的语言是否可行?它的语义。

例如:Ruby不允许多重继承,但是我可以扩展/覆盖默认语言行为以允许多重继承的实现。

是否有其他语言允许这样做?这实际上是语言设计师关注的主题吗?在选择使用ruby构建用于Web应用程序开发的Rails框架的选择时,此类语言可能非常强大,可以允许为各种应用程序设计框架(或DSL)。


2
您是否将允许将异常实现为库代码的方案扩展视为Scheme的卫生宏newspeak的反射?像Perligata:Romana这样的句法扩展呢?

这似乎是一个问题,要求提供语言列表而不是概念列表。在等待更改问题方向的编辑之前,我实际上投票赞成关闭主题。
拉斐尔

如果我没记错的话,甚至Java都将获得允许程序扩展类型系统的功能。
拉斐尔

1
@Raphael,您在考虑JSR 305吗?Java注释(部分)由Gilad Bracha设计,他设计了Newspeak,我在下面的答案中对此进行了链接,并倡导了可插拔类型系统。JSR 305提供类型系统注释,例如@Nullable@NonNull,供外部检查程序(如findbug)使用。
Mike Samuel

不清楚“扩展其语义”的含义。如果我看Boost.Spirit,那已经超出了我的“扩展语义”的个人门槛:C ++的数学运算符用于描述语言语法,然后编译器将其转换为该语言的解析器。我知道这不是实验室老鼠“扩展语言语义”的含义,但我认为这确实令人印象深刻。
DevSolar'5

Answers:


12

Converge具有一些令人印象深刻的元编程功能。

从简单的角度来看,这可以看作是类似于宏的工具,尽管它比大多数现有的宏工具更强大,因为可以在编译时运行任意代码。使用它,可以与编译器进行交互,并像ITrees(又称为抽象语法树)一样安全且轻松地生成代码。

这是Scheme 卫生宏又一又一步,该允许引用透明的宏定义。

准文字这样的机制允许使用其他语言构造和分解解析树,但这些机制更常用于与特定领域语言(DSL)交互,而不是自我修改。


Newspeak的反思允许将异常实现为库代码。

7.6异常处理

因为Newspeak提供对激活记录(3.6)的反射访问(7.2),所以异常处理纯粹是一个库问题。该平台将提供一个标准库,该库支持抛出,捕获和恢复异常,这与Smalltalk一样。


Perligata:Romana演示了如何将全新的语法皮肤化为一种语言。

本文介绍了Perl模块-Lingua :: Romana :: Perligata-使使用拉丁语编写Perl程序成为可能。


PyPy可以说是一种语言的解释器生成器,它的语义可以在高度静态可分析的Python子集中指定,并且可以用它来尝试使用Python中的新语言构造(例如在语言中添加thunk),可以说在语义上并不重要。


同样值得关注的是Ometa

本文主要研究计算机科学领域的实验。特别是,我将展示专门为支持实验而设计的新编程语言和结构可以大大简化研究人员和程序员的工作。

我介绍的工作涉及两种截然不同的实验。第一个目标是通过使编程人员更容易为新的编程语言和现有语言的扩展建立原型,从而帮助编程语言研究人员尝试他们的想法。另一个通过将程序本身允许进行不同的动作和可能性进行实验来将实验作为一种编程范例进行研究,换句话说,这是为……提供语言支持的尝试。或可能的世界推理。

Alex Warth的论文演示了使用Ometa在JavaScript + Ometa中定义显着的新语义(通过世界的事务性语义)。


8

“理论上可行吗?*

当然是的。人们总是可以用另一种语言()的语言()编写解释器,并用新语言编写程序。人们不经常这样做,因为编写这样的解释器可能涉及很多工作,并且附加解释层的性能会受到影响(10-100倍)。LS

这两个问题都有解决方案。可以使用强大的元编程功能来设计语言,从而易于实现解释器。诸如Scheme之类的语言具有此功能。大号

可以实现部分求值器,以便将解释器转换为编译器(从到)。然后,由于消除了额外的解释层,因此不会对性能造成影响。小号大号

如果新语言的运行时模型与实现语言明显不同,则它可能仍会运行缓慢。在这种情况下,解释器的位将显示在翻译后的代码中,并且将继续缓慢运行。但是,如果新语言与原始语言基本相同,只进行了一些调整,那么应该可以通过仔细调整部分评估来消除目标代码中的大多数解释器位。然后,只有新功能才会对性能造成影响。

实际上,这是用于编程语言的“虚拟化”技术。


6

从历史上看,Lisp是第一种引入元编程功能的主要编程语言。Lisp的宏系统允许程序员定义新的控制结构,新的数据模板等。例如,Common Lisp对象系统可以完全由核心语言之上的宏定义,而该核心语言对对象或类一无所知。宏系统还允许定义特定领域的语言

Ruby从Lisp中获得了很多启发,包括其反射性和元编程能力。在这方面,Lisp启发了许多动态类型的语言。(静态类型使事情复杂化,因为许多扩展名不适合原始类型系统。)


4

尚未在答案/评论中提及:

该调查:

摘要:可扩展语言是允许用户修改或添加语法并将新的语法形式与语义相关联的编程语言。这些语言有什么用?哪些功能易于添加,哪些不容易添加?它们强大到足以引起重视吗?在本次调查中,我们将尝试回答过程,面向对象,功能和通用可扩展语言等问题。我们主要对表达能力(常规,无上下文),相关警告(不卫生,歧义)以及各种机制的易用性感兴趣。

摘要:以新的句法形式扩展语言的能力是一个强大的工具。足够灵活的宏系统允许程序员从通用基础构建为专门为其问题领域设计的语言。但是,迄今为止,集成的,功能强大的,同时又简单到可以广泛使用的宏设施仅限于Lisp语言族。在本文中,我们介绍了一种称为Java语法扩展器(JSE)的宏功能,它具有Lisp宏系统的强大功能和易用性,但是对于Java而言,它是一种具有更常规代数语法的语言。...


1
请为每个参考文献写一两个摘要句;纯链接集合几乎永远不会是“好”答案。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.