新名词|什么是「电源」程序员?
什么是计算机系统
计算机系统(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,
评论 (0)