编程语言实现了自举是什么含义

2019-12-24 11:15:47 +08:00
 pythonee
假设语言 x
那么它的编译器是 x 语言编写的,那么编译器的编译器也是用 x 编写的,那么谁来编译这个“编译器的编译器”呢
感觉是无穷尽也

应该最小的那个不可再分的是用别的低级语言写的吧,那么还可称自举吗
9037 次点击
所在节点    程序员
30 条回复
hehheh
2019-12-24 15:16:55 +08:00
@qinliming 这么说就太抠字眼了。。。如果编译器的最终产品是什么?可执行文件对吧? objective file 算啥?算是最终产品吗?可是他怎么执行啊。。。所以 linker 干的事情也不算编译了?
pythonee
2019-12-24 15:20:00 +08:00
ac2sherry
2019-12-24 15:30:32 +08:00
@qinliming 说的对,是我混淆了。
FrankHB
2019-12-24 15:36:37 +08:00
某乎那个问题没到点,重点就是 @secondwtq 提的:最开始的 bootstrap 不要求编译。

@Cu635 @qinliming
汇编显然不是机器码,否则就没汇编器什么事了。
严格意义上讲,编译器是允许以批处理形式执行的把源程序翻译成目标程序的翻译器,而汇编器是一种简化的编译器。现代的不少编译器工具链直接包含汇编器作为其中的一个组件。
只不过历史上提出编译器概念的时候着重强调和机器无关,而当时的汇编普遍都是依赖机器的,所以在讨论高级语言的编译器时汇编器就往往被隐含排除了。

@hehheh Python 还真有编译,.pyc 就是编译出来的东西,只不过编译出的目标代码是中间的字节码而不是体系结构相关的本机代码而已。
注意编译器不一定要求输出可执行程序。而且,你现在在宿主语言实现看到的编译器也好单独汇编器也好,其实都是以编译器驱动(driver) 去调用链接器输出的,单独的不管是高级语言的翻译还是低级的汇编步骤都只生成包含目标代码的对象文件(object file) 而不是可执行程序。而排除编译器驱动和链接器的工具链仍然能叫编译器。

@ac2sherry 预处理记号、伪指令、宏以及其它注记这些可选的部分都可以不对应目标代码。
实际上,汇编语言也不一定需要是和机器相关的低级语言。用汇编器的形式实现高级汇编语言完全没有理论问题,只是大部分汇编语言都是硬件和个别适配具体体系结构的汇编器厂商提供的,很少有人这样设计而已——为什么放着高级语言的通用翻译技术而要纠结按传统汇编器那样使用助记符引导宏展开去实现一个编译器呢?
hehheh
2019-12-24 15:42:33 +08:00
@FrankHB 刚想多杠几句来着,一看是帝球,算了算了。手动滑稽
akira
2019-12-24 23:08:49 +08:00
@hehheh 机器码是给 cpu 执行的,汇编是给人看的,两者其实是同一个东西。

举个例子,字符"a" 是给人看的,对应的 ascii 是 65,你非要说人看的 a 和 ascii 的 65 不是一回事,那也没办法
CEBBCAT
2019-12-25 02:06:46 +08:00
KeyboardManAnAn
2019-12-25 12:10:09 +08:00
@Kaiv2 很形象的比喻
Cu635
2019-12-25 12:57:08 +08:00
@hehheh
所有机器。因为什么 mov 什么 add 都是“助记符”而已。

“这么说就太抠字眼了。。。”
那不是“抠字眼”而是概念上的不同。

@ac2sherry
那叫汇编器 assembler 不叫编译器 compiler。

@FrankHB
因为汇编跟机器指令基本上是一一对应的,所以在实质和理解上是完全可以说“汇编就是机器码”的。只不过需要转换才要有汇编器来完成。
都是搞计算机的,可以把这个看作进制转换的问题,一个是二进制数字,一个是十进制或者十六进制的数字这样:看着不一样但这是同一个数值的不同进制表示,反过来说虽然是同一个数值,但进制不同中间还是要转换的。

另外,不是“……当时的汇编普遍都是依赖机器的,……”,而是汇编那些什么 MOV 什么 ADD 这些字符串就叫做助记符,是机器码一串 01 没法记忆,为了方便记忆才弄出来字符串的。

别忘了一开始数据和指令的输入可都是打孔纸带呢,那个可就是人肉写机器码了。
FrankHB
2019-12-26 13:04:47 +08:00
@Cu635 现代的 ISA 中所谓的一一对应是一厢情愿的给 noob 灌输的简化,技术上就是错的。
随便举个例子,AT&T 汇编助记符的后缀,你确定能怎么和任意 ISA 的机器码对应?
再如,Intel IA-32 汇编的助记符是可以看成重载过的更高级的简化版本,但是光是指令前缀的使用就依赖处理器当前的操作模式,和机器码不可能简单对应。
在常见的实现中指望一一对应,要么是不懂汇编,要么是不懂机器码,要么是两个都不懂。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631785

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX