学习笔记N-061
其他
- 更新
- 内容块
- 73
- 阅读
- 约 3 分钟
- 路径
- 学习笔记 / 操作系统/编译原理
为什么在一个项目中通常使用多种语言?
对于c语言
在linux系统下,使用
gcc main.c -o main 进行编译

Pre-Processor(预处理):删除注释,展开宏,解决条件编译——#ifdef/#endif/#else,替换头文件
Compiler(编译):翻译为汇编语言
Assembler(汇编器):翻译为机器码
Linker(链接):在项目中有多个文件(main.c/1.c/2.c)需要头文件(stdio.o)支持,把头文件和多个内部文件,外部库文件(函数) 进行链接,合并为一个可执行文件。
静态链接:将头文件的机器码直接插入到统一可执行文件中,只要这个程序使用了该头文件中的函数,那么这个头文件就包含在这个可执行程序中。
动态链接:通过动态链接,把所用到的头文件(库)预编译为一个共享动态库(stdio.so/msvcrt.dll),这时,原可执行文件只包含对库的引用。

在一般编译时,这些中间文件一般不可见,使用
gcc mmain.c -o main -save-temps编译,可见如下图


可以使用特定指令中断这个过程

可以方便的学习汇编代码
如果我们不信任编译器的话,可以直接编写汇编代码,提高性能。
gcc不单单是一个编译器,更像一个流水线

所以gcc不只支持c语言,支持很多的语言(编译器套件)




多语言编程的应用场景总结:

5. 团队技术栈与分工协作 (Team Expertise and Division of Labor)
- •场景:团队成员有不同的技术背景。
- •做法:让熟悉对应语言的人负责对应模块,比如前端用 JS、后端业务用 Java、性能核心用 C++,提升整体开发效率。
6. 跨平台支持 (Cross-Platform Support)
- •场景:不同平台对语言的适配度不同。
- •例子:iOS 原生用 Swift/Objective-C,Android 用 Kotlin/Java,跨平台逻辑用 C++ 写一套,两边都能复用。
7. 渐进式迁移与遗留系统集成 (Gradual Migration or Legacy Integration)
- •场景:不想一次性重写整个旧项目。
- •做法:用新语言逐步替换部分模块,同时保留旧系统的核心代码,实现平滑过渡。
相同的逻辑,不同的高级语言,因为编译器的不同,被编译为了不同的汇编代码。
问题随之而来:举例


- 1.两个编译器没有约定好R0,R1,R2之间的存储关系(存的是R0和R1,加的是R1和R2)。
- 2.计算结果只会存到
R2,但主程序最后却从R0取结果存入内存。
汇编里的 ADD 指令通常有两种常见形式:
- •形式 1:
ADD Rd, Rs→Rd = Rd + Rs(目标寄存器自身累加源寄存器)
- •形式 2:
ADD Rd, Rs1, Rs2→Rd = Rs1 + Rs2(双源寄存器相加存入目标)
这里还补充了一种例子,不过没有被我记录
Application Binary Interface 应用程序二进制接口
重新认识外部变量