当前位置: 首页 > 网络应用技术

发动机分析:JS中的弦转子值

时间:2023-03-08 19:57:35 网络应用技术

  在JS中,有九种类型的字符串旋转值:

  这些方法的结果的差异如下表所示:

  比较表的源代码已发布到需要获取的https://airing.ursb.me/web/int.html。

  除了运行结果的差异外,这些方法还具有性能差异。在NODEJS V8环境中,这些方法的微型基本测试结果如下:

  可以看出,最低效率,只有大约2%的其他操作,最慢的效率,只有1%。

  为什么有不同的方式?如何在发动机层中解释这些操作?从主流JS发动机(例如V8,JavascriptCore,QuickJS等)的角度来看,它将探索这些方法的特定实现。

  首先看看。

  eCMAScript(ECMA-262)Parseint

  在V8 [→src/init/bootstrapper.cc]中定义构建-in js语言的标准对象。我们可以找到它的定义:

  可以看出,parseint和全局对象的parseint基于注册。它将将API安装在分离株中,并用bundin.js侧调用是发动机侧呼叫。

  内置(内置功能)是一个代码块,当V8在V8中运行时可以执行,该代码块用于在运行时表达对VM的更改。在目前,内置在V8版本中具有以下5个实现方法:

  返回到上一篇文章的功能,您可以在[→src/nelidins/builds.h]中看到定义:

  因此,在此功能中注册的原始名称将在[→SRC/incelions/number.tq]中实现,该名称是基于扭矩的内置实现。

  在查看此代码之前,在科学科学下,V8中的几个数据结构:(可以看到V8中所有数据结构的定义[→SRC/Objects/Objects.h])

  我们知道两个形状的参数在这里是相同的。实现过程如下:

  然后焦点来了。[→SRC/Runtime/Runtime-numbers.cc]

  这种逻辑相对简单,因此我不会解释它。值得注意的是,根据标准,如果不在2?36的范围内,NAN将被返回。

  让我们看一下JavaScriptCore。

  javascriptCore中JS语言的构建对象的注册是[→Runtime/jsglobalobjectfuntiontions.cpp] file ::

  WebKit中的代码注释非常易于阅读,并且不再在此处解释。从[→Runtime/parseint.h]中放置JavaScriptCore的实现。核心代码如下:

  该代码是直接发布的,因为JavascriptCore中的API严格紧随其后的是Ecmascript(ECMA-262)Parseint标准,并且可读性和注释也非常好。强烈建议读者自己阅读。

  QuickJS的核心代码在[→QuickJs.c]中。第一个注册代码:

  实施的逻辑如下:

  贝拉德的代码评论很小,但同时非常精致。

  在这一点上,本文在三个引擎下介绍了其实施。这三个是基于标准实现的,但是由于代码样式不同,因此似乎读了三种样式的三种样式的作品。

  但是,标准和实施,我们可以在实际执行字符串的操作中找到许多领域操作,例如输入法律判断,沉默识别价值,字符串格式判断和正则化,交叉判决等,等等等等,从运行时进行处理。因此,启动其效率略低的原因并不困难。

  接下来,让我们简单地看一下。

  ECMASCRIPT(ECMA-262)parsefloat

  根据标准,parsefloat与Parseint不同:

  V8中的相关逻辑彼此相邻,关键实现直接在此处发布:

  [→src/incelions/number.tq]

  [→src/runtime/runtime-numbers.cc]

  由于标准中的过程更简单,因此更容易阅读更容易。

  在JavaScriptCore中,逻辑的逻辑更简洁明了:

  与JavaScriptCore相比,QuickJS仅为12行:

  [→QuickJs.c]

  但是,经过比较后,QuickJS在这里很短,与ASCII和8bit不兼容。阅读Ecmascript(ECMA-262)parsefloat,您会发现在这里QuickJS的处理实际上没有问题。在最新标准中,没有要求解释器兼容。

  eCmascript(ECMA-262)编号(值)

  作为一个全局对象的数字是在[→SRC/INIT/BOOTTRAPPER.CC]中定义的,并且已在前面介绍的寄存器中引入。让我们回顾一下:

  除了此代码处理外,该代码还已注册,其原型链初始化了它,并将构造函数添加到其原型链中。构造函数是由扭矩实现的内置功能,[→src/builds/constructor.tq]实施如下:

  注释中的1-6一个对应于[ECMASCRIPT(ECMA-262)编号(值)]标准中的过程1-6,因此本文未描述本文。指出该数字支持BIGINT,并且每个引擎的实施也关注这一点,这也证明了我们先前的操作控制表中的结果。

  JavaScriptCore中的该代码缺乏注释,但在逻辑上与V8完全相同。遵循标准:

  [→Runtime/numberConstructor.cpp]

  数字对象的注册代码及其原始链如下所示:

  [→QuickJs.c]

  同样,在注册时将构造函数与原始链绑定:

  值得注意的是,QuickJS正在追求精简的紧凑性,因此它可以配置是否支持BigInt,其余逻辑仍然遵循标准。

  eCmascript(ECMA-262)钻头不运算符

  使用?操作字符使用标准中的第二步来键入计算的值类型转换,从而将字符串转换为一个值。在此处,我们注意发动机中的哪些步骤完成。

  首先查看V8中的一个犯罪运营商的判断:

  [→src/parsing/token.h]

  在add and void范围内定义的OP是一个 - 美元操作员,其中包括(可见[→src/parsing/token.h])。它还将击中一个 - 羽毛符号的判断:

  进入语法分析阶段后,在分析AST树的过程中,将相应地处理一个犯罪计算符号。

  [→src/parsing/parser-base.h]

  [→src/parsing/parser.cc]

  如果单词的表面是数字的,并且一个 - 美元的操作符号不是(!),则该值将转换为数字。

  同样在用于生成AST阶段的语法分析中,在处理tilde(?)之后,在创建表达式时将转换此表达式:

  [→解析器/Parser.cpp]

  [→解析器/astbuilder.h]

  [→解析器/nodeconstructors.h]

  [→解析器/resulttype.h]

  在语法分析阶段中的QuickJS遇到?这个代币会称呼:

  [→QuickJs.c]

  将生成OP_NOT字节码操作员,并将源代码保存在fd-> byte_code中。

  QuickJS解释执行的函数是它调用字节代码的解释,其核心逻辑是呼叫函数。

  可以看出,在解析op_not时,如果是整数,请直接采用它,否则请致电:

  将尝试出现,如果您不能转动,则转动-1,转动后转动。转换的逻辑如下:

  对于字符串,字符串处理中涉及的核心逻辑如下:

  它可以用于处理,否则返回NAN。

  eCMAScript(ECMA-262)Unary Plus操作员

  一个 - 美元计算符号是我最喜欢使用的字符串转子值的方法。在标准中,它没有任何芽。很简短,它用于进行数值类型的转换。

  语法分析阶段与双重旋转(~~)操作员相同,在此不会重复。

  语法分析阶段与双重旋转(~~)操作员相同,在此不会重复。

  语法分析阶段与Double Tilde(~~)运算符相同,该操作员不会在此处重复。最后,我仍然到达。

  [→QuickJs.c]

  可以发现,当操作号码为int或float时,它不直接处理,这与标准中的标准一致。在其他情况下,如果您在呼叫中遇到异常情况,请致电:异常逻辑:

  此处的内部处理逻辑与4.3中的内部处理逻辑相同,我不会详细介绍。处理值转换后,如果运算符是一个售价计算,它将直接返回;否则,它将根据操作员根据操作员进行完成,例如+1,例如自添加的符号。

  在这一点上,我们已经解释了解释器中以下五种方法的具体实现:

  除上述5种数值转换方法外,还有4种方法。由于长度问题,本文将不会详细介绍:

  绳杆的数量具有其自身的优势和缺点。用户可以根据自己的需求进行选择。以下是我个人的一些摘要经验:

  如果仅需要返回值才是塑料:

  如果需要返回值才能浮动 - 点类型: