在 GitHub 上的 TypeScript 存储库中,根据 GitHub 的说法,该存储库仅包含 100.0% TypeScript (.ts 文件)
它是如何运作的? TypeScript 如何自行编译为 JavaScript?
这称为“编译器引导”,很常见,原因有很多,其中最重要的是您正在编写的语言通常是最适合理解您正在编写的语言中实现的概念的语言... 如果你看一下这篇文章,大多数主要语言都有自托管编译器(C、C++)。这样做意味着您正在通过新编译器运行大量代码,这是对功能的良好测试。在通常情况下,您编写编译器是因为您想要一种比当前语言有一些优势的新语言,因此在编写编译器时能够利用这些优势是很有意义的。
第一遍必须用现有语言编写,但是一旦有了编译器,您就可以使用它来编译下一个版本,依此类推。显然,这限制了您的编译器只能使用
n-1
修订版中的功能,但由于您控制编译器,所以这应该是一个小问题。引用维基百科:
C++ 编译器 clang 的主要部分是用 C++ 的子集编写的,可以由 g++ 和 Microsoft Visual C++ 编译。
由于 TypeScript 是 JavaScript 的超集,因此编译器(理论上)可以使用共享语法编写并在其中任一语法下进行编译。我不认为这里是这种情况,但这种关系确实为您的初始编译器提供了良好的起始语言。
在 git 中,您可以有一个名为
.gitattributes 的文件。 Github 有一个名为 linguist 的项目,它可以利用该文件来获取每个存储库中的语言详细信息部分。在打字稿存储库中有一个 .gitattributes 文件,其中包含以下内容:
*.js linguist-language=TypeScript
* -text
您可以分叉 typescript 存储库,删除该文件,提交到 github 并等待一段时间,直到他们的存储库分析工作完成
因此第二个版本的转译器可以用打字稿编写。因此,自第二次迭代以来,所有下一个版本的 ts->js 转译器都是用打字稿构建的。