【问题标题】:What are the extensible languages people are using today?人们今天使用的可扩展语言是什么?
【发布时间】:2010-12-27 19:37:39
【问题描述】:

维基百科说:

可扩展编程是计算机科学中用来描述一种计算机编程风格的术语,该风格侧重于扩展编程语言、编译器和运行时环境的机制。

例如,Tcl 允许您编写自己的控制结构。见here

我有兴趣编制一份在实际代码中使用的可扩展编程语言列表。如果您也可以为您的语言提供一个示例,那就太好了。

【问题讨论】:

标签: language-agnostic extensible


【解决方案1】:

TCLlanguage 是一种动态语言,很少有fundamental rules

Tcl 的精神是"Everything is a string", "everything is a command",甚至是控制流构造。

例如,用自定义循环替换 while 循环。

# rename original while to orig_while for future usage.
rename while orig_while; 

#redefine while
proc while {cond body} {
# add customization code

# calculate while call count.
global while_call_count;
incr while_call_count;

# call original while in uper level stack 
 uplevel orig_while $cond $body;

# add customization code
}

Tcl 有C language interface 可以很容易地将Tcl 集成到现有程序中。 Tcl 在EDA tools 中使用非常广泛。

最后TCL强大到无法定义Tcl BNF,这就带来了lot of headaches

【讨论】:

    【解决方案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 :-)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-27
              • 1970-01-01
              相关资源
              最近更新 更多