字节码

【深入理解】JVM学习笔记—字节码

痞子三分冷 提交于 2019-12-21 05:46:42
Java虚拟机不和包括java在内的任何语言绑定,它只与“Class”特定的二进制文件格式关联,Class文件中包含Java虚拟机指令集和符号表以及若干其他辅助信息。本文将以字节码的角度来研究Java虚拟机。 字节码 Java跨平台的原因是JVM不跨平台 首先编写一个简单的java代码,一次为例进行讲解 测试1 public class MyTest1 { private int a = 1 ; public int getA ( ) { return a ; } public void setA ( int a ) { this . a = a ; } } 编译生成 MyTest.class 文件 使用反编译命令: javap MyTest ,对文件进行反编译,生成以下数据 Compiled from "A.java" public class controller . A { public controller . A ( ) ; public int getA ( ) ; public void setA ( int ) ; } 增加参数,使用反编译命令: javap -c MyTest ,生成以下数据 Compiled from "A.java" public class controller . A { public controller . A ( ) ; Code :

java与python

别说谁变了你拦得住时间么 提交于 2019-12-21 04:41:29
高级语言-> 机器代码: 高级语言-> 字节码 ->机器代码 2.1 java java 在执行过程中先利用javac将源文件编译成.class字节码,然后在jvm上继续解释和编译成可执行的机器代码。你可能注意到在jvm过程中同时有编译和解释的过程,这是跟jvm运行机制有关: JVM有三种运行模式:解释模式,编译模式,混合模式。上图对应的是混合模式,其流程为: 1.源代码经过编译器成为.class文件,也就是字节码。 2.程序字节码经过JIT判断,是否属于热点代码,例如循环或者频繁调用的方法。 3.如果是,被JIT编译成机器字节码,对应具体硬件处理器(如sparc,intel)。 4.如果不是,被JIT解释器解释执行。 所以JIT是一个解释器和编译器的集合,某些“热点代码”可以通过编译来节省逐条解释的耗时,其他代码仍旧通过解释器执行。 2.2 python py文件被编译成.pyc 字节码文件。这个字节码文件跟平台无关。接下来由pvm解释执行这个字节码文件,每一次负责将一条字节码文件语句翻译成cpu可以直接执行的机器代码,然后在接下来下一句。 对于python来说,没有针对机器代码的编译,每一条语句的执行都是直接对源代码或者中间代码进行解释运行。而少了这个编译的过程,使得解释型语言运行较慢。另外,在逐条解释的过程中,效率也较低。 来源: CSDN 作者: 浅笑不再 链接:

反射 is 框架的灵魂

浪子不回头ぞ 提交于 2019-12-21 03:56:12
背景: 我不相信你会问—啥是框架? (简单理解为可复用的代码)像现在很流行的框架如 Spring , Spring boot,Spring AOC 等都是框架,组成它们的代码中总会见到反射机制。 简介: 反射: 将类的组成部分封装成一个对象。 用一张图解释哈: 过程解释: 还是一个老生常谈的问题,我们用高级语言编写的代码如何被计算机执行? 都知道计算机只能执行机器码。 所以我们编译高级语言代码最终也会生成机器码,只不过中间有一个过度的部分那就是字节码。利用 javac 生成字节码后,我们想执行这个程序。又知道计算机是从内存中读取指令和数据的,我们利用反射将字节码文件加载进内存,然后被计算机所执行。 使用反射的好处: 1 可以在程序运行中操纵这些对象 2 可以解耦,提高程序的可扩展性 =============================================================== 应用举例: 获取 Class 对象的方式(可以理解 Class 对象是反射的另一种体现): 1 Class . forName ( "全类名" ) // 将磁盘中的对应代码加载进内存,返回 Class 对象(**多用于配制文件) 2 类名 . class //通过类名的属性获取对象(内存中),(**多用于参数传递) 3 对象 . getclass ( ) // getclass

编译与解释(java)

爱⌒轻易说出口 提交于 2019-12-21 03:39:51
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。 编译(compilation , compile)定义分为静态和动态两种: 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 通俗来讲,编译就是把高级语言变成计算机可以识别的二进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成二进制的。 编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件)。 解释: 解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。解释是一句一句的翻译。 因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高

Python学习一:Python简介

徘徊边缘 提交于 2019-12-21 02:43:45
  Python简介 :   Python是目前广泛使用的一门动态语言,类似Java,源代码必须首先由编译器转换成字节码(byte code),然后再由解释器来执行字节码。与Java不同的是,Python的编译器和解释器都是一个程序。因此,源代码也可以直接交给这个编译器/解释器来执行。   使用Python编写程序,你不需要预先声明好变量的类型,因为Python中变量的类型是动态确定的,即动态绑定。    Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。 Python语言的特点: 第一,纯面向对象的语言。与传统的面向对象语言(C++, Java)不同的是,在Python的世界里,万物皆为对象。模块,类,函数,变量,类的实例都属于Python中的对象,例如函数是一个对象,它有自己的代码块,注释文档以及变量字典。 第二,支持面向过程和面向对象的编程范式。Python不强制你使用类的概念组织软件,你可以以面向过程的思想编写你的软件。这个类似于C++,完全可以不用C++面向对象的特性编写软件,退化为C语言了。 第三,非常丰富的标准库支持。Python提供了一套功能完善的内置库支持

即时编译器的中间表达形式(IR)

