为什么php编译器(HPHP)的动态结构很难?

时间:2011-06-29 18:02:29

标签: php compiler-construction compilation

我正在阅读Paul Bigger的http://blog.paulbiggar.com/archive/a-rant-about-php-compilers-in-general-and-hiphop-in-particular/,他提到HPHP并不完全支持动态构造。然后他说:“不过,一个天真的方法就是坚持使用switch语句,编译所有有意义的东西。”他是说可以使用switch语句来包含正确的文件而不是动态包含吗?如果是这样,为什么这会起作用,为什么编译器“更容易”编译?一如既往,感谢您的时间!

2 个答案:

答案 0 :(得分:2)

从我的理解,如果你有这个

 include "$foo.php";

编译器不知道你要包含什么。另一方面,有了这个

  switch($foo) {
     case 'bar'  : include "bar.php";
     case 'quux' : include "quux.php";
  }

他们可以简单地编译“bar”和“quux”并将它们包装在if语句中,该语句检查$foo并执行适当的任何操作。

答案 1 :(得分:2)

编译器希望能够识别正在编译的程序可能使用的所有源文件和二进制文件。

include($random_file); 

如果$ random_file中指定的文件声明了常量,类,变量,编译器将无法知道因为$ random_file的值在编译时是未知的。使用这些常量,类和变量的代码将以难以调试的方式失败。 switch语句将使可能的文件列表已知,因此编译器可以发现任何相关的声明。

设计用于编译的语言具有动态链接器和外部函数接口,这些接口结合起来提供类似的功能,包括($ random_file),而无需显式切换。