- 浏览: 230435 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sfshine:
非常好非常好
Android 窗口管理 -
mthhk:
...
android3.0之Fragment(碎片)基础 -
FrankHB1989:
“C/C++标准不会保证这样的代码一定不会出错”的依据?你要说 ...
Duff's Device -
2006003845:
请问知道 刚体之间怎么不碰撞嘛 ?相互穿插
JBOX2D分析
現在做個簡單的 Compiler,包括三個部份,scanner 用 flex/scangen,parser 用 bison/yacc/llgen,剩下 code generation 可以直接輸出 assembly code 來做,也可輸出成 JVM bytecode。我之前沒學過 assembly code,直接學學這個也不錯,概念和 x86 差不多吧。
JVM 也屬 stack based machine platform (其他比如 PowerPC, x86, MIPS 等),但仍有些不同:
- 最主要不同是 JVM 的資料結構是一個稱為 Constant Pool table,在 .class 檔內用來描述 classes, function 以及 variables。
- JVM 禁止 memory reference,取得變數和函數方式會不同,而且沒有 global variables,要特別處理,比如要生成一個類別來處理 global variables.
若要參考 JVM Specification 來生成 binary 的 bytecode 當然很累,所以,有個現成的程式 Jasmin (即 JVM 的 assembler) 來使用,就比較方便了。
一般 .java 檔經 javac 轉成 .class (bytecode file)
public class HelloWorld { public static void main(String args[]) { System.out.println("Hello World!!"); } }
javap 用來 disassemble VM 指令,即可以知道一個 class 檔由哪些指令組成:
[derjohng@derjohngdediannao 551] $ javap -c HelloWorld Compiled from "HelloWorld.java" public class HelloWorld extends java.lang.Object{ public HelloWorld(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello World!! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return }
Jasmin 則是將 VM 指令寫成的檔案,轉成 bytecode file. 可視為 JVM 的一種 assembler,比如下面為 Jasmin 的指令例子(比如檔名為 HelloWord.j),執行 $jasmin HelloWord.j ,即會產生 HelloWord.class
.class public HelloWorld .super java/lang/Object ; specify the constructor method for the HelloWorld class .method public <init>()V aload_0 invokenonvirtual java/lang/Object/<init>()V return .end method ; specify the "main" method - this prints "Hello World" .method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 2 ; 將 output stream 和 string "Hello World!" 放到 stack. getstatic java/lang/System/out Ljava/io/PrintStream; ldc "Hello World!" invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V return .end method
簡短的 Jasmin 使用說明,參考這裡 。
更仔細的說明,參考 The Java Virtual Machine Specification, Chapter 7 .
參考
- C Compiler Targeting the Java Virtual Machine
- The Java Virtual Machine Specification
- Java Virtual Machine
2007.12.22 jasmin 產生的 class 檔案,用 java 執行,會有下述的 Error 出現
Exception in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file Main
Ans: 問題在於 method 內的 .limit stack 以及 .limit locals 一定要指定,這兩個值只能多給,不能少給。
2007.12.28 根據 Jasmin 手冊, .field 可以類似下面的用法:
.class public MyAda.Main .super java/lang/Object .field public XXX I = 20 .field public YYY D = 10.560000
但 jasmin 產生的 bytecode 用 javap -c 來看發現,其實並沒有給予起始值
Compiled from "Main.j" public class MyAda.Main extends java.lang.Object{ public int XXX; public double YYY; public MyAda.Main(); Code: 0: aload_0 1: invokespecial #46; //Method java/lang/Object."<init>":()V 4: return </init>
用下述的 java 檔,編成 class 檔
public class HelloWorld5 { public int iii=5;
會產生如下:
javap -c HelloWorld5 Compiled from "HelloWorld5.java" public class HelloWorld5 extends java.lang.Object{ public int iii; public HelloWorld5(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_5 6: putfield #2; //Field iii:I 9: return </init>
所以,這些值是放在 <init>() 下,但 jasmin 下 .method public <init>()V 要自己產生,所以,要另外用 putfield 來給予啟始值了? 用 .field 的 assign 值不就沒意義了?
发表评论
-
Java中循环嵌套跳出的高效写法
2014-04-24 19:31 3151(下面写的这些并不是Jdk的新特性,也不是Java某个版本提供 ... -
子墨对酒《三国杀》里论模式(肆)单例模式
2014-02-11 18:40 805当设计模式的观点被众 ... -
子墨对酒《三国杀》里论模式(三)适配器模式
2014-02-11 18:39 749如果你是一个Android程 ... -
子墨对酒《三国杀》里论模式(二)门面模式
2014-02-11 18:38 604学 习模式的人对门面 ... -
子墨对酒《三国杀》里论模式(一)工厂模式
2014-02-11 18:37 1102有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩 ... -
Proguard 源码分析 (七) 混淆
2013-11-10 21:19 1792本章我们讲Proguard非常重要的一个步骤:混淆Obfu ... -
Proguard源码分析(六)前文总结
2013-11-05 14:40 1064目前,我们读了Proguard的 ... -
java class文件结构(转)
2013-11-05 13:46 986学习Java的朋友应该都 ... -
Proguard源码分析(五) ConfigurationParser.keep参数
2013-10-31 14:43 3918本章节我们绕回来讲Keep参数,也就是Configurat ... -
Proguard源码分析(四) 压缩
2013-10-30 10:59 1110上一次我们讲了seed文件,这次我们说压缩,对应的输出文件是 ... -
代码混淆器Proguard源码分析(一) 读取
2013-10-22 19:40 2291Proguard是Android中经常用的混淆工具,当然你也 ... -
Android 查看内存详解(转)
2013-04-01 15:31 4461本来想着写点啥的,但发现已经有很多人写了类似的文章了。就 ... -
Android查看内存和CPU~
2013-04-01 15:19 1410.一、利用Android API函数 ... -
smali语法~(转)
2013-03-28 13:17 1026dalvik字节码有两种类型,原始类型和引用类型。对象和数组 ... -
OpenJDK源码阅读导航
2013-03-12 15:36 1409这是链接帖。主体内容都在各链接中。 怕放草稿箱里过会儿又坑掉 ... -
Scala 中apply方法的用法~(转)
2013-03-11 11:53 8715Scala 是构建在 JVM 上的静态类型的脚本语言,而脚 ... -
jdk的bin目录详解
2012-10-16 17:02 1006javac:Java编译器,将Java源代码换成字节代 ... -
深入JVM---JVM命令---invokespecial(转)
2012-07-24 14:12 142319.3 指令invokespecial Invokespec ... -
ByteBuffer的allocate和allocateDirect(转)
2012-04-24 21:35 1271在Java中当我们要对数据进行更底层的操作时,通常是操作数据的 ... -
挺好的总结~(java性能优化~)
2012-04-03 17:39 0最近的机器内存又爆满 ...
相关推荐
** Jasmin 概述 ** Jasmin 是一个开源的 Java 字节码汇编器,它允许程序员以类似于汇编语言的方式编写 JVM(Java 虚拟机)字节码。由 Neil Fraser 创建,Jasmin 提供了一种低级别的接口来创建和理解 Java 类文件。...
掌握Jasmin能够增强开发者对Java底层运作的理解,对于优化性能、调试问题或进行JVM级别的编程具有很大的价值。对于那些热衷于探索Java技术深度的人来说,Jasmin是一个不可或缺的工具。通过深入学习Jasmin和实践编写...
JASMIN框架是一种支持并行自适应结构网格应用的软件框架,其核心目标是快速研制和实现能解决多物理、多尺度、多介质、多组分复杂流动问题的并行程序。JASMIN框架的设计与实现中,涉及到核心数据结构的设计以及动态...
在学习使用soot工具(2.5.0)时,总是提示jasmin/Main中缺少assemble(StreamInput,StreamOut,boolean)函数,能在网上直接下载的jasmin版本都没有这个函数,或者参数不对。这个jar包是通过源文件编译好的,可以供soot...
《使用 Jasmin 实现的小游戏:五子棋》 在 IT 领域,Java 语言因其跨平台性与高效性而备受青睐。而在 Java 世界中,Jasmin 是一款重要的工具,它是一个用于汇编 Java 字节码的开源框架。本项目“jasmin实现的小游戏...
转到jasmin-web-panel/并运行cd jasmin-web-panel/pip install -r requirements.txtcp Sample.env .env 通过运行迁移命令来准备database : python deploy.py migratepython deploy.py load_new # to load new ...
无论您是Qt的新手还是从旧版本升级,本书都可以帮助您完成Qt 4.3所能实现的一切。
Jasmin-开源短信网关 介绍 Jasmin是一个非常完整的开源SMS网关,具有许多企业级功能,例如: SMPP客户端/服务器 HTTP客户端/服务器 基于控制台的配置,无需重新启动服务 基于AMQP代理,用于存储转发机制和其他排队...
《C++ GUI Qt4 编程(第二版)》是一本深入探讨使用Qt4库进行图形用户界面(GUI)开发的专业书籍。Qt4是Qt框架的一个版本,它为C++开发者提供了一整套用于创建跨平台GUI应用的工具和类库。这本书详细介绍了如何利用...
《C++ GUI Qt4编程(第二版)》,英文名《C++ GUI Programming with Qt4,Second Edition》,作者:【加拿大】Jasmin Blanchette、【英】Mark Summerfield,翻译:闫锋欣、曾泉人、张志强,审校:周莉娜、赵延兵,...
Jasmin是一个开源的SMS网关,它提供了一种强大的方式来处理短信通信。这款插件,名为"plugin-jasmin",是专门为playSMS设计的,允许用户通过HTTP API接口与Jasmin网关进行交互。playSMS是一款流行的开源短信应用程序...
在过去的十年中,计算机能力的指数级增长现在为并行编程在科学计算领域实现逼真的性能带来了巨大挑战。 为了改进惯性约束聚变(ICF)中激光聚变数值... JASMIN促进了科学计算并行编程的新范例。 本文简要介绍了JASMIN。
Jasmin是一个高度可扩展的短消息协议网关,它支持SMPP协议,可以连接到全球各地的短信服务中心(SMSCs)。HTTP API是Jasmin提供的一个接口,允许开发者通过HTTP请求发送短信,查询状态,甚至进行更复杂的操作,如...
Jasmin 提出的一些问题。 特别是,有几个人问我 Jasmin 是什么,为什么他们可能会使用 Jasmin,以及我为什么要写它。 我试图在下面给出这些问题的一些答案。 什么是茉莉花? Jasmin 是一个 Java 汇编程序接口。 它...
《C++ GUI Qt4编程(第二版)》,英文名《C++ GUI Programming with Qt4,Second Edition》,作者:【加拿大】Jasmin Blanchette、【英】Mark Summerfield,翻译:闫锋欣、曾泉人、张志强,审校:周莉娜、赵延兵,...
fwtheme-django-jasmin Django应用程序,为基于JASMIN的基于Django的Web应用程序提供Django框架主题。 需要较低级别的fwtheme-django。 ## 安装可以使用pip从Github直接安装fwtheme-django-jasmin进行开发,但对于...
为了与Jasmin通信,我们需要创建一个API客户端。在Laravel项目中创建一个新的服务提供商,例如`JasminHttpApiServiceProvider`,并注册到`config/app.php`的`providers`数组中。然后,在服务提供者中编写一个`...
在计算机科学领域,编译器和解释器是至关重要的工具,它们将高级编程语言转换为机器可理解的指令。本项目“MiniC到Jasmin”专注于将MiniC语言的源代码转化为Java虚拟机(JVM)能够执行的字节码,这是编译器设计和...