90后“老头儿”和00后Go小子的硬盘夜话

来自:码农翻身(微信号:coderising)

作者:刘欣


1初次见面

虽然这个目录中各种编程语言写的程序层出不穷,但Java还是怀念不幸罹难的C老头儿。他经常给同一目录中的Python ,Ruby说C老头儿知识多么渊博,贴近硬件运行,速度飞快,能从他身上学到很多东西等等。


(注:参加《C老头儿和Java小子的硬盘夜话》)


今天目录里入驻了一个新家伙,Java一看文件名"hello.go"就知道这是一门新的语言,难道这们语言叫做Go吗? 用一个动词作为语言名称,挺少见的啊!


Java赶紧上网搜索,我赛,这个小伙子是2009年出生的,都快10后了,太年轻了。我们这些90后真的成为老家伙了!


一群90后的老家伙们Java, Python, Ruby.....把00后的Go程序团团围住,仔细地打量:“新来的,你有什么本事?”


Go 有点害怕:“你们要干嘛, Ken Thompson, Rob Pike是我亲爹 ,你们小心点儿!”


Python悄悄地问Java :“这俩人是什么鬼?”


“孤陋寡闻了吧”  Java 其实也是刚刚上网搜过,现学现卖:“ Ken Thompson是Unix 和C的创始人,Rob Pike是 UTF-8的设计者! 这不是主要的,关键是Google在为这小子站台背书。”


大家听到这小子背景如此深厚,不由得怯了下来。


“按照惯例,新人都要来一个Hello World,交个投名状吧!”


?wx_fmt=png&wxfrom=5&wx_lazy=1


"又来了一个把类型放到变量名后边的!"  Java一看到这种语法就气不打一处来!


“Java先生,您JVM平台上的Scala和Kotlin不都是如此吗?” 00后Go小伙儿所知甚多,以己之道还治彼身。


“那俩小子敢到这儿来,我一定把他们痛打一顿,你们的这种语法,总是让老夫感到真气逆行!” Java竟然自称老夫,真是老了。


“好了,消消气吧,年龄大了,真气逆行,走火入魔了可不好啊!” Python 安慰到。


“不过这小子的变量都得指定类型,看起来也是个静态类型的语言,是我辈中人。” Java感到了一丝安慰。


“谁是你辈中人? 你仔细再看看这个变量声明,根本没有指定类型,语句后边连分号都没有,和我们Python 才是一家人。” Python 开始和Go 套近乎。


?wx_fmt=png


Java “老头儿”不屑地说:“这点儿小把戏你都不懂? 这是自动类型推断,我们家Kotlin早就玩烂了! 就说那个name吧,已经被声明为字符串类型了,不能再改动了,你把它赋值为一个整数试试? 我打赌编译器一定报错!”



2盘问


由于来了一个静态类型同盟军,Java 对Go建立了一点好感,他问道:“小伙子,对于一门语言来说,肯定得有几种最基本的数据结构,例如数组了,列表了,HashMap了,你应该内置的都有吧?”


“那是自然,现在不是C语言时代了,语言中都得内置常用的数据类型,没有它们怎么混江湖啊!” Go马上回复。


“流程控制语句估计差不多,我也不想看了, 你怎么实现用户自定义的类啊?” Java自居为这个目录的老大,代表大家继续盘问。


Go说:“很简单,我们从C老头儿那里学了一个struct 过来”


?wx_fmt=png


一听说偶像C老头儿,Java的眼睛就亮了,这语法果然和C差不多。


“嗯? 这只是属性数据啊, 没有相关的方法吗?” Python 不让Java独大,急忙追问。


“简单,写个方法就行了!”


?wx_fmt=png


“方法和属性分开了,不在一起,好古怪啊!”  大家纷纷叫道。


“我们都有public, private 这样的权限限定符,你那里怎么处理?” Ruby 问道。


“我这里很简单,如果一个标识符(如方法,变量等)以大写字母开头,就意味着是公开的,别的包的代码就可以访问,否则就是私有的!”


大家纷纷惊叹, 这...这也有点太天马行空了吧! 


“你怎么处理继承?”


“我这里其实并没有继承,我这里只有组合:”


?wx_fmt=png


又是一片惊叹声, 大家纷纷拿这种方法和自己的实现做比较,Java老头儿想起了面向对象设计的一个重要原则:“优先使用组合而不是继承”, 心里觉得Go的这种思路还是挺不错的。


“那你能实现多态吗?”


“那还用说, 我实现的方式也很简单,不用强制一个类去实现一个接口,只要你拥有和接口一样的方法就可以当做那个接口来使用!”


