如何读懂计算机


每天叫醒你的不是闹钟,而是知识


我在上一篇文章人人都能学编程中讲到,计算机是如何读懂人类的语言,今天我要讲的是人类如何读懂计算机语言

 

640.jpg


想要读懂计算机,就需要把计算机输出的内容转化为我们人类所能理解的语言,然后显示在屏幕上。

 

我在人人都能学编程中说到过,计算机只能处理二进制数据,那么如果计算机处理完二进制直接输出到屏幕上人是看不懂的。那么也是需要一套翻译系统根据一套规则帮我们把二进制翻译成自然语言

 

学过英语的都知道把英语翻译成汉语,其实就是根据语法规则和单词。那么其实计算机也是这样。

 

很久以前有一群聪明人他们决定8个可以开合晶体管来组合成不同的状态,来表示人类所能理解的数字和符号,他们把这8个晶体管称为字节。

640 (1).jpg


 

再后来,他们又做了一些可以处理这些字节的机器,可以用晶体管组合出很多种状态,然后计算机的雏形就诞生了。

 

世界上第一台通用计算机“ENIAC”于1946214日在美国宾夕法尼亚大学诞

 

第一台计算机是美国国防部用来计算弹道的,也就是说第一台计算机是美国用在军事上的。它非常大,用了18000个电子管,占地170平方米,重达30吨,耗电功率约150千瓦,每秒钟可进行5000次运算


640 (2).jpg

 

为什么要用这么多电子管,因为电子管越多能处理的状态就越多,这样能处理的速度就越快。

 

用八位的二进制表示一个字节,一共可以组合出256(28次方)种不同的状态

字节,它是计算机信息技术用于计量存储容量的一种计量单位,8位二进制数组合起来就有28次方种不同的状态,因为每一位二进制有2种状态01

 

刚开始计算机把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机收到约定好的这些字节被传过来时,就要做一些约定的动作。


640 (3).jpg


如收到 0001 0000, 终端就换行,收到0000 0111, 计算机就向人们嘟嘟叫,收到0000 1001, 打印机就打印反白的字,或者计算机就用彩色显示字母。于是就规定把这些0010 0000以下的字节状态称为控制码

 

然后把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。


640 (4).jpg

 


