通过F#解释脚本

时间:2015-06-11 21:39:22

标签: scripting f# interpreted-language

我真的很喜欢F#,但我觉得它并不是很简单,也不够短。我想走得更远。我确实知道如何改进它,但我没有制作编译器的经验所以我认为我将它变成了一种脚本语言。然后我意识到我可以使用脚本语言并使用F#解释它,但由于F#具有inline选项,它仍然可以获得100%的性能。我对吗?是否真的可以在F#中创建一个脚本解释器,它将通过我的脚本并将其转换为许多仿函数和东西,从而获得非常好的性能?

1 个答案:

答案 0 :(得分:5)

  

我真的很喜欢F#,但我觉得它不够简洁,也不够短。我想走得更远。我确实知道如何改进它,但我没有制作编译器的经验所以我认为我会把它变成脚本语言。

F#通过F#Interactive支持脚本方案,因此我建议先考虑internal DSL,或在F# Language UserVoice页面上推荐功能。

  

然后我意识到我可以使用脚本语言并使用F#进行解释,但由于F#具有内联选项,因此仍然可以获得100%的性能。我是对的吗?

根据场景,解释的代码可能足够快,例如,如果您的应用程序的99%的时间花费在网络,数据库或图形渲染上,则解释代码的总体成本可以忽略不计。对于基于计算的操作而言,这不太正确。 F#的内联函数可以帮助进行性能调优,但不太可能提供全局灵丹妙药。

  

是否真的可以在F#中创建脚本解释器

作为一个起点,可以为vanilla F#代码编写一个解释器。例如,您可以使用F#的引用机制来获取代码片段或整个模块的抽象语法树(AST),然后对其进行评估。这是一个小的F#代码段,用于评估F#代码报价的一小部分:http://fssnip.net/h1

或者你可以从头开始设计自己的语言......

  

是否真的可以在F#中创建一个脚本解释器,它将通过我的脚本并将其转换为许多仿函数和东西,从而获得非常好的性能?

是的,您可以设计自己的脚本语言,使用F#类型系统定义AST,然后编写将脚本代码转换为AST表示形式的解析器,最后解释AST。

<强>分析器

解析有很多选项,包括:

  • 活跃模式&amp;正则表达式,例如评估spreadsheet
  • 中的单元格
  • FsLex&amp; FsYacc,例如parse SQL
  • FParsec,一个解析器组合器库,例如用于解析Small Basic

我建议从FParsec开始,它有一个很好的教程,大量的示例,并根据您的代码免费提供基本的错误消息。

小例子

以下是一些使用FParsec开始的简单示例解释器:

Fun Basic

前段时间我用F#编写了自己的简单编程语言,基于微软的Small Basic,提供了有趣的扩展,如支持元组和模式匹配。它被称为Fun Basic,具有代码完成的IDE,可在Windows应用商店免费获得。 Windows Store版本被解释(由于发出代码的限制)并且性能足够。桌面的编译器版本也可以在Windows,Mac和Linux上运行。

  

是否真的可以在F#中创建脚本解释器

所以我想,答案是肯定的,如果你想了解更多信息,那么我去年在伦敦NDC会议上就如何Write Your Own Compiler in 24 Hours

进行了一次免费录音。

我还建议选择Peter Sestoft的Programming Language Concepts book,其中有一章介绍如何建立自己的功能语言。