#从源码到可执行程序

从源码到可执行程序

从源码到可执行程序
1.概述
2.预编译
3.编译
4.汇编
5.链接

1.概述

很多编译型语言的源码都需要被编译之后才可以正常的运行,如常用的c语言,它需通过编辑器的编译把它变成0101序列的机器语言才可以在指定机器上运行。而常见的java语言则属于解释型语言,它虽然也需要进行编译,不过它通过java编译器编出的是字节码(.class)文件,需要java虚拟机解释(解释器)解释执行,具体流程如图1所示。

图1

解释型语言与编译型语言相比,编译型语言的运行速度则会更快,因为在运行时java虚拟机解释(解释器)还需要把字节码文件翻译成目标机器对应机器指令再执行。当然,现在的java语言加入了即时编译(just in time)的优化机制来提高字节码(.class)文件的执行速度,其实质就是把运行频率较高的代码编译成机器码再执行(相对于编译型语言,人家在编译阶段就已经把这些过程完成了),但是把字节码编译成机器语言所占用的时间还是算在运行时期(所以感觉加入优化后的java代码运行速度还是比不上c吧,不过它用这个代价换取了java语言跨平台的特点还是非常不错的)。好吧,接下来看看编译型语言是怎么被编译程机器可以执行的程序的,它经历过哪些步骤?
    以一个C程序语言编写的helloWord为例。

  1. #include<stdio.h>
  2. int a=1;int main()
  3. {
  4. printf("helloWorld\n");
  5. return0;
  6. }

通过编译命令gcc c_1.c可以得到可执行文件a.out,执行后就会得到想要的结果:helloWorld,具体如图2所示。

图2

但是实际上,从源码到可执行文件总共需要4个步骤①预编译②编译③汇编④链接,具体过程如图3所示。

图3

2.预编译

首先,源码文件按c_1.c和相关的头文件stdio.h会预编译器编译成一个.i文件,具体过程如图4所示。

图4

