`
1025250620
  • 浏览: 229832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JASMIN编程笔记(转)

 
阅读更多

 

現在做個簡單的 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 等),但仍有些不同:

  1. 最主要不同是 JVM 的資料結構是一個稱為 Constant Pool table,在 .class 檔內用來描述 classes, function 以及 variables。
  2. 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 .

參考

  1. C Compiler Targeting the Java Virtual Machine 
  2. The Java Virtual Machine Specification 
  3. 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 值不就沒意義了?

分享到:
评论

相关推荐

    jasmin+本人写的一些jasmin程序

    ** Jasmin 概述 ** Jasmin 是一个开源的 Java 字节码汇编器,它允许程序员以类似于汇编语言的方式编写 JVM(Java 虚拟机)字节码。由 Neil Fraser 创建,Jasmin 提供了一种低级别的接口来创建和理解 Java 类文件。...

    jasmin-2.4.zip

    掌握Jasmin能够增强开发者对Java底层运作的理解,对于优化性能、调试问题或进行JVM级别的编程具有很大的价值。对于那些热衷于探索Java技术深度的人来说,Jasmin是一个不可或缺的工具。通过深入学习Jasmin和实践编写...

    JASMIN框架中核心数据结构的设计与实现.pdf

    JASMIN框架是一种支持并行自适应结构网格应用的软件框架,其核心目标是快速研制和实现能解决多物理、多尺度、多介质、多组分复杂流动问题的并行程序。JASMIN框架的设计与实现中,涉及到核心数据结构的设计以及动态...

    jasminclasses-2.2.1.jar、jasmin-2.2.1.jar

    在学习使用soot工具(2.5.0)时,总是提示jasmin/Main中缺少assemble(StreamInput,StreamOut,boolean)函数,能在网上直接下载的jasmin版本都没有这个函数,或者参数不对。这个jar包是通过源文件编译好的,可以供soot...

    jasmin实现的小游戏--五子棋

    《使用 Jasmin 实现的小游戏:五子棋》 在 IT 领域,Java 语言因其跨平台性与高效性而备受青睐。而在 Java 世界中,Jasmin 是一款重要的工具,它是一个用于汇编 Java 字节码的开源框架。本项目“jasmin实现的小游戏...

    jasmin-web-panel:for用于Jasmin SMS网关的Jasmin Web面板

    转到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 4,第二版的C ++ GUI编程(Jasmin Blanchette)C++ GUI Programming with Qt 4, 2nd Edition (Jasmin Blanchette)

    无论您是Qt的新手还是从旧版本升级,本书都可以帮助您完成Qt 4.3所能实现的一切。

    jasmin:Jasmin-开源短信网关-Open source

    Jasmin-开源短信网关 介绍 Jasmin是一个非常完整的开源SMS网关,具有许多企业级功能,例如: SMPP客户端/服务器 HTTP客户端/服务器 基于控制台的配置,无需重新启动服务 基于AMQP代理,用于存储转发机制和其他排队...

    C++ GUI Qt4 编程 (第二版)

    《C++ GUI Qt4 编程(第二版)》是一本深入探讨使用Qt4库进行图形用户界面(GUI)开发的专业书籍。Qt4是Qt框架的一个版本,它为C++开发者提供了一整套用于创建跨平台GUI应用的工具和类库。这本书详细介绍了如何利用...

    C++ GUI Qt4编程(第二版).pdf【第三部分】

    《C++ GUI Qt4编程(第二版)》,英文名《C++ GUI Programming with Qt4,Second Edition》,作者:【加拿大】Jasmin Blanchette、【英】Mark Summerfield,翻译:闫锋欣、曾泉人、张志强,审校:周莉娜、赵延兵,...

    plugin-jasmin:通过HTTP API的Jasmin的playSMS网关插件-http

    Jasmin是一个开源的SMS网关,它提供了一种强大的方式来处理短信通信。这款插件,名为"plugin-jasmin",是专门为playSMS设计的,允许用户通过HTTP API接口与Jasmin网关进行交互。playSMS是一款流行的开源短信应用程序...

    JASMIN:用于科学计算的并行软件基础架构

    在过去的十年中,计算机能力的指数级增长现在为并行编程在科学计算领域实现逼真的性能带来了巨大挑战。 为了改进惯性约束聚变(ICF)中激光聚变数值... JASMIN促进了科学计算并行编程的新范例。 本文简要介绍了JASMIN。

    Laravel开发-jasmin-http-api

    Jasmin是一个高度可扩展的短消息协议网关,它支持SMPP协议,可以连接到全球各地的短信服务中心(SMSCs)。HTTP API是Jasmin提供的一个接口,允许开发者通过HTTP请求发送短信,查询状态,甚至进行更复杂的操作,如...

    java高级笔试题及答案-jasmin:Jasmin是Java虚拟机的汇编器:tent:

    Jasmin 提出的一些问题。 特别是,有几个人问我 Jasmin 是什么,为什么他们可能会使用 Jasmin,以及我为什么要写它。 我试图在下面给出这些问题的一些答案。 什么是茉莉花? Jasmin 是一个 Java 汇编程序接口。 它...

    C++ GUI Qt4编程(第二版).pdf【第一部分】

    《C++ GUI Qt4编程(第二版)》,英文名《C++ GUI Programming with Qt4,Second Edition》,作者:【加拿大】Jasmin Blanchette、【英】Mark Summerfield,翻译:闫锋欣、曾泉人、张志强,审校:周莉娜、赵延兵,...

    fwtheme-django-jasmin:Django组件的框架主题,JASMIN品牌

    fwtheme-django-jasmin Django应用程序,为基于JASMIN的基于Django的Web应用程序提供Django框架主题。 需要较低级别的fwtheme-django。 ## 安装可以使用pip从Github直接安装fwtheme-django-jasmin进行开发,但对于...

    Laravel开发-jasmin-http-api .zip.zip

    为了与Jasmin通信,我们需要创建一个API客户端。在Laravel项目中创建一个新的服务提供商,例如`JasminHttpApiServiceProvider`,并注册到`config/app.php`的`providers`数组中。然后,在服务提供者中编写一个`...

    minic-to-jasmin:从 code.google.compminic-to-jasmin 自动导出

    在计算机科学领域,编译器和解释器是至关重要的工具,它们将高级编程语言转换为机器可理解的指令。本项目“MiniC到Jasmin”专注于将MiniC语言的源代码转化为Java虚拟机(JVM)能够执行的字节码,这是编译器设计和...

Global site tag (gtag.js) - Google Analytics