1

Я работаю над парсером для языка программирования, который требует многопоточной поддержки. Изучая, что такое бэкэнд моего компилятора, я заметил, что не могу найти много информации о многопоточности для таких вещей, как CIL, LLVM IR, gcc RTL или JVM байт-код. Я могу найти некоторые ссылки на то, как сделать такой поток кода безопасным, но ничего о том, как, например, создавать или форки нить. Я могу, конечно, использовать сигналы или что-то, чтобы напрямую взаимодействовать с операционной системой, но это непрозрачно и подвержено ошибкам.Переносная поддержка многопоточности в байт-кодах/промежуточных языках/компиляторах?

В этом случае нет простого способа управления потоками на этих низкоуровневых языках? Должен ли я скомпилировать язык высокого уровня (er), например C?

+2

Я не знаю о CIL, но на JVM создание и управление потоками осуществляется через стандартную библиотеку. Я думаю, это похоже на CIL. Кроме того, резьба на C - это кошмар. – Antimony

ответ

2

В байт-коде JVM вы можете использовать любые библиотеки Java, в том числе те, которые работают с потоками. Обычным способом создания нити будет

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

Этот код написан на Java. Соответствующий JVM байт-код можно увидеть с помощью javap:

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 
} 

Этот код прекрасно переносимым.

+0

Спасибо. К сожалению, я не уверен, что JVM является реалистичной целью, поскольку этот язык использует [стиль продолжения прохождения] (http://en.wikipedia.org/wiki/Continuation-passing_style), но я не понимал, как полезными были библиотеки Java. – jpt