将类似JavaScript的结构编译为静态、快速C++;? 关于编译器从一个非常类似于JavaScript到C++的语言的发展,我需要一种表示数据结构的方法。JavaScript的主要数据结构是数组和哈希表。数组更加严格:我可以使用非类型指针的向量。它需要是一个向量,因为JS数组是动态的,它需要是指针,因为JS数组可以容纳任何类型的对象,例如: var array = [1,2,[3,4],"test"];

将类似JavaScript的结构编译为静态、快速C++;? 关于编译器从一个非常类似于JavaScript到C++的语言的发展,我需要一种表示数据结构的方法。JavaScript的主要数据结构是数组和哈希表。数组更加严格:我可以使用非类型指针的向量。它需要是一个向量,因为JS数组是动态的,它需要是指针,因为JS数组可以容纳任何类型的对象,例如: var array = [1,2,[3,4],"test"];,javascript,c++,c,data-structures,compiler-construction,Javascript,C++,C,Data Structures,Compiler Construction,除此之外,我看不到一种表示这个的方法(有吗?)。对于散列,我可以使用类似的东西,除了包括访问时的字符串散列步骤 问题是: JavaScript散列是JIT编译成实际的C++对象,可能比散列< /强>快得多。这样,我恐怕像这样生成C++的尝试实际上会导致比JavaScript版本慢的代码!p> 这有意义吗 使用编译器的最佳方法是什么 如果这是一个AOT编译器,那么很明显,您只能处理在编译时看到的哈希键。在这种情况下,您可以将对已知键的哈希访问更改为数组访问,为每个已知键指定一个小整数作为索引。简单

除此之外,我看不到一种表示这个的方法(有吗?)。对于散列,我可以使用类似的东西,除了包括访问时的字符串散列步骤

问题是:<强> JavaScript散列是JIT编译成实际的C++对象,可能比散列< /强>快得多。这样,我恐怕像这样生成C++的尝试实际上会导致比JavaScript版本慢的代码!p>

  • 这有意义吗
  • 使用编译器的最佳方法是什么

  • 如果这是一个AOT编译器,那么很明显,您只能处理在编译时看到的哈希键。在这种情况下,您可以将对已知键的哈希访问更改为数组访问,为每个已知键指定一个小整数作为索引。

    简单地复制JavaScript JIT编译器的功能,并为常见对象模式创建隐藏类如何?您已经发现了快速动态语言实现在运行时进行自适应优化的许多原因之一。AOT编译器不适合这些语言。如果您想在这方面与JIT编译器竞争,请不要编写AOT编译器。您可以使用Boost变体或任何库来处理动态类型,而无需(必要的)动态内存分配。如果你感到受虐狂,也可以写下你自己的歧视工会类型。这就是为什么这是一个如此强大的工具的原因之一。感谢您的文章和评论!很有见地。(现在我只是在想我可以使用另一种结构,这种结构功能强大,不会造成编码困难——这是我的语言,所以我不需要JS数组);f({a:1,b:2});f({a:1,c:2})在这种情况下,编译器知道键
    a
    b
    c
    将始终被访问,并且可以将哈希转换为简单的偏移访问。哪个偏移?不同的成员集需要不同的偏移。由于您提出的是一个数组,而不是一个整数哈希表,因此您必须为每个对象保留与整个程序中使用的属性名称一样多的插槽。JIT编译器可以不受影响,因为它们专门为特定对象布局编写代码,但AOT编译器无法做到这一点。哦,但是在您给出的示例中,
    f
    可以内联到这些文本的调用站点中。显然,这不可能在任何地方、每个对象上都做到。是的,这个例子被简化了,因为我懒得写一个更复杂的例子。