
编译器技术
文章平均质量分 62
志_祥
C/C++/Java高级程序员,系统架构师,WebKit专家,目前从事Chromium-Android内核开发。
展开
-
关于浏览器核心的一些思考
在Chromium项目最让人感兴趣的2个声明:将WebCore核心模块化,以及用JS重新实现DOM。前者应可使得WebCore核心layout的代码结构更为清晰,第三方的定制裁剪也将更为方便,后者能,据说去除了罗哩罗嗦的JS-C++ bindings代码能能够进一步提高性能。这第2个目标一则反映了Google guys对他们的V8引擎很有信心,二来我想象不出什么是纯JS的DOM实现,反原创 2014-08-06 23:54:27 · 1552 阅读 · 3 评论 -
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(后续2)
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(后续1)https://codereview.chromium.org/1485023004/diff/20001/src/mips64/simulator-mips64.cc呃。。。所谓的”字节码解释器“似乎应该叫做simulator(仿真器)或者像JVM那样,”虚拟机“原创 2015-12-02 19:50:06 · 818 阅读 · 0 评论 -
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(后续3)中间休息思考
反省一下我目前的字节码指令设计:1、CallPrimitiveFunction是基于寄存器的,有一个最简单的ABI,但中间的临时变量却是需要Push/Pop的,什么时候需要将原语函数的计算结果Push,似乎没有一个好的指导原则?2、嗯,当前parser是基于算符优先+递归下降技术的,似乎可以这样:考虑一般的子表达式:subExpr1 op subExpr2其中,子表达式有可能递原创 2015-12-02 20:12:14 · 989 阅读 · 0 评论 -
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(后续4)
成功解决了字节码指令生成的问题,掌握一个原则:1、数值常量一律MovImm #imm, R0,但把执行Push2、假设任何表达式的指令生成结果都对应于其值在R0里,要不要Push iff:此子表达式出现在二元运算的左侧,且右侧需要递归。(注意,右侧如果只是一个数值常量的话,倒是可以直接MovImm #right_imm, R1,不需要对左侧的结果进行Push R0)fu原创 2015-12-03 14:26:06 · 964 阅读 · 0 评论 -
LLVM Essentials-Packt 2016(读书笔记):TableGen讲解并不透彻,另外我还想知道后端优化步算法到底怎么编写?
LLVM Essentials目录 [隐藏] 1 Playing with LLVM2 Building LLVM IR3 高级IR4 基本IR变换5 高级IR块变换6 IR到Selection DAG阶段7 为目标架构生成代码Playing with LLVM[编辑]寄存器变量(%var)、栈变量(alloca,%1原创 2016-02-18 15:35:20 · 2796 阅读 · 0 评论 -
从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化)
从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化)#一些想到的东西:## 要掌握编译器前端Parser的语法解析是怎么回事,不需要用完整的C语言系的字符串,只要考虑带括号的数学中缀表达式怎么处理就行了。## 这之间,关键的3点需要掌握:(1)怎么写一个算符优先、递归下降的BNF文法(2)怎么处理优先级和结合性的问题原创 2016-04-26 22:23:36 · 3539 阅读 · 0 评论 -
经典的基于图着色模型的寄存器分配
经典的基于图着色模型的寄存器分配:1、如果变量(在指令/语句序列中,或称程序“基本块”?)不再被use(def也是use),则它dead2、否则变量live(活着)3、如果2个变量在一个block/program中都是live,则不能赋以相同的寄存器,在对应的RIG(register inference graph)中,在这2个变量节点之间连接一条边由上面的描述原创 2016-05-07 14:58:24 · 6299 阅读 · 0 评论 -
Mozilla Rust最近发布的MIR的一个评论
原来Rust似乎是直接从AST翻译到LLVM IR,现在则拆分为HIR和MIR了。什么是MIR呢?仔细看了原始的blog文章和RFC,可以认为MIR其实就是对CFG的一种抽象,只有内存结构,没有线性化的序列化反序列化表示。这里要理解的一个核心概念是:AST只是高级层面的对原始语言的文法结构抽象,直接对应于前端parser的处理结果。而这个AST下降到MIR要做一系列的程序转换:这里原创 2016-05-08 16:19:35 · 1293 阅读 · 0 评论 -
HTML5页面渲染性能的”程序转换“思路
做浏览器内核引擎的,一般都会考虑怎么做性能优化,这个优化实际上包括下面的内容:(1)内存占用的优化,特别是对于嵌入式设备尤其重要,chromium有个blimp thin client的模块,不知道有没有用处;(2)渲染性能的提高,注意核心就是尽量利用硬件GPU来做渲染,避免CPU计算和内存Copy的开销(3)网络IO性能的提高,改善页面加载、响应数据,乃至云加速压缩流量、广告过滤屏蔽原创 2016-06-22 20:43:32 · 1339 阅读 · 0 评论 -
Google V8解释器(代号Ignition)设计文档的阅读感想
Google V8解释器(代号Ignition)设计文档的阅读感想https://docs.google.com/document/d/11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44/edit?ts=56f27d9d#1、字节码使用了x86的变长设计,可以前缀扩展到最多4个字节,以支持宽操作数?2、对于属性访问,所谓的TypeFee原创 2017-02-25 16:03:15 · 2261 阅读 · 0 评论 -
Build Your Own Angularjs 读书笔记(AngularJS牛逼的地方在于它内嵌了一个表达式到Function对象的编译器。。。当然还有DI框架)
Build Your Own Angularjs 读书笔记目录 [隐藏] 1 项目配置2 作用域3 表达式与过滤器4 模块与依赖注入5 辅助函数6 指令项目配置[编辑]npm package.jsonLo-Dash, jQuery:不依赖,如果有就代理使用_.template("Hello, !")({name: to}); //var _原创 2017-05-31 19:41:06 · 3223 阅读 · 1 评论 -
高性能虚拟机解释器:DTC vs ITC(Indirect-Threaded Code)
最近重新看Google Chromium讲Ignition的一个ppt,最后提及JSC是Direct-threaded dispatch,而v8属于Indirect-threaded dispatch。Contemporary JavaScript EnginesJavaScriptCore (Apple)● Direct threaded (== bigger code an原创 2017-08-08 10:42:21 · 1182 阅读 · 0 评论 -
Linux内核net/bpf模块的bpf_tail_call()尾调用机制
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/net/core?h=v4.13-rc2&id=04fd61ab36ec065e194ab5e74ae34a5240d992bb备注:(1)BPF实际上核心是一个解释器,加上JIT引擎,但是感觉它的复杂程度应该小于LuaJIT,当然更小于v8原创 2017-07-24 10:43:15 · 1460 阅读 · 0 评论 -
Mastering Web Application Development with AngularJS-Packt 2013 读书笔记(不错的好书!)
Angular ZenBatarangBatarang is a Chrome developer tool extension for inspecting the AngularJS web applications. Batarang is very handy for visualizing and examining the runtime characteristics原创 2017-08-03 14:29:01 · 805 阅读 · 0 评论 -
简明扼要地谈谈v8的隐藏类和Inline Cache(內联缓存)
还有一个是从AST直接生成机器码,但是这个现在已经被换成了Ignition(解释器)+TurboFan(类型优化编译器)的架构了。先说隐藏类:对一个JS对象的属性访问而言,最简单的解释器实现会把属性建模为运行时的hash查询。然而这个性能太慢,怎么优化呢?简单的说就是参考静态编译器的思路,把属性field的按名字访问,抹掉名字信息,变成按offset访问。——不过这样就需要一个clas原创 2017-08-13 23:17:03 · 2603 阅读 · 0 评论 -
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(后续1)
字节码设计:第一版(仅仅用于表达式计算)PushImm 123Push R2Pop R0Mov src, dst #寄存器到寄存器MovImm imm, reg #加载立即数到寄存器CallPrimitiveFunction ‘+’ #ABI: 最多2个输入参数,R0,R1,输出结果在R0核心JS代码(部分,优快云博客不支持上传附件):functi原创 2015-12-02 19:41:59 · 1615 阅读 · 0 评论 -
使用JavaScript实现一个“字节码解释器”,并用它重新实现JS科学计算器的后端(待续)
为简化问题,1、科学计算器不包含用户自定义函数,也就是说,“字节码解释器”不考虑嵌套调用栈的问题;2、需要把表达式转换为序列化的基于“寄存器”(假设R0~R15)和“局部变量”(像LLVM那样%1~无限)的微指令字节码序列,这里面最重要的是一个CPS转换3、需要定义字节码调用原语函数(PrimitiveFunction)的ABI规范,目前简化为:最多2个参数,用R0、R1传递,结果原创 2015-11-28 10:55:54 · 1627 阅读 · 0 评论 -
Getting Started with LLVM Core Libraries阅读笔记
Getting Started with LLVM Core Libraries目录1Build and Install LLVM2External Projects3Tools and Design4Frontend5LLVM IR6Backend7JIT8交叉编译9Clang静态分析10LibToolingBu原创 2014-09-21 00:19:54 · 5078 阅读 · 1 评论 -
使用Python语言编写简单的HTML5语法解析器
使用Python语言编写简单的HTML5语法解析器摘要:通过使用Python语言编写一个简单的HTML5语法解析器作为例子,探讨了在设计手写的递归下降语法解析器程序时需要注意的一些事项。 关键字:PythonHTML5语法解析器 正则表达式 递归下降 编译器技术 1 问题 如何编写一个语法解析器(Parser)呢?在C/C++语言领域,我们有le原创 2014-09-04 10:35:23 · 3556 阅读 · 1 评论 -
浏览器新实用功能开发研究:启动到浏览器(Fire OS, Chrome OS, Web OS)与浏览器容器化
启动到浏览器(Fire OS, Chrome OS, Web OS)与浏览器容器化本文试图阐明2种不同的技术方案:一个是启动到浏览器(如Fire OS, Chrome OS, HP Web OS, Tizen Web Rutime),另外一个我称为浏览器容器化启动到浏览器相信大家多少已经有了解,它就是通过底层的驱动支持、HTML5 Device API等等,把浏览器内核做成整个原创 2014-10-26 23:06:01 · 1413 阅读 · 0 评论 -
计算机程序的构造和解释(第二版)笔记
计算机程序的构造和解释(第二版)跳转至: 导航、 搜索definecondif (else)special form,不能实现为对cond的封装(why?)and or notsqrt形参应该可以统一换名:‘作弊检测程序’?内部定义:嵌套的define(块结构)词法作用域:内部程序共享的变量可以作为自由变量线性递归(gcd)尾递归(Schem原创 2014-10-31 22:48:54 · 1801 阅读 · 0 评论 -
不幸的问题还是出现了:Chromium代码上整理patch(working目录/master分支),部分文件做了git checkout恢复,结果GYP再编译就出错了
redtea@Lenovo:~/Projects/Chromium/src$ ninja -C out/Release android_webview_apkninja: Entering directory `out/Release'[3/24] CXX obj/android_webview/browser/android_webview_common.shared_renderer_原创 2014-12-19 15:12:36 · 2695 阅读 · 1 评论 -
IRON/DLR:无名的“LambdaExpression”节点
Before execution, the entire expression tree must be wrapped in a function so that it can be executed. In the DLR, functions are represented asLambdaExpression nodes. While in most languages a lam转载 2015-01-31 15:56:41 · 919 阅读 · 0 评论 -
Chromium代码里编写定制的clang插件做C++函数的静态样式检查
commit80f54dc1ab629289946237227e5706e19b7e7594authordcheng Wed Jan 07 19:13:49 2015committerCommit bot Wed Jan 07 19:15:28 2015Implement the Clang plugin as a RecursiveASTVisitor.The current原创 2015-01-19 12:39:57 · 1500 阅读 · 0 评论 -
C++的链接依赖是平面式的
假设模块A依赖于B,B依赖于C则A间接依赖于C编译A时需要设置到C的依赖而对于Java语言来讲则不需要原因是Java的二进制库可以在运行时动态加载但C++的dll/so则必须一次性处理当前自己写代码LoadLibrary或dlopen的除外原创 2015-02-28 13:47:31 · 950 阅读 · 0 评论 -
历史工作记录:V8-SH4移植项目到目前为止的经验总结 2010.3
V8-SH4移植项目到目前为止的经验总结 2010.3从IA32实现移植,而不是ARM尽量在指令级实现移植(Assembler、MacroAssembler),这样大部分代码可不做修改IA32的通用寄存器名称不变,定义成常量映射为SH4的通用寄存器比较及条件跳转现实:IA32有FLAG寄存器,而SH4只有一个T位从高层概念上把握一个原则:‘条件成原创 2015-06-27 18:01:34 · 807 阅读 · 0 评论 -
浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?
浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?需求“页面智能拼接”指的是通过启发式查询DOM树,判断出“下一页”链接,取出其href属性。Chromium的官方插件DOM Distiller完成类似的工作,主要目的就是为了将多页点击流程变成单页的Ajax连续阅读体验。问题是,现在有些网站为了阻止浏览器客户端这么做,将href属性设原创 2015-06-30 11:14:09 · 1572 阅读 · 0 评论 -
JavaScript实现高级科学计算器库
代码不贴了,主要讲解一下思路。 //BNF定义: //exprN代表优先级>=N的算符表达式 expr := expr20 expr100 := value //数值常量优先级最高,当然也可以把expr100合并到expr80,这样可以少写一个parseExpr100解析子函数 expr80 := ( expr ) | expr100 //其次是括号表达式原创 2015-07-02 21:51:43 · 3235 阅读 · 0 评论 -
LLVM Cookbook读书笔记(本书的缺点是直接展示大量Sample代码,对SSA/phi并没有怎么解释,TableGen部分也没讲清楚)
LLVM Cookbook(Packt,2015)*重新理解 value --> use(每个IR就是一个value,SSA)builder.GetInsertBlock(); //Codegen: 先有cfg框架,TDD?if-then-else及for循环:需用PHI合并?(重点)优化步(IR层)$ clang -S -O0 -emit-llvm test.cp原创 2015-08-26 16:44:12 · 4694 阅读 · 1 评论 -
使用JS-in-JS解释器陷阱执行来捕获恶意的网站脚本
主要思路:(1)使用JS实现一个JS解释器当然,似乎还没有开源的库实现?Esprima可以派上用场,将JS代码翻译为AST。(而Google V8引擎原来设计就是从AST编译为原生的机器代码,也许可以借鉴)(2)对于非DOM/IDL的访问操作,可使用编译执行的技术,但需要提供proxy trampoline接口;(3)对于DOM树操作或Web IDL(HTML API)访问,相当于原创 2015-07-22 10:20:16 · 1322 阅读 · 0 评论 -
用VS 2015写C++代码:体验一下变参模板、完美转发和lambda
#includetemplatevoid F(Ts&& ... params) {printf(std::forward(params)...);}int main(){auto f = [] { printf("hello world"); };f();F("%s: %d", __FUNCTION__, __LINE__); return原创 2015-07-24 15:35:18 · 2990 阅读 · 0 评论 -
JIT编译器里面的“逃逸分析”(Escape analysis)
逃逸分析是一种编译器后端优化技术,它不是局部优化,而是过程间分析,这意味着它会分析函数调用关系,以判断变量是否“逃逸”出当前作用域范围。对于JIT类语言来说,一般对象总是堆上分配,逃逸分析是否意味着局部的未逃逸的对象可以改成栈上分配呢?不是这样的,至少对于JVM不是这样。另外一个有趣的例子是Go语言,写惯了C/C++语言的代码会发现一个很奇怪的Go语言特性:当你return一个&{...}原创 2017-08-31 00:39:47 · 1230 阅读 · 0 评论