既然要学习编程,那么我们还是至少应该知道自己学习的是个什么东西才好吧?
说起编程,其实最早还是要追到我们的大神 艾伦图灵 小哥那里去。当时图灵发明出了图灵机——这东西很牛逼,不完全体就已经轻轻松松把二战缩短两年这里我们就不展开讲了,主要我们说,这个图灵机,基本上就是最早的电脑啦!
当然,教科书上不都说 冯诺伊曼 是电子计算机之父吗?嗯,我不会告诉你他俩搅基来着……当然,好吧也就是勾搭了几下。所以,如果你去搜索关键词 “图灵 冯诺伊曼”那么你会看到至今还争论不休的话题“谁是计算机之父”。
图灵机那时候还是在打点的,进行有限次的运算,简单的说,也叫有限机,具体的计算方法我们略去不讲,但它的根本我们还是要提一下,就是函数。
若干的函数进行不停的运算,存储等等,这样的过程最终能帮我们计算出想要的结果——好吧,这些都局限在数学之上,而且,还是二进制。
为什么要使用二进制?
想要让机器来做计算,那么就必须用最简单的结构来实现,把问题简单化:流水线上的工人怎样才能做成电脑呢?他们不需要知道电脑的每一个部件怎么用,只要把自己手上的螺丝拧紧就可以了。
计算机也是一样,它不关心你提出了多么复杂的题目,它只需要关心自己的纸带上的状态,即有和无。所以,艾伦很巧妙的发现,如果把问题转化为二进制,机器就能搞定了!(毕竟那时候也只有纸带啊!)
这样,状态机就有了——图灵机的祖宗。
一转眼艾伦给上帝做电脑去了……
冯诺伊曼这个天才富二代听说了埃尼阿克计划,觉得“我靠好无脑!不过我喜欢!”然后就入股就去干了,结果成功了,后来大型计算机就有了,但没办法,还是用纸带打点录入——尽管它已经用晶体管来储存状态。
随着时间的推移,最终计算机保留了这个古老的结构——二进制。我们的 CPU 依旧运行这这种古老的算法,唯一不同的是晶体管变成了纳米级别的半导体。
这时候计算机的运行速度大大加快了,可以运行“我的膝盖中了一箭”这样的大型游戏了,难道开发人员还要傻呵呵的去用棍子戳纸带么?当然不了,老早,就有老哥看不惯这个情况,发明出了机器语言。
汇编?嗯,差不多。
我们都知道,汇编是一门机器语言,它就是直白的用简单的文字代表了机器的代码——没错,不同公司的汇编语言是不同的。
作为一个程序猿,你不懂个七八门汇编怎么好意思出去见人?历史的车轮滚滚前进啊,C 语言就问世了。它成功的把程序语言变成了人类可以懂的单词了!
你只需要稍微按照特定的格式写好代码,放到编译器里边刷刷刷,程序就可以运行了!
这时候你知道了,“编译”,是现代编程语言变成程序的一个必要的过程,你的 iPhone 可不懂什么 Swift。
但是 C语言还是有它的局限的,这东西依旧太低级,不太够用啊。如果你了解 C语言,那么请问:“如何用 C语言编写《山口山》(《魔兽世界》)?”其实这个问题有点无聊,这是我的老师在给我讲什么是面向对象什么是面向过程时候问到的。
C语言的函数式编程固然好,但清晰的理顺每一个过程这样的开发就注定了在一个大团队当中它无法完美的协调。所以微软有了 C++ ,也就是我们常说的 CPP;苹果有了 Objective-C;嗯,大家有了 Java。后来因为 C 后边有加号了,放不下了,多出来的加号摞起来,便又有了 C#。
这里描写的不太严谨,希望大家不要过于深究,谈资而已。我想要说的重点是“Object- Oriented” Programming 也就是 OOP,就是大家常说的“面向对象”编程诞生了。
面向对象的好处是各个类之间再也不用相互制约了!每一个类每一个方法做他们自己的事情,你只需要在用的时候召唤(调用)它们!
这里我们还要讲到 Java,之前我们谈到了编译器这个东西,Java 的编译器与 C语言的不同。由于面向对象的语言是高级语言,它摆脱了 C 语言对于过程的束缚,所以人们就想,那是不是顺便就让它编译一次全平台运行呢?
这一点我们前边也提到过:不同的平台,汇编语言可能是不尽相同的——不同的架构,它的二进制指令也是不尽相同的。这就注定了,你 VB 只能在 Windows 下跑,C 语言想要跨平台,必须带着源码重新编译——事实上要处理的问题可不是说说这么简单。
于是就诞生了 “Java 运行时”——这也是 Java 的理念,叫做“一次编译,全平台运行”,从此,你再也不用关心内存是什么了!Java 环境帮你搞定一切,你只需要专心你的程序代码即可!
我不得不说,这是后来大部分人吐槽 Java 内存管理的原因。
讲了这么多 Java,我们这还是 Swift 课程吗?当然,我想说的是,自动的内存管理,也成了高级语言的标配(所以高级语言没有指针)。由于有了这些高级功能,你的代码也不会再被翻译成二进制,而是一种叫做“字节码”的东西,这种东西可以被特定的环境执行——比如说 iOS。
但我要讲,Swift 和 OC编译的字节码是相同的,这也是不少人吐槽 Swift 并不比 OC 强多少的原因之一。
说了这么多,我想你基本上应该了解了什么是编程语言——其实这东西就是把人类的思维逻辑转换成计算机程序的一个工具,就像人与人对话需要相同的语言一样,你想要告诉机器做什么,就需要一门程序语言来让计算机懂你的意思——计算机太笨,所以你不能说的那么艺术化“给我一杯水”这样的命令不太能够执行,(我们假定有这样的机器人问世),那么你应该这样来讲:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
启动 调用 语音识别 调用 肢体运动 语音采集 分析语音 如果语音命令为“给我一杯水” 那么(进入厨房) 找到饮水机 检查() 如果检查为假 报告“没水了!” 否则 接水() 端着水返回 检查 如果饮水机有水 那么返回 真 如果饮水机没水 那么返回假 接水 拿杯子 压水 检测水位 到达三分之二则停止 返回真 |
(代码仅供娱乐)
转载请保留出处和原文链接:https://www.logcg.com/archives/1006.html