【问题标题】:Generate C++ style code using LLVM使用 LLVM 生成 C++ 样式代码
【发布时间】:2015-08-25 03:27:26
【问题描述】:

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

我查看了 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 之前考虑到这一点吗?

【问题讨论】:

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


    【解决方案1】:

    如果您使用的是 LLVM,您将希望将您的语言翻译成 LLVM IR,而不是 c++ ast。

    从源语言文本到 IR 的过程是词法分析、解析、语义分析和降级。

    【讨论】:

    • 虽然这是信息性的,但我并不是在寻找一个广泛的解释,我已经查看了您上面描述的过程的源代码,我想知道,我必须做些什么才能使它工作像上面一样,在哪些步骤中使它像我的帖子一样的逻辑是什么?我不需要详细说明我通常需要做什么才能让它像我想要的那样工作。我主要了解词法分析和解析的过程,但我不确定在此过程中何时需要考虑以及需要做什么。
    • 我认为你的问题太宽泛了。对我来说,您的问题听起来像是“如何让我的编程语言工作”,非常广泛。
    • 这是一个关于特定项目的广泛问题,我不需要整个工作,我只需要描述它的广泛步骤,没有代码或任何东西。我了解词法分析和解析的作用,以及语义分析(不太了解),但我真的需要了解将单词的描述符转换为函数的过程。这是 Symantic 分析的问题,还是我会以某种方式在 IR 中处理它?我知道如何按原样解析某些东西,这对我来说很有意义,但是在什么时候我会将它翻译成上面的新代码?这就是我要找的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多