近来学习的一些东西和思考

源起

花了3-4天对DukTape的研究,又让我重拾了对QuickJS的信心。为什么这么说呢?DukTape是一个公司开发的,文档非常非常详细和完整。而QuickJS和DukTape实现原理差不多。所以,DukTape实际上辅助了我对QuickJS的理解。但是我现在也不好说QuickJS最终是否能全部拿下。所以,我想还是先留下一点东西。即使后面真的彻底放下它了,至少还有地方记录我为了QuickJS做了哪些工作,后来人可以用作参考。

为QuickJS做了哪些事情

对QuickJS(下文简称QJS)的研究主要是为了弥补我在《深入理解Android Java虚拟机ART》一书中留下的遗憾,即我对编程语言还处于一个使用者的境界,没有站在设计者的角度来考虑。通过对QJS的研究,我想摸清楚JS语言规范(所以我是结合ECMAScript规范一起看的),然后学习QJS是如何实现这个规范的。通过这个方式,或许我能成为JS语言的专家,同时还掌握如何实现这门语言。这是我直接的,宏伟的想法。

最开始对QJS的学习就是生看代码。我在JS语言领域还是处于一个中度偏低级的水平,了解部分语法,很多细节不知道。不过,这不影响看QJS的代码。但是整个感觉是比较痛苦的,比如,QJS在对js代码做解析的时候考虑了完备的JS语法规则。之前只是使用者,做到正确用就行了。现在是换成实现者的角度,这些规则需要非常清楚。注意,QJS没有使用yacc、lex这样现成的工具,而是手动生写的解析器。

痛苦是件好事,我深刻认识自己对JS语言了解的不够。为此,我一共看了如下几本书,按顺序是这样的:

  1. 《你不知道的JavaScript》,上中下三本,中文版。这本书精看了上中两卷,下卷看的比较粗。我对看书有这样的体会,新知识在最开始学的时候会比较慢一点,一旦基础知识补充到了60%-70%的样子,剩下的内容就会看得很快。这三本书帮我补充了对ES6的一些语言基础。

  2. 《How JavaScript Works》,这本书目前只有英文版,在Kindle电子书上有。我原以为它是介绍JS引擎内部实现的。其实不是,它还是讲JS语言使用的,然后有些地方会稍微提到技术细节(但这个内容不是很多)。

  3. 《深入理解ES6》,我精读了这本书的英文版。

针对JS,我看的书大概有上述5本。现在只能说对JS语言有了一些认识。有了这个基础后,我自己感觉再看QJS代码就不再那么心虚了。

QJS代码我基本看完JS代码解析部分了,相关的数据结构也有80%的了解,但在将JS代码转换成QJS内部的bytecode时,我就再也无法深入了——这正是我之前说想放弃QJS的根本原因。虽然在编译领域,语法/文法解析后,源代码会转成中间表达式,但具体怎么转,我在ART一书中并没有涉及。我依稀记得有本书上说这个转换工作虽然是套路,但好像是艺术性多于技术性一点的。尤其是我一方面还欠缺对JS语言的深度了解,另外一方面还对JS引擎哪怕最简单的实现都一无所知。

这个困难是相当难克服的。而且,QJS没有一丁点对bytecode的文档描述.....。貌似是个死胡同。不过,我又想,既然是套路,会不会有一些书籍呢?为此,我又看了两本书(看来,书真的是好朋友....)

  1. 美国人的计算机学科教材《Concepts of Programming Languages(11th)》。这本书精读了一半左右。大概是介绍各种语言的发展历史,以及各种语言的特性(站在实现者角度考虑),是一个知识全面的教材。权当扫盲教材。

  2. 松本行弘的新书《编程语言的设计与实现》。这本书其实是弘哥在十几年前日本某杂志上发的几篇文章的汇总。我原以为通过这本书能了解到一个语言的实现过程,但其实学到的东西并不多。只能说开了开眼界。相比另外一本日本人的书《垃圾回收的算法与实现》,弘哥这本书差了点意思。

看完上面两本书,我发现对QJS的大难题没有什么帮助。实在没办法,我就在一个小圈里说放弃QJS了,打算转向DukTape。没想到DukTape的文档那么详细,实现思路和QJS大体一致。基于DukTape的一些文档,我对QJS不再害怕(现在是这个感觉,以后会不会变不好说)。我现在又觉得当初选择QJS作为学习目标可能是正确的。昨天又重启了QJS,把bytecode dump出来,打算沉下心来干脆一个一个case来研究算了。

