我在学习编译器。此外,我也有兴趣自己构建一个编译器,以获得洞察力。
因此,我指的是Cool编译器(面向课堂对象的语言)。
我已经从这里下载了linux的参考编译器。
酷编译器提供了各种选项

我使用-x86和--asm进行编译,生成.s和.asm文件。IT在QTSPIM .中出现错误
如何在Linux上直接运行这些扩展。
示例
class Main {
main():Object
{ (new IO).out_string("HELLO WORLD !\n") };
};第一个(.asm文件-程序集输出)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
String..vtable: ;; virtual function table for String
constant string6
constant String..new
constant Object.abort
constant Object.copy
constant Object.type_name
constant String.concat
constant String.length
constant String.substr
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Bool..new: ;; constructor for Bool
mov fp <- sp
;; stack room for temporaries: 1
li r2 <- 1
sub sp <- sp r2
push ra
li r0 <- 4
alloc r0 r0
;; store class tag, object size and vtable pointer
li r2 <- 0
st r0[0] <- r2
li r2 <- 4
st r0[1] <- r2
la r2 <- Bool..vtable
st r0[2] <- r2
;; initialize attributes
;; self[3] holds field (raw content) (Int)
li r1 <- 0
st r0[3] <- r1
;; self[3] (raw content) initializer -- none
mov r1 <- r0
pop ra
li r2 <- 1
add sp <- sp r2
return
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;第二(.s文件-x8664程序集输出)
.globl String..vtable
String..vtable: ## virtual function table for String
.quad string6
.quad String..new
.quad Object.abort
.quad Object.copy
.quad Object.type_name
.quad String.concat
.quad String.length
.quad String.substr
## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.globl Bool..new
Bool..new: ## constructor for Bool
pushq %rbp
movq %rsp, %rbp
## stack room for temporaries: 1
movq $8, %r14
subq %r14, %rsp
## return address handling
movq $4, %r12
movq $8, %rsi
movq %r12, %rdi
call calloc
movq %rax, %r12
## store class tag, object size and vtable pointer
movq $0, %r14
movq %r14, 0(%r12)
movq $4, %r14
movq %r14, 8(%r12)
movq $Bool..vtable, %r14
movq %r14, 16(%r12)
## initialize attributes
## self[3] holds field (raw content) (Int)
movq $0, %r13
movq %r13, 24(%r12)
## self[3] (raw content) initializer -- none
movq %r12, %r13
## return address handling
movq %rbp, %rsp
popq %rbp
ret
## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;发布于 2016-12-09 13:00:17
这是一个老问题,但我认为这个答案可能会帮助其他人开始使用Cool,同时遵循Aiken的编译器课程。
问题是,艾肯教授的编译器课程的多个版本在网上比比皆是,因此,如果你指的是一个版本的材料(比如这些 YouTube视频),同时使用为不同版本设计的代码(比如这一个),那么你很容易感到困惑。
OP正在运行的是用于x86体系结构的酷解释器之一(可以从这里下载)。运行cool valid-cool-program.cl将导致您的程序被解释(运行)。此版本可以使用适当的标志调用程序集,但AFAIK仅使用x86程序集本身。
另一方面,上面链接的YouTube播放列表是指使用Cool编译器编译源程序并发射MIPS程序集,然后将其传递给spim,后者是MIPS模拟器。
运行后一个版本的最简单方法可能是使用预配置的Linux (提供这里)。
我昨天才开始学习这个课程,所以如果有更多的“不兼容”,我还不知道。
发布于 2015-06-19 11:27:27
您可以使用gcc将.s文件组装成可执行文件。
gcc hello.s -o hello
https://stackoverflow.com/questions/21873026
复制相似问题