【问题标题】:How dynamic variables implemented for Node.JS in C++如何在 C++ 中为 Node.JS 实现动态变量
【发布时间】:2016-07-25 12:56:35
【问题描述】:

首先,我是 C/C++ 初学者,请见谅。

在 Node.JS 中,所有变量都是动态的,我们可以将变量转换为任何类型。因此,Node.JS 是用 C++ 编写的,而在 C++ 或 C 中没有动态变量。那么动态变量是如何实现的呢?

在 JS 中:

var A;
A = 5; //Integer
A = "Hello world!"; //String
A = 2.5; //Float
A = 5 * "Hello world!"; // I do not sure about this one.

【问题讨论】:

  • 哦,C++11 有动态类型的变量;编译器或标准运行时不会为您清理它们。您可以尝试使用与 RTTI 标志配对的union 创建一个(例如:std::type_info)。请注意,在 C++17 中,将有一个标准化的 std::any,它是一个可以安全地为任何类型的对象。
  • 看看std::anystd::variant。不完全一样,但很相似。它们可能尚未在每个系统中实现,因为它们将成为 C++17 的一部分。
  • 我觉得这个问题太笼统了。也许您可以通过关注动态变量的某些方面或某些特定的 JS 代码来使其变得更好?
  • 另外,请记住,Node.JS 使用的 JavaScript 引擎 V8 是用 C++ 编写的,但这并不意味着 JS 代码会被翻译成 C++。
  • 通常实现动态类型的方式(我认为这就是您要问的......),那么如果我们有例如两种类型(struct my_intstruct my_string),那么这两种共享一个共同的结构头。该空间被所有类型占用并包含类型信息。投射时保留此标头有一些保证...

标签: c++ c++11 language-design dynamic-variables


【解决方案1】:

有两种很好的方法。

第一个是将局部变量视为一系列值的名称。这允许您使用 ,而不是变量,并且值具有类型,即使变量没有。

处理它的一种不太有效的方法是创建多态存储,例如boost::anystd::any。在 JS 的情况下,只有几个基本类型,所以 boost::variantstd::variant 绰绰有余。 (复杂的 JS 对象只是修饰的键值映射)。

variant 是一种标记联合。数据结构有一个整数或枚举来说明存储的类型,然后是一个可以被视为任何这些类型的存储块。访问器检查类型,然后与数据进行交互,就像它是该类型一样。

标记的联合可以通过手动销毁存储的数据(使用.~X() 语法)将存储的数据替换为不同类型的数据,然后在该位置手动创建新类型(使用placement-new 语法)。在 C 中执行此操作与语言支持基本相同。

第一种技术 - 找出真正存在的类型并使用它 - 往往要快一个数量级(在我看到它分析的情况下),因此智能脚本引擎非常努力地工作做到这一点。但第二个功能足够了。

现在,我不知道node.js 是否真的被重新编译为 C/C++ 代码。但是经过编译和解析和字节码的层级之后,它将被 C/C++ 或汇编解释器解释,或者它会自己编译成机器码,而无需经过 C/C++ 中间步骤。这个问题的机器码解决方案无论如何都相当于C/C++的解决方案。

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 2013-01-09
    • 2017-03-30
    • 2014-08-06
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2014-07-12
    相关资源
    最近更新 更多