【问题标题】:What are the extensible languages people are using today?人们今天使用的可扩展语言是什么?
【发布时间】:2010-12-27 19:37:39
【问题描述】:
维基百科说:
可扩展编程是计算机科学中用来描述一种计算机编程风格的术语,该风格侧重于扩展编程语言、编译器和运行时环境的机制。
例如,Tcl 允许您编写自己的控制结构。见here。
我有兴趣编制一份在实际代码中使用的可扩展编程语言列表。如果您也可以为您的语言提供一个示例,那就太好了。
【问题讨论】:
标签:
language-agnostic
extensible
【解决方案2】:
关于Extensible programming 的维基百科文章提到了Seed7 语言。 Seed7 的维基百科文章将其描述为:
除了许多其他功能之外,它还提供了一种扩展机制。 Seed7 支持将新语法及其语义引入语言,并允许使用 Seed7 语言本身定义新的语言结构。例如:程序员可以引入新语句的语法和语义以及用户定义的运算符符号。
Seed7 从头开始设计为可扩展语言。整个语言在编译器中没有硬编码。相反,Seed7 是在库中定义的,这些库在程序编译时被加载。恕我直言,Seed7 是唯一一种将可扩展性作为基本特征而其他一切都基于它的语言。其他方法使用传统语言,编译器使用硬编码语法和语义分析,并在其上添加一些扩展机制。
【解决方案3】:
Jetbrains MPS (Meta-programming System) 提供基于投影编辑器的可扩展语言工作台。它可以帮助您为您的语言扩展创建编辑器、类型系统、约束、重构和代码生成器。它附带一些 Java 语言实现和扩展。
mbeddr 是利用该技术的 C 实现。它具有组件系统、发送/接收 + 客户端/服务器接口、依赖注入、状态机、测试和 PLE 扩展。它还包含一个可扩展的调试系统,因此您可以将扩展映射到 gdb 并提供舒适的调试体验。几乎所有的 C 语言特性都被映射,因此代码生成主要可以通过简化为 C 结构而不是愚蠢的 M2T 转换来处理。
Aynth 是一个简单的单声道合成器,使用 mbeddr 编写,用于演示组件和发送/接收接口。
无论如何,如果您使用它,您首先会注意到,在许多情况下,投影编辑不如文本编辑舒适。我们非常习惯基于文本的编辑。但是可扩展语言有很多好处。
【解决方案4】:
Jeebox 是一种可扩展的语言,可以描述任何东西,包括代码。
现在纯粹是用来形容事物的……
但是一种可扩展的编程语言,可以很容易地构建在 Jeebox 之上。
(我正在 Jeebox 之上构建一种普通的、不可扩展的编程语言,仅仅是因为将可扩展性构建到编程语言中不仅仅是一种语言特性。它需要一种递归,你可以在其中编写可以创建的代码更多代码。正确地执行此操作将需要比我可用的时间更多的时间。但是很高兴知道我使用的语言 Jeebox 可以支持这一点,一旦我有时间这样做。)
【解决方案5】:
Scala 也不是严格可扩展的,但您可以定义看起来像运算符的内容。例如,在定义地图时,您可以使用:
val romanNumeral = Map(
1 -> "I", 2 -> "II", 3 -> "III"
)
->实际上是在对象1上调用的方法,但看起来像一个操作符。
【解决方案6】:
LISP 家族中的语言(Common Lisp、Guile 等)具有非常的可扩展性——比我使用过的任何其他语言都强。把它想象成类固醇上的 C 宏系统。如果你够无聊,你可以将 + 运算符重新定义为减法:现在这就是可扩展性!
LISP 在很多地方已经过时了,但是Guile(Scheme 的一种方言)是GNU Project 的官方扩展语言。
【讨论】:
-
但是你不能扩展 LISP 的语法。最后,它归结为括号和原子。我听说像Racket 这样的方言允许您扩展它们的语法,但最终您必须在 LISP S-Expressions 中编写自己的解析器。每个 LISP 代码看起来都相似,这可能是一个有趣的属性,但它也会损害可读性(考虑到某些结构使用另一种格式可能更易于阅读和维护)。
【解决方案7】:
Ruby 并不是严格意义上的可扩展语言,但其语法足够灵活且功能强大,如果你眯着眼睛看,它看起来就像是……对于许多用途而言,这已经足够好了。
无论如何,人们实际上在使用 Ruby :-)