新名词|什么是「电源」程序员?

什么是计算机系统

计算机系统(A computer system) 是由硬件和软件组成的,它们协同工作运行程序。不同的系统可能会有不同实现,但是核心概念是一样的,通用的。

不同的系统有 Microsoft Windows、Apple Mac OS X、Linux 等。

所有的计算机系统都有相似的软件和硬件组成,它们执行相似的功能。

你想要什么

首先,问你一个问题,你想成为哪种程序员?

这是我最近搜索到的一个很好的开源项目,它的路径是 https://github.com/keithnull/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md

也就是

我也把它里面涉及的中文/英文书籍都下载下来了,公众号回复 计算机基础,即可领取。(图中是冯·诺伊曼)

我一直想成为第一种工程师,即使我永远成为不了,我也要越来越靠近它。

回到正题

没错,我就想成为一种电源程序员

一段简单的程序

这次真的言归正传了,下面是一道很简单的 C 程序(不要管我的名字是 Java建设者还是什么,Java建设者就不能学习 C 了吗?虽然饭碗是 Java,但是 C 才是爸爸啊。)

#include <stdio.h>

int main(){
  pritnf("hello, worldn");
  return 0;
}

这是用 C 语言输出的一个 Hello,world 程序,尽管它是一个非常简单的程序,但系统的每个部分都必须协同工作才能运行。

这段程序的生命周期就是程序员创建程序、在系统中运行这段程序、打印出一个简单的消息然后终止。

程序员首先在文本中创建这段代码,这个文本又被称为源文件或者源程序,然后保存为 hello.c 文件,源程序实际上就是一个由 0 和 1 组成的位(又称为 比特,即 bit)。8 个 bit 成为一组,称做 字节。每个字节又表示着一个文本字符,这些文本字符通常是由 ASCII 码组成的,下面是 hello.c 程序的 ASCII 码

hello.c 程序以字节顺序存储在文件中,每个字节都对应一个整数值,也就是 8 位表示一个整数。比如第一个字符是 35,那这个 35 是从哪来的呢?这其实是有个 ASCII 码的对照表(因为 ASCII 非常多,可以去 http://ascii.911cha.com/?year=# 官网查询,这里只选取几个作为参考哦)

每行都以不可见的 n 来结尾,它的 ASCII 码值是 10。

注意;只由 ASCII 字符组成的诸如 hello.c 之类的文件称为文本文件。 所有其他文件称为二进制文件。

hello.c 的表示方法说明了一个基本思想:系统中所有的信息 --- 包括磁盘文件、内存中的程序、内存中存放的数据以及网络上传输的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读取对象时的上下文,比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

为什么是 C

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

C 语言起源于贝尔实验室。美国国家标准学会 ANSI 在 1981 年颁布了 ANSI C 的标准,后来 C 就被标准化了,这些标准定义了 C 语言和一系列函数库,即所谓的 C 语言标准库,那么 C 语言有什么特点呢?

  • C 语言与 Unix 操作系统密切关联。C 从一开始就被开发为 UNIX 系统的编程语言,大部分 UNIX 内核(操作系统和核心部分)和工具,动态库都是使用 C 编写的。UNIX 成为 1970 - 1980 年代最火的操作系统,而 C 成为最火的编程语言
  • C 是一种非常小巧,简单的语言。并且 C 语言的简单使他移植性比较强。
  • C 语言是为实践目的设计的。

我们上面提到了 C 语言的各种优势,但是 C 语言也并非所有程序员都能熟练掌握并运用的,C 语言的指针经常让很多程序员头疼,C 语言还缺乏对抽象的良好支持,例如类、对象,但是 C 和 Java 都解决了这些问题。

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

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

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

gcc -o hello hello.c

gcc 编译器驱动从源文件读取 hello.c ,并把它翻译成一个可执行文件 hello。这个翻译过程可用如下图来表示

这就是一个完整的 hello world 程序执行过程,会涉及几个核心组件:预处理器、编译器、汇编器、连接器,下面我们逐个击破。

  • 预处理阶段(Preprocessing phase),预处理器会根据开始的 # 字符,修改源 C 程序。#include <stdio.h> 命令就会告诉预处理器去读系统头文件 stdio.h 中的内容,并把它插入到程序作为文本。然后就得到了另外一个 C 程序hello.i,这个程序通常是以 .i为结尾。
  • 然后是 编译阶段(Compilation phase),编译器会把文本文件 hello.i 翻译成文本hello.s,它包括一段汇编语言程序(assembly-language program)。这个函数包含 main 函数的定义,如下
main:
	subq		$8, %rsp
	movl		$.LCO,