Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 世界上有没有一个强大的优化编译器,可以让一个简单的函数式语言自行运行?_Javascript_Haskell_Optimization_Compiler Construction_Scheme - Fatal编程技术网

Javascript 世界上有没有一个强大的优化编译器,可以让一个简单的函数式语言自行运行?

Javascript 世界上有没有一个强大的优化编译器,可以让一个简单的函数式语言自行运行?,javascript,haskell,optimization,compiler-construction,scheme,Javascript,Haskell,Optimization,Compiler Construction,Scheme,世界上有没有为一种简单的函数式语言(比如定义的函数式语言)编写的编译器,或者仅仅是Scheme,甚至是ML本身?也就是说,编译器将分析该简单函数语言的代码,执行复杂的优化,例如流融合,并返回优化的代码 我之所以需要它,是因为我正试图将我的简单玩具语言(相当于lambda演算+数字和数组)编译成JavaScript,但实际上,由于朴素的编译器完全没有优化,所以速度非常慢。函数不是无载波的,诸如(map f(map g h))之类的东西不会融合到(map(f.g)h)中。实现一个优化的编译器会带来很

世界上有没有为一种简单的函数式语言(比如定义的函数式语言)编写的编译器,或者仅仅是Scheme,甚至是ML本身?也就是说,编译器将分析该简单函数语言的代码,执行复杂的优化,例如流融合,并返回优化的代码


我之所以需要它,是因为我正试图将我的简单玩具语言(相当于lambda演算+数字和数组)编译成JavaScript,但实际上,由于朴素的编译器完全没有优化,所以速度非常慢。函数不是无载波的,诸如
(map f(map g h))
之类的东西不会融合到
(map(f.g)h)
中。实现一个优化的编译器会带来很多麻烦。我曾经考虑过如何利用现有的编译器,比如GHC,但我还没有决定如何做到这一点。例如,我可以将我的语言编译成Haskell并编译回JavaScript,但大多数Haskell->JS解决方案都不是最优的,会产生大量开销。对于一个简单的函数式语言来说,现有的这种强大的优化编译器本身会减少很多工作。世界上还有吗?

GHC可以产生GHC核心,这是一种类似哈斯克尔的中间原始语言。它是在编译器的所有优化之后进行的,包括流融合之类的高级功能。所以我想它可能是你完成任务的完美人选

发件人:

格拉斯哥哈斯克尔编译器(GHC)使用一种称为“核心”的中间语言作为编译器简化阶段的内部程序表示。Core类似于Haskell的一个子集,但具有多态lambda演算(Fω)风格的显式类型注释

GHC的前端将完整的Haskell 98(加上一些扩展)转换为核心。然后,GHC优化器重复转换核心程序,同时保留其含义。GHC types中的“Core Lint”过程在转换过程之间检查Core(至少当用户通过设置编译器标志启用linting时),验证转换是否保持类型正确性。最后,GHC的后端将核心转换为STG机器代码[STG machine],然后再转换为C或本机代码


如果你对书籍感兴趣,我可以推荐克里斯蒂安·奎因内克的《小品Lisp》和安德鲁·阿佩尔的编译器系列书籍(其中一本叫做《连续体编译》,还有两三本关于现代编译器的书,我现在还不知道它们的名字)。我已经有一段时间没有读过它们了,但我认为它们都提供了关于源代码到源代码编译的信息,当然它们都涵盖了各种优化。任何一本像样的编译器教科书都应该有你感兴趣的内容。

请原谅,如果这是真的,其他语言怎么从来没有用它从Haskell生成JavaScript?我认为Haskell->JS天生就有缺陷,因为Haskell有很多特性和差异(比如懒惰),可以转化为MBs和MBs的开销。@Viclib我不能代表JS编译器的实现者说话。您可能有兴趣联系流行的现代Haskell to JS项目社区,如和。关于懒惰,您应该知道,即使在Haskell中,它也不能总是被优化掉,这就是为什么我们在运行时有“Thunks”。STG是GHC管道中从堆芯开始的一个阶段@3个小时的尝试后,托梅利的情况非常糟糕,我无法快速编译。似乎它在OSX上不起作用。请注意,因为您计划编译为JavaScript:您听说过Google的吗?从JavaScript到JavaScript的内联似乎相当繁重。是和否,heavy不是您应该使用的形容词。它的优化是微不足道的。不过,这并不是因为它的错误,很多东西根本无法在纯JS->JS中优化。流融合是完全不可能的。(未来编译器/优化器的测试用例)。纠结的基于列表的代码(在Haskell中),它实际上只表示一个嵌套循环,使用一个临时数组。-说到循环,您是否熟悉和。这可能是相关的(或者只是一个历史背景)。所有这些都非常有用,谢谢!