【问题标题】:How to create a compiler in vb.net如何在 vb.net 中创建编译器
【发布时间】:2021-05-23 01:46:44
【问题描述】:

在回答这个问题之前,请理解我不是在问如何创建自己的编程语言,而是在问如何使用 vb.net 代码为像 vb.net 这样的语言本身创建编译器。本质上,用户输入代码,他们得到一个 .exe。我绝对不想编写自己的语言,因为这里似乎有其他与编译器相关的问题。我也不想使用 vb.net 编译器本身,也不想复制 IDE。

我想要做的确切目的很难解释,但我所需要的只是朝着正确的方向推动编写一个编译器(如果可能的话从头开始),它可以简单地接受输入并创建一个 .exe。我之前(我自己的程序)以纯文本形式打开了 .exe 文件,看看我是否可以从我认为是人类可读文本的内容中获得一些含义,但我显然对看到随机 ascii 感到非常失望,尽管可以理解为什么这就是我找到的全部。

我知道 .exe 文件只是几行代码,由它所在的计算机解析,但我的问题实际上归结为:什么代码组成了 .exe?如果我愿意,我怎么能在纯文本编辑器中制作一个? (不,我不想那样做,但如果我理解这个过程,我的目标会更容易实现。) 是什么让可执行文件成为可执行文件?代码的逻辑在哪里?

这是一个编程问题,而不是计算机问题,这就是为什么我没有在 SuperUser 上发布它。我知道很多关于 System.IO 命名空间的信息,所以我知道如何创建一个文件并写入它,我只是不知道我将在这个文件中放置什么以使其作为可执行文件工作。

如果这个问题“令人困惑”、“愚蠢”或“显而易见”,我很抱歉,但我无法在任何地方找到有关可执行文件实际内容的任何信息。

One of my google searches

Something that looked promising

编辑:这里的第二个链接虽然看起来不错,但完全失败了。我不会浪费时间敲击键盘并记录结果。 “使用“Alt”和 3 位组合来创建不会出现在键盘上但在程序中需要的符号。” (第 4 步)我怎么知道我需要什么符号???

非常感谢您的帮助,如果这个问题是一个新手或“坏”问题,我深表歉意。

简单总结一下:我想在 vb.net 中创建一个程序,它可以将特定语言的代码编译为单个可执行文件。有哪些方法可以让我做到这一点,如果没有,我该如何从头开始编写自己的方法?

【问题讨论】:

  • 我认为您大大低估了编译器的复杂性。大学里有关于这个单一主题的完整课程。
  • 因此,如果这是一个愚蠢的问题,我深表歉意。显然,这些并非没有根据。如您所见,我确实在谷歌上搜索过,我并没有期待一个小的答案。
  • 乔尔说,对于一个读龙书的人才来说,写一个编译器是两个月的工作:joelonsoftware.com/items/2006/09/01b.html
  • 这绝对是一个小问题,但我不会说它是一个坏问题。很明显,你对你要问的问题一无所知,也不知道它意味着什么,但如果不问别人,你是不会知道的。顺便说一句,第二个链接确实没用,而且您关于需要哪些符号的问题已经死了:这就像参加十四行诗写作课程并被教如何触摸打字。
  • 是的,我对此一无所知,而且绝对是nooby。是的,第二个链接失败了。

标签: vb.net compiler-construction


【解决方案1】:

您要问的是一个非常复杂的问题。当然,它的核心似乎很基本:

  1. 解释代码本身
  2. 写出解释代码

但是这些步骤中的每一个都可能非常紧张。第 1 步应该可以通过一些时间和大量的努力来实现——您需要根据语言的规范将代码解析为许多控制语句。查看http://en.wikipedia.org/wiki/Parsing 了解有关此步骤的更多信息。本质上,您是将键入的代码转换为代表您想要的功能的通用格式。

一旦您解析了代码,下一步就是获取解析后的代码并将其转换为机器可运行的代码(通常是汇编,尽管使用 VB.NET 您可以编写 Microsoft 中间语言代码作为输出,然后在 CLR 中运行它)。这就是以让计算机运行程序的方式实际创建可执行文件的方式。

很遗憾,解决此问题的最佳建议是:

  1. 去买几本关于编程语言、机器代码、汇编语言、编译器等的书,然后花几个月或几年的时间阅读和试验,直到你从书中获得的知识让你编写出一个成功的编译器。
  2. 在当地大学注册计算机科学课程。编写编译器和编程语言通常在计算机科学学士学位的第二年或第三年进行初级学习,然后在研究生阶段进行更深入的学习。

祝你好运!

编辑:如果您正在寻找的只是一种编写代码的方法,然后编写一种执行它的方法,您可以尝试为已经存在的一种脚本语言编写解释器 - Ruby、Python、Lua等。

