FIDL编译器


英文原文快照


流水线

加载文件

库中所有FIDL文件的编译都由SourceManager加载。 它的工作是为源代码文件提供缓冲区支持,这些缓冲区在整个编译流水线均保持活动状态。 例如,令牌本质上是一个字符串加上一些描述其源位置(文件和文件中的位置)的元数据。

解析文件

FIDL编译器首先将每个文件解析为内存中的AST,它由ast.h中的结构体所定义。 此解析操作首先将文件读入内存,然后将其内容放入令牌(token)流中,然后再由解析器(parser)将流解析为分层的AST。 此时类型的名称尚未解析(它们可能最终指向另一个文件或库中的类型,或者只是毫无用处的值),并且嵌套声明仍然相互嵌套在AST中。

此阶段如果有任何无效的FIDL文件,那么此步骤将导致失败。

平展FIDL库

将所有文件解析为AST节点后,即可在此阶段平展其表示。

根据FIDL的语言规范,声明可以相互嵌套,例如,常量的声明可以出现在接口或结构体的声明中。 平展操作即是将所有声明设定在同一个级别,因此需要计算这些嵌套类型的完整全限定名称。

解析FIDL库中的名称

FIDL文件的许多部分通过名称来进行相互引用。 例如,结构体可以有一个字段,其类型由某个其他(加以限定的)结构体的名称给出。 任何无法解析的(即不存在于任何给定的文件或库依赖项中的)名称会导致编译在此阶段失败。

库的布局的计算

所有数据结构的布局都将在此阶段被计算。 这里所说的布局包括库定义的所有消息的编码表,以及这些消息的有线格式。 布局在内存中的表示由coded_ast.h中的结构体所定义。

数个方面的问题可能会导致该步骤失败。 如果给定的消息静态地超过通道的消息大小限制,则编译将失败。 另外,静态地超过FIDL解码过程的递归限制也将导致编译失败。

后端生成

到了这个阶段,关于FIDL库本身的任何内容都不会导致编译失败(但特定于某种语言绑定的任何特定内容都可能失败,包括编译器被指定输出结果到不合法的位置上等)。

C语言

C语言的后端绑定直接从库的布局中生成。

JSON

所有其他语言的绑定都由另一个外部程序所生成。