使用LLVM

时间:2015-06-10 03:57:37

标签: llvm code-generation abstract-syntax-tree

我正在研究制作一种有趣的自定义语言,主要是为了了解它是如何工作的,但在深入研究代码之前,我遇到了一些概念上的麻烦。

我查看了Kaleidoscope示例代码和许多其他在线资源,但我对如何做几件事感到困惑:

我的目标 将我的代码翻译成C ++代码或直接翻译成具有C ++风格AST

的机器代码

原因 主要是为了学习,但如果我能够很好地进行这项工作,我可能会进一步发展它。

我的语言是什么? 我的语言将特定于sql和数据库创建,重点是版本控制和缓存策略。

我的问题 我不确定如何将我的“语言”中的一些信息翻译成C ++等价物。

示例:

//An Integer type which is nullable and the default value of null.
int number = nullable;

会翻译成这样的......

public static sqlInt number = new sqlInt(true, null);

我遇到的问题是,如何生成AST和LLVM代码生成以将“可空”字段识别为新的sqlInt而不明确地将其写出来?这需要适用于更复杂的类型:

示例2:

//Create a foreign key which is of type int, points to pkID
//forces reference and holds ZeroToMany records for a single pkID
//It is also nullable with a default value of 0.
FK<int>(tableName.pkID, true, ZTM) fk1 = nullable(0);

会翻译成这样的东西:

public static FK<sqlInt> fk1 = new FK<sqlInt>(tableName.pkID, true, 
                                              ZTM, true, 0);

问题仍然存在,我是否必须建立特殊的AST?如果是这样我还需要做些什么才能做到这一点?或者这是否特定于LLVM?

我似乎找不到类似于这种风格的llvm语言的例子。

我目前没有任何实际代码,我只是收集信息,我似乎无法从我看过的代码中找出这部分内容。

修改 我(大多数情况下)理解如何使解析器和词法分析器找到函数并将其分配给变量,但我不确定何时应该派生函数来声明sqlInt以及如何找到正确的参数...等等。这是在LLVM IR之后的代码生成期间吗?我应该在LLVM IR之前解释这个吗?

1 个答案:

答案 0 :(得分:1)

如果您正在使用LLVM,那么您将希望从您的语言转换为LLVM IR而不是c ++ ast。

从源语言文本到IR的过程是lexing,parsing,语义分析和降低。