主页

来写一个简单的解释器(五)

来写一个简单的解释器(五) 你如何解决一个复杂度与理解去创造一个解释器或编译器一样的事情呢? 一开始它看起来非常像一堆乱七八糟的纱线,你需要解开才能得到完美的球。 解决方法就是一次解开一根线,一次一个结。 有时候,你可能觉得自己不会马上理解某些事情,但你必须坚持下去。 如果你足够坚持,你最终会清醒,我保证(诶呀,以前如果我每次不明白的花就放25美分,那么我很久以前就是个富人了) 在理解如果写一个解释器和编译器的过程中,我可能会给你最好的建议之一就是阅读文章中的源代码,甚至编写相同的代码。来使你感觉这些东西和代码对你来说十分自然,然后学习新的主题。不要匆忙,只是放慢速度,花时间深入理解基本思想。 这种看似缓慢的方法将在未来取得成效,相信我。 你最追将获得最完美的纱线球。 而且,你...

阅读更多

来写一个简单的解释器(四)

来写一个简单的解释器(四) 你是否在被动的学习这些文章种的内容?或是主动的学习?我希望你一直是主动的、积极的练习它。(真的) 还记得孔子说过的话吗? 「不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至于行之而止矣。」 英文:“I hear and I forget. I see and I believe. I do and I understand.” 在之前的文章里,你已经学习了如何解析和解释任意个整数的加减计算表达式,比如“7 - 3 + 2 - 1”。你也学到了有关语法图和如何使用它们来描述编程语言的语法。 今天,你将要学到如何去解析解释任意个整数的乘除计算表达式,比如“7 * 4 / 2 * 3”。本章将划分的是整数除法,所...

阅读更多

来写一个简单的解释器(三)

来写一个简单的解释器(三) 今早起来的时候,我陷入了沉思:“为什么我们学习新知识如此的困难?” 我认为它不仅仅是因为它难。我认为其中的一个原因是因为我们花了大量的时间和精力通过阅读和观看来获取知识,而没有足够的时间通过练习来将这些知识转化成技能。比如学习游泳,你可以花很多时间阅读上百本有关游泳的书,和阅历丰富的游泳运动员和教练谈几个小时,观看所有能找到的训练视频,但是当你第一次跳进水里时候,你仍然会像石头一样沉入水底。 底线是:你认为自己对这门学科了解多少并不重要————否则你必须把这些知识付诸实践,从而把它变成一种技能。为了帮助你锻炼,我把一些练习题放到了第一章和第二章。是的,你会在今天和以后的文章看到更多更多的练习题,我保证:) 好的,让我们开始今天的素材,不然呢? 目前...

阅读更多

来写一个简单的解释器(二)

来写一个简单的解释器(二) 在一本有趣的书————《有用思维的五要素》中,作者Burger和 Starbird分享了他们如何观察Tony Plig,一个国际知名的小号演奏家,为优秀的小号演奏者开了一个大师班的故事。学生们首先演奏复杂的音乐短句,并且他们演奏的非常好。但后来他们被要求演奏非常基础、简单的音符。当他们演奏音符时候,与先前的复杂短句相比,这些音符显得十分幼稚。他们完成演奏后,老师也演奏了相同的音符,但是当他演奏的时候,却不显得幼稚。差异让人惊讶。Tony解释说,掌握简单的音符能够让人更好的控制复杂的曲子。这个例子很明确————想要掌握精湛的技术,必须注重简单、基础的思想。 故事中的启示不仅仅适用于音乐,也适用于软件开发。这个故事提醒我们不要忽视在基础、简单的想法上埋工夫的...

阅读更多

来写一个简单的解释器(一)

来写一个简单的解释器(一) “如果你不知道编译器的原理,那么你就不知道电脑如何运行。如果你不是100%确定你知道编译器的原理,那么你就是不知道他们的原理” — Steve Yegge 你读了这句话。然后仔细想一想。它真的与你是否是一个电脑小白或者经验丰富的开发者没有关系:如果你不知道编译器和解释器的原理,那么你就真的不知道电脑如何运行。就是这么简单。 所以说,你知道解释器和编译器的工作原理吗?我的意思是,你是否百分比确信你知道他们的原理。 如果你说你不知道 或者你说你不知道并且对此十分的激动 不要担心。如果你坚持完成这个系列,并和我一起搭建一个解释器和编译器,你最终就会知道他们的原理的。然后你也就会变成一个高兴又自信的人。至少我是这么觉得。 为啥...

阅读更多

百度贴吧里有哪些神贴?

本人的ID,himself65,就是在百度帖吧注册账号时候填的, 之后也一直用着这个ID 大概在使用知乎前,在使用GitHub之前,一直都用的百度贴吧 我记得大概经历就是从 Minecraft吧 到了 plagueinc吧 到了安卓吧 大概到成龙的Duang风靡一时我还刷着百度贴吧。期间认识了很多人 初中那会儿一直都在瘟疫公司群里水。基本就是有时间就水 这已经是2019年了,那已经是2015年的事情了

阅读更多

一些算法的总结

前言 最近看Unix系统设计什么的,既然看到了就随便记录一下,肯定不会第二次看(逃 LRU(Least recently used,最近最少使用)算法 基本思路就是一个单向链表,每次访问如果有这个数据就返回这个数据并把它的节点放到链表头部 GETBLK(缓冲区分配) 算法 五种情况,不一一细说了 // todo

阅读更多

JavaScript的语言陷阱

一个例子,猜一下会不会Throw Error class Father { constructor() { if (arguments.length === 0) { throw Error('1') } else { this.foo = arguments[0] } } } class Son extends Father { constructor(first, second) { super(first) } } const son = new Son() 没有 为什么呢,因为 Son 类型虽然不存在 first 参数,但是它是 undefined,所以它变成了参数传递给了父类,于是 this....

阅读更多