我很想知道是否存在任何语言,使程序员可以在源代码中间“发射”字节码。更明确地说,是否有任何解释语言都具有类似于c / c ++的asm
关键字的功能?
答案 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编译库,例如libgccjit或LLVM或libjit或lightning或asmjit。
有些语言是homoiconic,然后以某种方式公开其字节码或足够好的IR。学习Lisp(至少阅读SICP)然后阅读Lisp In Small Pieces
请注意Greenspun's tenth rule。看看Liam Proven在FOSDEM 2018上的The circuit less traveled演讲。