Есть ли какой-либо интерпретируемый язык, выставляющий его байт-код (или любой IR) - PullRequest
0 голосов
/ 06 сентября 2018

Мне любопытно узнать, существует ли какой-либо язык, который дает программисту возможность «испускать» байт-код в середине исходного кода. Чтобы быть более ясным, есть ли интерпретируемый язык, который имеет средство, подобное ключевому слову asm для c / c ++?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я не уверен, имеет ли это значение, но в Forth вы можете традиционно сделать это. Вы можете оставить компилятор с [ в любой момент и манипулировать байтовым кодом и состоянием компилятора так, как вам нравится, прежде чем возобновить компиляцию с ]. Слово , напрямую выбрасывает слово из стека в байт-код. Например, следующее слово помещает 6 × 7 в стек; комментарии ограничены круглыми скобками:

: answer               ( create a word answer, start the compiler )
[                      ( stop the compiler )
6 7 *                  ( compute 6 × 7 )
' LIT                  ( push the word LIT (push literal) on the stack )
,                      ( append it to the machine code )
,                      ( append 6 × 7 to the machine code )
]                      ( resume compilation )
;                      ( finish the definition of answer )

Этот код работает так же, как если бы вы написали

: answer 42 ;

, который компилируется в байт-код

LIT 42 EXIT

Слово LIT берет следующее слово из потока байтового кода и помещает его в стек, EXIT возвращает из функции текущего байтового кода.

0 голосов
/ 06 сентября 2018

Stricto sensu не может быть эквивалентом asm, потому что это по существу для скомпилированных языков (и asm возможно в C, потому что компиляторы C генерируют код ассемблера!).

Я опубликовал в своей статье DSL2011 описание MELT - языка для конкретного домена, встроенного в компилятор GCC

Я описал в этой статье несколько особенностей, которыепомогает в генерации кода на C из MELT (который является Lisp-подобным языком, переведенным на C или C ++).

Но интерпретируемые языки с интерпретатором байт-кода (например, Lua, Guile, Nim, Ocaml) предоставляют хуки для добавления новыхпримитивы в этот интерпретатор байт-кода.Обычно операция с байт-кодом будет выглядеть примерно так: вызовите примитив # N с аргументами arg1 arg2 arg3 .

Вы можете реализовать свой язык (некоторые DSL) в качестве транслятора для C. Это обычная практика , и довольно весело делать.Затем вы кодируете некоторый «наивный» компилятор с вашего языка на C. Вместо этого вы можете использовать библиотеку JIT-компиляции, такую ​​как libgccjit или LLVM или libjit или lightning или asmjit .

И некоторые языки homoiconic , тогда они каким-то образом выставляют свой байт-код или достаточно хороший IR.Выучите Lisp (хотя бы прочитайте SICP ), затем прочитайте Lisp In Small Pieces

Помните Десятое правило Гринспуна .Посмотрите на Схема менее пройденного доклад Лиама Провен на FOSDEM 2018.

...