我不知道什么是编译,编译时会发生什么?我的意思是,你按下编译或在控制台中键入,但它在“背景”中实际上做了什么?当我编译时会发生什么?
回答
首先编译器"lexes"的源码。这意味着它将源代码转换为一系列“令牌”。令牌是对编译器有意义的字母,数字和符号的序列。
接下来,编译器执行syntactic analysis来创建源的表示以确定源的语义含义。这是编译器构建syntax tree的步骤。
最后,编译器将在目标表示中捕获源的语义含义(如机器码,中间语言(如Microsoft's CIL或其他编程语言))的输出。
有关简要信息,请参阅Wikipedia。有关血淋淋的细节,请参阅the dragon book(每一位计算机科学的学生都应该学习这本书)。
this参见
基本上,魔法精灵和仙女转人类可读代码转换为机器代码。
一个非常简短的概述将是一个编译器分析您的代码检查错误,然后将其转换为字节或机器代码。
为了更好地概述我会读上的编译器维基百科的文章:
编译正在翻译的源代码为机器码。通常,编译器(或解释器)会生成一个中间代码,有时称为字节代码,它在虚拟机上运行(这是编译Java的方式)。字节代码由虚拟机翻译为机器特定的代码,这些代码运行在您定位的特定架构上。这整个过程可以被认为是“编译”
目标往往是,但不一定是机器代码。我编译的编译器编译为C代码 - 然后我们使用本机C编译器完成编译为机器代码的工作。另一个产生一个p代码(伪代码 - 连字符在哪里去?);然后解释器使用常规C(机器代码)函数来执行p代码指令。 Java编译器为JVM生成字节码 - 也不是机器码。 – 2009-09-14 01:17:13
或this。
龙书,建筑编译器的原始来源。
'或'是轻微的误导 - 与什么相比?你的建议阅读很不错,但你应该让自己的答案更接近自己。然后你会得到最后的选票... – 2009-09-14 01:18:39
这是回应我对这个问题的第一个答案,这只是“这个”。作为维基百科关于编译器的文章的链接。 – 2009-09-14 03:05:30
- 1. 当我ping 127.0.0.1时会发生什么
- 2. 当我在编译器级声明一个变量时会发生什么?
- 3. 当我编译AlamofireImage3.1时发生错误
- 4. 编译时发生类模板时发生什么
- 5. 当localStorage已满时会发生什么?
- 6. 当redis重载时会发生什么?
- 7. 当FlatFileFooterCallback出错时会发生什么?
- 8. 当AsyncTasks已满时会发生什么?
- 9. 当crontabs重叠时会发生什么?
- 10. 当EditText有空时会发生什么?
- 11. 当VRAM已满时会发生什么?
- 12. 针对共享库进行编译时会发生什么?
- 13. 当使用no-angle和-no-opengl编译Qt时会发生什么?
- 14. 当发生javascript运行时错误时会发生什么?
- 15. 当程序运行时发生事件时会发生什么
- 16. 当我刷新页面时,我的收藏会发生什么?
- 17. 当我下载JDK时,我的预装JRE会发生什么?
- 18. 当我在脚本运行时编辑脚本时会发生什么?
- 19. 当makefile编辑自己时会发生什么?
- 20. 当在编译指令中有一个编译指示时,OpenMP会发生什么?
- 21. 当JMS侦听器发生异常时会发生什么
- 22. 当primary_key默认发生冲突时,Django会发生什么?
- 23. 当模块初始化发生异常时会发生什么
- 24. 发生故障时会发生什么?
- 25. 什么时候会发生?
- 26. 当我绑定到AliasProperty时会发生什么?
- 27. 当我禁用计时器会发生什么?
- 28. 当我不包含头文件时会发生什么
- 29. 当我用完EC2或GAE资源时会发生什么?
- 30. 当我删除一列时Oracle会发生什么?
谢谢,“(每个计算机科学的学生都应该学习这本书)。”我是一名计算机科学的学生..我从来没有真正知道这本书,我更专注于编程..数据结构,物体bla bla ..从来没有真正想知道“超越” – ant 2009-09-14 01:35:04
+1龙书 – Pwninstein 2009-09-14 02:47:30
非常好的解释。 +1 – Alex 2009-09-14 03:11:47