关于计算机这一块儿的认识

到目前为止,对计算机也算有一个通透的认识了。也该总结一下了。
由于我很乱,不想按照写程序的思路来写成一篇博客,反而想轻松的说一说。不一定真实,但可以作为参考。
windows早期为了竞争pc领域,不想自己造轮子,而是基于DOS的API开发。DOS的系统调用当时明显不够,为了支持更多的硬件,DOS的系统调用逐渐增多。随着90年代计算机和互联网的如火如荼,钱,驱使着人,微软的人一下子变多了。
不断选拔出的编程精英们,不断优化着各种系统调用。开始有最早一批的架构师系统性的总结API,并进行归类。并且必须做到的是可以迭代。旧的代码一定可以复用。这是为了使windows内部代码的健康走向而不得不未雨绸缪的。那时候的架构师们,就像任正非一样,有着远见的目光。
为了给员工们提气,比尔盖茨开始游说当时各种著名的公司,频繁的露脸使得这位年轻的BOSS逐渐在世人的目光。win的崛起依赖数亿的软件。当时gcc 90年代才开发好,c只是一个标准,我们何不自己开发?win抱着这个想法写了vc。为了更好的配合windows的生态,造了IDE。各种硬件的加入,使得DOS系统内部打了许多驱动。还有一些不知名的硬件不得不给windows提供驱动才行。这是捆绑的。
靠着office套件在中国大卖,一下子用户体量得到了奠基。

故事还很长。


