源起

花了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下载的镜像文件里。这样太麻烦了。我做了一个脚本,做几个链接就行了。如下所示:

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

一些思考

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

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

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

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

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

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

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

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

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

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

后续的安排

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

最后的最后

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

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

神农和朋友们的杂文集

长按识别二维码关注我们

近来学习的一些东西和思考相关推荐

  1. 近来学习的一些东西和思考(2)

    源起 离上回公众号文章差不多1个月了.这个月主要还是在看ECMAScript规范,另外看了几本可能有效的鸡汤书.这里有些心得.BTW,感觉没什么好的标题,不如就继续上篇文章的名字吧. 三省吾身 孔子说 ...

  2. 聚焦CSDN技术主题月:深度学习框架的重构与思考专场回顾

    10月15日下午,在北京兆维大厦,由CSDN社区主办的技术主题月系列之--<深度学习框架的重构与思考>活动成功举办.CSDN邀请了用友畅捷通人工智能负责人张俊林.创业公司大数据总监周步恋. ...

  3. 整理关于牛人们对图书管理系统领域建模的精彩讨论,以此希望大家学习下别人是如何思考的...

    整理关于牛人们对图书管理系统领域建模的精彩讨论,以此希望大家学习下别人是如何思考的 原文:整理关于牛人们对图书管理系统领域建模的精彩讨论,以此希望大家学习下别人是如何思考的 关于图书管理系统的业务大家 ...

  4. 学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?...

    学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?请看到这还不理解我想说什么的朋友自行编写代码实现一下,就会有特别深刻的印象了. 解决方案:编写程序模拟笔算 ...

  5. 进入计算机专业学习的一些体会和思考以及今后的学习规划

    一.前言 这篇文章,我分享了刚刚进入计算机专业学习的一些体会和思考以及今后的学习规划,今后计划在CSDN进行学习上的反馈,欢迎大家一起交流,有大佬看到多多指教

  6. 不要学习代码,要学会思考(转)

    英文原文:Don't learn to code, learn to think 译/赖信涛 这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来 ...

  7. 学习bert过程中的思考,少走弯路

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 最近参加了一个nlp的比赛,做文本情感分类的.发现传统神经网络的效果的确赶不上bert.就研究 ...

  8. Java学习系列之不要学习代码,要学会思考

    这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo's在各个国家悄然兴起:在英国,编程已经是各个年级 ...

  9. 迷信、强化学习与认知的若干思考

    首先在这里祝大家情人节快乐! 说到迷信,我们可能并不陌生,迷信作为一个已经被我们贴上颜色标签的词,我们每个人都会有特殊的反应.说到强化学习,我们可能也并不陌生,作为人工智能博弈类的常用方法,至今还并未 ...

  10. C++ primer plus 学习中的疑惑与思考(1)

    plus中讲述的C++内容还是挺详细的,涉及很多举例和比喻帮助你理解,对于c++基础好的人可能觉得啰嗦之类的,但对于我来说刚好,补充了许多老师课上没讲的东西.相当于老师只是给你一个结果,但没讲解题过程 ...

最新文章

  1. Java实现文件复制的四种方式
  2. 架构师之路 — 数据库设计 — 关系型数据库应用程序设计
  3. Linux 支持显卡sli么,AMD Vega20专业卡将支持XGMI总线交火
  4. Uipath 学习栏目基础教学:8、uipath 屏幕抓取获取文本
  5. where is Fiori count server execution interval configured
  6. python 三引号_Python 基础(一):入门必备知识
  7. Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】
  8. linux resin 服务功能,linux服务之resin
  9. 定档6月11日 诺基亚手机新品发布亮点抢先看
  10. 市场营销读后感_好书共赏市场营销原理——带你探索市场营销成功的奥秘 !...
  11. 【转】C#的内存管理:堆栈、托管堆与指针
  12. 在MAC OS X下安装usb转串口驱动(PL2303主控芯片)
  13. HCI实验图常见类型
  14. 什么是1号信令、7号信令和PRI信令?
  15. java考试系统倒计时的实现_(Java程序设计)第11章设计考试系统中的倒计时.ppt
  16. Citavi 6使用教程
  17. CSP202006-1 线性分类器(100分)【数学】
  18. win10键锁定计算机,win10笔记本键盘win键被锁怎么解锁
  19. 弹性计算的内部概念:弹性扩张、弹性收缩、弹性自愈
  20. 统计物理中积分计算和态密度计算要点

热门文章

  1. 二项分布 (Binomial Distribution)
  2. 手动扩展oracle表空间,Oracle如何扩展表空间
  3. 买卖股票系列(力扣121、122、123、188、309、714) Java动态规划
  4. 外星人17r4原版系统_外星人17r4重装系统
  5. origin三图合一_神教程:Origin也能玩转图片拼接组合排版
  6. 从Cheney算法-广度优先搜索-倒酒问题(JAVA实现)
  7. 2019年中南大学研究生复试机试题 题解
  8. 这10道基础Java面试题,虐哭了多少人
  9. KUCAS清关文件申请形式 TER与TIR认证介绍
  10. 手把手教大家实现一个电子签名