Assembly 是否有任何解释语言公开其字节码(或任何IR) 我很想知道是否有任何语言可以让程序员在源代码的中间“发射”字节码。更清楚地说,是否有任何解释语言具有类似于c/c++的asm关键字的功能

Assembly 是否有任何解释语言公开其字节码(或任何IR) 我很想知道是否有任何语言可以让程序员在源代码的中间“发射”字节码。更清楚地说,是否有任何解释语言具有类似于c/c++的asm关键字的功能,assembly,keyword,bytecode,inline-assembly,interpreted-language,Assembly,Keyword,Bytecode,Inline Assembly,Interpreted Language,严格意义上讲,不可能有与asm等价的东西,因为它基本上是用于编译语言的(而asm在C中是可能的,因为C编译器发出汇编代码!) 我在我的论文中发表了一篇关于 MELT-嵌入在GCC编译器中的翻译后的领域特定语言 在那篇文章中,我描述了几个特性,这些特性有助于从MELT生成C代码(这是一种翻译成C或C++的类似Lisp的语言) 但是,带有字节码解释器的解释语言(例如Lua、Guile、Nim、Ocaml)提供了挂钩,可以向字节码解释器添加新的原语。通常,字节码操作类似于使用参数arg1 arg2 a

严格意义上讲,不可能有与
asm
等价的东西,因为它基本上是用于编译语言的(而
asm
在C中是可能的,因为C编译器发出汇编代码!)

我在我的论文中发表了一篇关于 MELT-嵌入在GCC编译器中的翻译后的领域特定语言

在那篇文章中,我描述了几个特性,这些特性有助于从MELT生成C代码(这是一种翻译成C或C++的类似Lisp的语言)

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

您可以将您的语言(一些DSL)实现为C语言的翻译器。这是一个非常有趣的过程。然后,你可以将一些“天真”的编译器从你的语言编码成C。你可以考虑使用JIT编译库,比如,或LIJJIT或闪电,或者

。 有些语言是这样的,它们以某种方式暴露了它们的字节码或一些足够好的IR。学习(至少阅读)然后阅读


意识到。查看Liam在2018年FOSDEM大会上证明的谈话。

严格意义上讲,不可能有与
asm
等价的东西,因为它本质上是用于编译语言的(而
asm
在C中是可能的,因为C编译器发出汇编代码!)

我在我的论文中发表了一篇关于 MELT-嵌入在GCC编译器中的翻译后的领域特定语言

在那篇文章中,我描述了几个特性,这些特性有助于从MELT生成C代码(这是一种翻译成C或C++的类似Lisp的语言)

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

您可以将您的语言(一些DSL)实现为C语言的翻译器。这是一个非常有趣的过程。然后,你可以将一些“天真”的编译器从你的语言编码成C。你可以考虑使用JIT编译库,比如,或LIJJIT或闪电,或者

。 有些语言是这样的,它们以某种方式暴露了它们的字节码或一些足够好的IR。学习(至少阅读)然后阅读


意识到。查看Liam在2018年FOSDEM大会上的演讲。

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

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

说:“输出类可以保存到文件中,或者由
类加载器动态加载。
经典“解释”语言通常只有
eval
用于在同一语言中注入动态代码。(与C/C++中的
asm
相反,在C/C++中,asm必须在编译时已知)。对于大多数真正解释的语言,任何中间表示都只是一个实现细节。您可以在CPython()中转储它,但如果您可以静态地提供它,则可以使用IDK。谢谢你的评论。不喜欢一个问题,不解释为什么它完全是错误的inexcusable@AntonioMolinaro我想否决票是因为这是一个“列出具有此属性的随机事物”的问题,它并不真正适合此网站的格式。说明:“输出类可以保存到文件中,也可以由
类加载器动态加载”
。经典的“解释”语言通常只有
eval
用于在同一语言中注入动态代码。(与C/C++中的
asm
相反,在C/C++中,asm必须在编译时已知)。对于大多数真正解释的语言,任何中间表示都只是一个实现细节。您可以在CPython()中转储它,但如果您可以静态地提供它,则可以使用IDK。谢谢你的评论。不喜欢一个问题,不解释为什么它完全是错误的inexcusable@AntonioMolinaro我想否决票是因为这是一个“列出具有此属性的随机事物”的问题,它并不真正适合此网站的格式。老实说,我已经做到了。我只是想知道它是否已经完成了。func size(){asm:“native_call”、“#1\n”、“exp#u ret\n”}然后写一些关于这一点的博客文章,我正在发布该语言的过程中,请确保重新发布