可以讲编程语言划分为两大类:
- 编译型语言
- 运行前,先由编译器将高级语言的代码编译成对应机器的cpu汇编指令,然后再有汇编器汇编为目标机器码,生成可执行文件,然后运行最终生成的可执行文件
- 解释型语言
- 运行时,由翻译器将高级语言代码反应成中间代码,并由解释器将该中间代码解释成机器码并执行,相当于编译和执行二合一
编译一个C程序分为四个阶段:
1、预处理阶段
2、生成汇编代码阶段
3、汇编阶段
4、链接阶段
ps:也就是说,gcc会生成汇编的.o文件,然后通过链接,生成.out文件
编译的主要步骤有:词法分析->语法分析->语义分析及相关的优化->中间代码生成->目标代码生成(汇编文件.s)
关于gcc、g++和gdb
linux中,使用gcc来编译c程序,用g++来编译c++程序,用gdb来调试程序
安装g++:
yum install gcc-c++
安装gcc:
yum install gcc
安装gdb:
yum install gdb
为什么编译成汇编代码?
一般的编译器,是先将高级语言转换成汇编代码(中间代码),然后在汇编的基础上优化成OBJ目标代码,最后link成可执行文件
- C#是一种二次编译语言,首先是通过编译器将C#编译成IL文件,然后通过CLR将IL文件编译成机器码文件,这种机器文件也只能适用于特定的CPU才可以运行。
- java号称一次编译,到处运行,他也是先通过编译器将java文件编译成javac文件,然后需要运行的时候再通过虚拟机jvm将中间代码翻译成特定目标平台的机器码文件,不同的cpu的机器只需要安装对应的虚拟机便可以执行同一份java代码,所以java是一种先编译后解释的语言。
参考资料: