字节码

Java程序运行机制

拈花ヽ惹草 提交于 2019-12-02 23:31:34
高级语言的运行机制 计算机高级语言按程序的执行方式可以分为编译型和解释型两种 。 编译型语言是指使用专门的编译器,针对特定平台,也就是操作系统将某种高级语言源代码一次性翻译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序 的格式,这个转换过程称为编译, 编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行 。 有些程序编译结束后,还可能需要对其他编译好的目标代码进行连接,即组装两个以上的目标代码模板生成最终的可执行性程序,通过这种方式实现低层次的代码复用。 因为编译型语言是一次性的编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较高,但是 因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的 可执行性程序通常无法移植到其他平台上运行 ,如果需要移植,则必须将源代码复制到特定的平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。 现在的C,C++,Object-C,Pascal等高级语言都属于编译型语言。 解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。 解释型语言通常不会进行整体性的编译和连接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成 。 可以这么认为:每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低

java程序的运行机制及JVM

一笑奈何 提交于 2019-12-02 23:31:23
本文出自java疯狂讲义,主要概述java运行机制 众所周知java是跨平台的,但是为什么跨平台呢?这就需要了解java程序运行过程 无论通过什么编辑器编写完java程序,保存的文件都是【.java】的格式表示这是java的源程序,相当于C中的【.o】 然后通过javac命令进行编译,编译生成与平台无关的的字节码文件【bytecode】,这种字节码文件只是一个中间代码,不能被执行,必须使用java虚拟机来解释执行,也就是直接通过java命令执行.class文件 通过具体一个例子,解释java运行过程 public class Test { public static void main(String[] args) { System.out.println("Hello World"); } } 这一段是很简单的一个java代码,此时文件名是.java(java源代码文件) 根据上面所说,应该将其转化为与平台无关的字节码,可以通过javac命令 通过命令行进入此java文件的路径,输入命令 javac Test.java 然后可以查看到Test.java后面多了一个文件【Test.class】也就是字节码文件,在输入命令 java Test 就可以看到输出内容,也就是入门的Hello World了。 Java语言负责执行字节码文件的是JVM(java虚拟机,JAVA Virtual

01--java--语言概述

烈酒焚心 提交于 2019-12-02 23:08:05
啦啦啦~~~我又开始想学习了...第一次学Java... JAVA主要版本 1.Java SE(java Platform,Standard Edition) java SE以前称为J2SE。它允许开发和部署在桌面、服务器、,嵌入式环境和实时环境中使用的Java应用程序。 Java SE包含了支持Java Web服务开发的类,并为Java Platform Enterprise Edition(java EE)提供基础。例如:类似QQ 扫雷、飞秋、凌波这样的桌面应用 2.Java EE(java Platform,Enterprise Edition)B(浏览器)/S(服务器)架构 java EE以前称为J2EE。称为Java平台企业版,浏览器上能看见的东西,可以用Java去实现,例如门户网站、电子商务系统、京东、淘宝等 3.Java ME (java Platform,Micro Edition) java EE以前称为J2ME,称为Java平台的微型版,随着安卓系统的普及而淘汰 JAVA跨平台(write once run anywhere...) 跨平台指软件开发中不依赖于操作系统,也不依赖于硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。 Java的跨平台是相对于其他编程语言而言的

python介绍

匿名 (未验证) 提交于 2019-12-02 22:56:40
1.简介及适用领域:   python的创始人为吉多・范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多・范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。   最新的TIOBE排行榜,Python赶超PHP占据第五!!!   Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、       Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有: 自动化运维 、 自动化测试 、 大数据分析、爬虫、Web 等。 2.对比其他语言:    Python与C       由C开发而来,Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.Python的运行速度相较与C,绝逼是慢了   Python 和 Java、C#       Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持,Python在速度上 可能 稍显逊色 3.分类:   Cpython: Python的官方版本

处理Python2.7的中文乱码问题

匿名 (未验证) 提交于 2019-12-02 22:54:36
Python2.7对于中文编码的问题处理的并不好,在此做一个简单的整理总结。 Python 3 中字符均使用unicode编码,unicode函数不再需要。 gbk是win环境下的一种汉字编码,其中GB2312编码也算是gbk编码 utf-8是Unix下的一种通用编码,可以对汉字编码 unicode是一种二进制编码,所有的utf-8和gbk编码都得通过unicode编码进行转译,说的直白一点,utf-8和gbk编码之间不能之间转换,要在unicode之间过个场才能转换。 程序存储、传输、操作字符串时,对代码中写好的字符串或者手动输入的字符串,程序会自动将这些字符串按照某种字符集编码(一般为本地系统字符编码)将字符串转换为字节码,这是字符的“解码”,将显示的字符转化为字节码; 程序中显示文字时,计算机读取一串字节,选择合适的字符集(一般为本地系统字符集)将字节码翻译为字符集中对应的字符,这些字符一般为本地存储的字符图片,然后调用系统的显示接口将这些“图片”打印在屏幕上。这是字符的“编码”,将字节码转化为可显示的字符。 如果字符的解码和编码采用的是相同的字符集,则将显示出来原始给定的字符,结果正常;如果不是同一种字符集,则有可能会出现乱码(因为相同的字节码在不同的字符集中可能对应不同的字符,一种字符集的某字符解码后的字节码在另一种字符集中编码之后可能是不同的字符)。

11-1 Python中的GIL

匿名 (未验证) 提交于 2019-12-02 22:51:30
GIL: global interpreter lock (cpython) GIL控制的字节码的执行,锁控制的是Python代码 什么是字节码,怎么查看字节码? #通过dis模块查看函数add的字节码 import dis def add (a) : a = a+ 1 return a print(dis.dis(add)) #运行结果 6 0 LOAD_FAST 0 (a) 2 LOAD_CONST 1 ( 1 ) 4 BINARY_ADD 6 STORE_FAST 0 (a) 7 8 LOAD_FAST 0 (a) 10 RETURN_VALUE 2.GIL作用 GIL使得同一时刻只有一个线程在一个cpu上执行字节码。保证字节码的执行是线程安全的 有了GIL是不是就是多线程安全的,不需要考虑线程间同步呢? 答案肯定不是的,因为GIL会在适当的时候释放的。举例说明 total= 0 def add () : #1. dosomething1 #2. io操作 #3. dosomething3 global total for i in range( 1000000 ): total += 1 def desc () : global total for i in range( 1000000 ): total -= 1 import threading thread1

如何在 Python 中实现 goto 语句

匿名 (未验证) 提交于 2019-12-02 22:11:45
Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于 https://github.com/snoack/pyt... 比如在下面这个例子里, from goto import with_goto @with_goto def func(): for i in range(2): for j in range(2): goto .end label .end return (i, j, k) func() for j in range(2) return 按理说本文到此就该完了,但是这个库有一个限制,如果嵌套的循环层次太深,就无法工作 。比如下面这几行代码: @with_goto def func(): for i in range(2): for j in range(2): for k in range(2): for m in range(2): for n in range(2): goto .end label .end return (i, j, k, m, n) SyntaxError 本文接下来的内容,就是如何打破这个限制。 python-goto 是如何工作的 python-goto func __code__ goto.py func import dis dis.dis(func) 打印出来。 @with_goto

JavaScript引擎

匿名 (未验证) 提交于 2019-12-02 21:53:52
JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。 什么是虚拟机呢? 虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。 根据虚拟机的运用和直接机器的相关性分为两类: 系统虚拟机,提供一个可以运行完整操作系统的完整系统平台。 程序虚拟机,运行单个计算机程序设计,这意谓它支持单个进程。 JavaScript引擎就是一种程序虚拟机。 V8 ,用C++编写,开放源代码,由Google丹麦开发,是 Google Chrome 的一部分,也用于 Node.js 。 JavaScriptCore ,开放源代码,用于webkit型浏览器,如 Safari ,2008年实现了编译器和字节码解释器,升级为了 SquirrelFish 。苹果内部代号为“Nitro”的JavaScript引擎也是基于JavaScriptCore引擎的。 Rhino ,由Mozilla基金会管理,开放源代码,完全以Java编写,用于 HTMLUnit SpiderMonkey ,第一款JavaScript引擎,早期用于Netscape Navigator,现时用于 Mozilla Firefox 。 Chakra (JScript引擎

java 字节码文件详解

匿名 (未验证) 提交于 2019-12-02 21:53:52
每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象。 字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,方法数量及方法表,属性属性及属性表 魔术:四个字节,用于定义此字节码文件是否符合虚拟机规范,保证字节码文件不会威胁虚拟机的安全,若为cafebabe则表示字节码符合虚拟机规范 主次版本号:四个字节,前两字节表示次版本号,后两字节表示主版本号,用于定义编译的字节码文件格式版本,第版本虚拟机拒绝运行高版本字节码文件,但高版本虚拟机会向下兼容低版本字节码文件 类索引及父类索引:四个字节,用于存储指向常量池constant_class_info对应的有效索引,而constant_class_info存储常量池列表的constant_utf8_info常量项索引,根据此索引可找到类和父类的全限定名 接口数量及接口表:接口属性用于存储当前类或接口的直接超类接口数量,接口表是一个数组,记住

第一个Java程序示例――Hello World!

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java程序输出“Hell World!”。 Eclipse运行程序 Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹出对话框: 图 “文件 --> 新建 --> 类”,弹出对话框: 图 “完成”,成功创建一个HelloWorld类: 图 Java是大小写敏感的: public class { public static void main ( String [] ){ . out . println ( "Hello World!" ); } } “运行 --> 运行”,就可以看到下方控制台输出了“Hello World!”: 图 Java程序。 Demo文件夹下的bin目录,出现了一个 HelloWorld.class 文件,这就是编译生成的字节码。与C、C++不同,Java编译的结果不是可执行文件,而是字节码文件。字节码文件不能直接运行,必须由JVM翻译成机器码才能运行,这就是为什么运行Java程序必须安装JVM的原因。 通过命令行运行程序 Java。 CMD,cd 到源文件所在目录,通过 javac filename 命令完成编译,通过 java classname 命令来运行程序,如下所示: 图 Eclipse中运行程序,实际上也是执行这些命令,并将输出结果显示到控制台。有了Eclipse,编程更加方便。 HelloWorld程序分析