Golang 的编译器是用什么语言写的?

看起来像是个“鸡生蛋,蛋生鸡”的问题,实际上不是的。 (推荐学习:go)

这个问题的关键在于理解,编译器本身就是一个程序,它的功能就是把源代码翻译为计算机可执行的程序。

对于 C/C++、Go、Rust 这样的本地语言,它们编译生成后的目标程序就是目标平台的本地可执行程序。比如你用这三种语言写个 Hello World,在 Windows 平台下用编译的结果一定是一个 .exe 文件,这些 .exe 文件里面没有包含任何源语言的信息。

Windows 运行它们的时候不知道,也不需要知道这些 .exe 文件编译之前是用什么语言写的,只需要把它们加载进内存,一句一句地执行指令就行了。

编译器程序也是这个道理。

假如你发明了一种新的语言 CNifeLang,首先需要用一种现有的语言写一个 CNifeLang 的编译器,比如说就用 Golang 吧;

你用 Golang 写了一个 CNifeLang 的编译器,能成功地把任何合法的 CNifeLang 源代码编译为等价的目标程序。

接着用 CNifeLang 写一个程序,它与你用 Golang 写的编译器功能完全相同,用 Golang 实现的编译器把这个程序编译完成,你就得到了一个用 CNifeLang 实现的 CNifeLang 编译器。

因为这个程序的功能与用 Golang 写的编译器完全相同,所以你完全可以用这个编译器去编译 CNifeLang,于是 CNifeLang 实现了 自举。

如果题主学习了编译原理这门课,就会发现编译与编程语言是没有关系的,它有一套完整而成熟的操作方法,你完全可以用任何一种图灵完备的语言去写任何一种形式语言的编译器,而且有严格的数学方法证明你写的编译器是正确的。

我们常见的编程语言基本都实现了自举,这是一种编程语言发展成熟的标志之一。因为编译器既是一个复杂的工程,也有一套成熟的评价体系,能写出成熟可用、效率有保证的本语言编译器,就能说明这种语言已经能拿来用了。

更多相关文章

  1. go语言数据类型转换教程
  2. Go语言中GOROOT、GOPATH、GOBIN详解
  3. golang的编译器是什么
  4. 从go语言闭包谈函数式编程
  5. go语言中函数与方法介绍
  6. Go语言使用正则表达式提取网页文本
  7. go语言环境vim配置详解
  8. Go语言的内存模型介绍
  9. Go语言结构体与初始化图文详解

随机推荐

  1. linux 下常用音频格式的转化
  2. Linux nginx 配置 location 语法 正则表
  3. 常见压缩格式的区别,及 Linux 下的压缩相
  4. U-Boot启动过程源代码分析(2)-第二阶段
  5. Linux下各类TCP网络服务器的实现源代码
  6. 【转】刚发现一个linux在线文档库。很好
  7. windows下virtualbox中Ubuntu与主机通过s
  8. Re:从零开始的Linux之路(基础篇)
  9. 如何发送一个字节(或字节)来测试在我的应用
  10. Linux产生随机数的几种常见方法