8

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

 3 years ago
source link: https://blog.csdn.net/innost/article/details/102481439
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

阿拉神农 2019-10-09 15:05:01 5999

花了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

神农和朋友们的杂文集

长按识别二维码关注我们


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK