正在为F#编写一个编译器Hello World?

时间:2010-04-19 14:38:25

标签: f#

我不相信见this。它说:

  

4月份,Chris Smith将介绍如何用F#编写Java到x86编译器。

演示文稿可能会持续一两个小时,但这绝对不足以编写编译器。我听说F#功能强大,但这个功能强大吗?

嗯,我想问的是:你能快速在F#编写编译器吗?

4 个答案:

答案 0 :(得分:18)

让我们先来做一些修正:

  • 它不是Java编译器,它是Java的小型子集的编译器。
  • 它没有说任何时候编译器将的时间,只是它解释
  • 事实上,它甚至没有说,它会呈现。哎呀,我可以在3分钟内介绍海湾合作委员会。它不会是一个非常有用的演示文稿,但它将是一个演示文稿。

也就是说,解释一个结构良好,简单的编译器,用于以一种非常适合在一小时内编写编译器的语言实现的简单语言,这绝对是可行的。

F#是ML系列语言的成员(特别是OCaml的近亲),这些确实非常适合编写编译器。事实上,理由为什么罗宾米尔纳为他的语言选择名称ML(元语言),是因为它是专门设计的用于编写编译器。编译器基本上是一个很大的功能(因此很容易在函数式语言中实现),它可以检测模式(因此可以很自然地用模式匹配的语言实现)并为它检测到的每个模式执行一些代码(因此,使用具有一流功能的语言实现非常自然)。和whaddayaknow? F#是一种功能语言,具有非常复杂的模式匹配功能。另一个不错的功能是具有代数数据类型和有区别的联合的表达式系统,这使得表示抽象语法树变得非常容易。

在Lang.NET研讨会上,Jason Olson给了a talk on F#,在此期间,他展示了一些他目前正在研究的翻译,这些翻译很好地展示了这些特征。

FredrikHolmström目前正致力于IronJS,这是针对动态语言运行时的ECMAScript 3实现。请查看code,特别是AST types以及部分analysisparsing代码。

Jonathan Tang's Write Yourself a Scheme in 48 Hours是另一个编写解释器的好例子,这次是在Haskell中与F#共享许多功能。

The 90 Minute Scheme to C compiler by Marc Feeley是关于用Scheme编写的Scheme编译器的演示文稿。

Implementing Scheme in Ruby中,James Coglan教授观众方案,实时代码并在Ruby中解释一个Scheme解释器,并在15分钟内编写几个示例Scheme程序。

答案 1 :(得分:16)

关于项目的演示与在演示期间实施整个项目不同。

完全有可能在一小时内向x86编译器提供一些有趣的Java方面,甚至可以显示一些代码:但这与创建所有代码并不相同。

答案 2 :(得分:8)

Java是一种相当复杂的语言,因此我认为Chris不会实现完整的Java编译器。然而,他的演讲确实指出,在F#中使用代码(和一般的树状结构)进行操作比在任何其他.NET语言中更容易 。这就是F#用于各种静态分析工具(例如微软的静态驱动程序验证程序)

的原因

像fslex和fsyacc这样的工具可以很容易地为语言编写解析器。克里斯有一个blog with simple mathematical expressions。罗伯特皮克林写了a more sophisticated example实际上只用几行代码生成IL代码(用.NET编译数学表达式)。如果使用表达式树生成代码,这在.NET 4.0上会更容易。

所以我想,即使他是从头开始编写编译器,他也可以编写一个语言编译器,可以用来编写非平凡的示例程序。

答案 3 :(得分:5)

  

你能快速用F#编写编译器吗?

过去一周,我在F#中编写了两个小编译器,每个都在大约那么多时间。是的,它可以做到。 Here就是其中之一。

请注意,F#的ML系列语言是专门为此应用程序设计的(元编程)。