-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
重学js —— 算法约定(阅读规范需要) #67
Labels
重学js
重学js系列 规范+MDN
Comments
This was referenced Jan 13, 2020
Open
Open
This was referenced Jan 22, 2020
Open
This was referenced Feb 11, 2020
This was referenced Feb 21, 2020
Open
This was referenced Mar 7, 2020
This was referenced Mar 22, 2020
This was referenced Apr 24, 2020
This was referenced May 5, 2020
This was referenced May 22, 2020
Open
This was referenced Jun 2, 2020
This was referenced Jun 10, 2020
This was referenced Jun 20, 2020
This was referenced Jun 28, 2020
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
算法约定
该规范通常使用编号列表来指定算法中的步骤。这些算法用于精确指定ECMAScript语言构造所需的语义。这些算法并不意味着使用任何特定的实现技术。实际上,可能有更有效的算法可用于实现给定功能。
算法步骤可以细分为连续的子步骤。子步骤是缩进的,它们本身可以进一步分为缩进的子步骤。大纲编号惯例用于标识第一级子步骤(用小写字母字符标记)和第二级子步骤(用小写罗马数字标记)的子步骤(我翻译全用了阿拉伯数字。。。)。如果需要三个以上的级别,这些规则将使用数字标签在第四个级别重复。例如(用了国内祖制来代替说明):
顶级步骤
a. 子步骤
b. 子步骤
一个步骤或子步骤可以写为一个 if 谓词,用于限定其子步骤。在这种情况下,仅当谓词为 true 时才应用子步骤。如果某个步骤或子步骤以单词 else 开头,则该谓词是前面的 if 谓词步骤在相同级别上的取反。一个步骤可以指定其子步骤的迭代应用。
以 Assert: 开始的步骤 断言其算法的不变条件。此类断言用于产生显式的算法不变量,否则它们将是隐式的。这样的断言不增加任何附加的语义要求,因此不需要由实现来检查。它们仅用于阐明算法。
算法步骤可以使用 Let x be someValue 的形式为任何值声明命名别名。这些别名与引用类似,因为 x 和 someValue 都引用相同的基础数据,并且对两者的修改都可见。想要避免这种类似引用行为的算法步骤应该显式地复制右侧代码:Let x be a copy of someValue 会创建 someValue 的浅表副本。声明后,别名可以在任何后续步骤中引用,并且一定不能从别名声明之前的步骤中引用。别名可以使用 Set x to someOtherValue 的形式进行修改。
抽象操作
为了便于在本规范的多个部分中使用它们,某些算法(称为抽象操作)以参数化功能形式进行命名和编写,以便可以从其他算法中按名称进行引用。通常使用功能性应用程序样式(例如 OperationName(arg1,arg2))来引用抽象操作。一些抽象操作被视为 类规范 抽象的多态调度方法。通常使用诸如 someValue.OperationName(arg1,arg2) 之类的应用程序样式来引用此类类似于方法的抽象操作。
语法定向的操作
syntax-directed operation 是一个命名操作其定义由 算法 组成,每一个算法都与一种ECMAScript语法的一个或多个结果相关联。具有多个备选定义的产出通常会对每个备选方案使用不同的算法。当算法与语法产生关联时,它可以引用生产替代方案的终端和非终端符号,就好像它们是算法的参数一样。当以这种方式使用时,非终结符是指在解析源文本时匹配的实际替代定义。由语法产物匹配的源文本是源文本的一部分,该部分从参与匹配的第一个终端的开头开始,到参与匹配的最后一个终端的结尾结束。
当算法与生产备选方案相关联时,该备选方案通常展示时不会伴有 [] 语法注释。这样的注释应该只影响替代的句法识别,而对替代的关联语义没有影响。
通过使用以下算法中的步骤1、3和4的约定,使用解析节点和可选的其他参数调用语法定向的操作:
除非另有明确说明,所有链生产对于可能应用于该生产的左侧非终端的每个操作都有一个隐式定义。隐式定义只是使用相同的参数重新应用相同的操作,如果有的话,到 链生产 的唯一右侧非终端,然后返回结果。例如,假设某个算法的步骤形式为:“返回评估Block的结果”,并且产生了:
但评估操作不会将算法与此生成关联。在这种情况下,评估操作隐式包括以下形式的关联:
运行时语义:Evaluation
Block : { StatementList }
运行时语义
必须在运行时调用的算法称为 运行时语义。运行时语义由 抽象操作 或 语法定向的操作 定义。此类算法总是返回一个 completion record。
隐式完成值
本规范的算法通常隐式返回 [[Type]] 为 normal 的 completion record。除非上下文中另有明确规定,否则返回一个不是 completion record 值的算法语句,例如:
其实等同于:
但是,如果 return 语句的值是 completion record 构造文字,则返回结果 completion record。如果值表达式是对抽象操作的调用,则 return 语句仅返回由抽象操作产生的 completion record。
抽象操作 Completion(completionRecord) 用于强调将返回先前计算的 completion record。Completion 抽象操作使用单个参数 completionRecord,执行以下步骤:
一个没有返回值得 return 语句等同于:
除非完成记录是 突然完成 的,否则在不显式要求 completion record 的上下文中对 completion record 的任何引用都等效于对 completion record [[Value]] 字段的显式引用。
抛错误
抛出 TypeError 错误等同于 返回 ThrowCompletion(a newly created TypeError object)
ReturnIfAbrupt
ReturnIfAbrupt(argument) 等效于:
ReturnIfAbrupt(AbstractOperation()) 等效于:
定义 result 为 AbstractOperation(ReturnIfAbrupt(argument)) 等效于:
ReturnIfAbrupt速记
调用以 ? 为前缀的 抽象操作 或 语法定向的操作。 指示 ReturnIfAbrupt 应该应用于生成的 completion record。例如:
? OperationName() 等效于
? someValue.OperationName() 等效于
相似的,前缀 ! 被用来表示以下对 抽象操作 或 语法定向的操作 的调用将永远不会返回 abrupt completion,并且应使用结果 completion record [[Value]] 字段代替该操作的返回值。
用于 运行时语义 的语法定向操作在调用操作之前通过放置速记 ! 或者 ? 使用:
静态语义
数学运算
该规范参考了两种数值:
在该规范语言中,使用下标将数值和运算(包含加,减,取反,乘,除和比较)区分开来。下标 F指代 Number,下标 R 指代 Mathematical value。每个数字值和运算符后均使用下标。
为了简洁,F 下标可以在 Number 值上省略,没有下标的数值会被解释为 Number。没有下标的运算会被解释为 Number 运算,除非某个参数有特定下标,否则运算将采用该下标。例如:1R + 2R = 3R 是关于数学值(Mathematical value)的陈述,而 1 + 2 = 3 是关于 数字(Number) 的陈述。
总体来说,当规范引用数值,例如这条短语,"the length of y" 或 "the integer represented by the four hexadecimal digits ...",如果没有明确指定数值类型,则默认为 Number。引用数学值(Mathematical value)的短语将这样明确注释,例如,"he mathematical value of the number of code points in ..."。
Number 值 0,也被写作 0F,代表为 双精度浮点正0即。某些情况下,也被写作 +0。
规范中大多数数值采用 十进制;有时也会使用 16进制,格式为 0X 开头,后面跟着数字 0 ~ 9 或 A ~ F。
某些情况下,指定了一个在数字和数学值之间通用的运算。在这种情况下,下标可以是变量;t 被用来实现这一目的,例如 5t x 10t = 50t,对于在 R 和 F 范围内的 t而言,它们涉及的值都在语义一致的范围内。
数学值与数字之间的转换永远不会隐含,在本文档中始终明确。从数学值转换为数字值这样表示:"the Number value for x",且在 Number 类型 中定义。从数字值转换为数学值像这样表示:"the mathematical value of x",或 R(x)。注意,没有定义无限数学值,数学值得 +0 和 -0 都是数学值 0R。
当规范中使用 integer,它引用一个 Number 值其数学值在整数集中,除非另有说明:当规范中使用 mathematical integer,它引用一个在整数集中的 Mathematical value。为了速记,integert 可以指代它们中任意一个,具体由 t 决定。
值表示法
在规范中,ECMAScript语言值用 加黑 表示。例如 null,true 或 "hello"。这些区别于较长的ECMAScript代码序列例如:Function.prototype.apply or let n = 42;
规范的内置值不能直接通过ECMAScript代码观察到的值用 无衬线字体 显示。例如 completion record 的 [[Type]] 值 normal,return,或 throw(PS:我这里用斜体代替了!)
运行时语义:求值(Runtime Semantics: Evaluation)
规范中很多算法第一步就是求值,但是没有链接,一开始我不理解什么意思,随着深入翻译,才意识到算法中的求值其实对应的是 Runtime Semantics: Evaluation。
以 Let initResult be the result of evaluating AssignmentExpression. 为例,这里的 evaluating 对应的是 赋值表达式的 Runtime Semantics: Evaluation
2020-07-16 补充 语法定义
来自 winter《重学前端》理解编译原理:
这种语法定义的书写方式叫 BNF,第一次知道呢
The text was updated successfully, but these errors were encountered: