在底层语言中实现脚本语言的核心方法的优点和缺点

时间:2015-05-16 20:16:19

标签: language-design scripting-language language-implementation

背景:我正在编写脚本语言解释器,以测试一些实验语言的想法。我正在为内置类型编写核心标准方法(函数)集。其中一些方法需要直接与底层数据结构接口,并且必须使用底层语言编写(在我的情况下是Haskell,但这对于这个问题并不重要)。如果我选择,其他人可以用脚本语言编写。

问题:在底层语言或语言本身中实现核心库函数有哪些优点和缺点?

示例:我的语言包含内置类型Array,就像您认为的那样工作 - 将有序数据组合在一起。 Array实例(这是一种OO语言)包含方法injectmapeach。我在Haskell中实现了inject。我也可以在Haskell中编写mapeach,或者我可以使用inject以我的语言编写它们。例如:

def map(fn)
    inject([]) do |acc,val|
        acc << fn(val)
    #end inject
#end def map 

def each(fn)
    inject(nil) do |acc,val|
        fn val
    #end inject
#end def each

我想知道每种选择的优点和缺点是什么?

1 个答案:

答案 0 :(得分:3)

主要优点是你正在吃自己的狗粮。您可以用您的语言编写更多代码,从而更好地了解它的含义,至少对于通用库代码而言。这不仅是一个注意语言设计缺陷的好机会,也是实施过程中的缺陷。特别是,你会发现更多错误,你会发现这些抽象是否可以有效实现,或者是否有一个基本障碍迫使人们用另一种语言编写对性能敏感的代码。

这当然会导致一个缺点:无论是程序员时间还是运行时性能,它都可能更慢。然而,第一个是有价值的经验,对于你,语言设计师,第二个应该是激励优化实现(假设你关心性能)而不是解决问题 - 它削弱了你的语言,并没有解决同样的问题对于无法修改实现的其他用户。

未来的实施也有优势。面对引擎盖下的重大修改,语言应保持稳定,因此在执行这些操作时您将不得不重写较少的代码。相反,函数将更像其他用户定义的函数:存在一个真正的风险,当在实现语言中定义一些标准库函数或类型时,潜在的细微差别使得类型或函数的行为方式可以不会被语言模仿。