友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

夜半鬼入梦-第307部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!

关于硬件,我们业余选手可以不用知道那么多,只要知道:cpu会执行我们的一些命令,我们的命令是存在“存储器”里的0101010110101001010…这样的数字来代表。

    作为常识我们知道,计算机只认识0和1(至少你现在知道了),那么我们就来看一下它是如何运用0和1来工作的。

    汇编:

    请注意为了方便讲解我就自己创造例子了,可能和实际情况有出入,但是更容易帮助理解。先看一下这一行代码:

    00000001 00001100 00001010

    看不懂?普通人类当然看不懂,但是机器看得懂,而且机器就只能看懂这种形式的信息。这个叫做机器语言,也是二进制码。二进制码是构成如今计算机世界的基础,我们电脑里的任何文件、应用程序归根结底的都是以二进制码的形式存在的。比如:我们常常能够在电脑的文件夹里看到这样一个文件夹:

    这其中“bin”就是单词“binary”的缩写,意思是二进制文件。打开bin文件夹,xe和。dll文件。对于我们来说,。exe就是一个应用程序嘛,比如说:xe、xe。

    大家难道没有好奇过:为什么应用程序的的后缀是“exe”呢?原因:“exe”是英文词组“executable file”的缩写,意思就是可执行文件。“可执行文件”的意思是:可以被cpu执行的文件。我们前面说过,cpu只能执行0101001这样的指令。所以“可执行文件”其实就是这种指令的集合,也就是是一堆二进制码 “00001111 01010011 00100110 00001111 01010011 ……”。所以它才会常常被放在ry)文件夹里。(有没有发现,那些曾经我们看不懂的文件夹结构、文件名后缀,其实设计得都是有道理的)

    我们玩的每一个游戏,它们的本质都是这样的二进制文件。所以编写一个游戏,其实最终最本质就是编写出这样的文件:0101010101110010101010101001010101……可是……

    我知道这也太特么为难人了!鬼看得懂这些01是什么意思啊!(鬼:我也看不懂啊~)但没有办法,现代的计算机只能识别这种简单的机器语言。(即便是量子计算机也是玩01这样的量子比特) 为了让这些机器语言更容易被我们人类所理解,先驱们发明了汇编语言。bly language”)但其实汇编语言很简单,有了汇编,我就能跟你解释前面的0011是怎么回事了。再来看之前的那行代码:

    00000001 00001100 00001010

    请注意这不是一串随便瞎写的0和1,它是有规律的!你们看,以八个0或1为一组,每组中间有个空格。e),每一个0或者1,我们叫做一个“比特”(bit)。第一个字节:00000001,假设我们规定,它代表一个命令:加法(add)。我们再规定,如果cpu遇到“加法”命令,它就把后面两个字节相加,把结果存到前一个字节所在的地方。于是我们的cpu就能够计算加法了。规则是给它这三个数:

    第一个是表示加法命令的“00000001”,第二个a和第三个b是两个加数,每次都不同,所以我用x表示那些比特位。同样的道理我们能够制定出减法命令、乘法命令、复制命令等等。比如复制命令:我们规定“00001111”代表复制命令,如果cpu遇到“00001111”,它就把后面第二个字节的数据,复制到后面第一个字节的数据所表示的位置上(注意这些字节里的二进制数不仅可以当数字用,也可以当命令用,也可以用来表示储存位置)。于是我们就有了复制数据的功能了。

    这些功能,都是cpu中的逻辑电路为我们提供的,我们只需要发送规定好的指令便能使用这些功能。注意,指令的本质是一串0和1代表的信息,但是我们很难去记忆和区分1101这样的数字,所以我们就用“add”代表00000001(加法指令),用“py”代表00001111(复制指令)。在英文里本来就是加和复制的意思,这就很好记。而“add”、“py”等这些指令集合起来就形成了汇编语言。它实际上就是把机器语言(一串0和1)直译成了英文单词。一般cpu认识的指令不多,就那么十几个(加上变种一般也就几十个)。所以汇编语言中的指令一一对应也不多,大致分为三种:

    数据传输类:复制、加载、存储……算数/逻辑类:布尔运算、加法运算、自加运算……控制类:转移、停止……

    就这么几个指令能干啥?你别说,我还真有办法能让你亲自见证一下,就这么几个指令,可以让cpu干些什么事。achine》这个小游戏。然后开始玩吧。我已经让群友们验证过了,不管有没有学过编程都可以玩几下。而游戏的主体内容,其实就是以一种有趣的方式在写汇编代码。在过关这个游戏之后,你会发现你自己用这几个最简单的指令,让计算机实现了一些简单的功能,诸如:比较两个数字的大小、判断一个数字的正负、让计算机数数、用加法实现了乘法运算、从一组数中找到最小的数……如果你在游戏里过五关斩六将实现了这些功能,那么你就相当于解决了上个世纪计算机科学早期那些先驱们所面对的问题。给自己一个奖励吧,点击文章末尾的“赏”就会看到编程学习大礼包!额,你说你没有通关?没关系,最后几关是比较难,而且这个游戏只是为了让你体验一下汇编编程的感觉。

    现在你会发现,汇编语言其实没有多复杂,而且比起那些0011的代码,真是太好识别了。但是那还不够,比如我要计算一个:

    *z++p…2

    这个自然的表达式人人都能看懂吧?但是用汇编语言写出来就不那么好看了:

    mov  x;  y

    mul  y;  z

    div  q;  10。5

    add  y;  q

    sub  p;  2

    add  y;  p

    一眼看上去不知道是在干嘛。而且汇编语言也不够“自然”,比如我要做一个赋值操作:

    ;

    上面这种写法很自然,我们在学数学的时候就是这么写的,但是在汇编语言中它是这么写的:

    mov  x, y

    直译就是:把y移动到x的存储位置(这是计算机硬件能够实现的操作)。再比如:

    if  x

    这几行命令,我们用自然语言就能读懂它在干嘛:比较两个数的大小,然后把大的数赋值给小的数。用汇编语言写就是这样:

    cmp x;y

    jle lesscase

    jmp skipcase

    lesscase:

    mov x;y

    skipcase:

    mov y;x

    用自然语言写很简单的三行命令,用汇编写就需要这么多行才能实现。

    还记得当初我们为什么需要汇编吗?因为机器只能识别0和1构成的指令,但是那种数字指令对我们人类来说很难识别和记忆,所以我们用英文单词来一一对应那些数字指令,那些英文单词构成的指令集合就成为了汇编语言。新的知识点:当我们写出汇编代码后,在真正交给cpu运行之前,我们得把汇编代码翻译成机器码,因为cpu只认识0和1构成的机器语言。(因为机器指令和汇编指令是一一对应的,所以翻译过程很简单,就像把简体字翻译成繁体字)。

    先驱们尝试把汇编语言简化的过程中,想到:既然要翻译,那么我们能不能创造一种更简洁的语言,然后把它翻译成相对复杂的汇编呢?就像把文言文翻译成语素成分更复杂的现代文。

    “私见张良,具告以事“———翻译为———》“私下会见张良,把事情详细地告诉了他“

    从这个想法出发,c语言诞生了。(实际上c语言是在b语言的基础发展出来,b语言是在bcpl的基础上发展出来的,的基础上发展出来的。在cpl之前还有个十几种其他编程语言。不要管辣么多,静静听我吹就好。)

    c语言

    你们看,汇编语言多复杂,因为它和机器硬件实现的指令一一对应,所以光改造它而不改造机器指令的话毫无意义。所以我们不如创造一种新的语言,然后把它翻译成汇编吧!语言有许多强大的优点。但是在此,(顶着老师和同行们的压力)我想让新手知道的是:函数。

    函数是什么?当我们在写代码的时候,可以想象为我们写的每一行都是一个指令。我们写十几行指令来实现一个乘法运算,用二十几行写一个排序操作。程序猿是世界上最懒的物种,他们不想每次要做乘法时都写十几行代码。能不能用一行指令代表十几行指令?就像:

    指令集a和指令集b所描述的就是完全同样的事情。但是a用了7个指令,b用了5个指令。如果你要在这件事件上偷懒,你是愿意以a的形式还是b的形式来写这个指令集呢。我不知道你的选择是什么,但是作为世界上最懒的物种来说,程序猿在编程的时候,能少写一行就不会多写,能少敲一个字母就绝对不会敲两个。所以在碰到上面这个问题时,采用b的写法无疑。那么如何实现呢?假设指令集a中的每条指令都是计算机能够识别的指令,指令集b中的第3条“把大象装进冰箱”是计算机不能识别的,是我们自己虚构的。但是我们要使用这条指令,因为它对于我们来说很省事。现在很简单,只要规定:我们每次写“把大象装进冰箱”这条虚构指令,就自动把它翻译成“打开冰箱、把大象塞进去、关上冰箱”这三条原生指令。翻译过程不用担心,前人们已经写好了各种翻译器能够现实这种效果。

    那么,上面我们虚构出来的那条指令:把大象装进冰箱。其实就是我们所谓的函数!下面展示的是在c语言中创建一个函数的形式。

    把大象装进冰箱(大象x)

    {

    打开冰箱;

    把 大象x 塞进去;

    关上冰箱;

    }

    下次想干这件事件的时候,就只要写一句:把大象装进冰箱(大象巴拉)。括号里写哪头大象,就装哪头。 那么把大象装进冰箱()就是一个函数。

    有了函数这个东西,世界上任何复杂的任务都可以被拆分成最简单的单个任务。当我们学c语言的时候,一定要把函数的用法学好。我认为这也是新手学习c语言的主要任务。

    更高级的编程语言

    按照学院派的编程学习路线,计算机专业基本都是先学c语言,然后学c++,,然后学on/js。。。。,然后回去再学汇编呀、电路呀什么的。想必大家都熟悉这套方案。

    其实学习一个东西,从根源开始了解接触,从底层学到顶层是一个自然的遵循逻辑的学习方式。在计算机世界中,如果说从真正的根源开始学的话,估计真得从逻辑电路开始了,然后学到汇编语言,再学到c语言,再学c++。但是为什么学院们都选择从c语言开始呢?一是因为相比起汇编语言,c语言更能够学以致用,使用起来更方便;二是因为,现在许多流行的编程语言,比如c++、java、c#、python都是类c语言的,首先是语法上都是仿照c语言的风格来设计的,其次它们的一些技术原理是建立在c语言的基础之上的。它们之间的关系就好比“汉语”与“北京话”、“四川话”、“重庆话”、“广东话”之间的关系,其中c语言就是汉语。所以c语言作为广大语言的根基,把它当做入门编程语言来学习是没有问题的。再以它为中心,向高层语言和底层原理来扩展学习,往往计算机专业的同学到大三就能把整个计算机体系打通。

    编程语言发展史

    刚刚我们才讲到了c语言。并且说了游戏领域中比较重要的几种语言与c语言的关系。从这张图中我们应该能够更清晰看到这几种语言的发展脉络。每一种新的语言诞生,都摒弃了一些前者的弊病,加入了自己优秀的特性。但无论怎样,每一次编程语言的发展和进步都是在前人的基础之上进行改良和创造,很少有几个语言是凌空出世的。正因为这样,所以编程语言之间的差别,并不是天差地别。并不是我选择了学习java,就意味着放弃了c#;也并不是我如果不先学c语言,我就学不懂c++。编程语言之间都是触类旁通的,只要先掌握了其中一种,那么其他的语言就能很快掌握。

    再看一眼上面的图,接下来我来讲讲c、c++和、python的关系。

    c++

    首先经过我们上面一顿瞎bb,已经知道了c语言是怎么来的,而且知道了c语言的语法比较接近我们的自然语言,语言写的代码,在被cpu运行之前,需要翻译成汇编代码,再翻译成机器码。我们对这个设计很满意,使用了好多年。后来在使用中,特别是开发一些大型项目,比如用c语言开发一个计算机操作系统时,发现有问题处理起来很麻烦,先辈就对c语言进行了改进。有一次改进后新增了一个叫“类”的功能,这个功能很牛逼,导致那个版本的c语言直接脱胎换骨。这种与众不同的牛逼需要在名字上体现出来,所以他们学习iphone的起名策略,在名字后面加了个“plus”。“c plus”=“c+”。一个不够,那就两个“c plus plus”=“c++”。(顺便剧透一下c#的起名策略:“c#”=“c plus plus plus plus”=“c++++”。)所以!c++是c的升级版,多了一个核心功能:类。语法没有变,本质的东西没有变,还需要被翻译成汇编,然后翻译成机器码,再交给cpu执行。所以学校里安排先学c语言,再学c++,其实这种说法是有点狗屎的,就好像是说:我们先学习“浮水”,再学习“游泳”。本来我们学习游泳的过程中就会学习浮水,但是就要把学习“浮水”先说一遍,让人误解为这是两个差别很大的东西。所以懂了吗?我再说明白一点:学习c++就是学习一个高级版本的c语言,学c++的过程中,就会先把c语言的那些东西学到。所以不存在:如果不学c语言打基础,就学不好c++。如果再有人问这个问题,就把这一章节贴到他脸上去。

    另外补充:c++从c发展出来后,c语言也没有闲着,自己还是在不断发展,比如后来发展出了objective…c。严格意义上来说,“学习c语言”和“学习c++”确实是不一样的,因为要去研究它们不同的语言特性。但是!对于没有学过任何编程的初学者来说,最开始就是学习个语法认识几个关键字而已,根本到不了研究语言特性的程度,所以两者说法对他们来说几乎没啥差别。

    c#(和其他高级语言)

    我们知道现在两方对峙,操作系统是 os和android三足鼎立(我们不知道linux)。 可是你们知道上世纪八九时年代,计算机市场是繁花绽放,各种各样的硬件、操作系统充斥在硅谷整条小吃街。那个年代的码农,随手写一个程序,并不是写完就能到处用的啊。就算现在也不是啊。原因很多,可能cpu不一样,操作系统不一样。。。。那怎么办?先辈们想到了一个胆大包天的方法:我写一个软件,这个软件去模拟cpu硬件,然后再写其他的程序,把这些程序编译成这个虚拟cpu能够执行的机器码,然后让虚拟cpu去执行程序。(请再读三遍)

    这样,只要所有的电脑都提前装好我这个虚拟cpu软件,那么其他那些杂七杂八的软件统统都在我上面可以运行了!完美解决跨平台问题。

    有了这个想法之后,先辈们就开始动手去写这个牛逼哄哄的虚拟achine。。。。。。

    看到这里,聪明的你已经看破了真相,原来on编写
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!