语言入门基础之一

书籍推荐| 2025-08-30| 0

大纲编程语言发展历程机器语言

计算机的大脑或者说心脏就是 CPU,它控制着整个计算机的运作。每种 CPU,都有自己的指令系统。这个指令系统,就是该 CPU 的机器语言。机器语言是一组由 0 和 1 系列组成的指令码,这些指令码,是 CPU 制造厂商规定出来的,然后发布出来,要求程序员遵守。要让计算机干活,就得用机器语言(二级制数)去命令它。这样的命令,不是一条两条,而是上百条。不同型号的计算机其机器语言是不相通的,也就是使用某种计算机的机器指令编制的程序,不能在另一种计算机上执行。

汇编语言

机器语言编程很令人烦恼,因此终于出现了汇编语言,就是一些标识符取代 0 与 1。汇编语言是一门人类可以比较轻松认识的编程语言。只是这门语言计算机并不认识,所以人类还不能用这门语言命令计算机做事情。所以,有一类专门的程序,既认识机器语言,又认识汇编语言,也就是编译器,将标识符换成 0 与 1,知道怎么把汇编语言翻译成机器语言。

高级语言

汇编语言和机器语言都是面向机器的,机器不同,语言也不同。既然有办法让汇编语言翻译成机器语言,难道就不能把其他更人性化的语言翻译成机器语言?1954 年, 语言出现了,其后相继出现了其他的类似语言。这批语言,使程序员摆脱了计算机硬件的限制,把主要精力放在了程序设计上,不在关注低层的计算机硬件。这类语言,称为高级语言。同样的,高级语言要被计算机执行,也需要一个翻译程序将其翻译成机器语言,这就是编译程序,简称 “编译器”。这类高级语言解决问题的方法是分析出解决问题所需要的步骤,把程序看作是数据被加工的过程。基于这类方法的程序设计语言,成为了面向过程的语言。

语言的层次

语言的进化史

为什么要学习 C 语言C 语言的特点

优点:

缺点:

学习 C 语言理由

C 语言的应用领域

C 语言的应用极其广泛,从网站后台,到底层操作系统,从多媒体应用到大型网络游戏,均可使用 C 语言来开发:

第一个 C 语言程序编写代码

1
2
3
4
5
6

#include 

int main(int argc, char *argv[]) {
printf("Hello World!\n");
return 0;
}

编译代码选项含义

-o

指定生成的输出文件名

-E

只进行预处理

-S

只进行预处理和编译

-c

只进行预处理、编译和汇编

1

$ gcc hello.c -o hello

运行代码

1
2
3

$ ./hello
Hello World!

代码分析 函数 函数的定义

1
2
3
4
5
6
7

头文件:#include 
声明:int system(const char *command);
功能:在已经运行的程序中执行另外一个外程序
参数:外可执行程序名字
返回值:
成功:不同系统返回值不一样
失败:通常是 -1

函数的调用

1
2
3
4
5
6
7
8

#include 
#include

int main(int argc, char *argv[]) {
system("ls"); // Linux 平台
// system("calc"); // Windows 平台
return 0;
}

函数的返回值

在 和 系统下分别调用 () 函数,若调用成功返回值是不一样的,若调动失败返回值一般为 -1。C 语言所有的库函数调用,只能保证语法是一致的,但不能保证执行结果是一致的;同样的库函数在不同的操作系统下执行结果可能是一样的,也可能是不一样的。 的发展离不开 标准,只要符合这个标准的函数,在不同的系统下执行的结果就可以一致。Unix 和 很多库函数都是支持 标准的,但 支持的比较差。如果将 Unix 代码移植到 一般代价很小,如果把 代码移植到 Unix 或者 就比较麻烦。

C 语言的编译过程C 语言的编译步骤

C 语言编译成可执行程序需要经过以下 4 个步骤,详见 编译流程图。

GCC 的编译过程GCC 的编译步骤步骤命令

1. 预处理

gcc -E .c -o .i

2. 编译到汇编代码

gcc -S .c -o .s

3. 汇编到目标代码(二进制文件)

gcc -c .s -o .o

4. 链接,生成可执行文件

gcc .o -o

值得一提的是,以上四个步骤,可以合成一个步骤,直接编译链接成可执行目标文件,命令是 gcc .c -o

文件后缀的不同含义文件后缀含义

.c

C 语言文件

.i

预处理后的 C 语言文件

.s

编译后的汇编文件

.o

编译后的目标文件

查找程序所依赖的动态库

1
2
3
4
5
6
7
8

# GCC编译
$ gcc hello.c -o hello

# 查看所依赖的动态库
$ ldd hello
linux-vdso.so.1 => (0x00007f152053a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f151ff4d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f152031b000)

在 系统里,可以使用 工具查看程序所依赖的动态库(DLL),如下图所示:

VS 中 C 语言嵌套汇编代码

在 中,由于下述代码使用了 eax 寄存器,因此程序需要运行在 32 位(x86)的平台。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#include 

int main() {
int a;
int b;
int c;

__asm
{
mov a, 3 // 3的值放在a对应内存的位置
mov b, 4 // 4的值放在a对应内存的位置
mov eax, a // 把a内存的值放在eax寄存器
add eax, b // eax和b相加,结果放在eax
mov c, eax // eax的值放在c中
}

printf("c = %d\n", c);
return 0;
}

下一篇

没有了

相关推荐

语言入门基础之一

汇编语言是一门人类可以比较轻松认识的编程语言。汇编语言和机器语言都是面向机器的,机器不同,语言也不同。既然有办法让汇编语言翻译成机器语言,难道就不能把其他更人性化的语言翻译成机器语言?基于这类方法的程序设计语言,成为了面向过程的语言。

书籍推荐 115 2025-08-30
微信二维码