?wx_fmt=png


“这不就是和我们的Duck Typing 一样嘛!” Python和Ruby 异口同声地说,“只要你看起来鸭子,走起路来摇摇晃晃像鸭子,那不管你是否实现了鸭子的接口,我们就会认为你是个鸭子!”



3goroutine


Java不支持Duck Typing , 心里略微不爽,他撇撇嘴说: “这有什么啊,都是一些奇技淫巧。 我问你,你的多线程编程实现得怎么样?这才是你能不能在服务器端,在高并发的苛刻环境中活下来的关键!”


Go说:“我没有多线程!”


没有线程? 大家都瞪大了眼睛,那你怎么支持并发啊?


“可是我有goroutine, 可以认为是一种轻量级的线程。”


“我说嘛,现代语言怎么可能不支持并发? 你这个goroutine有什么特点?” Java问道。


“goroutine和线程很像,就是一段可以运行的代码,你在一个函数调用之前加上关键字go 就启动了一个goroutine,简单不?“


?wx_fmt=png


“说说你具体是怎么实现的?”


“当你创建一个goroutine,它会被加入到一个全局的运行队列当中, 然后调度器会把他们分配给某个逻辑处理器,这个逻辑处理器会被绑定到唯一的操作系统线程,在上面真正地运行goroutine,如果一个逻辑处理器有多个goroutine要运行,那也要就形成队列,让逻辑处理器来调度执行。”


?wx_fmt=png

(逻辑处理器可以有多个)


“要是某个goroutine需要读写文件,阻塞了怎么办?” Java 很关心这个问题。


“简单,就让这个goroutine和逻辑处理器解脱关联,直接和系统线程绑定,等到读写文件完成以后,在回到某个逻辑处理器的队列去。”


?wx_fmt=png


“那你相当于自己实现了一个线程的调度器啊” Python 感叹到。


“是啊,你们不是这么玩的吗?” Go 反问道。


Java , Python,Ruby 自然不是这么玩的,根本没有逻辑处理器这个东西,像Java,会把用户空间的线程直接映射到系统的核心线程去执行。


“goroutine 虽说是轻量级的线程,他们之间怎么通信?” Java问道。


“我的创始人发明了一个叫做Channel的东西,你可以理解为一个通道,通过它各个goroutine就可以发送、接收数据了!”


goroutine其实就像在程序在用户空间实现的线程, 非常地轻量级,所需的空间非常小,切换也发生在用户空间,开销极小。所以非常适合创建大量的goroutine去并发地执行请求。



4EXE 文件


“咦,这小子生成了一个hello.exe来运行啊。”  Ruby观察得挺仔细。


原来的C老头儿也是编译成exe执行的, Ruby的这个发现一下子激起了大家的妒忌,因为这里的90后们,无论是Java, Python, Ruby, PHP其实都有一个虚拟机帮他们执行程序, 他们都想体验下当个exe,直接在硬件上执行那如飞的感觉,奈何是没有机会啊。


Java 有个好处是Hotspot的虚拟机,能把部分热点代码变成机器指令,在硬件CPU上执行,这已经让Java吹嘘很多天了,没想到又来了一个直接生成exe执行的。 


Java 想起之前C老头儿说的指针和内存管理的地狱,马上抛出一个撒手锏:“你有自动内存管理吗?”


这目录里边的大部分语言都是由虚拟机自动管理内存, 听到Java这么问,心里又来了一些优越感。


“当然有了!你只管创建对象,分配内存,垃圾回收Go会自己做的,我亲爹说过,一定要把C语言不好用的地方改进了!”


这些把大家震住了,一个exe程序,又能自动管理内存,以后我们还有活路吗?


“你们看,这个exe文件好大啊。” 有人叫道。


果真如此,一个小小的hello.exe竟然有1M多,怎么回事?


“我们Go语言默认是静态链接的,那个exe会把运行时所需要的所有东西都加进去,这样你就可以把exe复制到任何地方去运行了,多方便! 再说了我们那个exe文件还包含着垃圾回收不是?”


Java说:“啊,我明白了,其实你的每个exe文件当中已经包含了一个类似于虚拟机的runtime对不对? 要不然你怎么去自动地回收垃圾,进行goroutine的调度啊。”


大家伙的优越感又恢复了一点点,至少不会望人项背了。 

?wx_fmt=png


夜已深,Java做了个最后的总结:“新来的Go小子代码写起来有点Python的感觉,简洁干练,但骨子中去却流淌着静态类型的血液。他的封装、继承、多态还有goroutine都显得如此与众不同,但是总能在某个语言中找到一点影子,虽然能编译成EXE,性能不错,但实际上也有runtime 。看来是吸收了不少语言的特点啊。”


