扯淡:技术爆炸

扯淡:这一周感觉经历了一次技术爆炸

过去的一周里,憋了很久终于把之前欠的ASDK的文章,写出了一个前言,然后又扔那不动了,唔,罪过罪过

今天又想多扯点淡,扯点碎碎念了

标题党了,先道歉,以我片面的学习和认知,我是真的觉得这周大新闻好多,好厉害!

之前不是写了一篇从antlr扯淡到一点点编译原理么,当时的背景是这样的,使用JSPatch很久以来,我都有个想法,想了解一下JSPatchConvertor到底是怎么运作的,因为JSPatchConvertor目前依然还有一些缺陷和不支持,我想了解这里面更深层面的原因,并且之前YY过一个想法,很多Cfunction需要写Bridge,这个Bridge能不能自动生成,扫描一个xxx.h的头文件,自动生成那些外表很规范的JSPatch Cfunction Bridge(那会JSPatch还没引入libffi),这种种的问题都指向了一件事情

  • 我需要解析代码字符串
    • JSPatchConvertor的原理就是把oc代码,当做字符串,让一个神秘的东西分析出来了逻辑
    • 而我想要的自动生成Cfunction Bridge,也是需要解析.h文件的字符串,然后生成对应看起来很模板化的Bridge代码

所以在bang哥的提点和文章介绍下,我才了解到antlr这个东西,(最开始我曾经天真的想用正则的方法解决问题)

扯淡:

其实槽点来了,我早在15年底就有过JSPatch Cfunction Bridge自动生成的想法,bang哥也给我了提点,一直觉得这块难啃,光看antlr的网站介绍就不想看下去了,于是我一直拖延到16年中,才开始硬着头皮去捉摸antlr,捉摸完了也忘记总结,直到11月份才想起来写个东西给自己留个念想,不光是拖延症的问题,我真的是觉得这玩意好难

后来通过antlr我给自己建立了一个大概的认知

  • 代码其实是一行一行的字符串
  • 字符串通过预处理器,转换一些宏和预处理的东西,还是字符串(Preprocesser)
  • 字符串输入词法分析器,产生经过词法分析后的一个结果(Lexer)
  • 词法分析后输入语法分析器,产生AST(抽象语法树abstract syntax tree)(Parser)
    • 分支:走LLVM编译机器码
    • 分支:走虚拟机,在虚拟机环境直接运行

周一:滴滴的DynamicCocoa横空出世

DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航

@我就叫Sunny怎么了 大神发布了大新闻,这个新闻相信太多的人都看到了,太厉害太牛逼了,也在我自己的微博上转发了崇拜之情。

我是这么理解的,苹果本身oc是通过clang编译的,也就是说clang本身就含有最完善的把OC代码字符串,通过Preprosessor -> Lexer -> Parser -> AST过程,大神们直接在clang工作流生成AST后进行了接管,在AST传给LLVM生成机器码之前,拿走了AST进行自己的处理也就是滴滴说的codeGen,处理语法树,生成转化为JS代码,再通过底层的JSCore + OCRuntime实现了动态更新,后半部分思路上和JSPatch异曲同工,但前面部分实在牛逼。

JSPatch本身是有JSPatchConvertor的,但还存在着很多缺陷和不支持,原因就在于很多OC的语法并不是和JS语法是一一对应的,换句话说如果让每个OC语法都照常在JS里面进行实现,还需要做太多太多的事情,其次JSPatchConvertor是借助antlr进行的编译(Preprosessor + Lexer + Parser),antlr的源码是否能做到完美还原出clang的AST这是一个问号?我其实对antlr理解没那么深,但初步看来,C/C++与OC混编,各种预处理,在antlr里想全面支持,以我对antlr目前还算片面的认知,感觉好痛苦。

但是滴滴绕过了这一步,直接去拿clang的AST结果进行处理,实在是太妙了!但接下来还有一个问题没有解决,所有AST节点类型都直接支持么?语法树中包含OC语言中的各种特性节点,难道都能一一翻译成对应的JS?这里面语法的支持程度有多少呢?(真是迫不及待想看源码啊!嗷嗷嗷嗷嗷!)为了支持足够多的OC语法类型,是否需要对以前JSPatch那一套底层JS-OC runtime进行大刀阔斧的改变呢?

尽管有这么多问题,尽管迫不及待想看到代码,还没看到但依然觉得这一套DynamicCocoa很恐怖很牛逼,使用者只用写oc不用关注js的,并且转换器与OC编译器保持高度一致性,远比常见的各种不支持的convertor要深入的多得多,并且把hotpatch底层部分为了更贴合编译器做了好多优化和功能扩充,想想就觉得太厉害了

周四:iOS动态化的故事引出了QQ的OC虚拟机

iOS动态化的故事

@bang哥发了这样一个博文,介绍了iOS这么久以来在动态更新上的探索历程,这篇文章说了很多事情,道出了平台的限制以及如此多的大厂对于动态化的尝试历程。但这篇文章中有一段文字简直如惊雷一般!

手机 QQ 内部也有一个类似的方案,不过更进一步,他们通过 clang 把 OC 代码编译成自己定制的字节码动态下发,然后开发一个虚拟机去执行(惊呆了)

我瞬间想起10月份@杨萧玉HIT大神的一篇微博

配合@bang哥的文字解释,瞬间觉得有点炸天。

不知道是不是我设想的这样,由clang生成的AST,不再像滴滴那样转换语言到js,然后交给jscore(一个js虚拟机)配合js-oc runtime来生效,而干脆是直接重写了一套虚拟机,所有指令集都是自己设计的,直接把AST输入给虚拟机就能直接运作了

自己重写一套虚拟机,重写一套虚拟机,一套虚拟机,虚拟机,…… 整个人都吓到了,不过以上这些还没有对应的宣传文章和详细介绍,存在于各位大神的交流的只言片语之中。

从研究语言编译,更进一步上升到,重新设计指令集,重写一个虚拟机

突然有点懵逼,感觉自己太多不会太多不懂了

上面所有的内容其实都是我的认知和猜想,我对这方面的细节完全懵逼,感觉扯了这么多我始终还停留在嘴炮的阶段

上面所有的内容其实都是我的认知和猜想,我对这方面的细节完全懵逼,感觉扯了这么多我始终还停留在嘴炮的阶段

上面所有的内容其实都是我的认知和猜想,我对这方面的细节完全懵逼,感觉扯了这么多我始终还停留在嘴炮的阶段

重要的事情说三遍╮(╯_╰)╭

之前看编译这块,就觉得让我使用现成的antlr之类的东西,导入现成的grammer规则,让我看看AST如何遍历,如何转化成不同语言,我还勉强能梳理出一个轮廓。

如果是让我完全独立重写Lexer+Parser我感觉我就彻底懵逼了,Flex/Bison Lexy/Yacc,确实有关键字可以帮助我查询获取知识,当我搜寻这些关键字的时候,我发现搜出来的文章,一个个单词和字我或许能认识,连成句子以后感觉就不是人话了╮(╯_╰)╭

这一下更是除了编译这个环节之外,虚拟机的底层实现又出来了。真的觉得要学的太多了。

我觉得有必要让自己需要系统的了解点相关的知识了,很多人说龙书看不进去,不知道在有了这些我自己产生的浓厚兴趣后,我到底不是能看进去,这话不能说太大说太满╮(╯_╰)╭但我也想尝试一下,学学以前不敢想象,不敢涉及的领域

PS:

@老郭为人民服务在他的技术群里发来一个东西,看上去感觉很威武很牛逼!

http://c-smile.sourceforge.net/

C-SMILE is a scripting language, which inherits it’s syntax and structure from C, C++, Java(tm) and JavaScript. On hypothetical “axis of programming languages” it resides somewhere between Java(tm) and JavaScript.

In the same way as in JavaScript, all variables are typeless and as in Java it is mandatory to declare variables before usage.

C-SMILE has a compiler, a virtual machine running bytecodes, and a C/C++ extensible runtime. C-SMILE is intended to run in standalone or embedded mode.

简略点说就是一套用c++写的,同时支持c/c++,java,js的四种语言的编译器+字节码虚拟机的源码,不知道我能不能看懂源码,但也想试试

用C/C++写的一套能运行C/C++代码实时虚拟机,有没有感觉很带感!更何况他同时支持java和js,其实我猜,编译成同一套AST后,可以用一个虚拟机解决3个语言。这个玩意支持程度有多大,我还不了解,因为我觉得我一时半会不见得吃的透,但我觉得这也是一个了解虚拟机底层实现的途径

苹果爸爸让不让?

我确实看到了很多人问这样一个问题,这么高调不怕被苹果干掉吗?

我觉得facebook的rn够高调了。

但我现在有一个看法,我根本不在意苹果爸爸是否会干掉!

我倒是觉得,无论苹果爸爸让不让这么做,这都是一个让人激动的事情,其实只要苹果还允许网络通信,各种绕过审核的方案就没可能禁掉,禁了jscore,植入一个V8进去或许更牛更high,怎么禁?虚拟机都是人写的,大不了向qq一样重写一个虚拟机。

下发脚本语言叫动态更新,服务器做个开关,下发不同的配置展现不同的界面就不叫动态更新?服务器下发不同的文案,按钮展现不同的文字就不叫动态更新?

有些人会觉得我举得这两个例子有点扯淡,其实有没有想过,webview底层内核,js虚拟机底层源码,很多时候都是同源,或者说本质近似?

这事或许一开始是因为绕过审核限制而起,我现在倒是丝毫不因为绕过审核而激动,各种人在尝试各种方案的过程中其实是在还原代码的运作本源,字符串编译,字节码运行,探索到这一步其实会发现,平台和语言的界限没那么分明,不再是使用固有语言,编写被提供的限有的api

这背后其实意味着:很多时候平台限制不再是真正意义的瓶颈,无论是因为苹果禁止,还是一开始平台或语言设计存在缺陷,也许要实现需要的技术壁垒巨高无比,只有大公司大团队才做的起,但背后也是有很大意义与价值甚至商业价值的,意义不一定就是在打破苹果禁令,更多意义在于:有时候平台和语言本身缺陷也不是不可改变了,只能等官方解决了,这背后的技术价值是很令人激动的,但真说绕过审核,规避禁令,我反倒觉得无所谓

YY中

如果说程序员编写程序,就好像造物主创造万物,从无到有创造东西,那么这类对底层的探寻,是否有点寻找造物主自己是如何被创造出来的赶脚呢?怎么感觉自己有点在说梦话╮(╯_╰)╭

其实写了这么多,还是回到了标题,扯淡:这一周感觉经历了一次技术爆炸,说白了还是在扯淡,哈哈哈哈哈哈哈哈哈

有时候在自己的博客里留一点扯淡,留一点纯思考性的东西,感觉也挺有意思的,上一次是以一个外行人扯淡有关前端发展的观后感。

“站在10年研发路上,眺望前端未来”:读后感

相关链接

从antlr扯淡到一点点编译原理

DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航

iOS动态化的故事

http://c-smile.sourceforge.net/

“站在10年研发路上,眺望前端未来”:读后感