字节码

「译」JS 引擎核心: 原型优化

烂漫一生 提交于 2019-12-03 08:04:46
本文转载于: 猿2048 网站➱ https://www.mk2048.com/blog/blog.php?id=hc01b0jkjb 原文链接: JavaScript engine fundamentals: optimizing prototypes 作者序 本系列主要介绍那些 JS 引擎中用到的核心设计。本文的作者是 V8 引擎的开发者 Benedikt and Mathias ,但不用担心,这些内容是适用于各大 JS 引擎的。作为一个 JS 开发者,深入了解 JS 引擎的工作原理可以有助于你去解读自己代码的一些性能特征。 在上一篇文章中( 原文 , 译文 ),我们讨论了 JS 引擎是如何使用 Shapes(形,V8 中对这种数据结构的命名,具体原理请参考上一篇文章) 和 Inline Caches(暂译内联缓存,一种用于优化访问性能的数据结构,具体原理同样参考上一篇文章) 来优化对对象与数组的访问性能的。本文将会解释 优化管线中的权衡 以及引擎是如何优化原型属性访问的性能的。 **小贴士:**如果你更倾向于看视频来学习,可以跳过本文直接看这个 视频 。(需要梯子,推荐使用酸酸乳) 优化层级与执行权衡(Optimization tiers and execution trade-offs) 我们的上一篇文章讨论了现代 JS 引擎都存在着一个相同的运行管线设计:

Topics in CS(difference between compile and interpret)

北城余情 提交于 2019-12-03 07:43:22
编译 Compile :把整个程序源代码翻译成另外一种代码,然后等待被执行,发生在运行之前,产物是「另一份代码」。 解释 Interpret :把程序源代码一行一行的读懂然后执行,发生在运行时,产物是「运行结果」。 高级语言代码 High-Level Code 高级语言代码,自然是指由高级编程语言编写代码,对计算机的细节有更高层次的抽象。 相对于低级编程语言(low-level programming language)更接近自然语言(人类的语言)。 集成一系列的自动工具(垃圾回收,内存管理等),会让程序员延长寿命,更快乐的编写出更简洁,更易读的程序代码。 低级语言代码 Low-Level Code 低级语言代码,指由低级编程语言编写的代码,相对高级语言,少了更多的抽象概念,更加接近于汇编或者机器指令。 但是这也意味着代码的可移植性很差。 在我看来,高与低,只是一组相对词而已。 越高级的语言,性能、自由度越不及低级语言。 但是在抽象、可读可写性、可移植性越比低级语言优秀。 在以前的年代,C/C++语言相对汇编语言,机器指令来说,肯定是高级语言。 而到了今天,我们更多人对C语言偏向认知为「低级语言」。 或许未来世界的开发者,看我们现在所熟悉的Java、PHP、Python、ECMAScript等等,都是「low」到爆的语言。 汇编语言 Assembly Language

解释性和编程性语言

痴心易碎 提交于 2019-12-03 07:30:50
首先,我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写的程序。 说到翻译,其实翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。 用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成机器语言(具体翻译过程可以参看下图),把源高级程序编译成为机器语言文件,比如windows下的exe文件。以后就可以直接运行而不需要编译了,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。 解释则不同,解释型语言编写的程序不需要编译。解释型语言在运行的时候才翻译,比如VB语言,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。 一,编译型语言: 编译生成的可执行程序可以以脱离开发环境,在特定的平台上独立运行。 因为编译型语言是一次性的编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较高;但因为编译性语言的程序被编译成特定平台上的机器码,因此编译生成的可执行程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定的平台上,针对特定的平台进行修改

java和python对比

