一、前言
无论要做什么,首先从一个较为宏观的角度去了解它都是一件非常有必要的事情。
不过初学者却很难站到一个更高的角度来审视,而这也就是本教程所存在的意义了。
本教程最终实现的目标是:推箱子小游戏
那么我们首先第一个问题就是,什么是游戏?
二、理解游戏
广义上来说,游戏当然不仅仅是指电脑、手机游戏,比如小时候玩过的捉迷藏,当然也可以叫做游戏。
但由于本教程是教编程相关的,所以这里指代的游戏,就可以狭义的称其为游戏软件。
游戏软件,与你手机、电脑上用的其它软件,比如QQ、微信、支付宝等,并没有什么区别,都是软件。
它们都是运行在电脑、手机上的一个个程序而已,只不过游戏更侧重于娱乐,而其它软件则更侧重于实用,仅此而已。
二、什么是程序?
上面我提到了一个词:程序。
广义上讲,就是规定的一系列步骤,比如现实世界中的司法程序。
而狭义上来说,计算机所运行的一系列指令组合起来,实现某一个功能,便可称其为程序。
也许你已经听到过无数遍了,计算机的本质其实就是二进制的0和1。
无论是你看的视频、听的音乐、玩的游戏,在计算机眼中都是二进制的0和1.
除此之外,计算机就什么都不认识了。
那计算机为什么能仅仅依靠0和1两个数字就能展现出我们所能看到的如何繁荣的互联网呢?
答案就是数量。
虽然一位数字,只能表达两个信号:0或1,即:2的一次方。
但如果是两位,那就能表达四个信号:00、11、01、10,即:2的2次方。
而如果是8位呢?那就能表达 2的8次方 个信号。
这样能表达的含义不就丰富起来了吗!
比如用 00001111 这个8位的二进制数字信号,人为的规定其是做乘法运算的,00001100 这个8位的二进制数字信号,人为的规定其是做加法运算的。
那么计算机便能只在认识0和1这两个数字的基础上,完成超越二进制的加法以及乘法运算了!
而这就是早期的机器语言,即二进制编程,面向机器编程。
这样的机器指令可能有数百个之多,人为记忆起来是很困难的。
那我们就可以用我们所知道的符号来代替它呀!
比如:用符号mul代替 00001111 这个数字,用符号add代替00001100 等。
这样我们写代码的时候,就不用写这些二进制数字了,而是可以直接用这些符号来写了。
写完之后呢,再通过一个提前写好的程序,来将这些符号重新转化为对应的二进制指令数字,交给计算机执行不就行了?
第一个将符号转换为二进制数字的程序肯定是用机器码写的,其开发的痛苦程度都不用多说了!
这便是汇编语言的由来,它的每一个符号都对应着一段二进制机器指令。
但汇编指令写起来仍然很痛苦啊!
举个例子,以下就是用汇编语言打印 hello world 的代码:
DATA SEGMENT
BUF DB 'HELLO WORLD!$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
写好上面这串代码后,我们还需要找到对应的汇编程序将其翻译为二进制后,才能让计算机来执行。
是不是只是看着就很绝望?
为了简化程序员的负担,后面就出现了更加高级的语言,也就是我们本系列文章要讲解的C语言:
#include<stdio.h>
int main(){
print("hello world");
return 0;
}
同样是输出一个hello world,是不是比汇编要简单多了?
不过其原理同样不复杂,就是在汇编的基础上,又添加了一层而已。
当你写好了这段C语言代码,通过对应的C语言编译器,就会将其翻译为汇编代码,最终再通过汇编程序将其翻译为计算机能够理解的机器码,也就是二进制数字。
虽然这样做可能会损失一部分性能,但如今的编译器非常强大,与为我们提供的开发速度来说,这点损耗已经完全算不上什么了。
甚至就算你手写汇编,也不一定比用C语言编译器编译后的汇编性能更好。
而第一个C语言编译器程序不出意外的话,自然也就是用汇编语言写的了。
但后面的C语言编译器,便是用C语言本身写的了,毕竟开发效率提升太多了!(语言本身写自己的编译器,称为自举,并不是任何语言都有这种能力)。
以上,当我们用C语言写好一段代码后,程序的执行流程:
- 将C语言代码翻译会汇编代码
- 将汇编代码翻译为机器码
- 计算机执行机器码
而作为程序员来说,程序,常常就是指代的我们所写的代码。
对于本系列来说,也就是C语言代码。
通过写代码,我们就能够让计算机做一些我们想让它做的事情。
三、总结
本章主要是介绍了一下程序的概念,又或者说,是介绍了一下C语言的原理。
无论任何游戏、软件,最终都是转换为了二进制数据交给计算机来运行。
而这个转换的过程,就需要用到翻译器,C语言,用到的就是C语言编译器,这个下一章会进行介绍。
对于想要在编程世界走的更高更远的人来说,这些东西也并非要完全掌握,但你至少要知道这中间是有这么一个过程的。
这对于未来了解其它语言也有一定的帮助,比如Java、Python等更高级的语言。