大家看到这样,都感觉很好,于是大家都把这个方案叫做ANSI”Ascii”编码(美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

 

后来计算机发展越来越广泛,世界各国为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128255这一页的字符集被称扩展字符集


640 (5).jpg


 

这样的话所有的状态都被用完了。

 

等到中国人民开始使用计算机了,发现状态都被你们用完了,那我们如何来表示中文字符呢?况且有6000多个常用汉字需要保存呢。


聪明的中国人就想,靠你们来开发是不可能的了。

 

于是就自主研发,把那些127号之后的奇异符号们直接取消掉。规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。

 

这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文都编进去了。

 

连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫半角字符(也就是占一个字节)了。

 

中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312″GB2312是对ASCII的中文扩展。


640 (6).jpg

 

但是中国的汉字太多了,后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。

 

结果扩展之后的编码方案被称为GBK标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了GB18030

 

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码。

 

第一个发明汉字输入法的是王永民(王码键盘输入发明者)从此字登上了信息化的舞台。


640 (7).jpg

 

当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,装错了字符系统,显示就会乱码。

 

就在这时,一个叫ISO(国际标准化组织)的国际组织看不过去了,决定着手解决这个问题。

 

他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!

 

于是所有问题的解决了,也统一的各个国家的所有语言。

 

他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称“UNICODE”

 

UNICODE 来到时,计算机网络刚好兴起,UNICODE如何在网络上传输也是一个必须考虑的问题。

 

于是面向传输的众多 UTFUCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE UTF时并不是直接的对应,而是要过一些算法和规则来转换。

 

现在我们所使用的计算机基本上所有的操作系统都自带了UNICODEUTF8等基本的字符集,可以随时切换。Windows XPWindows7操作系统自带的都是GBK字符集(含2万余汉字)

 

这样的话操作系统就可以帮我们把计算机输出的二进制翻译成人类能读懂的文字了。

 



那么图片和视频又是如何翻译的呢?请观看后续文章


 

请关注我的微信公众号:理想的键盘,获取更多编程知识。

 

扫描二维码关注:

 

640 (8).jpg

 


 

总结一下计算机编码的发展历程:

 

●  第一台计算机诞生,美国国家标准学会制定了 ASCII 编码。基础ASCII码,使用位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字9、标点符号,以及在美式英语中使用的特殊控制字符

 

●中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。

 

●汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。

 

●中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK编码扩充为 GB18030 编码。

 

●每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

 

●  终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。

 

●  UNICODE在网络传输中,出现了两个标准 UTF-8  UTF-16,分别每次传输 8个位和 16个位。


人人都能学编程

在看电影和电视剧的时候我们经常能看到,一个电脑黑客随便在键盘上敲几下就破解了别人的电脑系统进入里面盗取资料。


每当看到这样的片段就觉的黑客很牛逼,很羡慕,崇拜,幻想着自己也能有这样的技术。

 

我经常这么幻想着,所以我从小就很喜欢计算机,喜欢捣鼓各种黑科技,高考完几乎全部志愿都是填的计算机相关的专业。

 

现在我虽然没有像电影情节那样随便破解别人电脑,但是以现在的技术找工作还是挺容易的,而且工作挺快乐轻松的。


如果要问世界上什么工作最好,那么我的回答是:做你喜欢的事,感兴趣的事,那就是最好的工作了

 

很多人对编程都很感兴趣,但是苦于不知道如何去学。觉得编程很难,自己数学不好,英语不好,学不下去。 刚开始学的时候其实我也觉的很难,但是现在我告诉你们其实编程一点也不难,要不是傻子人人都能学会,关键看你有没有这个兴趣和耐心了。

 

学习一样东西最好的时刻是现在,当然有兴趣还需要一个好老师,不然再大兴趣也会被磨灭。


想要学习计算机,首先你需要认识它,不要以为你都认识它了,其实你只是认识它的皮囊而已,你只是知道它长什么样



你要了解它的心,才能和它交流,你要知道它想要什么,它才会把你当朋友

 

那么今天小猿就来做这个老师教你如何认识计算机,如何和它交流。

 

大家都知道计算机是一个机器,如何和机器打交道?

 

假如你在大街上遇到一个外国人,你想和他交流,你会怎么做?是不是应该说他能听懂的语言和他打招呼。

 

那么其实计算机也是一样,你如果想要和它交流,你就要学会一门语言,就像你要和英国人交流一样你要学习英语。


这个语言就是计算机语言,也就是计算机能处理和理解的语言,现在世界上有几百种计算机语言,常用的有C,C++,JAVA,PHP,lua等等,这些都叫做计算机编程语言。


 

而这些语言只是我们人类能学习的语言,对计算机来说是一种高级语言,实际上计算机真正能直接处理的语言是机器语言,什么是机器语言?


其实就是二进制代码,什么是二进制代码?


就是010101这样一串0和1的数字组合而已


 

为什么计算机只能处理这样的一串01组合的数字呢,原因是计算机内部使用了成千上万个微型的“通断型”电子开关进行工作:


这些开关在任何时刻要么是通电,要么是断电


或者说,该电路只有两种工作状态:通或断,所以只需要用0和1表示这两种状态。多种状态的组合即多个0和1的组合。

 

为什么我们不直接学习机器代码呢?


机器代码是一堆0和1的数字,你想想如果要你用一串0和1的数字去表示一句话或者是一个数学计算,有多困难,是不是很麻烦呢。只用0和1 去描述一件事或者去计算一个公式是很复杂的过程。所以人类就想出了用其他语言替代机器语言。

QQ截图20180724115129.png



然后再通过编译软件把高级语言翻译成机器语言,再由计算机去执行机器语言。

 

就像是你虽然学习了英语但是你的英语口语并不是很好,外国人并没有听懂你讲什么,这个时候有一个专业的英语老师过来了给你做翻译。

QQ截图20180724120224.png

 

既然是交流,那么就是双方都需要输入和输出。上面讲的是如何把我们人类所要表达的翻译成计算机能理解和处理的,那么计算机理解和处理后如果反馈给我们人类呢?


那就需要把计算机输出的内容转化为我们人类所能理解的语言,然后显示在屏幕上。


 

小猿将会在下一篇文章为您解答二进制的01代码如何转换为人类所能理解的语言。


请关注我的公众号:理想的键盘,学习更多编程知识。


2018_07_24_2158296960.png

人人都应该学点编程

周末去市图书馆逛了一下,本想去找本“人生鸡汤”看看,不知不觉就走到了计算机书架区了,真是职业毛病啊。心想都走到这里了,就看看现在有什么感兴趣的书吧!



走到编程书架旁看着那一排排编程语言的书,仿佛又回到了大学时代,感觉自己就像在学校的图书馆一样,还能感受到刚上大学时那种兴奋感。这个时候突然一个小学生打断了我的幻想,那个小学生说:我要买VB的书,我觉得VB比较实用,后面跟着他的爸爸妈妈,他爸爸说:不是应该学C语言吗?那个小男孩在书架上翻找着。我顿时来了兴趣,没想到现在这么小的小学生都开始学习编程开发了,居然还讨论着哪个语言好坏来了!这通常不是我们正规的程序猿应该讨论的问题吗?毕竟都说PHP是世界上最好的语言,虽然我不这么觉得,但是也轮不到小学生来评价啊。



我心想,现在已经是2018年了,互联网发展如此之快,小学就开始学习编程似乎并不奇怪,毕竟在大城市教育环境和孩子爸妈的教育都比较好,乔布斯曾经说过:”每个人都应该学习编程,因为它教会你思考的方式”,这样类似的话好像特朗普也说过,说明了编程在我们的生活中还是帮助挺大的,毕竟现在互联网如此普遍,以后我们的生活肯定会越来越方便化科技化,如果不学习一些如何与计算机沟通的东西还真的会被OUT掉。


      

从现在小学生就开始学习编程的趋势来看,如果我们成年人还不学习的话我相信马上就会被小学生超越了,到时候或许连小学生讨论的都是编程语言VB,C,PHP,Python这些专业词语。你一个做父母的可能都听不懂,这难道不是一种危机吗?未来的一切设备都可能是可编程的东西,现在越来越流行的是智能家居系统,买房子销售都喜欢吹他们的楼盘带智能装修,智能装修是什么?就是开发商在盖房子的时候已经想到了各种物联网智能家居的东西,把这些高科技的东西都装修到了房子里面,比如你家里的监控和门禁系统都是可以联网的,你只需要手机上装一个APP就可以直接开你家里面的门,开照明,开空调,看监控,各种你想的到和想不到的。



你可能会觉得这些好像和编程没有什么关系,是的现在是没什么很大关系,但是现在发展是这样,你想想以后会怎样呢?  你是不是发现现在的电视是越来越智能,几乎就是一台能看电视的电脑,未来很可能所有的智能家电都会设计成那样,直接互联网化,甚至没有屏幕,一个投影出来,像美国大片那样,手指随便点击几下就可以控制所有的家电。说到这里你可能还觉得好像和你会不会编程依然没有半毛钱关系,下面小猿就来说说他们到底有什么联系。



大家都知道现在手机上的APP和智能家电上的软件和系统都是编程开发出来的,那么在这个越来越讲究个性化,定制化的世界,这些功能能满足你们所有人的需求吗?每个家庭甚至是每个人对自己家的电视的要求都是不一样的。就比如有些人只喜欢看娱乐节目,有些人只需要看电视剧。然后每次看电视都是一个遥控器从头翻到尾,然后继续循环。是不是很烦?那么如果这些电视的生产商把电视做成可编程化,提供编程接口,让你自己定制你的电视,你自己写代码控制遥控器的功能,你可以让你的遥控器只循环娱乐节目,甚至是根据你的喜好自动选择一个频道给你播放,还可以根据你平时看电视的时间自动开机关机。



这些你都可以自己定制开发,我知道你心里肯定会说,这些东西生产商直接做进去不就好了,你要知道无论什么东西都不能让所有的人满意,就像你不能让所有的人都喜欢你吧,你喜欢的东西未必其他人喜欢,有些人喜欢简单,有些人喜欢科技化智能化。把功能都做进去只会让一个产品越来越臃肿,并且价格还越来越贵。现在很多软件都是可定制化的,我相信未来的硬件也一样是可定制化的(现在已经有很多),而且是可编程扩展的。只要发挥你的想象,每个人都能成为产品经理。


      

我只是举了个小例,未来会编程不只这一点好处,编程以后会是在生活上工作上的基本技能。来你想做的事,你只需要写个程序就可以帮你完成了。




欢迎关注公众号:理想的键盘,获取更多编程知识


Lua实现ECS简单框架

 ECS模式全称就是Entity-Component-System模式.

– Entity是实例,作为承载组件的载体,也是框架中维护对象的实体. 
– Component只包含数据,具备这个组件便具有这个功能. 
– System作为逻辑维护,维护对应的组件执行相关操作.

面向对象:把共同的东西抽象出来然后写在基类里面,然后不断的继承它们.

面向组件:把共同的东西抽象成一个组件,然后组合成一个实体.

虽然ECS的开发思想很早就提出来了,但是我发现没有Lua版本的一个ECS框架,其他语言版本倒是挺多的,今天在github上看到触控的 quick-cocos2d-x 的源码发现了GameObject.lua,Registry.lua,Component.lua.  

这3个文件,觉得这就是ECS的思想啊! GameObject.lua 代表了 实体也就是Entity,Component.lua代表了Component,

Registry.lua 相当于一个注册类,缓存了所有的Component.而里面的具体业务逻辑代码构成了System.

只需要把新的组件继承自Component类,实体继承自GameObject类,然后用实体的addComponent 方法添加需要的组件即可.而Component里

的 exportMethods_ 函数是把Component的里的方法导出到实体中,可以在实体对象中直接访问组件里的方法,

这是一种非常巧妙的设计,我觉的这3个文件完全可以抽出来放当我们的项目中去.


Github地址:

https://github.com/chukong/quick-cocos2d-x

rawget和rawset的作用

在Lua中有时候会遇到rawget  和 rawset 这2个函数,实际这2个函数的意思就是对表的访问和赋值 不使用元表的元方法.如下代码:

Class = {}
Class.mt = {}

function Class.New(o)
	local instance = o or {}
	setmetatable(instance,Class.mt)
	return instance
end

Class.mt.__index = function(t, key)
	return "huangyi.cc"
end

Class.mt.__newindex = function(t, key , value)
	if key == "fgreen" then
		rawset(t, key, value) --原始操作不使用元表方法
		--t.fgreen = value    --会使用元表__newindex方法
	end
end

w = Class.New({})
print(rawget(w,"fgreen")) --第一次打印输出
print(w.fgreen)
w.fgreen = "nVal"
print(w.fgreen)

输出结果:

image.png

可以看到第一次打印输出是nil 说明使用rawget获取表的值时没有去访问元表的__index 方法,而是直接访问了表w ,所以输出了nil.

而第二次打印的时候没有使用rawget方法获取表的值 则调用的了元表的__index方法去获取表的值输出了元方法的返回值.

当直接对w.fgreen赋值时,使用了元方法__newindex,元方法里面又使用了rawset 设置表的值,此时不会再去调用元方法__newindex了,所以设置成功了.

如果将rawset(t, key, value)换成t.fgreen = value的话将会造成死循环,因为t.fgreen = value的直接赋值会继续去调用元方法__newindex,造成堆栈溢出.

关于区块链

    最近的区块链和比特币很火,特别是李笑来的录音,我看了2遍,明白了很多东西,但是很多问题还是没搞懂,有人说可以看他的书,但是不要买他的币。我想有些问题还是要从他的书中才能找到答案吧!中国人就喜欢凑热闹,不管是在大街上还是在互联网还是在创业圈。我觉得不管做什么还是要有自己的一点思考,或者说是 做这件事的一个理由吧!否则你即使成功了也没有一个成功的理由,失败了也没有一个教训。

    区块链是一项技术,一个理论基础,比特币是基于区块链技术的产品。技术无罪无好坏,但是产品有,产品的理念很重要。比特币注定是一个泡沫型的产品,不会长久。