接着上一帖:#【J.C.X】了解电源程序员1#
-------------分界线-------------------------------
为什么是 C

这里插播一则新闻,为什么我们要学 C 语言?学 Java 用不用懂 C 语言?这里需要聊聊 C 语言的发家史了

程序被其他程序翻译成不同的形式

C 语言程序成为高级语言的原因是它能够读取并理解人们的思想。然而,为了能够在系统中运行 hello.c 程序,则各个 C 语句必须由其他程序转换为一系列低级机器语言指令。这些指令被打包作为可执行对象程序,存储在二进制磁盘文件中。目标程序也称为可执行目标文件。

在 UNIX 系统中,从源文件到对象文件的转换是由编译器执行完成的。

gcc 编译器驱动从源文件读取 hello.c ,并把它翻译成一个可执行文件 hello。这个翻译过程可用如下图来表示
上面定义的描述了一种低级语言指令。汇编语言是非常有用的,因为它能够针对不同高级语言来提供自己的一套标准输出语言。

编译完成之后是汇编阶段(Assembly phase),这一步,汇编器 as会把 hello.s 翻译成机器指令,把这些指令打包成可重定位的二进制程序(relocatable object program)放在 hello.c 文件中。它包含的 17 个字节是函数 main 的指令编码,如果我们在文本编辑器中打开 hello.c 将会看到一堆乱码。
最后一个是链接阶段(Linking phase),我们的 hello 程序会调用 printf 函数,它是 C 编译器提供的 C 标准库中的一部分。printf 函数位于一个叫做 printf.o文件中,它是一个单独的预编译好的目标文件,而这个文件必须要和我们的 hello.o 进行链接,连接器(ld) 会处理这个合并操作。结果是,hello 文件,它是一个可执行的目标文件(或称为可执行文件),已准备好加载到内存中并由系统执行。

你需要理解编译系统做了什么

对于上面这种简单的 hello 程序来说,我们可以依赖编译系统(compilation system)来提供一个正确和有效的机器代码。然而,对于我们上面讲的程序员来说,编译器有几大特征你需要知道
处理器读取、解释内存中的指令

现在,我们的 hello.c 源程序已经被解释成为了可执行的 hello 目标程序,它存储在磁盘上。如果想要在 UNIX 操作系统中运行这个程序,我们需要在 shell 应用程序中输入
这里解释下什么是 shell,shell 其实就是一个命令解释器,它输出一个字符,等待用户输入一条命令,然后执行这个命令。如果命令行的第一个词不是 shell 内置的命令,那么 shell 就会假设这是一个可执行文件,它会加载并运行这个可执行文件。

这贴不够下面的知识点,开新帖
点关注不迷路

最近更新