2.3. 从源构建软件
这部分描述了如何从源代码构建软件。
对于使用编译语言编写的软件,源代码将通过构建流程生成机器代码。这个过程通常称为编译或转换,不同的语言会有所不同。所生成的构建软件可以被运行,使计算机执行程序员指定的任务。
对于使用原始解释语言编写的软件,源代码不会被构建,而是直接执行。
对于以字节编译的解释语言编写的软件,源代码将编译成字节代码,然后由语言虚拟机执行。
2.3.1. 原生编译代码
本节演示了如何将 C 语言编写的 cello.c
程序构建成可执行文件。
cello.c
#include <stdio.h> int main(void) { printf("Hello World\n"); return 0; }
2.3.1.1. 手动构建
如果要手动构建 cello.c
程序,请使用此流程:
步骤
从 GNU Compiler Collection 调用 C 编译器,将源代码编译到二进制中:
gcc -g -o cello cello.c
执行生成的输出二进制
cello
:$ ./cello Hello World
2.3.1.2. 自动化构建
大规模软件通常使用自动化构建,方法是创建 Makefile
文件,然后运行 GNU make
实用程序。
如果要使用自动构建来构建 cello.c
程序,请使用以下步骤:
步骤
要设置自动化构建,请在与
cello.c
相同的目录中使用以下内容创建Makefile
文件。Makefile
cello: gcc -g -o cello cello.c clean: rm cello
请注意,
cello:
和clean:
下的行必须以一个 tab 空间开头。要构建软件,请运行
make
命令:$ make make: 'cello' is up to date.
因为已有可用的构建,请运行
make clean
命令,然后再次运行make
命令:$ make clean rm cello $ make gcc -g -o cello cello.c
注意在另一个构建之后尝试构建程序无效。
$ make make: 'cello' is up to date.
执行程序:
$ ./cello Hello World
您现在已手动编译程序并使用构建工具。
2.3.2. 解释代码
本节演示了如何对 Python 编写的程序进行字节编译,以及使用 bash 编写的程序的原始解析。
在下面的两个示例中,文件顶部的 #!
行称为 shebang,不是编程语言源代码的一部分。
shebang 启用文本文件作为可执行文件:系统程序加载程序解析包含 shebang 的行以获取二进制可执行文件的路径,然后用作编程语言解释器。功能要求将文本文件标记为可执行文件。
2.3.2.1. 字节编译代码
本节演示了如何将 Python 编写的 pello.py
程序编译成字节代码,然后由 Python 语言虚拟机执行。
Python 源代码也可以是原始解释器,但编译的版本速度更快。因此,RPM Packagers 更喜欢将字节版本打包为最终用户发布。
pello.py
#!/usr/bin/python3 print("Hello World")
字节程序的流程因以下因素而异:
- 编程语言
- 语言虚拟机
- 与该语言一起使用的工具和流程
使用这个步骤将 pello.py
编译成字节代码:
步骤
字节编译
pello.py
文件:$ python -m compileall pello.py $ file pello.pyc pello.pyc: python 2.7 byte-compiled
在
pello.pyc
中执行字节代码:$ python pello.pyc Hello World
2.3.2.2. 原始解析代码
本节介绍如何使用 bash shell 内置语言编写的 bello
程序。
bello
#!/bin/bash printf "Hello World\n"
使用 shell 脚本语言(如 bash )编写的程序是原始的解释。
步骤
使含有源代码的文件可执行并运行它:
$ chmod +x bello $ ./bello Hello World