淺唱寂寞╮ 提交于 2019-12-03 06:42:47
一:解释性和编译型 梳理 编译型:源代码经过编译直接变为二进制的机器语言,每次都可以直接重新运行不需要翻译。典型的就是c语言。 解释性:java和python都是解释型,源代码经过编译变为字节码文件,然后将字节码放在VM上运行,达到跨平台的目的。 java和python都是边解释边执行,但是解释之前都先进行了编译工作,编译为vm能看懂的字节码,vm解释的是字节码,而非源码。 但是为什么python比java慢了一个级别? 主要原因是python是动态语言,java是静态语言。 静态语言:变量声明的时候要声明变量类型,这样编译器在程序运行时直到变量的类型, 动态语言:在程序运行时解释器只知道变量是一个对象,至于具体是什么类型解释器并不知道,所以每次程序运行的时候都要判断变量的类型,才能调用方法,以此来判断此变量对象有没有此方法。 正是因为动态语言多了一个类型判断的过程,因此python比java慢了一个级别。 动态语言是简单,但是解释器在背后做的事情比静态语言的解释器在背后做了更多的事情。 python两个概念,PyCodeObject和pyc文件 在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。 当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时

函数式接口及lambda表达式相关

怎甘沉沦 提交于 2019-12-03 05:06:38
0.why lambda? 简化代码,紧凑结构。 代码简洁程度:外部类->内部类->匿名内部类->lambda->方法引用 parameters –> a expression; or (parameters)->{expressions ; }; 注意要有返回值。 参数可为空:以()表示。 1.lambda表达式在java8中的实现形式 Lambda表达式生成了一个内部类。 参考博文 https://www.cnblogs.com/WJ5888/p/4667086.html# 此博文在分析lambda表达式的时候,采用了①直接javap生成字节码文件的分析②反证法,通过自己创建了一个与从字节码文件反编译得到的方法同名的方法来反面证明自己的设想; 侧面证明了:lambda表达式会首先被编译为一个 私有的静态函数! 查看字节码文件之前就会,而博主根据反证法来验证自己的想法,此处学习了。 其后,该表达式会生成一个内部类。 core java volume中,将lambda表达式安排在紧挨着接口及内部类看来确有深意。 此处添加了 -Djdk.internal.lambda.dumpProxyClasses 指令,可以将生成的内部类字节码输出到一个文件中。 2.函数式接口的实现对象 该对象实现了将方法作为参数传递给方法或者返回一个方法的作用 故而,该接口应当有且仅有一个未实现的方法

你真的了解java序列化吗

孤街醉人 提交于 2019-12-03 04:09:11
问: 可是我这个实体类,没有实现序列化那个接口,也能存到数据库,这是为什么呢? 想不通!我是用的注解和hibernate框架弄的! 难道说不实现序列化接口也能保存数据?不应该啊。 @Entity public class Person { @Id @GeneratedValue private Integer id; private String name; private Integer age; } 答: 你用habernate保存数据,只要XML文件配置好了,实体类DAO层都没错,调用SAVE方法 然后COMMIT就可以保存数据。 序列化主要就是把你要保存的数据,转换成字节码的形式,反序列化就是把字节码变成数据。 你直接把数据通过本机服务器提交给硬盘,确实不需要序列化。 但是你在网络传输的时候就不行了,你传给别人一个东西,它接收了所有的字节码之后,却不知道你原本传的是什么对象,也就没法把这个东西按照原始去解析。 你序列化之后,在传给对方,他接收到的时候会按照序列化特定的模式,给反序列化出来,也就是说你传了什么,对方接收的也是什么,解析成功,可以正确使用方法以及属性。 追问: 你没明白我的意思,我不是问什么叫序列化 我问你我没实现序列化接口Serializable 为什么还可以保存对象到数据库呢? 追答: 本来就是可以保存的啊。你想想最开始学习数据库和JAVA的时候

从字节码角度看String、StringBuffer、StringBuilder的不同

被刻印的时光 ゝ 提交于 2019-12-03 02:38:00
Oracle官方说明: javap 将一个或多个类文件进行分解。 使用简要说明 javap [options] classfile... options 命令行选项,详细查看后面的Options介绍 classfile 一个或多个Class文件(多个使用空格分离),可以使用文件路径或者classPath下的文件或者输入URL Description javap命令分解卸一个或多个类文件。输出取决于所使用的选项。当没有使用任何选项,那么javap命令打印方案为protected和公共字段和方法。javap命令将输出打印到控制台。 Options -help --help -? 打印帮助信息 -version 打印版本信息 -l 打印行内变量以及局部变量 -public 显示public访问修饰的内容 -protected 显示protected、public访问修饰的内容 -private -p 显示所有的内容 -Joption 将指定的选项传递给JVM。例如: javap -J-version javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName For more information about JVM options, see the java command

