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