对QJS的心态是反反复复来来回回。可能我还是老了,没年轻之前的勇气了。或许,做事情只要沉下心来,一咬牙可能也就搞成了——想想ART那本书也是这么搞出来的,坚持坚持。

这段时间干的其它事情

我看神农班Fwk局的童鞋们搞Android 10.0风生水起,也手痒下了10.0的代码编译了下。其中碰到几个问题要说一下:

  • 第一次发现Android编译这么吃内存。如果编译64位的话,至少要准备15GB的内存。我看主要是在生成ninjia.build这个文件时特别占内存。使用Ubuntu的同学们注意,只要将swap区域内存调大就行了,方法非常简单。我用的是虚拟机,物理内存只分了8GB,swap又分了8GB,如此编译x86_64没问题。

  • AOSP编译的话,如果想用模拟器跑,lunch后只要编译aosp_x86-eng或aosp_x86_64-eng即可。我以前选择mini-emulator那个,但是发现10.0上编译会失败。模拟器使用自编译的image速度非常快,感觉谷歌应该是优化不少了。

  • 编译好后,从AVD中创建对应的模拟器。然后需要设置一下才能用模拟器加载自己编译的image。以前只需要指定"--system 自己的image文件路径"即可,现在不行了。我和神农班Fwk局里的同学请教了下,他们是把自己编译的镜像文件拷贝到SDK下载的镜像文件里。这样太麻烦了。我做了一个脚本,做几个链接就行了。如下所示:

640?wx_fmt=jpeg

把这个脚本放在aosp源码根目录下,搞成可执行的。这样,一run就能启动模拟器,岂不爽哉?

一些思考

在XYS上看到一篇文章,叫《达克效应与认知的四个阶段》,文章上说,“一个人的认知过程一般要经历这么四个阶段:  

  • 第一阶段:不知道自己不知道;  

  • 第二阶段:知道自己不知道;  

  • 第三阶段:知道自己知道;  

  • 第四阶段:不知道自己知道

这一认知过程,恰与Dunning-Kruger Effect(达克效应)的总结相类似:越是无知的人就越自信。当一个人知识越来越多,自信心会下降,但是突破临界 点以后,自信心会回升,但之后不论怎么回升,都不如一开始一无所知时那么自信。即越是知识丰富的人越能意识到自己的不足,也越能发现、承认与学习别人的优点

这些认知阶段也恰好可以对应达克效应曲线的不同分段:愚昧山峰(不知道自己不知道),绝望之谷(知道自己不知道),开悟之坡(知道自己知道)与平稳高原(不知道自己知道)。

达克效应是一种认知偏差现象,这种偏差既可能是那些能力低的人过高估计 了自己的水平,也可能是那些能力高的人过高估计了他人的水平,但不论是哪一 种,都是由于个人错误地评估了特定人群的认知水平。

在我们的现实生活中,达克效应的现象可以说是无处不在,不仅是那些本就 不屑于、不善于学习进取的人总是有着迷之自信,即便是那些身居高位或被视为 社会精英的成功人士,都无法避免自己表现出这样的认知偏差。“

很多事情,我总觉得领导、年轻人有勇气,有魄力,搞得我常常自惭形愧。现在看来可能他们是确实有勇气,也可能是他们"不知道自己不知道"。

后续的安排

如果没有大的变动,我还是想坚守QJS。已经付出这么多了,希望不要变成沉没成本。

最后的最后

  • 我期望的结果不是朋友们从我的书、文章、博客后学会了什么知识,干成了什么,而应该是说,神农,我可是踩在你的肩膀上的喔。

  • 关于学习方面的问题,我已经讨论完了。后面这个公众号将对一些基础的技术,新技术做一些学习和分享。也欢迎你的投稿。不过,正如我在公众号“联系方式”里说的那样——郑渊洁在童话大王《智齿》里有一句话令我印象深刻,大意是“我有权保持沉默,但你说的每一句话都可能成为我灵感的源泉”。所以,影响不是单向的,很可能我从你那学到的东西更多。

640?wx_fmt=jpeg

神农和朋友们的杂文集

长按识别二维码关注我们

猜你喜欢

转载自blog.csdn.net/Innost/article/details/102481439
今日推荐