在预编译过程中主要是将预编译指令(如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”、“#include”、“#define”)文件插入到源文件的对应位置。打开预编译后的文件hello.i可以看到如图5的内容。在最下面就是写好的helloWorld程序,而上面部分是stdio.h文件内容。

图5

3.编译

编译过程就是把预编译完的文件进过一系列的词法分析、语法分析、语意分析及相关的优化后生成的汇编文件.s,具体生成过程可以参考《编译原理》===>??(这部分是程序程序构建的关键,反正感觉会比较难,以前本科学习编译原理的时候也只是考试背题然后通过考试最后基本忘了这门课程讲的什么东西。看来要深入学习计算机科学相关知识,编译部分也是非常重要的)??

图6

通过vim打开编译后的文件hello.s,如图8所示可以看到里面全是汇编代码。

图7

4.汇编

汇编过程就是把图7中的汇编语言按照汇编指令和机器指令一一对应的关系翻译成机器指令,具体如图8所示。

图8

5.链接

这阶段就是把汇编后的机器指令集变成可以直接运行的文件,而对目标文件进行链接主要是因为在目标文件中可能用到了在其他文件当中定义的字段(或者函数),通过链接来把多个不同目标文件关联到一起。比如有2个目标文件a和b,在 b中定义了一个函数"method",而在文件a中则使用到了b文件中的函数"method",通过链接文件a才能调用到函数"method",不然文件a根本就不知道到函数"method"底做了些什么操作。查看链接后的文件a.out如图9所示。

图8

时间: 2024-10-31 12:38:33

#从源码到可执行程序的相关文章

linux学习笔记——源码编译安装Mysql

#######Redhat6.5源码编译安装Mysql########实验环境:1.IP:172.25.8.32.磁盘要大于20G先添加一块大于20G的磁盘fdisk /dev/vdb        ##得到/dev/vdb1 8e linuxpvcreate /dev/vdb1    ##把物理分区做成物理卷vgextend vg_server1 /dev/vdb1    ##把新建立的/dev/vdb1添加到vg_server1中lvextend -L 20G /dev/vg_server1

centos 7.4源码安装mysql5.5.20

安装环境: centos 7.4 + mysql 5.5.20 步骤: (1)     源码安装MYSQL5.5.20方法,通过cmake.make.make install三个步骤实现. 安装mysql需要的包:yum install -y cmake make gcc gcc-c++ wget ncurses-devel cmake make perl ncurses-devel openssl-devel bison-devel libaio libaio-devel PCRE是一个Per

为什么下载源码包需要到官网上去下载?

1. 为什么下载源码包需要到官网上去下载? 答:官网提供的源码包更完整,无修改,无病毒,无后门. 2. 64位机器是否可以安装32位rpm包?64位机器是否可以安装32位的mysql二进制免编译包? 答:可以,但是不建议这样做,最好是安装对应版本的包,不容易出问题. 3. 编译安装apache时, 会有什么问题? 答:编译安装apache需要底层接口库apr的支持,如果不加--with-included-apr参数,会编译出错:Cannot use an external APR with th

S5P210-uboot源码分析-uboot如何启动内核

uboot如何启动内核 7.1.uboot和内核到底是什么? 1.uboot是一个裸机程序 (1)uboot的本质就是一个复杂点的裸机程序,和我们arm裸机中写的程序没有什么本质上的区别. (2)uboot最像我们在arm裸机中的最后写的那个shell,它其实就是一个迷你型的uboot. 2.linux内核本身也是一个"裸机程序" (1)操作系统内核本身就是一个裸机程序,和uboot并没有本质区别. (2)区别在于,操作系统运行起来后在软件层次上可以分为内核层和应用层,分层后两层的权限

Apache2.2.17源码编译安装以及配置虚拟主机

WEB服务(一) 理论部分: Apache服务主要是多个服务的组合,名称来自于A Patchy Server 意思是基于原有的WEB程序的代码修改(补丁)后形成的服务器程序 1995年发布第一个版本1.0一直有Apache Group负责该项目的维护和管理1999年成立了Apache的软件基金会官方网站是http://www.apache.org/ ASF是非盈利性组织,Apache HTTP Server 就是旗下最著名的软件项目之一 跨平台应用(支持多数操作系统) 支持多字符集 Apache

2apt-get命令,deb包安装,源码安装

1 安装卸载软件 更新源服务器列表 sudovi /etc/apt/sources.list 更新完服务器列表后需要更新下源 sudoapt-get update 更新源 sudoapt-get install package 安装包 sudoapt-get remove package 删除包 sudoapt-cache search package 搜索软件包 sudoapt-cache show package 获取包的相关信息,如说明.大小.版本等 sudoapt-get install

CSAPP Tiny web 服务器源码分析及搭建运行

1. Web基础 web客户端和服务器之间的交互使用的是一个基于文本的应用级协议HTTP(超文本传输协议).一个web客户端(即浏览器)打开一个到服务器的因特网连接,并且请求某些内容.服务器响应所请求的内容,然后关闭连接.浏览器读取这些内容,并把它显示在屏幕上. 对于web客户端和服务器而言,内容是与一个MIME类型相关的字节序列.常见的MIME类型: MIME类型 描述 text/html HTML页面 text/plain 无格式文本 image/gif GIF格式编码的二进制图像 imag

在 Linux 系统上源码安装 GTK+ 2.0

在 Linux 系统上源码安装 GTK+ 2.0==================================================Keywords: GTK+, Install, Linux, SourceAuthor:       whyglinux (whyglinux AT hotmail DOT com)Date:          2007-01-07==================================================目录0. 前言1.

php源码的编译

本片文章主要介绍windows下的php源码的编译. 1.1 编译环境 软件 环境 操作系统 Windows 7 专业版 32bit Visual studio 2012 专业版 PHP 5.5.2.1 线程安全版本 PHP-SDK 下载 1.2 编译步骤 该配置步骤参考PHP官方文档. 1  解压PHP-sdk文件,分别放置于D:/PHP/PHP-sdk/: 2  在PHP-sdk下打开VS2012 x86本机工具命令行提示(该命令行提示符包含了VS的编译.链接等命令的path路径),跳转至P