从源代码到可执行文件

4933701-127ce6e06da53eeb.png
Windows中的编译和链接机制

计算机只能运行本地代码

用某种编程语言编写的程序称为源代码,保存源代码的文件称为源文件。源代码是无法直接运行的,因为CPU能直接解析并运行的不是源代码而是本地代码的程序。作为计算机大脑的CPU,也只能解释已经转换成本地代码的程序内容。

$ vim avg.c

#include <stdio.h>
#include <windows.h>

char *title = "title";

//返回两个参数平均值的函数
double avg(double a, double b){
    return (a+b)/2;
}

//程序运行起始位置的函数
int WINAPI WinMain(HINSTANCE h, HINSTANCE d, LPSTR s, int m){
    double average;
    char buffer[80];

    average = avg(123, 456);

    sprintf(buffer, "average is %f", average);//显示在消息框中的字符串
    MessageBox(NULL, buffer, title, MB_OK);//打开消息框

    return 0;
}

$ gcc avg.c -o avg
$ avg.exe

本地(native)这个术语有“母语的”的意思,对CPU而言,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。也就是说,即使是用不同编程语言编写的代码,转换成本地代码后,也都编程用同一种语言(机器语言)来表示了。

4933701-2f9b0d8acd5f27d2.png
转换成本地代码后就编程了同样的语言

本地代码的内容

Windows中EXE文件的文件内容,使用的就是本地代码。将EXE文件的内容Dump一下,Dump是指把文件的内容,每个字节用2位16进制数来表示的方式。计算机就是把所有的信息作为数值的集合来处理的,与此相同,计算机指令也是数值的罗列,这就是本地代码。

编译器负责转换源代码

能够将C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。

编译器首先读入源代码的内容,然后再把源代码转换成本地代码。编译器中好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应表是无法生成本地代码的。读入的源代码还要经过语法解析、句法解析、语义解析等,才能生成本地代码。

根据CPU类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关,和CPU的类型也是相关的。

4933701-cca722ef29573a8c.png
同样的源代码可以转换成适用于不同处理器的本地代码

仅靠编译是无法得到可执行文件的

编译器转换源代码后会生成本地代码,不过,本地代码是无法直接运行的。为了得到可以运行的可执行文件,编译之后还需要进行“链接”处理。将多个目标文件结合,生成一个可执行文件的处理过程就是链接,运行连接的程序称为链接器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值