用PHP编写编译器

时间:2012-10-03 06:09:35

标签: php compiler-construction

几年前,我开始研究一些关于编程语言的想法,因为我对它们感到非常兴奋,我只想看看它们是如何工作的,所以我决定为此编写一个非常简单的编译器。由于我在PHP中更舒适,更有经验,我只是看看是否有可能用PHP编写编译器,很快就发现是的,这是可能的。所以我开始制作它,幸运的是一切都很好,现在它工作正常。

那些日子我只想要一个地方开始研究我的想法,并且由于PHP开发速度很快(不需要编译),我手上还有MySQL,调试非常简单等等。

现在我想扩展这个简单的编译器,这就是我需要你的建议。我的主要问题是“PHP是编译器项目的正确工具吗?”。假设我不会公开发布它,所以只要考虑PHP处理任务的能力,而不是像分发那样的其他问题。

我相信它有一些优点。它开发速度很快,我只是编辑代码并按下浏览器上的F5,然后我就得到了我的二进制输出。我还在那里制作了一个文本框,我可以在那里编写简单的代码,按下提交,然后我再次获得二进制输出。在MySQL中保存和处理解析数据也很快。但是现在我更担心脚本超时。如果要编译10,000行源代码,我猜它会超时。我知道我可以增加超时,但仍然担心。另外我知道PHP作为一种脚本语言(正如我所听到的)慢了10倍而不是编译应用程序。

那么,你认为我必须关掉C吗? (我也对此也没关系)...或者你有什么想法,如果我可以继续我的PHP后端,但处理更严重的事情,而不是面临严重的错误?

更新

是的!该项目是个人和乐趣。你也可以考虑一下!

关于基于PHP的编译器的应用程序,是的,它不是一个真实的编译器,但想象一下,如果你想与他人分享你的想法,如果你给他们一个Web表单来编写他们的代码,那将是很好的,按下按钮并下载二进制代码。然而,这不是我的目标,我只是想知道这一点。

关于Lex / Yacc,我的想法更多是关于优化最终二进制代码,所以我需要的不仅仅是通过Lex / Yacc生成二进制代码。

4 个答案:

答案 0 :(得分:7)

PHP不是编写编译器的理想环境。它可行吗?当然。你应该这样做吗?我强烈反对用PHP这样的高级语言编写编译器。我也反对不必要地重新发明轮子。

如果它很有趣,我会说它,但我目前没有看到PHP驱动编译器的任何实际用途。

答案 1 :(得分:2)

可以用任何语言编写编译器(甚至可以使用一些非图灵完备语言)。但是为了让生活更轻松,你需要PHP中缺少的某些语言功能,并且因为它是一种非常低级的语言,所以不太可能在语言中添加这些功能。

实现编译器的一种不错的语言必须包含:

  • 某种形式的algebraic data types,即使对于完全动态的语言(如Lisp)也是如此
  • Pattern matching,越强大,越有表现力 - 越好。在没有模式匹配的情况下编写AST变换是一种痛苦。

这是最低限度的。对图表有一些不错的原生支持是一个优势。对解析具有嵌入式支持非常有用(但解析通常并不重要)。在运行时访问Prolog或Datalog非常有用(但在PHP中实现自己的Prolog应该很容易)。

答案 2 :(得分:1)

Webjawns说:但我目前没有看到PHP驱动编译器的任何实际用途。  所以???? Smarty - 是一个compiller !!!

如果你的编译器只是为了娱乐或特定的,与PHP相关的使用 - 最好将php作为环境。

但是如果你的编译器有性能要求或内存限制 - 使用PHP是非常糟糕的。

答案 3 :(得分:0)

有一个计算机程序员堵嘴听起来像是:

  

Rookie:为什么C被认为是"运行得更快" /"使用更少的内存" /"在此处插入其他优化比较"比Java?    Mentor:因为Java编译器是用C语言编写的,而C编译器是用C语言编写的(带有用于优化的汇编痕迹)。

几乎所有编译器都是用C语言编写的。对于几乎全部用C语言编写的操作系统也是如此。几乎所有高级语言使用的主要预打包库都是用C编写的。几乎所有高负载服务器(包括Apache和MySQL)用C语言编写。基本上几乎所有关键任务软件都是用C语言编写的。

考虑到这一点,我们说:

我写了一个Tokenizer - >解析器 - > PHP中的代码转换器链很有趣 - 甚至可能是一个带有数据库存储的东西;但我会输出文本(另一种语言的源代码)。

我不会用PHP编写编译器,因为我不想从PHP输出二进制文件 - 不是因为它不能因为我不喜欢使用字符串二元算术。

编译器我用C编写。