编译器 简单总结

参考自:mirrors / starkwang / the-super-tiny-compiler-cn · GIT CODE

 比较简单的理解一下步骤:


比如要计算这个的值:2 + (4 - 2)

lisp 风格的代码实现:(add 2 (subtract 4 2))

C 风格的代码实现: add(2, subtract(4, 2))

现在把lisp编译成C(可以理解为由es6编译成es5。。。就这样理解吧)

1、把原始代码(lisp风格)分割成一些被称为 Token 的东西


 *
 *   (add 2 (subtract 4 2))
 *
 * 它产生的 Token 看起来或许是这样的:
 *
 *   [
 *     { type: 'paren',  value: '('        },
 *     { type: 'name',   value: 'add'      },
 *     { type: 'number', value: '2'        },
 *     { type: 'paren',  value: '('        },
 *     { type: 'name',   value: 'subtract' },
 *     { type: 'number', value: '4'        },
 *     { type: 'number', value: '2'        },
 *     { type: 'paren',  value: ')'        },
 *     { type: 'paren',  value: ')'        }
 *   ]

2、将 Token转换为抽象语法树(AST),AST描述了代码语句中的每一个片段以及它们之间的关系。

 * AST像这样:
 *
 *   {
 *     type: 'Program',
 *     body: [{
 *       type: 'CallExpression',
 *       name: 'add',
 *       params: [{
 *         type: 'NumberLiteral',
 *         value: '2'
 *       }, {
 *         type: 'CallExpression',
 *         name: 'subtract',
 *         params: [{
 *           type: 'NumberLiteral',
 *           value: '4'
 *         }, {
 *           type: 'NumberLiteral',
 *           value: '2'
 *         }]
 *       }]
 *     }]
 *   }

3、通过添加、移动、替代现有的 AST 生成一个全新的 AST,也就是lisp风格的AST转换成C风格的AST。

4、根据C风格的AST,生成C风格的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值