【讨论】:

  • 看看我对第二个链接的编辑,这就是为什么我说它看起来很有希望,但实际上它没有任何意义。我不打算专门获得学位,以便我可以制作编译器,或购买任何有关该主题的书籍。这似乎真的比它应该的更复杂哈哈......
  • 在我发布后看到了编辑 - 老实说,该链接是一个讽刺 :) 的确,你所做的所有核心都是采用某种文本模式并将其转换为某种 1s 模式,然后0s - 如果你这样定义它,那么是的,这绝对很容易。当然,如果我们走这条路: - 篮球真的只是把球放进篮筐 - 盖房子真的只是结合木头和钉子 - 说一门外语真的只是记忆 有些人花费数年时间学习编写编译器 - 它是看似复杂:)
  • 此时我已经确信,完全编写自己的语言几乎更简单,并且只需自己编写所有逻辑作为解析器。当然,这也很荒谬,因为我不需要一种全新的语言(尽管我曾经尝试在 vb.net 中编写 Lolcode 解析器,但它是唯一使用“OH NOES”作为异常处理程序的语言。
  • @Cyclone:编写自己的语言不会更简单,因为复杂性在于编译任何东西。编写任何类型的编译器对你来说都是一次丰富的学习经历和大量的工作,而获得计算机科学学位可能是最简单的方法。
  • @Cyclone:“这似乎真的比它应该的复杂......”你认为将人类可以理解的文本翻译成二进制文件有多简单应该可以被一系列电子逻辑门捣碎以产生一些仍然是人类可感知的结果的东西?
【解决方案2】:
Process.Start(String.Format("vbc.exe {0}", sourceFilePath))

【讨论】:

  • “我怎样才能从头开始编写自己的?”我不能假设用户在他们的计算机上安装了 vb ide。
  • 您不需要 IDE 来获取编译器...只需要免费下载的 SDK。
  • @Cyclone - 说真的,在 VB.NET 中重写 VB.NET 编译器是一项艰巨的任务,而不是我(或者,我猜,这里的任何其他人都想要)承担)。使用可免费分发的 .NET SDK 会容易得多。
  • K,能给个链接吗?另外,这适用于 vb.net 对吗?使用字符串“sourceFilePath”,源文件的内容应该是什么?这是 vb.net,而不是 vb6,所以 vbscript 文件根本不是其中的一部分,而 vbscript 文件是我能想到的唯一可以作为单个文件编译到其中的文件。
【解决方案3】:

这里是one book,它在非常基本的层面上解释了这一切。包括您可以在几个小时内开始工作的示例代码。

与许多编程爱好者一样,您需要数月的学习才能完成您想要的。祝你好运!!

【讨论】:

  • 我会把它添加到我的购物车中,看看在那之前我能不能找到更便宜的解决方案。谢谢!
【解决方案4】:

首先让我说这是完全可行的。忽略反对者。

好吧,看来你在这里咬得比你能咀嚼的还多。我建议稍微重新评估你的目标。看来您想了解编译器的工作原理,而编写一个 VB.net 编译器是您开始的项目。

尝试编写一个解释器,这是一个更小更简单的任务。以下是你的做法:

  • 为非常小的语言编写解析器,可能只支持赋值语句。使用解析器工具包,例如Antlr。这将构建一个 AST(“抽象语法树” - 即一些代表程序语法的类或对象,没有分号之类的废话,就像一棵树),它看起来像这样:

  • 然后你通过 AST,然后执行它。谷歌搜索“AST walker”。因此,对于赋值 x = 5,为“x”创建一个哈希表条目,为其赋值 5,然后继续执行下一条语句。

  • 继续添加功能。

一旦您掌握了完整的语言,您可能已经在理解编译器书籍的过程中学到了足够的知识。不要使用龙书,而是尝试 Appel 的书,或 Cooper/Torczon。如果您愿意,有在线书籍,我从未尝试过。

当您编写编译器时,您只需将执行 AST 的位更改为生成程序集(或 C,如果您愿意)的位,该程序集将在运行时执行相同的操作。

我承认这似乎令人生畏,但如果你坚持做一个简单的开始,你最多几天就会得到一些工作。几个月后,您将把它建成您正在寻找的东西。祝你好运。

到你问题的最后一部分:

您似乎不知道如何从代码中生成可执行文件。自 80 年代以来,人们就没有在他们的编译器中使用过十六进制,即使在那时也希望不会太多。 基本上,在解析代码之后,您会经历一系列使代码逐渐变得更简单的步骤。最后,你有一些非常接近组装的东西。然后生成程序集,assemblerlinker 合力将其变成可执行文件。

【讨论】:

    【解决方案5】:

    Visual Basic .NET 编译器作为 .NET Framework 的一部分免费提供 - 您甚至不需要 SDK 或 Express Edition。 VB(和 C#)的编译器位于 c:\windows\microsoft.net\framework[version]\vbc.exe(或 C# 的 csc.exe)。因此,任何可以运行 VB.NET 程序的计算机都可以编译一个。 .NET 框架还包括 System.CodeDom 命名空间,它提供了一种从程序内部编译程序的方法,可以从文档模型或从字符串(或文件)编译成 .NET 程序集( .exe 或 .dll)并在 VB 和 C# 中生成代码。

    问候,

    安东尼 D. 格林 |项目经理 | Visual Basic 编译器

    【讨论】:

    • 是的,我在你提到的命名空间中找到了必要的代码。
    【解决方案6】:

    您为 vb.net 创建编译器的方式与创建任何其他编译器的方式相同。你需要一个词法分析器/解析器。关于这个主题已经写了整本书,最著名的可能是The Dragon Book

    要提供明确的答案:不,您不能创建一个像样的编译器来使用记事本生成可执行文件。您需要一个编译器将人类可读的文本转换为机器语言(汇编或 IL),然后链接器或解释器可以执行。

    【讨论】:

    • 您是否点击了我提供的链接?这应该足以让你放弃在记事本中编写它的想法......
    • 我从未打算在记事本中编写可执行文件?
    • 啊...我想您原始帖子的这一部分让我感到困惑:“如果我愿意,我怎么能在纯文本编辑器中制作一个?”
    • 我更多的是询问 .exe 文件本身的实际结构,而不是出去在记事本中制作一个。
    • 它是二进制机器码,包含供 CPU 执行的指令,无论它是用什么语言编写的。(好吧,不完全正确 - 例如,如果你用 VB 脚本编写,它是文本VB 脚本运行时编译成它解释的东西并变成机器代码。但是,您询问了 .EXE 文件。)
    【解决方案7】:

    您可以尝试在http://www.icemanind.com查看我的教程

    这是一个关于创建自己的虚拟机和汇编程序的教程,用 100% C# 编写。

    【讨论】:

      【解决方案8】:

      Cyclone,我想知道你到底想达到什么目的?你说“我想做的事情的确切目的很难解释”和“基本上,用户输入代码,他们得到一个 .exe”。

      如果您只是希望用户能够输入代码然后执行它,您可以考虑使用现有的脚本语言。 VBScript 内置在 Windows 中,语言与 VB.Net 非常相似,或者有各种优秀的免费语言可以下载,如 Python

      如果用户确实需要能够创建 .exe - 我认为脚本可能会这样做 - 那么为什么不使用现有的免费编译器,例如 FreeBasic,甚至 Visual Basic.Net Express Edition

      【讨论】:

        【解决方案9】:

        我正在我的网站http://dgblogs.weebly.com 上为此制作教程。它是用 C# 编写的,您可以创建自己的计算机编程语言!

        你永远不会在我的教程中看到这种语法:

        Console.Readline();
        

        我的网站目前处于离线状态,祝你好运!

        谢谢, DgBlogs

        【讨论】:

          【解决方案10】:

          我很震惊这个问题从来没有得到完全回答;最近我遇到了一些关于从头开始开发编程语言的教程https://www.youtube.com/c/DmitrySoshnikov-education/playlists 尽管该人使用 Java Script 用于创建标记器和解析器的技术来使用标记器的输出,从而为我认为是 GOLD 的转录语言生成 AST! ... 另一个教程或人https://youtube.com/playlist?list=PLSq9OFrD2Q3DasoOa54Vm9Mr8CATyTbLF 托比霍!还使用 Nearly 解析器(插件)生成了各种方法来更轻松地构建语言,但不像我这样的纯代码编码器(不喜欢扩展来完成我自己可以做的工作)...... https://github.com/spydaz/SpydazWeb-AI-_Emulators

          我能够做一些不同的实验来设计堆栈机器(运行迷你汇编语言)。对于我的“玩具”编程语言(基本)可以执行。 (虚拟机)- 使用 Visual Basic(我个人的语言 - 我认为是 VB)

          自从重温教程以来; https://youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu5GRAVmze1t2y 伊莫兰德沃思!又做了几个实验 这次用 C# 多一点意大利面来考虑;但实际上揭示了(在了解更多之后);

          是的,IT 可以很容易地用 VB.net 设计编译器/VM ...无需外部工具。

          作为一名 AI 开发人员(CONVERSATIONAL AI / NLP),如果可以使用该技术来解析语法树并使用 Tokenizer/Parser 从文本构建语法树,我有兴趣为英语构建一个编译器到 AST Method ,以及设计转译器以允许将语法树用于翻译成其他语言。就像今天的编程语言只是与低级(VM)语言接口的高级语言一样。事实上,我们应该开发更自然的语言 - 编程语言并消除更神秘的语言,如 C# (Lol) 和 Java 和 Go 等(如此多的括号和分号/制表符等 - 真的不需要!)就是说我们程序员还是在代码中思考!作为 AI 开发人员的旅程跨越了许多领域。迫使许多偏离主题的研究途径..所以又是一个很大的YES!我们仍然可以说任何编程语言都可以用来创建另一种编程语言,它只取决于你“思考”的语言......因此没有使用太多语言(我了解大多数编程语言 - 但我会永远在 VB 中思考)...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-25
            • 2011-06-11
            • 2011-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多