我目前正在使用llvm编写一个编译器项目.我已经按照各种教程进行操作,以便我有一个解析器来创建语法树,然后使用提供的IRBuilder将树转换为llvm模块.
我的目标是创建一个可执行文件,我很困惑,接下来该做什么.我发现的所有教程都创建了llvm模块并使用Module.dump()打印出程序集.另外,我能找到的唯一文档是llvm开发人员,而不是项目的最终用户.
如果我想生成机器代码,接下来的步骤是什么?llvm-mc项目看起来可能会做我想要的,但我找不到任何类型的文档.
也许我期待自己会做一些事情.我的期望是我可以构建一个模块,然后会有一个我可以使用模块调用的API,并且将生成一个目标三元组和一个目标文件.我找到了关于生成JIT的文档和示例,我对此并不感兴趣.我正在寻找如何生成编译的二进制文件.
我正在研究OS X,如果这有任何影响.
我正在进行巡回演唱,我觉得除了并发之外,我对语言有很好的理解.
在幻灯片72上有一个练习,要求读者并行化一个网络爬虫(并使其不覆盖重复,但我还没有到那里.)
这是我到目前为止:
func Crawl(url string, depth int, fetcher Fetcher, ch chan string) {
if depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
ch <- fmt.Sprintln(err)
return
}
ch <- fmt.Sprintf("found: %s %q\n", url, body)
for _, u := range urls {
go Crawl(u, depth-1, fetcher, ch)
}
}
func main() {
ch := make(chan string, 100)
go Crawl("http://golang.org/", 4, fetcher, ch)
for i := range ch {
fmt.Println(i)
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目来构建一个小编译器,只是为了它.
我决定采用构建一个非常简单的虚拟机来实现目标,所以我不必担心学习精灵,英特尔组装等的来龙去脉.
我的问题是关于使用工会在C中打字.我决定只在vm的内存中支持32位整数和32位浮点值.为方便起见,vm的"主内存"设置如下:
typedef union
{
int i;
float f;
}word;
memory = (word *)malloc(mem_size * sizeof(word));
Run Code Online (Sandbox Code Playgroud)
所以我可以根据指令将内存部分视为int或float.
这在技术上是打字吗?当然,如果我使用int作为内存的话,然后使用float*来像浮点数一样对待它们.我目前的方法虽然在语法上有所不同,但我认为它在语义上并不相同.最后,我仍然将内存中的32位视为int或float.
我在网上提出的唯一信息表明这是依赖于实现的.是否有更便携的方式来实现这一点而不浪费一大堆空间?
我可以做到以下几点,但接下来我会占用相当于工会的2倍以上的记忆和"重新发明轮子".
typedef struct
{
int i;
float f;
char is_int;
}
Run Code Online (Sandbox Code Playgroud)
编辑
我也许没有说清楚我的确切问题.我知道我可以使用一个没有未定义行为的联合中的float或int.我所追求的是一种具有32位内存位置的方法,我可以安全地将其用作int或float,而不知道最后一个值集是什么.我想说明使用其他类型的情况.