如何在vb.net中创建编译器

时间:2009-09-28 20:05:47

标签: vb.net compiler-construction

在回答这个问题之前,要明白我并不是在问如何创建自己的编程语言,我想知道如何使用vb.net代码为vb.net本身的语言创建编译器。基本上,用户输入代码,他们获得.exe。通过NO MEANS我想写自己的语言,因为这里似乎有其他与编译器相关的问题。我也不想使用vb.net编译器本身,也不想复制IDE。

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

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

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

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

One of my google searches

Something that looked promising

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

非常感谢你的帮助,如果这个问题是一个非常糟糕或“糟糕”的问题我很抱歉。

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

10 个答案:

答案 0 :(得分:8)

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

  1. 解释代码本身
  2. 写出解释后的代码
  3. 但是每个步骤都非常激烈。步骤1应该可以通过一些时间和大量的肘部油脂来实现 - 您需要根据语言规范将代码解析为许多控制语句。有关此步骤的详细信息,请查看http://en.wikipedia.org/wiki/Parsing。实质上,您将键入的代码转换为表示所需功能的通用格式。

    一旦你解析了代码,下一步就是把解析后的代码转换成机器可运行的代码(通常是汇编代码,虽然使用VB.NET你可以编写Microsoft中间语言代码作为输出然后在CLR中运行它。这实际上是以允许计算机运行程序的方式创建可执行文件的。

    不幸的是,解决这个问题的最佳建议是:

    1. 购买几本关于编程语言,机器代码,汇编语言,编译器等的书籍,然后花几个月或几年阅读和试验,直到你从书中获得的知识导致你的编写成功的编译器。< / LI>
    2. 参加当地大学的计算机科学课程。编写编程器和编程语言通常在计算机科学学士学位的第二年或第三年进行初步研究,然后在研究生阶段进行更深入的研究。
    3. 祝你好运!

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

答案 1 :(得分:4)

Process.Start(String.Format("vbc.exe {0}", sourceFilePath))

答案 2 :(得分:2)

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

与许多编程工作一样,您需要花费数月的时间来完成您想要的工作。祝你好运!!

答案 3 :(得分:2)

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

好的,所以看起来你比在这里咀嚼更多。我建议稍微重新评估一下你的目标。您似乎想要了解编译器的工作原理,编写VB.net编译器是您开始的项目。

尝试编写一个解释器,这是一个更小,更简单的任务。这是你如何做到的:

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

alt text

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

  • 随时随地添加功能。

一旦你掌握了完整的语言,你就可能已经学会了解编译器书籍的方法。不要使用龙书,而是尝试Appel的书,或Cooper / Torczon。如果你愿意,有网上书籍,我从来没有尝试过。

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

我会认为它似乎令人生畏,但如果你坚持一个简单的开始,你最多会在几天内得到一些工作。几个月后,你就可以把它建立起来,就像你正在寻找的那样。祝你好运。

至于问题的最后部分:

您似乎不知道代码是如何生成可执行文件的。自80年代以来,人们没有在编译器中使用hex,并且希望即便如此。 基本上,在解析代码之后,您将经历一系列步骤,这些步骤使代码逐渐变得更加简单。最后,你有一些非常接近装配的东西。然后生成程序集,汇编程序链接程序密谋使其成为可执行文件。

答案 4 :(得分:2)

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#中生成代码。

此致

Anthony D. Green |项目经理| Visual Basic编译器

答案 5 :(得分:1)

您可以像创建任何其他编译器一样为vb.net创建编译器。你需要一个词法分析器/解析器。关于这个主题的全部书籍都已写完,最着名的可能就是The Dragon Book

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

答案 6 :(得分:1)

您可以尝试在http://www.icemanind.com

查看我的教程

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

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

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

Console.Readline();

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

谢谢, DgBlogs

答案 9 :(得分:0)

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

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

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

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

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