操作系统到底有什么奥义?抛开复杂性不提,系统最核心的就是内核。这点linux已经验证,无需多言。
你想过用c语言实现一个printf么?平时你不写这种代码,但当你写操作系统时才能明白需要写这样的代码。
你想过怎样实现么?printf()后面的可变参数又是怎样写的?你一定烦了吧。你还觉得c语言的标准输入输出麻烦呢。不如python的1句print(),不如java的一句syso,不如c++的一句cout。qdebug。确实,这些函数的调用是不是很爽啊,但只能让你云里雾里。你也写过程序,你也知道你不喜欢写文档。你造个轮子后,需要让别人使用,你肯定嫌麻烦,不会将文档写的面面俱到,你会来一句,看代码吧。在你看来,别人的抱怨就是他们懒得瞧你写的代码。我个人觉得早期接触编程看代码的文档是一件不可能的事。我刚学c的时候那时候也是刚接触编程。老师给我们一本电子书,好家伙,我当时也是看了十几页的人,但是实在枯燥,不看。后来老师发了chw,还是中文的,但是,这函数说的啥意思啊。啥是内存地址?啥是初始化?…啥都不明白的我,当时也是直接把那个软件仍一边了。真的是…自己笑自己,哈哈。就是这样的年代,我接触了Java。怎么说呢?我记得我学得很远,一直学到了微服务。你得承认有的人他虽然对电脑感兴趣,但他有时的思维也不是很适合搞算法之类的。Java给人的最大好处就是懒。我们是被上帝宠的孩子,还远看不到编码的冰山一角。我之前写过一篇很短,但非常有趣的文章。for循环。仔细研读就会发现里面的奥妙。我们可以知道Java在封装数据时的边界以及越界了怎么处理。完全是计算机科学导论里面讲的嘛。导论难学,幸好我遇到了个有趣的老师,我不认为他很难,只要潜心研究。大学里只是教我们有这门课,和真实的机器怎么联系还是得看课下的功夫。而我认为我远远没有达到。代码啊,一行一行。写的适合没感觉,就加个for就3,4行了。问我自己,怎么做到的。为什么一下的功夫就多了这门多代码?每啥,就是脑子里灵光闪过,就形成了代码呗。代码说穿了就是要干什么干什么。有时候涉及到相关的内容了,查查文档,资料啊,复制拷贝代码就上去了。如果你去研究github上neovim项目的代码贡献度,你会发现一个很有意思的事情。github上贡献代码最多的,也是删除代码最多的。我不想搞什么Unix哲学,可是事实就是这样。而这就关乎了代码质量。同时养活了几门学科,什么数据结构啊,软件工程啊。我虽然每写过大型C项目。我也知道,按照C的特色,到最后代码上升到万行后,怕是如果没有好的数据结构来支撑,自己都不想多看一眼。甚至眼一瞪,大叫一声,老子不干了,转行转行。这时候Java,C++可能就会被垂爱。可能还不放弃的,叫嚣着重拾数据结构,于是就有了一遍遍地挣扎…青春,也在挣扎中消逝。这个故事没人给我讲过,我只是模拟一下,故事也可能只是虚拟。
可这就是生活啊。我们在代码中耗费我们大量时间。于是,有人去研究了更底层的事情。教育水平也在不断推进着。
学校的任务啊,我觉得,最重要的事情啊,就是要让你尽可能的看到事情的全貌。可能今后你挣扎着的那块领域你会不屑学校的肤浅,可是不必恨啊。因为如果你没学过编译原理,会不会听信了别人代码一定要写成这样的风格的鬼话?第1是所有代码进编译器一致对待。第2是你可以写一个程序,然后格式化你的代码啊。我用vim写java的时候,只要保存就会默认给我加上缩进。我不觉得这是很难的技术。甚至是谈不上编译原理前端的一部分。关键是你得知道一些历史上关于\n,\r,\n\r,\t等字符的处理。不同的系统有不同的处理。学到正则你还会惊喜的发现,这些统统可以用\s来代替。所以,在某些不是那么花的课程上下点功夫,哪怕你只是记记笔记,多年后再重拾这门学科,也可以啊。这些扩宽了我独立思考的深度。
等到接触脚本后,才发现这又是一个新的世界。我睡着的时候就可以帮我下载电影,然后自动关机。这在以前一定是高大上,到后来才发觉不过是脚本的妙用罢了。我在目前觉着有几点十分重要,需要着重说明的,不包含在这篇聊天范围内的,就是,代码要保存好。面向对象调用类头花时要记得思路,然后保存代码。永远永远看官方文档是最好的。英文?别搞笑了。我用linux,现在有道都出linux了。虽然启动有点慢。。。但屏幕取词什么的该有的都有了。这当然只能是忠告。因为按照我的德行,当初死活不听别人的忠告,忠告,也只能是忠告了。唉。写软件里面的也不乏异类。他们写代码完全上升到了哲学的高度。他们对编程语言甚至称之为实现范式。关键是人一开始就这样指导自己的编程了。我不知道这对于他们度过数据结构,算法那段枯燥期有没有帮助,但他们的视野肯定不会太差。写出来的代码是有灵魂的。不像我,一开始只是把别人给的代码敲了一边,到现在也只是学会了别人的风格,还差的远呢。有的人真的是废弃忘食的写了。当然我听到的大多是10年之前的例子。时间是很重要的参考条件。
怎么说呢?编写那些底层的代码真的不难。我大大小小也算见过猪跑的人了。对于一些底层的问题,我会向一些立志本科写操作系统的人建的QQ群提问。如果你没进,推荐可以搜一下进1个,对你是很有帮助的。我就是问了很多问题啊。
其实OS就是管理你硬件的。硬件什么的也是有API的。这是硬件厂商本身的进化。所以他给你提供的API操作系统的人肯定就要默默的搞了。在这个API基础上封装一个系统的API。比如,print,如果是OS的,就是printk。最后一个k是kernal内核的意思。你说,这又什么难的?大家不要小看这个函数,OS人必须保证别人掉这个函数是没问题的。
接着就是开发一下常用的软件了。比如shell。ls,pwd。之类的。而且他们需要遵循一个约定,GNU的好像,是一个开发操作系统所遵循的标准,虽然是参考性的,但还是很多开发OS的人遵守了。不为别的,就为标准。硬件这样做了,软件也这样做了,大家才能各自干好自己的事。我见过挑战标准最成功的例子就是微软,到最后自己成了标准。牛逼。
然后给别人提供进入你系统的内存地址。也就是系统调用。封装一下,成为API。供开发者开发。就是这了。
所以你写的#include <stdio.h>其实不就是系统有这个库嘛?或者是gcc有。反正肯定是有对应函数实现的,至于到底这个函数已经变成了二进制文件还是其他的,我没研究过。不过结合我使用这么长时间linux来看,肯定是stdio.h对应函数的事先早已变为二进制。反正纠结个这也没啥意思。
这就是这啊。至于怎么获取你的音箱,鼠标,甚至游戏手柄,在linux下就一个设备文件的事儿。别人都抽象好文件了,会文件读写不就会操作了?
当然你说为什么抽象称文件?他们怎么做到的。很简单,就是OS开发者不断的写结构体,不断的写,不断的抽象,恩,就成了。
你有兴趣可以看一下维护可以说是这个世界上最大C项目的人–linus,他最常用的软件。emmm。我不敢说现在,我觉得过去他一定经常用gdb作为调试工具。是的,就是那个带超级多参数的CLI界面的工具。人家用的。linus还是对很多GNU的东西保持好感的,比如gcc。他可没有自己去搞套gcc啊。
我所说的真的是事实啊。因为我加入的OS群,看源码的化,会发现很多OS相关的概念,进程,等都是代码里的数据结构啊。然后就是相关算法。
啊。。。
好吧。
就是这样了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章