Multithreading 字节码/中间语言/编译器后端中的可移植多线程支持?
我一直在为一种需要多线程支持的编程语言开发解析器。在研究编译器的后端应该是什么的时候,我注意到我找不到很多关于多线程的信息,比如CIL、LLVM-IR、gcc-RTL或JVM字节码。我可以找到一些关于如何使这样的代码线程安全的参考资料,但没有找到关于如何创建或分叉线程的参考资料。我当然可以使用信号或其他东西直接与操作系统接口,但这是不可移植的,而且容易出错Multithreading 字节码/中间语言/编译器后端中的可移植多线程支持?,multithreading,compiler-construction,bytecode,cil,llvm-ir,Multithreading,Compiler Construction,Bytecode,Cil,Llvm Ir,我一直在为一种需要多线程支持的编程语言开发解析器。在研究编译器的后端应该是什么的时候,我注意到我找不到很多关于多线程的信息,比如CIL、LLVM-IR、gcc-RTL或JVM字节码。我可以找到一些关于如何使这样的代码线程安全的参考资料,但没有找到关于如何创建或分叉线程的参考资料。我当然可以使用信号或其他东西直接与操作系统接口,但这是不可移植的,而且容易出错 是不是在这些低级语言中根本没有可移植的方式来管理线程?我应该编译成像C这样的高级语言吗?在JVM字节码中,您可以使用任何Java库,包括那些
是不是在这些低级语言中根本没有可移植的方式来管理线程?我应该编译成像C这样的高级语言吗?在JVM字节码中,您可以使用任何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
0:new#2//class Main$1
3:dup
4:invokespecial#3//methodmain$1.“:()V
7:invokevirtual#4//方法Main$1.start:()V
10:返回
主要$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
}
final类Main$1扩展了java/lang/Thread{
//编译自:Intf.java
OUTERCLASS Main([Ljava/lang/String;)V
//访问标志0x8
静态INNERCLASS Main$1 null
//访问标志0x0
()V
L0
7号线L0
阿洛德0
调用特殊的java/lang/Thread。()V
返回
L1
LOCALVARIABLE此LMain$1;L0 L1 0
MAXSTACK=1
最大局部数=1
//访问标志0x1
公营
L0
线路号11 L0
返回
L1
LOCALVARIABLE此LMain$1;L0 L1 0
MAXSTACK=0
最大局部数=1
}
这段代码的可移植性非常好。我不知道CIL,但在JVM上,创建和管理线程是通过标准库完成的。我想CIL也是如此。此外,C中的线程化是一场噩梦。谢谢。不幸的是,我不确定JVM是否是一个现实的目标,因为这种语言使用了,但我没有意识到ul Java库是。