可紊 提交于 2019-12-20 19:45:35
原文链接: https://www.520mwx.com/view/36709 一、中间表达形式(IR) 在编译原理课程中,我们通常将编译器分为前端和后端。其中,前端会对所输入的程序进行词法分析、语法分析、语义分析,然后生成中间表达形式,也就是 IR(Intermediate Representation )。后端会对 IR 进行优化,然后生成目标代码。 如果不考虑解释执行的话,从 Java 源代码到最终的机器码实际上经过了两轮编译:Java 编译器将 Java 源代码编译成 Java 字节码,而即时编译器则将 Java 字节码编译成机器码。 对于即时编译器来说,所输入的 Java 字节码剥离了很多高级的 Java 语法,而且其采用的基于栈的计算模型非常容易建模。因此,即时编译器并不需要重新进行词法分析、语法分析以及语义分析,而是直接将 Java 字节码作为一种 IR。 不过,Java 字节码本身并不适合直接作为可供优化的 IR。这是因为现代编译器一般采用静态单赋值(Static Single Assignment,SSA)IR。这种 IR 的特点是每个变量只能被赋值一次,而且只有当变量被赋值之后才能使用。 y = 1; y = 2; x = y; 举个例子( 来源 ),上面这段代码所对应的 SSA 形式伪代码是下面这段: y1 = 1; y2 = 2; x1 = y2;

JAVA运行机制

蹲街弑〆低调 提交于 2019-12-20 00:14:13
这一篇我们来简单理解一下JAVA的运行机制 大概可以分为三大部分 1.编写程序 2.编译程序 3.运行程序 1. 编写程序 编写程序就是我们前面说的源代码 这些源代码都有特殊的语法 例如main函数 他是jdk中一个比较特殊的函数 他必须要使用特定的语法来编写 (在前面加上 public 等关键字来修饰) 源代码就像是程序的灵魂, 程序的实现是由源代码来就决定的 就像一块橡皮泥, 你想把它变成什么样子完成由你来决定 2 . 编译程序 为什么要编译? 因为 JAVA和大多数语言一样是一种高级语言 我们编写好的代码都被保存成为一个.java的文件 然而我们计算机并不认识(不能运行)这些文件 这就需要把我们编写好的文件(源代码)变成计算机可以运行的机器码(二进制码) 这个过程就叫做编译 注意 :编译就是我们前面用到的 javac 命令 它可以将.java文件编译成一个.class文件(字节码) 并且class文件是一种与平台无关的文件 3. 运行程序 上面说到把源代码编译成字节码。 那么就到运行字节码了 其实我们的JAVA语言有一个非常大的特点就是跨平台 用他们话说就是:一次编译,到处运行 前面说过class文件是一种与平台无关的文件 它也不可直接运行 那我们怎么运行呢? 这就要讲到一个东西jvm(JAVA虚拟机) 它可以将我们的class文件解释成计算机可以运行的二进制

Java 编程的动态性, 第四部分: 用 Javassist 进行类转换

余生长醉 提交于 2019-12-19 19:06:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 讲过了 Java 类格式和利用反射进行的运行时访问后,本系列到了进入更高级主题的时候了。本月我将开始本系列的第二部分,在这里 Java 类信息只不过是由应用程序操纵的另一种形式的数据结构而已。我将这个主题的整个内容称为 classworking 。 我将以 Javassist 字节码操作库作为对 classworking 的讨论的开始。Javassist 不仅是一个处理字节码的库,而且更因为它的另一项功能使得它成为试验 classworking 的很好的起点。这一项功能就是:可以用 Javassist 改变 Java 类的字节码,而无需真正了解关于字节码或者 Java 虚拟机(Java virtual machine JVM)结构的任何内容。从某方面将这一功能有好处也有坏处 -- 我一般不提倡随便使用不了解的技术 -- 但是比起在单条指令水平上工作的框架,它确实使字节码操作更可具有可行性了。 Javassist 基础 Javassist 使您可以检查、编辑以及创建 Java 二进制类。检查方面基本上与通过 Reflection API 直接在 Java 中进行的一样,但是当想要修改类而不只是执行它们时,则另一种访问这些信息的方法就很有用了。这是因为 JVM 设计上并没有提供在类装载到 JVM

Java字节码增强应用(一):动态代理

瘦欲@ 提交于 2019-12-19 11:32:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在上一篇文章 Java字节码结构 里,我们了解了字节码文件的结构,其中提到方法代码指令区是我们进行字节码增强的关键地方。从这篇文章开始,我将继续介绍一些字节码增强的技术,有些是我们比较熟悉的比如动态代理,有些是在我们日常业务开发中较少接触到的,比如 Javaagent 技术,APM等。本文主要介绍动态代理的原理以及各类框架 AOP 的实现原理。 动态代理属于代理模式的一种实现方式,代理模式就是,我们需要在一个现有类的方法增加一些功能,我们可以通过代理模式来实现。代理模式可以分为两类: 静态代理 动态代理 静态代理 静态代理是程序员通过编程的方式扩展原有类的功能。大致方式为,编写一个代理类,和目标类实现同样的接口,并持有目标类的实例,在代理方法里先执行需要扩展的逻辑,然后再通过目标类的实例调用目标方法。 如我们有一个 Person 接口,其中有方法 run() ,有个实现类 Tom ,实现了具体的 run() 方法,现在我们需要在 Tom 类的 run() 方法前后增加一些逻辑,我们可以通过新建一个类 PersonProxy 类,实现 Person 接口,并在构造方法里传入具体要代理的目标类,然后在 run 方法里执行增加的逻辑,并调用目标类的 run 方法。具体类图如下: 测试代码如下: public

Java简介

醉酒当歌 提交于 2019-12-19 09:59:56
由来:    Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。 特性:   1.简单性 :Java吸收了C++语言的各种优点,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。   2.面向对象 :Java是一门面向对象的编程语言,它提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。   3.分布性:Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。   5.稳健性