字节码

《Python学习手册 第五版》 -第2章 Python如何运行程序

你离开我真会死。 提交于 2019-12-27 17:34:40
第二章主要讲解了Python的运行机制, 在开始之前,需要明确以下几点 因为《Python学习手册》这本书是面向市场很多人的,既然有很多人,就有很多不一样的需求和使用情况,这本书涵盖Python2.X和Python3.X两个版本的讲解,也涉及到Linux、Mac OS系统、Windows系统等不同的操作系统,本人学习不是为了大而全,而是单点突破,深入了解,所以后续的所有笔记内容会依以下情况进行,不再单独说明 1、使用Window 10操作系统 2、Python环境使用Python 3.7.2版本(如下截图): 因为《Python学习手册》第五版的英文版是2013年出版,当时最新的Python版本是3.3.0,截止到现在2019年12月,Python最新版本3.8.0 3、运行Python的方式:DOS命令、Eclipse集成环境 接下来回归本章的重点,Python的运行机制 :文章中有一个图,有书的可以参考,以下是我理解后的步骤,通过文字即可了解 步骤1、源代码文件 :就是我们写出来的程序文件,以“.py"格式存储 步骤2、编译 :Python会对源代码进行编译 步骤3、编译后的结果是字节码文件 :字节码文件会以”.pyc"的格式存在 步骤4、Python虚拟机 (PVM)运行字节码 以上4各步骤就是Python核心的运行机制,通过这四个步骤,会有很多延伸出来的问题 1

初识Python

懵懂的女人 提交于 2019-12-27 11:31:03
Python与C 、Java、C#等比较 C——>机器码——>处理器执行 Python、Java、C#——>字节码——>虚拟机上执行——>机器码——>处理器执行 简而言之,Python这门语言是由C开发而来 Python 和 C比较 对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.   对于速度:Python的运行速度相较与C,慢 Python 和 Java、C#等比较 对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持   对于速度:Python在速度上 可能 稍显逊色 Python的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。 Jyhton Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。 IronPython Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似) PyPy(特殊) Python实现的Python,将Python的字节码字节码再编译成机器码。 注:PyPy

Java类加载器深入探索

主宰稳场 提交于 2019-12-27 03:11:45
林炳文Evankaka 原创作品。转载请注明出处 http://blog.csdn.net/evankaka 什么是.class文件? class文件全名称为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。class文件径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。而这也是Java宣称的“一次编译,到处运行”的真正原因,因为各个系统上的Java文件都是被编译成.class文件,然后通过虚拟机来加载运行的。 什么是类加载器? 类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。 生成一个对象实例发生了什么事?

java自定义注解

℡╲_俬逩灬. 提交于 2019-12-27 02:05:22
Java注解(Annotation)简介 java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到 说明、配置 的功能。 注解相关类都包含在java.lang.annotation包中。 Java注解分类 JDK基本注解 不需要编写代码,jdk自带 1.@Override 重写 2.@Deprecated 已过时 3.@SuppressWarnings(value = “unchecked”) 压制编辑器警告(eclipse 现在已少见) JDK元注解 作用:元注解用于修饰其他的注解 @Retention :定义注解的保留策略 @Retention ( RetentionPolicy . SOURCE ) //注解仅存在于源码中,在class字节码文件中不包含 @Retention ( RetentionPolicy . CLASS ) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得, @Retention ( RetentionPolicy . RUNTIME ) //注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Inherited :指定被修饰的Annotation将具有继承性 @Documented :指定被修饰的该Annotation可以被javadoc工具提取成文档 . 现在一般来说比较常用

Java注解

江枫思渺然 提交于 2019-12-26 23:02:11
摘抄并学习   以前,【XML】是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越大,XML 的内容也越来越复杂,维护成本变高。   于是,有人提出一种标记式高耦合的配置方式,【注解】。方法上可以进行注解,类上也可以注解,字段属性也可以注解,反正几乎需要配置的地方都可以进行注解。   关于【注解】和【XML】两种不同的配置模式,争论了好多年,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 XML 相对于注解则是相反的。   追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。 注解的本质   接口中有这么一句话,用来描述注解,“ 所有的注解类型都继承自这个普通的接口(Annotation) ”    一个注解准确意义上来说,只不过是一种特殊的注释,如果没有解析它的代码,它可能连注释都不如 。   而解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。反射的事情我们待会说,而编译期的扫描指的是编译器在对 java 代码编译字节码的过程中会检测到某个类或者方法被一些注释修饰,这时它就会对于这些注解进行某些处理。   典型的就是注解 @Override,一旦编译器检测到某个方法被修饰了 @Override 注解,编译器就会检查当前方法的签名是否真正重写了父类的某个方法

