QML 的底层实现之 JavaScript 变量编码



  • QML 是基于 ECMA-262(JavaScript),通过 Qt 的机制进行拓展的高级编程语言。下面会简单讲讲 JavaScript 变量是如何在 C++ 中定义的。

    先看如下一段话:

    We use two different ways of encoding JS values. One for 32bit and one for 64bit systems.

    In both cases, we use 8 bytes for a value and a different variant of NaN boxing. A Double NaN (actually -qNaN)
    is indicated by a number that has the top 13 bits set. The other values are usually set to 0 by the
    processor, and are thus free for us to store other data. We keep pointers in there for managed objects,
    and encode the other types using the free space given to use by the unused bits for NaN values. This also
    works for pointers on 64 bit systems, as they all currently only have 48 bits of addressable memory.

    On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value that
    will make the number a NaN. The Masks below are used for encoding the other types.

    On 64 bit, we xor Doubles with (0xffff8000 << 32). That has the effect that no doubles will get encoded
    with the 13 highest bits all 0. We are now using special values for bits 14-17 to encode our values. These
    can be used, as the highest valid pointer on a 64 bit system is 2^48-1.

    If they are all 0, we have a pointer to a Managed object. If bit 14 is set we have an integer.
    This makes testing for pointers and numbers very fast (we have a number if any of the highest 14 bits is set).

    Bit 15-17 is then used to encode other immediates.

    大意如下:

    使用两种不同的方式对 JS 值进行编码,一种是 32 位,一种是 64 位。

    在这两种情况下,使用 8 字节(int64)保存一个值或者一个包装了非数字变量的变体。使用前 13 个 bit 来标定 -qNaN,其他位一般置为零以便使用。在后 51 位中可以保存被管理对象的指针或者其他值,这是适用 64 位操作系统,因为现有的 64 位操作系统,一般只是用 48 位(2^48-1)进行寻址,这意味着有多余的 16 位( 2^16+1 )是不会被使用的。

    在 32 位系统上,直接将双精度浮点数进行保存。高 32 位配合位遮罩保存不同的非数字变量,例如 int 和指针。

    在 64 位上,通过 0xffff8000 << 32 这个位遮罩存取浮点数,这样的效果是,不直接对双精度进行编码,最高的 13 位直接置为零。现在可以使用 14~17 位对其他值进行编码,在64位系统上的最高有效指针是2 ^ 48-1。

    如果最高的 14 位全为零,那么低 48 位保存的是一个指针,如果第 14 位置为 1,保存的便是一个整数。这让数字和指针在运算过程中变得十分快速。(最高的 14 位中,任意一位为 1,保存的便是整数)

    然后使用 15-17 位来编码其他立即数。

    总结一下,就是使用 int64 作为 JavaScript 运行的 var,这个 var 可以保存数字或者指针。

    代码在这里 qv4value_p.h



  • @qyvlik 厉害,都研究到v4引擎来了。那么,作为我们QML开发者,需要注意那些呢?想知道知道。👷



  • @jiangcaiyang123 这种应该是 tagged pointer 的原理。



  • @qyvlik 能具体介绍一下吗?好像还是不懂的样子…………


Log in to reply
 

最近的回复

  • E

    是不是好久都没有人了,站主找到工作了,还是说划水了

    read more
  • 请问一下如果原Qt桌面软件支持拖拽外部文件进去(比如把在用资源管理器里的一张图片拖拽到软件界面上就会显示这张图片),转成Webassembly之后这种拖拽操作还是否有效?劳烦大佬帮我试试看,可以的话我就学QML了

    read more
  • H
    Toou 2D 拿来即用,为简单而生。

    简称T2D,是一款采用自身模块规范编写的轻量级UI框架,遵循Qt书写与组织形式门槛极低无需深入学习简单易用可拿来即用,丰富的控件模块适合界面的快速开发,让程序人员拥有更多的精力来实现业务逻辑与算法。

    统一交互规范,丰富的Ui控件几十种常用控件放弃了Qt Controls 及 Controls 2 来提高性能。

    完善的主题系统,业务逻辑与界面主题设计分离,可通过简单修改变量自定义主题皮肤。灵活的多主题皮肤绑定机制、在不需要重启App即实现一键换肤

    ini皮肤配置规则与每一个控件融合。可在应用内配置也可在应用外动态扩展配置。

    框架自动化安装支持动态库、静态库多模式编译。使用方便更安全更自由。

    提供丰富Demo、全面的帮助文档,Api查阅快速方便。项目必备开源框架!

    已经集成最新版 Font Awesome 4.7

    开源地址:https://github.com/ShowFL/Toou-2D

    read more
  • 刚刚毕业,工作用QT开发,以后有问题多多请教各位前辈😬 抱拳了。

    read more

关注我们

微博
QQ群