对JavaScript 引擎基础:原型优化的研究 -----------------------引用

萝らか妹 提交于 2019-12-03 02:12:25
一、优化层级与执行效率的取舍 介绍了现代 JavaScript 引擎通用的工作流程: 我们也指出,尽管从高级抽象层面来看,引擎之间的处理流程都很相似,但他们在优化流程上通常都存在差异。为什么呢?为什么有些引擎的优化层级会比其他引擎多一些?事实证明,在快速获取可运行的代码与花费更多时间获得最优运行性能的代码之间存在一些取舍与平衡点。 解释器可以快速生成字节码,但字节码通常效率不高。 相比之下,优化编译器虽然需要更长的时间进行处理,但最终会产生更高效的机器码。 这正是 V8 在使用的模型。它的解释器叫 Ignition,(就原始字节码执行速度而言)是所有引擎中最快的解释器。V8 的优化编译器名为 TurboFan,最终由它生成高度优化的机器码。 我们往往需要在启动延迟与执行速度之间做出一些取舍,而这便是一些 JavaScript 引擎决定是否在流程中加入优化层的原因所在。例如,SpiderMonkey 在解释器和完整的 IonMonkey 优化编译器之间添加了一个 Baseline 层: 解释器可以快速生成字节码,但字节码执行起来相对较慢。Baseline 生成代码需要花费更长的时间,但能提供更好的运行时性能。最后,IonMonkey 优化编译器花费最长时间来生成机器码,但该代码运行起来非常高效。 让我们通过一个具体的例子,看看不同引擎中的优化流程都有哪些差异

反射学习总结 --为理解SpringMVC底层做准备

匿名 (未验证) 提交于 2019-12-03 00:41:02
反射是什么?   java:一个类在反射面前就像照X光,清清楚楚明明白白。   应用:我们的ide中,能够"."一下就知道类中的所有方法就是通过反射实现的。      XML中配置的class全路径动态生成类。(框架)   程序在运行过程中,动态的创建对象。 字节码对象 来创建该类的一个对象。 何为class对象:   HelloWorld.java    关于Class的加载: public static void main(String[] args) { Person p = new Person(); Class pClassclass = p.getClass(); System.out.println(pClassclass); Person person = new Person("aa", "18", "USA"); Class personClass = person.getClass(); System.out.println(personClass); System.out.println(pClassclass == personClass); //true 字节码文件在程序运行过程中,只会被加载到内存中一次 }    public static void main(String[] args) throws ClassNotFoundException {

面试题

匿名 (未验证) 提交于 2019-12-03 00:38:01
1 :简述解释型和编译型编程语言的区别 解释型:当程序运行时,将代码从上至下,一句一句解释成二进制,在执行. 典型: python , php 优点:开发速度快,可以跨平台. 缺点:执行效率慢. 编译型:将源码一次性转化成二进制文件,然后在执行. 典型: C , C ++... 优点:执行效率快. 缺点:开发速度慢,不能跨平台. 2 : Python 解释器种类以及特点 使用最广泛的是 CPython CPython 当从 Python 官方网站下载并安装好 Python2 . 7 后,就直接获得了一个官方版本的解释器: Cpython ,这个解释器是用 C 语言开发的, 所以叫 CPython ,在命名行下运行 python ,就是启动 CPython 解释器, CPython 是使用最广的 Python 解释器。 IPython IPython 是基于 CPython 之上的一个交互式解释器,也就是说, IPython 只是在交互方式上有所增强,但是执行 Python 代码 的功能和 CPython 是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了 IE 。 PyPy PyPy 是另一个 Python 解释器,它的目标是执行速度, PyPy 采用 JIT 技术,对 Python 代码进行动态编译,所以可以显著 提高 Python 代码的执行速度。 Jython