Skip to content

Commit

Permalink
update doc of architecture
Browse files Browse the repository at this point in the history
  • Loading branch information
vita-dounai committed Sep 13, 2020
1 parent 29be4c0 commit 9b00cf9
Showing 1 changed file with 1 addition and 9 deletions.
10 changes: 1 addition & 9 deletions docs/in_depth/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,9 @@ Rust源代码文件编译需要经过下列阶段(我们在图中省略了优
与C/C++中宏处理(展开#include的头文件、替换#define的符号等)是发生在预编译阶段不同,Rust语言并没有预编译阶段,其宏展开是发生在的完成语法分析后。也正是因为如此,Rust宏能够获得更详细、更复杂的编译期信息,从而提供极为强大的功能。
```

<br>

2. 随即,编译器启动语法分析流程,将词法分析生成的标记树翻译为AST。AST的全称是**A**bstract **S**yntax **T**ree,即抽象语法树。在计算机科学中,AST是源代码语法结构的一种抽象表示,能够方便地被编译器处理。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。上述第1步中生成的样例标记树会被翻译为如下图所示的AST:

<img src="../../images/in_depth/architecture/ast.png" width = "50%" height = "50%" alt="图片名称" align=center />

<br>
<br>
<br>
![](../../images/in_depth/architecture/ast.png)

3. 然后,编译器开始分析AST并执行宏展开过程。此阶段是是最为重要的阶段,因为Liquid主要工作在这个阶段。以[HelloWorld合约](../quick_start/introduction.md)为例,编译器构造出HelloWorld合约的AST后,当扫描至AST中表示"```#[liquid::contract(version = "0.1.0")]```"的语法树节点时,编译器能够知道,此处正在调用[属性宏](https://doc.rust-lang.org/reference/procedural-macros.html#attribute-macros)(Rust中一种特殊的宏),因此会开始寻找`contract`属性宏的定义并尝试进行宏展开。在Liquid中,`contract`属性宏的定义如下:

Expand All @@ -53,8 +47,6 @@ Rust源代码文件编译需要经过下列阶段(我们在图中省略了优

具体到Liquid的`contract`属性宏,当编译器进行展开时,`contract`属性宏会获取到自身及其后跟随的`mod`(即我们用来定义合约状态及合约方法的模块)的标记序列,并将其解析为一颗AST。随后,`contract`属性宏会自顶向下扫描这颗AST,当遇到使用```#[liquid(storage)] struct ...```语法定义的合约状态时,会进行语法检查及代码变换,将对结构体成员的读写操作变为对链上状态读写接口的调用。同理,在合约代码中使用```#[liquid(event)] struct ...```定义事件、使用```#[liquid(methods)] impl ...```定义合约方法等也会经历同样的代码变换过程,只是变换及桥接到区块链底层平台的方式不尽相同。

<br>

4. 编译器将进行宏展开之后的AST翻译为可执行文件:若是需要在本机运行单元测试,则会将AST翻译为本机所使用的操作系统及CPU所能识别的可执行文件格式及二进制代码;若是需要可以在区块链上部署运行,则会将AST翻译为Wasm格式字节码。至此,合约的基本构建流程结束。

从Liquid的实现原理中可以看出,Liquid可以理解为是一种以Rust语言目标语言的编程语言。编译器的广义定义是一种会将某种编程语言写成的源代码转换成另一种编程语言计算机程序,因此实际上Liquid的宏展开过程一定程度上扮演了编译器的角色,从而让您在编写合约时更加便利、自然。如果您对[HelloWorld合约](../quick_start/introduction.md)完全展开后的代码形态感兴趣,可以参考[这里](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a2ac3d836b0fdce414e656019b454c82),您可能会发现这些代码极其晦涩,但幸运的是,您完全不需要和这些代码打交道,Liquid会帮您打理好一切:)。
Expand Down

0 comments on commit 9b00cf9

Please sign in to comment.