编译器构造与DirectX

编译器构造与DirectX,directx,project,gdi,compiler-construction,Directx,Project,Gdi,Compiler Construction,我是一个设计和编码项目的初学者,我已经有了所有的想法,但我有一个问题阻碍了我继续这个项目 我觉得代码很难看,不可读,我不能继续这样做。这个项目是我脑海中的一种编程语言,它有很小的图形功能 即使是初学者,我也希望使用DirectX编写代码,因为每个人都想要它。我想完全编码它,而不是依赖于任何像SDL这样的包装库 我对DirectX模块进行了重构,它暴露了所有漏洞。到处都有Direct3D代码,但代码本身做的很少!我不知道这是我的设计错误还是DirectX的错误 我会使用DirectX开始构建这样的

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

我觉得代码很难看,不可读,我不能继续这样做。这个项目是我脑海中的一种编程语言,它有很小的图形功能

即使是初学者,我也希望使用DirectX编写代码,因为每个人都想要它。我想完全编码它,而不是依赖于任何像SDL这样的包装库

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


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

根据您的评论,听起来您试图编写一个编译器,但实际上并不知道它是如何工作的,最终将所有内容混合在一个大碗中

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

如果使用。你可能想从零开始:

  • 做一个语法,写下每个句法结构的语义;不仅仅是每个构造做什么,还包括它做这些事情所需要的东西(键入规则等)。您可能会发现查看现有语法很有帮助,但这取决于您语言的复杂性
  • 编写一个解析器——根据语法的复杂性,您可以手工或使用语法分析器
  • 编写代码检查语义规则
  • 创建一个指令集并定义一个VM,并使用您的语义将您的构造转换为指令(或使用已经存在的东西)。您可以通过为每件事情分配指令来处理“外部”事情(如图形),或者您可以定义作为每种类型操作目标的特定地址(因此,如果您尝试在地址0xF000处调用函数,那么解释器必须执行代码以将特定像素设置为某种颜色)。后一种方法为您提供了更大的灵活性(意味着您可以将操作码用于其他用途),但代价是CALL指令的实现更为复杂——由您决定什么适合您的需要
当你有了指令集,你可以很容易地为它编写一个解释器,使用任何你想处理图形的东西(DirectX,OpenGL,GDI,SDL…)-它几乎只是一个大的开关语句,操作码作为例子来实现。这就是你放置代码的地方,特定于你用来画的东西

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

注意:您应该知道,编写编译器不是一项简单的任务。这也不是很难,但可能有很多事情你需要学习。考虑阅读一本关于这个主题的书——所谓的被认为是最好的一个,如果不是最好的,但其他好书存在。一年前,当我了解到这一点时,罗伯特·塞贝斯塔、大卫·瓦特和德里克·布朗使用了这一技术。您可能想检查您当地的图书馆,看看他们是否有这些


如果你想要更多的灵感,看看我们去年在大学里写的,作为创建我们自己的编程语言的一部分。忽略该语言的语法-不仅有点问题,而且它也不是一个很好的例子,说明你应该如何做-但是报告的其余部分可能会给你一些关于如何解决问题的想法。

你到底在想什么是“小图形功能”?您认为您的编程语言将具有什么样的实用程序?在什么情况下它会有用?它只是一个可以利用的帧缓冲区。编译器将以字节码编译所有图形操作。这有点慢,但我认为C虚拟机变小了,用高级语言编写它是值得的。之后编写复杂的代码非常灵活。它是一种具有基本感觉的语言,但具有过程和对象的简单原型。之后,当项目稳定后,我将为它构建一个简单的GUI,就像PDA一样。最后,像8位和16位之前的控制台这样的平台游戏。这个想法是在最后建造一台微型虚拟计算机。