【问题标题】:Compiler construction and DirectX编译器构建和 DirectX
【发布时间】:2011-02-12 04:57:02
【问题描述】:

我是一个项目设计和编码的初学者,我已经有了所有的想法,但是我有一个问题阻碍了我继续这个项目。

我觉得代码丑陋且不可读,我不能继续这样下去。该项目是我脑海中的一种编程语言,它具有小的图形功能。

即使是初学者,我也想使用 DirectX 对其进行编码,因为每个人都想要它。而且我想完全编写代码,而不是依赖于 SDL 之类的任何包装库。

我对 DirectX 模块进行了重构,它暴露了所有弱点。到处都有 Direct3D 代码,但代码本身做的很少!我不知道这是我设计的错误还是 DirectX 的错误。

我会开始使用 DirectX 构建这样的项目,还是应该只使用 GDI 和 Windows 的多媒体 API?这对初学者来说是一个很好的进步吗?

【问题讨论】:

  • 您想到的这些“小型图形功能”究竟是什么?你认为你的编程语言会有什么样的实用性?在什么场景下会有用?
  • 它只是一个可以绘制的帧缓冲区。所有图形操作都将由编译器编译成字节码。它有点慢,但我认为 C VM 变得更小,并且用高级语言编写它的舒适性是值得的。之后编码复杂的东西非常灵活。它是一种具有 BASIC 感觉的语言,但具有程序和简单的对象原型。之后,当项目稳定后,我将为它构建一个简单的 GUI,就像 PDA 一样。最后,平台游戏如 8 位和 16 位之前的游戏机。我们的想法是最终构建一个微型虚拟计算机。

标签: directx project gdi compiler-construction


【解决方案1】:

根据您的评论,您似乎在不真正了解其工作原理的情况下尝试编写编译器,结果将所有内容混合在一个大碗中。

您说的是使用 DirectX 来编写编译器 - 但是如果您将其编译为一些字节码,那么编译器不应该关心您最终是否会使用 DirectX、GDI ,OpenGL,或完全不同的东西。 解释器需要关心,但是如果你已经将图形操作抽象到了一组​​操作码后面,那么解释器使用什么并不重要——你可以为每个不同的平台编写一个解释器并运行相同的代码。

如果您使用multi-step process,编译通常会更容易。您可能需要考虑从头开始:

  • 制定语法并写下每个句法结构的语义;不仅是每个构造的功能,还包括它执行这些操作所需的内容(键入规则等)。您可能会发现查看现有语法会有所帮助,但这取决于您的语言的复杂程度。
  • 编写解析器 - 您可以手动完成,也可以使用 parser generator,具体取决于语法的复杂程度。
  • 编写代码来检查您的语义规则。
  • 创建一个指令集并定义一个 VM,并使用您的语义将您的构造转换为指令(或使用已经存在的东西)。您可以通过为每个事物分配指令来处理“外部”事物(例如图形),或者您可以定义特定地址作为每种操作的目标(因此,如果您尝试在地址 0xF000 处调用该函数,然后解释器必须执行代码将特定像素设置为某种颜色)。后一种方法为您提供了更大的灵活性(并且意味着您可以将操作码用于其他目的),但代价是 CALL 指令的实现更加复杂 - 由您决定什么适合您的需求。

当您拥有指令集后,您可以轻松地为它编写一个解释器,使用您想要处理图形的任何东西(DirectX、OpenGL、GDI、SDL...)——这几乎只是一个大的 switch 语句,操作码作为案例实现。那是您放置特定于您用于绘制的任何代码的地方。

如果您的问题是您想将这两者组合到一个程序中,以便它会读取源文件并立即执行它们,那么您可以这样做,但它仍然可以帮助您在代码中将它们分开.最简单的方法可能是首先将其编译为字节码,然后将其保存在内存中并让解释器在那里读取它。

注意:您应该意识到编写编译器并非易事。这也不完全,但是你可能需要学习很多东西。考虑阅读一本关于该主题的书——所谓的Dragon Book 被认为是目前最好的书之一,即使不是最好的,但也存在其他好书。一年前我了解到这些东西时,我们使用了 Robert Sebesta 的 Concepts of Programmming Languages 和 David Watt 和 Deryck Brown 的 Programming Language Processors in Java。您可能想查看您当地的图书馆,看看他们是否有这些。

如果您想获得更多灵感,查看 the report 可能会对您有所帮助,这是我们去年在大学创建自己的编程语言的一部分。忽略语言的语法——它不仅有点错误,而且也不是一个很好的例子来说明你应该如何做——但报告的其余部分可能会给你一些关于如何解决问题的想法。

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2012-10-15
    • 2010-10-08
    • 1970-01-01
    • 2013-03-07
    • 2017-03-14
    • 2021-06-24
    • 2017-08-29
    相关资源
    最近更新 更多