Python之路【第一篇】:Python前世今生

北城余情 提交于 2019-12-26 16:29:58
Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有: 自动化运维 、 自动化测试 、 大数据分析、爬虫、Web 等。 注视:上述重点字体表示该公司主要使用Python语言开发 为什么是Python而不是其他语言? C 和 Python、Java、C#等 C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行 Python 和 C

谈谈ASM字节码框架在Spring源码的应用

你说的曾经没有我的故事 提交于 2019-12-26 12:23:56
什么是ASM? 引用ASM官方的介绍: ASM是一个通用的Java字节码操作和分析框架。它可以直接以二进制形式用于修改现有类或动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从中构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但主要关注性能。由于它的设计和实现尽可能小,速度尽可能快,因此非常适合在动态系统中使用(当然,也可以以静态方式使用,例如在编译器中)。 说白了就是我们可以通过使用ASM框架,来读取和修改.class文件。相比JDK反射技术来说,ASM提供了更方便的字节码读取方式,性能上也更加高效。 简单了解如何使用ASM框架 在ASM框架中有两个主要的类,一个是ClassVisitor,一个是ClassReader。 ClassReader接收一个输入流,读取.class文件时通过accept方法 回调 ClassVisitor的各类 visit开头 的方法; InputStream is = new BufferedInputStream ( resource . getInputStream ( ) ) ; ClassReader classReader = new ClassReader ( is ) ; classReader . accept ( visitor , ClassReader . SKIP_DEBUG )

动态代理的两种实现方式

僤鯓⒐⒋嵵緔 提交于 2019-12-26 11:23:40
JDK动态代理 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理 利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的 class 文件加载进来,通过修改其字节码生成子类来处理。 区别 JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理 final 修饰的类。 方式一:JDK动态代理 目标接口类 /** * 目标接口类 */ public interface UserManager { void addUser ( String username , String password ) ; void delUser ( String username ) ; } 接口实现类 /** * 动态代理: * 1. 特点:字节码随用随创建,随用随加载 * 2. 作用:不修改源码的基础上对方法增强 * 3. 分类: * 1)基于接口的动态代理 * 1. 基于接口的动态代理: * 1)涉及的类:Proxy * 2)提供者:JDK官方 * 3)如何创建代理对象: * 使用Proxy类中的newProxyInstance方法 * 4)创建代理对象的要求 * 被代理类最少实现一个接口,如果没有则不能使用 * 5

dalvik虚拟机简单介绍

浪子不回头ぞ 提交于 2019-12-26 03:12:26
首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息。 Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。 因此,我们不妨对Dalvik虚拟机作出这样的描述: Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。 与Dalvik虚拟机关系最密切的非JVM莫属

深入理解JVM - JVM内存模型

不羁的心 提交于 2019-12-25 23:00:54
各版本的差异 JDK1.6 在JDK1.6 的时候运行时常量池在方法区中 JDK1.7 在JDK1.7 的时候运行时常量池在堆中 JDK1.8 在JDK1.8 的时候,JVM内存模型直接将方法区移到了本地内存中,叫元数据空间。该区域的内存大小就只受本机总内存的限制,但是当申请不到足够内存时也会报出 程序计数器 主要作用是:存储当前线程运行时的字节码行号,占用空间小且线程私有。 字节码解释器会通过改变程序计数器的值来选取下一条需要执行的字节码指令,并且分支(if)、循环、跳转、异常处理、线程恢复等基础功能都是基于程序计数器来实现的。 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 JAVA 虚拟机栈 线程私有,描述的是Java方法执行的内存模型,主要作用是:存储运行当前线程需要执行的所有方法所对应的栈帧。 一个线程栈的默认大小是1M,可用参数 –Xss调整大小,例如-Xss256k; 栈帧 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是Java 虚拟机栈(Virtual Machine Stack)的栈元素。 每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法的执行过程,就是一个栈帧在虚拟机栈中从入栈到出栈的过程。