字节码/中间语言/编译器后端的便携式多线程支持?

时间:2014-02-04 23:01:03

标签: multithreading compiler-construction bytecode cil llvm-ir

我一直在研究需要多线程支持的编程语言的解析器。在调查我的编译器的后端应该是什么时,我注意到我找不到有关CIR,LLVM IR,gcc RTL或JVM字节码之类的多线程的大量信息。我可以找到关于如何使这样的代码线程安全的一些参考,但没有关于如何创建或分叉线程的任何内容。我当然可以使用信号或其他东西直接与操作系统连接,但这是不可移植的,容易出错。

是不是这种低级语言中没有可移植的方法来管理线程?我应该编译成像C这样的高级(呃)级语言吗?

1 个答案:

答案 0 :(得分:2)

在JVM字节代码中,您可以使用任何Java库,包括那些与线程一起使用的Java库。创建线程的传统方法是

    new Thread() {
        @Override
        public void run() {
            /// code
        }
    }.start();

此代码是用Java编写的。使用javap:

可以看到相应的JVM字节代码
   0: new           #2                  // class Main$1
   3: dup           
   4: invokespecial #3                  // Method Main$1."<init>":()V
   7: invokevirtual #4                  // Method Main$1.start:()V
   10: return        

Main $ 1是一个类:

final class Main$1 extends java/lang/Thread  {

  // compiled from: Intf.java
  OUTERCLASS Main main ([Ljava/lang/String;)V
  // access flags 0x8
  static INNERCLASS Main$1 null null

  // access flags 0x0
  <init>()V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Thread.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this LMain$1; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public run()V
   L0
    LINENUMBER 11 L0
    RETURN
   L1
    LOCALVARIABLE this LMain$1; L0 L1 0
    MAXSTACK = 0
    MAXLOCALS = 1
}

此代码非常便携。