为编译成JavaScript的引用透明语言优化向量操作的技巧?

为编译成JavaScript的引用透明语言优化向量操作的技巧?,javascript,algorithm,data-structures,immutability,Javascript,Algorithm,Data Structures,Immutability,我正在创建一个从语言到JavaScript的编译器。根据定义,这种语言具有引用透明的功能。对于JavaScript来说,这意味着矩阵/向量和等数值运算的大量开销,因为每次运算都必须创建新数组。我试图找出一个解决办法,但事实证明比我想象的要复杂。有什么办法可以解决这个问题吗?你也许可以从或中得到一些线索 我知道他们在这方面都做了很多工作。处理引用透明函数的常用方法是什么 我的看法是,您希望缓存函数的输出,但如何处理作用域和垃圾收集 如果您没有实际实现引用透明的函数,而是尽了最大的努力,该怎么办。同

我正在创建一个从语言到JavaScript的编译器。根据定义,这种语言具有引用透明的功能。对于JavaScript来说,这意味着矩阵/向量和等数值运算的大量开销,因为每次运算都必须创建新数组。我试图找出一个解决办法,但事实证明比我想象的要复杂。有什么办法可以解决这个问题吗?

你也许可以从或中得到一些线索


我知道他们在这方面都做了很多工作。

处理引用透明函数的常用方法是什么

我的看法是,您希望缓存函数的输出,但如何处理作用域和垃圾收集

如果您没有实际实现引用透明的函数,而是尽了最大的努力,该怎么办。同一范围内的表达式将受益于缓存,但否则它将不得不重新计算。这解决了垃圾收集的问题


或者,您可以设置一些全局缓存方案,该方案甚至不尝试进行垃圾收集,而只是使用一些具有修剪功能的通用有限空间缓存方案,例如:最近使用的、最常用的或随机替换。这放松了垃圾收集限制。

前者将极其不纯的LLVM IR编译成JavaScript,后者将传统的JavaScript编译成机器代码。两者都与OP的问题无关,Javascipt是一种带有emscripten的目标语言。机器代码是v8的目标(来自javascript)。通过将它们链接在一起,您可以看到它们为数值运算和矩阵所做的设计选择。因此,如果您在c中创建了一个简单的矩阵操作,将其编译成javascript并在v8中运行,那么您就能够从操作的角度衡量设计选择的效率。然后,更改c程序,您可能会看到他们处理不同情况的能力有多好(或有多差)。当OP陷入困境时,有时即使是一个简单的想法也能促使他找到解决方案。但他们都编译不纯净的代码。OP在编译纯函数式语言方面的研究占了相当大的一部分。你做了一些研究,读了一些论文,检查了其他纯语言是如何处理这个问题的吗?@delnan事实上,是的,我读了很多关于这个主题的论文,以及Clojure的作者写的一本关于结构的好书。实际上我读了很多书。但我这么问是因为我无法找到一种用JavaScript解决这个问题的方法,因为我只知道它能处理什么。虽然JS在某些情况下有点快,但在不造成性能灾难的情况下编译不同的语义并不是那么简单。