TypeScript 100.0%是如何用TypeScript编写的?

M98*_*M98 53 javascript compiler-construction typescript

GitHub上的TypeScript存储库中,根据GitHub,存储库只包含100.0%TypeScript (.ts文件)

在此输入图像描述

它是如何工作的?以及TypeScript如何将其自身编译为JavaScript?

ssu*_*ube 59

这称为编译器引导,并且由于多种原因而很常见,尤其是您正在编写的语言通常是用于理解您正在编写的语言中实现的概念的最佳语言...

如果你看一下这篇文章,大多数主要语言都有自托管编译器(C,C++).这样做意味着您通过新的编译器运行大量代码,这是对功能的良好测试.在通常的情况下,你正在编写一个编译器,因为你想要一种新语言,它比你当前的语言有一些好处,所以能够在编写编译器时利用这些好处是有道理的.

第一遍必须用现有语言编写,但是一旦有了编译器,就可以用它来编译下一个版本,依此类推.显然,这限制了编译器仅使用n-1修订版中的功能,但是因为您控制编译器应该是次要问题.引用维基百科:

C++编译器clang的主要部分是用C++的子集编写的,可以用g ++和Microsoft Visual C++编译.

由于TypeScript是JavaScript的超集,因此编译器可以(理论上)用共享语法编写并在其中编译.我不相信这种情况,但这种关系确实为初始编译器提供了良好的起始语言.

  • @Kermani,但由于 Typescript 是 JavaScript 的超集,因此您可以在 TS 中编写有效的 JS 程序,对其进行编译,然后使用它来编译使用更多语言功能的 TS 程序,依此类推。从技术上来说,可能是一路下来的TS。大多数其他转译器都不是严格的超集(例如 C 和 C++),因此它们无法充分利用这一点。 (2认同)
  • 我的理解是:TS 是 JS 的超集 ==> JS 是 TS ==> 任何 JS 代码也是 TS 代码 ==> TS 编译器是 100% 用 TS 编写的。 (2认同)

Iva*_*ski 26

我只想添加一些我认为有趣的东西。

在 git 中,您可以有一个名为.gitattributes的文件。Github 有一个名为linguist的项目,它可以使用该文件作为每个存储库中的语言详细信息部分。在打字稿存储库中有一个.gitattributes文件,其内容如下:

*.js linguist-language=TypeScript
* -text
Run Code Online (Sandbox Code Playgroud)

您可以 fork 打字稿存储库,删除该文件,提交到 github 并等待一段时间,直到他们的存储库分析工作完成并且语言图会发生变化。没有 gitattributes 的 typescript repo 语言统计信息

  • 这是一个很棒的答案,我想很多可能提出这个问题的人都不知道这个文件。也许您也可以共享 Typescript 分叉存储库的链接,而无需该特定文件 (3认同)

dar*_*gua 18

Typescript是自托管的,并且维护自身的Last-Known-Good(LKG)版本以编译下一个版本.目前(2016年8月30日)该版本位于lib目录中.

  • @JerryGreen JavaScript 我很确定 (2认同)