是否有任何解释性语言公开其字节码(或任何IR)

时间:2018-09-06 19:45:03

标签: assembly keyword bytecode inline-assembly interpreted-language

我很想知道是否存在任何语言,使程序员可以在源代码中间“发射”字节码。更明确地说,是否有任何解释语言都具有类似于c / c ++的asm关键字的功能?

2 个答案:

答案 0 :(得分:4)

我不确定这是否有意义,但是在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从当前字节码函数返回。

答案 1 :(得分:1)

严格来说,不能等同于asm,因为它本质上是用于编译语言的(而asm在C中是可能的,因为C编译器会发出汇编代码!)

我在DSL2011论文中发表了对 MELT-嵌入在GCC编译器中的翻译领域特定语言

我在论文中描述了一些特征,这些特征有助于从MELT(一种翻译成C或C ++的类似Lisp的语言)中生成C代码。

但是带有字节码解释器的解释语言(例如Lua,Guile,Nim,Ocaml)提供了将新原语添加到该字节码解释器中的钩子。通常,字节码操作类似于使用参数arg1 arg2 arg3 调用Primitive#N。

您可以将您的语言(某些DSL)实现为C的翻译器。这是usual practice,而且做起来很有趣。然后,您可以将某种“幼稚”的编译器从您的语言编写为C语言。您可以考虑使用一些JIT编译库,例如libgccjitLLVM或libjit或lightning或asmjit

有些语言是homoiconic,然后以某种方式公开其字节码或足够好的IR。学习Lisp(至少阅读SICP)然后阅读Lisp In Small Pieces

请注意Greenspun's tenth rule。看看Liam Proven在FOSDEM 2018上的The circuit less traveled演讲。