我真的很喜欢F#,但我觉得它不够简洁和简短。我想走得更远。我确实有一个想法,我想如何改进它,但我没有制作编译器的经验,所以我想我会让它成为一种脚本语言。然后我意识到我可以使其成为一种脚本语言并使用 F# 解释它,但由于 F# 具有 inline
选项,我仍然可以获得几乎 100% 的性能。我说的对吗?真的有可能在 F# 中制作一个脚本解释器来遍历我的脚本并将其转换为大量函子和东西,从而获得非常好的性能吗?
F# 通过 F#我真的很喜欢 F#,但我觉得它不够简洁和简短。我想走得更远。我确实有一个想法,我想如何改进它,但我没有制作编译器的经验,所以我想我会让它成为一种脚本语言。
交互支持脚本方案,因此我建议首先考虑内部 DSL,或在 F# 语言 UserVoice 页上建议功能。
然后我意识到我可以使其成为一种脚本语言并使用 F# 解释它,但由于 F# 具有内联选项,我仍然可以获得几乎 100% 的性能。我说的对吗?
根据方案的不同,解释代码可能足够快,例如,如果应用程序 99% 的时间都花在等待网络、数据库或图形呈现上,则解释代码的总体成本可能可以忽略不计。对于基于计算的操作,情况并非如此。F# 的内联函数可以帮助进行性能优化,但不太可能提供全局灵丹妙药。
真的可以用 F# 制作脚本解释器吗
作为起点,可以为原版 F# 代码编写解释器。例如,可以使用 F# 的引用机制获取代码片段或整个模块的抽象语法树 (AST),然后对其进行评估。下面是一个小的 F# 代码段,用于评估 F# 代码引用的一小部分: http://fssnip.net/h1
或者,您可以从头开始设计自己的语言...
真的有可能在 F# 中制作一个脚本解释器来遍历我的脚本并将其转换为大量函子和东西,从而获得非常好的性能吗?
是的,您可以设计自己的脚本语言,使用 F# 类型系统定义 AST,然后编写将脚本代码转换为 AST 表示形式的分析器,最后解释 AST。
解析 器
有许多解析选项,包括:
- 活动模式和正则表达式,例如评估电子表格中的单元格
- FsLex 和 FsYacc,例如解析 SQL
- FParsec,一个解析器组合器库,例如用于解析 Small Basic
我建议从 FParsec 开始,它有一个很好的教程,大量的示例,并根据您的代码免费提供基本的错误消息。
小例子
以下是一些使用 FParsec 的简单示例解释器来帮助您入门:
- 海龟 - http://fssnip.net/nM
- 最小徽标语言 - http://fssnip.net/nN
- 小型基本 - http://fssnip.net/le
趣味基础
不久前,我用F#编写了自己的简单编程语言,基于Microsoft的Small Basic,具有有趣的扩展,例如对元组和模式匹配的支持。它被称为Fun Basic,有一个带有代码完成功能的IDE,可以在Windows应用商店免费获得。Windows 应用商店版本被解释(由于对发出代码的限制),并且性能足够。还有一个适用于桌面的编译器版本,可在Windows,Mac和Linux上运行。
真的可以用 F# 制作脚本解释器吗
所以我想,答案是肯定的,如果你想了解更多信息,这里有我去年在NDC伦敦做的关于如何在24小时内编写自己的编译器的演讲的免费录音
我还建议拿起Peter Sestoft的《编程语言概念》一书,其中有一章是关于构建自己的函数式语言的。