大伙纷纷表示赞同,然后就鸟兽散了。

(完)



●本文编号2817,以后想阅读这篇文章直接输入2817即可

●输入m获取文章目录

推荐↓↓↓ 

?wx_fmt=gif

大数据与人工智能

更多推荐18个技术类微信公众号

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

阅读更多
换一批

70后、80后、90后的区别

04-03

1.70后:工作狂基本上都是70后的. rn 80后:而我们,拒绝加班! rn 90后:拒绝上班! rnrn2.70后:他们喜欢穿七匹狼或者猛龙牌子的衣服。 rn 80后: 我们喜欢G-Star之类的。 rn 90后:乞丐服,越花越好,越破越好..一个洞时尚,两个洞潮流,三个洞个性... rnrn3.70后:他们唱k的时候只会乱吼──例如2002年的第一场雪,然后就拼命拉着你喝酒,不让唱。 rn 80后:Mic霸一般是我们。 rn 90后:我们不止会唱,还会跳! rnrn4.70后:他们的话题除了工作就是股票。 rn 80后:我们的话题更多,有英超、魔兽…… rn 90后:QQ等级,QQ秀... rnrn5.70后:他们如果有笔记本,会喜欢到公众场合用。 rn 80后:我们才不会背那么重的东西在身上。 rn 90后:只要苹果笔记本,而且不止一台... rnrn6.70后:他们喜欢喝红酒,一般是长城红酒。 rn 80后:我们要么不喝酒,要么就喝啤酒。 rn 90后:韩国果汁,日本汽水... rnrn7.70后:他们无论任何时候,看到有站着的领导,都会马上给领导让座。 rn 80后:我们崇尚上下级平等。 rn 90后:天上地下,唯我独尊! rnrn8.70后:他们娶老婆的时候想娶处女。 rn 80后:我们觉得无所谓,只要相互感情好就可以了。 rn 90后:结婚需要感情吗?..需要结婚吗?.. rnrn9.70后:他们觉得每个日本人、美国人、台湾人都想攻打中国。 rn 80后:我们喜欢日本的连续剧、台湾的综艺节目、美国的大片。 rn 90后:我要去日本,因为我是日系MM... rnrn10.70后:他们希望中国用核弹把上面三个国家(地区)都灭了。 rn 80后:我们希望和平。 rn 90后:和我无关!打仗衣服会降价吗?那就打呗~~ rnrn11.70后:他们对服务员态度恶劣,或者言语上调戏女服务员。 rn 80后:我们只在点菜和结帐时会跟服务员说话。 rn 90后:从不和waitress说话,只会背后讨论她的衣服很土... rnrn12.70后:他们有存款。 rn 80后:我们负债。 rn 90后:我们有老爸! rnrn13.70后:他们会把房子买在番禺或者花都,然后每天早上花一个多小时乘车去上班。 rn 80后:我们喜欢在公司附近租房子,每天骑车或走路去上班,就为了早上多睡一会。 rn 90后:我们住哪里都可以,只要BF喜欢... rnrn14.70后:他们结交有背景有地位的人。 rn 80后:我们结交志趣相投的人。 rn 90后:我们结交满身文身的帅哥! rnrn15.70后:他们周末约客户去吃饭。 rn 80后:我们周末约同学去逛街。 rn 90后:一个礼拜7天周末,想做什么做什么! rnrn16.70后:他们喝酒时喜欢跟别人干杯. rn 80后:我们能喝多少喝多少,喝不下了,怎么也不肯再喝. rn 90后:我不是随便喝酒的人,我随便喝起酒来不是人~ rnrn17.70后:他们的家进门要脱鞋。 rn 80后:我们家进门不用脱鞋。 rn 90后:我们上床睡觉都不脱鞋! rnrn18.70后:他们五一、国庆去旅游,然后会在各个景点门口拍下很多V字手势的照片 rn 80后:我们五一、国庆在家睡觉,或者约朋友去唱k,去旅游,我们只会拍景色 rn 90后:我们天天是五一,国庆....取消五一没什么关系... rnrn19.70后:吃饭时,他们喜欢坐在老板旁边. rn 80后:我们最好别坐在老板旁边,那才无拘无束. rn 90后:我是老板! rnrn20.70后:他们跟陌生人在一起的时候喜欢找话题说。 rn 80后:我们不太搭理陌生人,故意找话题不累么? rn 90后:你谁阿,穿这么土,死开~ 帅哥,交个朋友好嘛?~~ rn

没有更多推荐了,返回首页