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

Abd*_*med 4 f#

我不相信看到这一点.它说:

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

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

好吧,我想问的是:你能快速在F#中编写一个编译器吗?

Jör*_*tag 19

让我们首先从一些更正开始:

  • 它不是Java编译器,它是Java的一小部分编译器.
  • 它没有说任何地方编译器将在时间内写入,只会说明它将被解释.
  • 事实上,它甚至没有说它将会出现.哎呀,我可以在3分钟内介绍海湾合作委员会.这不是一个非常有用的演示文稿,但它将是一个演示文稿.

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

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

在Lang.NET研讨会上,Jason Olson发表了关于F#的演讲,期间他展示了他正在研究的一些翻译,这些翻译非常好地展示了这些特征.

FredrikHolmström目前正在研究IronJS,这是针对动态语言运行时的ECMAScript 3实现.看一下代码,特别是AST类型和一些分析解析代码.

Jonathan Tang在48小时内自己写了一个方案是另一个编写翻译的好例子,这次是在Haskell中与F#共享许多功能.

Marc Feeley的90分钟计划到C编译器是关于用Scheme编写的Scheme编译器的演示文稿.

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


Jon*_*eet 16

提供有关项目的演示与在演示期间实施整个项目不同.

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

  • 您应该已经看过比尔盖茨在Windows Vista上的演示.在谈论/实施新的窗口系统后,他似乎很啰嗦. (4认同)
  • 然后他在作弊:) (2认同)

Tom*_*cek 8

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

像fslex和fsyacc这样的工具可以很容易地为语言编写解析器.克里斯有一个简单的数学表达式博客.罗伯特皮克林写了一个更复杂的例子,它实际上只用几行代码生成IL代码(用.NET编译数学表达式).如果使用表达式树生成代码,这在.NET 4.0上会更容易.

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


Jon*_*rop 5

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

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

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