最近,我已经通过创建我自己的简单CPU架构来消耗,在某种程度上可以很容易地在硬件上实现(没有FPGA,但是实际的逻辑门电路)。当然,为了满足这一要求,我使用了一个简单的4位CPU,一个4kB程序空间和256字节RAM。
它支持所有的基本操作,如加、减、加载、存储等。在我开始将这些操作提交给硬件之前,我想要开发一个功能中等的软件栈,它可以为体系结构编译类似于A/C的语言,这样cpu就可以使用高级语言编程。目前,我已经用VB.NET编写了一个工作的汇编程序,但现在我仍然停留在如何接近工作编译器的最终目标上。
具体而言,我有以下问题:
下一步应该是什么,我应该如何编写编译器呢?
尽管4位CPU很简单,但它并不是很有用,因为它不能同时处理大型计算,因此,我的最终目标是通过开发对用户来说就像编程16位(或更大) CPU的软件栈来抽象这种能力。目前,我手动编写的程序集可以跨越多个寄存器,并在它们之间执行计算,但是软件堆栈的哪一部分最终处理的是大于物理寄存器大小的数字和计算?
软件栈的哪一部分处理子程序调用等?
如果我需要澄清什么,请告诉我。
发布于 2014-12-27 14:29:41
LLVM后端是实现这一目标的主要合理方法。如果您将LLVM降低到程序集或微码,您可以从那里滚动,只需使用众多的LLVM前端就可以将更高的语言(如C++ )转换为LLVM。
换句话说,LLVM的明确设计就是为了支持这个场景。
整个堆栈如下所示:
第一部分是在每种语言的基础上提供给你的.因此,对于C和C++,您可以使用Clang,对于D可以使用最小二乘法等。第二部分由LLVM提供-它们提供了大量独立于目标的优化例程和一些目标感知的例程。最后,您提供了从LLVM到特定于体系结构的代码的翻译服务。
请注意,LLVM IR提供了一些保证,因为它们是针对实际平台的。例如,它们假定IEEE754浮点支持、8位字节以及各种类型的指针支持。如果您希望编译像C这样的语言来针对您的总体架构,那么无论如何,您都需要支持所有这些。如果您愿意将源语言限制得稍微超出正常范围,那么您可以不用实现所有这些特性--例如,如果C代码不使用浮点数,原则上没有理由使用LLVM IR代码来发出float。
LLVM是一个共同的中间点,您可以编译任何语言到目标,然后,从那里,可以降低任何CPU。基本上,您所需要做的就是支持原语,然后提供一个LLVM后端,以便从LLVM IR转换到您的程序集。LLVM和语言前端将完成所有剩下的工作。
https://softwareengineering.stackexchange.com/questions/267442
复制相似问题