TypeScript 编译器源码研究(一)
TypeScript (以下简称 TS)是一个非常强大的语言,其编译器源码超过 10000 行。
源码在 Github 可以找到:https://github.com/Microsoft/TypeScript/tree/master/src/compiler
基础概念
只读(immutable)对象
TS 源码大量应用了只读对象来提升解析性能。只读对象即一个普通对象,但无法修改其内部任意属性,如果需要修改,则必须创建一个新的副本。
这个设计使得程序可以只在需要的时候再处理对象,并且把处理的结果缓存起来。因为对象是只读的,所以缓存的数据始终是正确的,不会因为对象更改导致缓存失效。
编译器概念
通用的编译器都需要了解以下概念:
- 语法树(Abstract Syntax Tree):表示源码的基本结构。所有提到编译器原理的地方都会提到语法树,这里不多解释。
- 符号(Symbol):符号表示是一个变量、一个字段或一个函数之类属于“定义”范畴的概念,符号一般会属于某个词法作用域(Scope),且符号可以计算其类型。
- 类型(Type):表示一个数值类型,类型拥有父类型、子成员。
- 流程分支(FlowNode):表示代码从上往下执行的分支情况,通过流程分支可以掌握到从头到当前位置的执行步骤,当然也可以检测到无法执行的代码(比如 return 之后的代码)。
- 函数签名(Signature):表示一个函数的一种参数方式,通过签名可以确定函数的参数类型和返回类型。一个函数可以有多个签名。
---国内研究编译器的人不多,如果你觉得这篇文章有用,请通过评论告知,我将完善内容---
TypeScript 编译器源码研究(一)的更多相关文章
- OAuth2学习及DotNetOpenAuth部分源码研究
OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...
- Android开源项目 Universal imageloader 源码研究之Lru算法
https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...
- zepto源码研究 - zepto.js - 1
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
- dubbo源码研究(一)
1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...
- 【JavaScript】$.extend使用心得及源码研究
最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. ...
- underscore.js源码研究(8)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(7)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(5)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
随机推荐
- 【转】libxml2 如何获得某个节点的所有信息
网址:http://bbs.csdn.net/topics/380115580 顶楼: 我的需求是这样的,我使用libxml2从内存中解析一个xml文件,需要修改某个节点下的一个子节点,修改完成之后, ...
- HDU2017新生赛 找方块
思路: 先n^3预处理出每个点能到达的(1010串)最上面的行下标. 然后再n^3暴力一下,对于每个点,往左走看能走到哪,边走边更新面积. 代码: #include<bits/stdc++.h& ...
- Codeforces 839B - Game of the Rows
839B - Game of the Rows 思路:先放4个的,然后再放2个的,最后再放1个的. 代码: #include<bits/stdc++.h> using namespace ...
- 雷林鹏分享:Ruby 安装 - Windows
Ruby 安装 - Windows 下面列出了在 Windows 机器上安装 Ruby 的步骤. 注意:在安装时,您可能有不同的可用版本. 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 R ...
- English trip -- VC(情景课)1 F Another view
Another view 另一种观点 拓展应用 Life-skills reading 生活技能阅读 Midtown Adult School 中城成人学校 NAME: Samir Ahmed ...
- LeetCode--121--卖卖股票的最佳时机
问题描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出 ...
- LeetCode--058--最后一个单词的长度
问题描述 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: ...
- Confluence 6 为站点禁用匿名用户访问
希望为你的站点禁用匿名用户的访问,取消选择 可以使用(can use)前面的选择框,然后选择 保存所有(Save All).这时候,用户应该禁止访问你的站点直达这些用户登录你的 Confluence ...
- POJ-3744 Scout YYF I (矩阵优化概率DP)
题目大意:有n颗地雷分布在一条直线上,有个人的起始位置在1,他每次前进1步的概率为p,前进两步的概率为1-p,问他不碰到地雷的概率. 题目分析:定义状态dp(i)表示到了dp(i)的概率,则状态转移方 ...
- @ConditionalOnProperty 详解
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Documented @Con ...