`
xieyj
  • 浏览: 103070 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java解释器的阅读

阅读更多

     前面已经提到了java的方法入口是Interpreter::entry_for_method,此处就将cpu控制权交给了java的解释器。

上面的entry_for_method为这个AbstractInterpreterGenerator::generate_method_entry函数的返回值,在此还是以X86机器为例,普通的方法由InterpreterGenerator::generate_normal_entry返回。

     address InterpreterGenerator::generate_normal_entry(bool synchronized) {

                .......

          //调用真正解释器的地方

          RuntimeAddress normal(CAST_FROM_FN_PTR(address, BytecodeInterpreter::run));
           RuntimeAddress checking(CAST_FROM_FN_PTR(address, BytecodeInterpreter::runWithChecks));

           __ call(JvmtiExport::can_post_interpreter_events() ? checking : normal);
           __ popl(rax);                                                  // discard parameter to run

     }

   在执行到上面的call时,就会调用了BytecodeInterpreter::run方法。此方法在BytecodeInterpreter.cpp里面,用#ifdef这些包含,不容易找到。这也是一个硕大的方法。挑选进行字节码解释部分分析一下。

     while (1){

            opcode = *pc;

            switch (opcode){

                   ...........

                   CASE(_new): {
                           u2 index = Bytes::get_Java_u2(pc+1);
                           constantPoolOop constants = istate->method()->constants();
                           if (!constants->tag_at(index).is_unresolved_klass()) {
                            // Make sure klass is initialized and doesn't have a finalizer
                           oop entry = (klassOop) *constants->obj_at_addr(index);
                           assert(entry->is_klass(), "Should be resolved klass");
                           klassOop k_entry = (klassOop) entry;
                           assert(k_entry->klass_part()->oop_is_instance(), "Should be instanceKlass");
                           instanceKlass* ik = (instanceKlass*) k_entry->klass_part();
                           if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
                           size_t obj_size = ik->size_helper();
                           oop result = NULL;
                           // If the TLAB isn't pre-zeroed then we'll have to do it
                           bool need_zero = !ZeroTLAB;
                           if (UseTLAB) {
                                   result = (oop) THREAD->tlab().allocate(obj_size);
                           }
                           if (result == NULL) {
                                   need_zero = true;
                                   // Try allocate in shared eden
                           retry:
                                   HeapWord* compare_to = *Universe::heap()->top_addr();
                                   HeapWord* new_top = compare_to + obj_size;
                                   if (new_top <= *Universe::heap()->end_addr()) {
                                               if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) {
                                               goto retry;
                                 }
                           result = (oop) compare_to;
                       }
                     }
                  if (result != NULL) {
                            // Initialize object (if nonzero size and need) and then the header
                        if (need_zero ) {
                                  HeapWord* to_zero = (HeapWord*) result + sizeof(oopDesc) / oopSize;
                                  obj_size -= sizeof(oopDesc) / oopSize;
                                  if (obj_size > 0 ) {
                                          memset(to_zero, 0, obj_size * HeapWordSize);
                                  }
                   }
                   if (UseBiasedLocking) {
                             result->set_mark(ik->prototype_header());
                   } else {
                            result->set_mark(markOopDesc::prototype());
                   }
                   result->set_klass(k_entry);
                   SET_STACK_OBJECT(result, 0);
                   UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
                 }
              }
          }
          // Slow case allocation
          CALL_VM(InterpreterRuntime::_new(THREAD, METHOD->constants(), index),
                handle_exception);
          SET_STACK_OBJECT(THREAD->vm_result(), 0);
          THREAD->set_vm_result(NULL);
          UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
      }

   //上面挑选一段new字节码的解释过程,整个run函数用到太多的宏,看起来太费劲,个人感觉宏难以理解,还是少用为好

      ................

      if (!THREAD->has_pending_exception()) {
        CONTINUE;
      }
      /* We will be gcsafe soon, so flush our state. */
      DECACHE_PC();
      goto handle_exception;
    }
  do_continue: ;

 }

 .........

 //下面是些处理异常的操作

由上面的代码可以看到,整个解释过程就是不断读入字节码,和系统预先定义好的字节码进行匹配(也就是上面的case处理)的过程。解释所用到的java栈、栈桢、本地方法栈等,还有待于慢慢阅读分析。

 

1
0
分享到:
评论

相关推荐

    微型java解释器

    轻巧的Java解释器。 用法: &gt; jr yourclass.class

    编译原理课程解释器构造Java源码

    在这个“编译原理课程解释器构造Java源码”中,我们可以推测这是一个基于Java编程语言实现的解释器项目。Java是一种广泛应用的面向对象的编程语言,它的跨平台特性使得它成为构建各种软件工具的理想选择,包括解释器...

    设计模式之解释器模式Java版本实现

    在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。这个模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的计算器或者SQL查询的简化版本。 ...

    CMM解释器java版语法分析器

    本项目名为“CMM解释器java版语法分析器”,是国际软件学院的一次作业,目的是让学生掌握如何使用Java语言实现一个语法分析器。在这个过程中,学生将深入理解编程语言的内部工作原理,以及如何解析并执行代码。 ...

    使用Java实现语言解释器.doc

    通过这个过程,Java解释器将逐行读取并执行SmallBASIC程序,提供一个交互式的环境,允许程序在运行时暂停、恢复,并在错误发生时进行调试。 总的来说,本章旨在通过构建一个简单的语言解释器,让读者深入理解解释器...

    java写的解释器,解释器构造课作业,实现全部CMM语法,支持string

    在构建一个Java解释器的过程中,我们需要关注以下几个关键知识点: 1. **词法分析**:这是编译器和解释器的第一步,它将源代码分解成一个个称为“标记”(tokens)的最小单位。这个过程通常由词法分析器(lexer)...

    基于antlr的java解释器

    在本主题“基于ANTLR的Java解释器”中,我们将深入探讨如何利用ANTLR来构建一个能够理解和执行Java代码的解释器。 ANTLR的核心功能是生成解析器和词法分析器。词法分析器负责将输入的字符流分解成一系列的标记...

    Java语言编写的Linux简单命令解释器

    在Java解释器中,这可能涉及到获取并打印Java的`System.getProperty("user.dir")`来获取当前工作目录。 4. **list命令**:`list`通常对应于Linux的`ls`命令,用于列出目录中的文件和子目录。Java实现可能需要遍历...

    java写的--CMM语言解释器

    《Java实现的CMM语言解释器详解》 在编程领域,理解并掌握编译器和解释器的工作原理是至关重要的。本项目是一个基于Java实现的C语言子集——CMM语言的解释器,旨在帮助学习者深入理解编译原理及其实践应用。下面,...

    JVM、Java编译器和Java解释器1

    Java编程语言以其跨平台的能力和高效执行闻名,这主要得益于其独特的执行机制,包括Java编译器、Java虚拟机(JVM)以及Java解释器。本文将深入探讨这些组件的作用和交互。 首先,Java编译器是开发过程中的关键部分...

    ha-textpad java解释器

    **标题:“ha-textpad java解释器”** **正文:** `ha-textpad` 是一个文本编辑器,特别针对编程人员设计,支持多种编程语言,包括Java。它以其简洁的界面和丰富的代码编辑功能受到程序员的喜爱。在Java开发环境中...

    Java源代码解释器

    一个java的辅助工具,旨在编写java时,能适时的解释代码段作用.

    beanshell java源码解释器

    Beanshell 是一个轻量级的Java源码解释器,它允许你在运行时执行Java代码片段或者完整的脚本。这个工具非常适用于快速测试、调试、以及动态编程任务,因为它的语法接近于标准Java,同时又引入了一些脚本语言的便利...

    java解释器初步之词法分析

    Java解释器是将Java源代码转换为机器可执行指令的关键组件。在这个初步的Java解释器中,重点在于词法分析,这是编译器设计过程中的第一步。词法分析,也称为扫描,是从源代码中识别出有意义的符号,即标记(tokens)...

    CMM解释器--java

    CMM解释器是一种用于执行CMM(一种特定的编程语言)程序的软件。在这个Java实现中,我们将深入探讨如何...通过阅读和理解这些代码,你可以深入了解解释器的工作原理,以及如何使用Java来实现一个完整的编程语言解释器。

    基于Java实现Lambda解释器【100012339】

    一个lambda interpreter主要由一下几个方面构成: 1.词法分析器(Lexer):将字符流分解为符号流(token流) 2....语法解释器/语法制导的翻译(Interpreter):遍历处理AST,进行对语法树进行求值。

    Java解释器的运行过程介绍

    Java解释器是Java虚拟机(JVM)的一个组成部分,它负责将编译好的Java字节码转换为特定平台上的机器码来执行。在Java程序的生命周期中,解释器起到了至关重要的作用。当Java代码被编译器编译成字节码后,这些字节码...

    解释器构造

    在桂浩的解释器项目中,使用Java作为实现语言是很常见的选择,因为Java具有良好的跨平台性,且其标准库提供了丰富的工具和支持。"国软"可能指的是该解释器项目是中国软件行业的产物,或者特别针对中国开发者设计的。...

    java设计模式-解释器模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

Global site tag (gtag.js) - Google Analytics