【问题标题】:PHP formal semantics?PHP形式语义?
【发布时间】:2013-12-15 14:39:18
【问题描述】:

我的任务是学习PHP,但是有很多东西我不明白。例如,the concept of "variable functions" 不是我在其他任何地方见过的。还有很多其他的例子,但为了简洁起见,我找到了PHPWTF,其中有很多 PHP 特性的例子。

我使用过的大多数其他语言要么有正式规范(例如,Haskell 2010),要么至少有一篇关于其形式语义的研究论文(例如,this for Javascript)。但是,我找不到任何可与 PHP 相媲美的东西。

有一个official "language reference"。但是,它非常非正式,读起来像 wiki,并且缺少整个部分(例如,the section on syntax 根本没有定义语法)。确认我的怀疑,this guy 告诉我没有官方规范,甚至没有定义的语法。

维基百科有一篇关于"PHP syntax and semantics"的文章,但只涉及语法,几乎没有提到语义。

我在 PHP 上找到的一篇论文是 this paper on its assignment semantics。这是该语言的一个非常小的片段,如果没有一些上下文,可能对我没有多大用处。还有this paper on 'SaferPHP',想必它必须与PHP的一些定义一起工作,虽然我看不到任何东西。

解释器/编译器提供语义,所以我想看看这些。然而,the Zend source 令人生畏(尽管它确实提供了useful test cases)和HipHop runs to 2.7 million LoC。 (我发现人们投入了巨大的精力为一种语言编写编译器而从未编写过规范之类的东西,这让我感到惊讶。)

我想看看 PHP 的类型系统以获得指导,就像 TypeScript 为 JavaScript 提供一些指导一样。我找到了these tantalising slides on Hack,这是一个 PHP 的可选类型系统。然而,这只是幻灯片,目前该项目似乎是 Facebook 的内部项目。

有谁知道比这些穷人的语义更好的东西吗?还是每个人都只是“以身作则”?

【问题讨论】:

  • PHP的语义是由官方实现的行为AFAIK定义的。
  • “形式语义”?别逗我笑。正如蒂姆所说,它由它所做的定义。它所做的事情是“有机地”增长的(“哦,让我们添加这个很酷的功能”的委婉说法,据我所知,这主要是出于对其他语言的嫉妒)。
  • @IraBaxter:是的,看起来是这样。虽然我认为 Javascript 也是如此,并且它已经可以进行一些形式化。也许 PHP 也可以。

标签: php formal-semantics


【解决方案1】:

您似乎不是在追求官方标准(例如,这可能对编写独立的符合标准的实现的人有用),而是为了让您能够对它做出连贯的理解。不幸的是,不可能有这样的事情,因为 PHP 背后没有一个连贯的形式模型。 它已经有机地发展,现在背负着不一致的问题,最臭名昭著的是在函数和方法命名方面,但在一些细节上也是如此比如truefalse,以及其他类似的令人担忧的细节。

在我看来,使用 PHP 的最佳方法是对核心功能和库、需要注意的“陷阱”以及(为了阅读现有代码)有一个良好的感觉没有分心)对于在现实世界的 PHP 脚本中太常见的反模式。我的猜测是最好在知道如何有效使用 PHP 的人的指导下学习 PHP,但我没有那种奢侈。 (关于文档:我花了很长时间才注意到您可以使用方括号来索引字符串。该功能可能在文档中的某处提到,但至少在当时,它所属的任何地方都没有提到。)

This article 很好地介绍了使您想要的那种语义模型变得不可能的事物。 (你可能想跳过开头的咆哮,直接去discussion of PHP features.)还有很多很多其他类似的文本。引用:“PHP 最初是为非程序员明确设计的(而且,字里行间,非程序);它并没有很好地摆脱它的根源。”

不要误会我的意思:我使用 PHP,虽然它不是我最喜欢的语言,但我不会说我讨厌它。我说要有效地使用它,必须了解它的性质和局限性。如果你是从 Haskell 来的,那你会大吃一惊的。

【讨论】:

  • 它肯定似乎有坏/复杂的部分。我希望有类似“Featherweight PHP”(如"Featherweight Java",或“PHP 的本质”(如"The Essence of Javascript")之类的东西。为了严格解释基本语义而剥离复杂功能的东西。Javascript 在与 PHP 类似的方法,但事实证明可以将其简化为一种用于严格分析的最小语言。
  • 我正要问和 OP 一样的问题。 (我有一些 PHP 的背景,想加深对这门语言的理解)。我认为你的回答没有抓住重点。是的,可能没有任何“正式的”语义,但仍然有某些关键事物的行为方式 - 像参数传递、迭代器、范围等。尽管相当一部分 PHP 程序员没有这些知识,我仍然相当肯定它以某种方式记录在某处。
  • @Dexter 我并不是说没有文档,而是要记录的行为在某种意义上是不一致的,因为它们属于您可以“获得”的统一模型。每个方面都是不同的。范围以一种方式工作,命名空间是另一种方式。有很多概述,但任何文档都将是某种大列表,而不是统一的模型。我可能错了,但我不相信我错过了重点。
【解决方案2】:

这个答案是在您最初的问题之后出现的,但现在我们终于有了 PHP 的正式语义。看看:http://www.phpsemantics.org。最近在 ECOOP 2014 论文集上发表了一篇关于它的论文,如果您有兴趣,可以在我链接的网页中找到链接。问候。

【讨论】:

    【解决方案3】:

    不直接解决您的问题,但解释了 PHP 变量背后的一些魔力。

    http://webandphp.com/how-php-manages-variables

    【讨论】:

    • 目前,我已经接受了这个作为答案,因为它实际上提供了有用的信息,而其他答案只是忽略了这个问题(有问题的理由)。
    【解决方案4】:

    有趣的问题。我将手册视为官方语言参考;我很感激它不是您所寻求的意义上的“正式参考”,但我不知道有多少这样的东西会被广泛作为学习的东西。

    我不熟悉 PHPWTF,但我猜它与博客文章 Fractal Of Bad Design(由 @alexis 早先链接)处于同一模式。我无法窥探任何一位作者的想法,但在我看来,它们是从希望 PHP 不好的角度编写的。宗教战争经常在互联网和编程中占据主导地位——你喜欢的浏览器、你使用的 IDE/编辑器、你的操作系统和你选择的框架都受到同样凶猛、党派和不屈不挠的对待。遗憾的是,编程语言没有什么不同。

    确实,PHP 确实存在许多设计上的不一致之处,尤其是在处理空值的方式以及标准函数中参数的顺序方面。然而,尽管如此,PHP 也确实取得了巨大的成功。它在 5.0 和 5.1 的可靠性低迷中度过了很长一段时间,5.2 稳定但可以说不是企业级的,它终于在 5.3 以后成熟了。

    虽然这可能是我出现的偏见,但我感觉到我在 Stack Overflow 上读到的用户一致认为,所有流行语言都有自己的位置。这部分是对我们不喜欢的东西不会消失这一现实的回应,部分可能是学习 .net、Java、Perl、Ruby、PHP、Python 等总是是件好事事物。也许我们也集体厌倦了双方的激烈争吵(Java 臃肿,PHP 不一致,微软被供应商锁定,Rails 不稳定等等)。

    我已经偏离了主题,但我倾向于认为这个特定的观点值得一读,尤其是对于那些传统上不同意它与 PHP 相关的人。 p>

    为了解决您问题的目的,您应该如何学习?嗯,通过示例学习是一种极好的方法 - 只需知道要学习哪些示例。搜索“PHP 教程”和“PHP 初学者”——也许就像任何语言的情况一样——提供了优秀和可怕的材料的混合。有人可能会争辩说,PHP 的低准入门槛导致了大量不安全且写得不好的“操作方法”文章,我当然见过不少!

    我认为解决方案是直接查看精心设计的项目中的代码,并从中学习。如:

    • Symfony2(和组件)
    • Zend 框架
    • 狂饮
    • 推进
    • 教义

    啊,差点忘了; this website 也是一个不错的起点。


    Post Script:它们在其他语言中可能有不同的名称,但我希望它们都有可变功能。例如,在 JavaScript 中,它是 object[myFunc]();,其中 myFunc 是一个字符串。

    【讨论】:

    • +1 链接到 phptherightway,它看起来是一个不错的资源!也就是说,OP 并不是要求好的文档,而是 PHP 的“形式语义”。 Phptherightway 突出了 PHP 的最佳功能(不是最差的,正如我提供的链接),但我没有看到任何符合该语言正式模型的条件。
    • 感谢您的想法。我同意正式定义是问题的一部分,但“每个人都只是“通过示例学习”吗?无论对错,我都将其解释为“什么是学习的好方法”。 FWIW,我认为正式/BNF 规范很难学习,但它可能因人而异。
    • 我无法想象从 BNF 规范中学习,但是文本描述说“这是一个表达式,这是一个语句,这是一个左值,这是一个引用,这是什么当你把它们结合起来时你会得到“?例如,python 文档在这方面做得很好。但是什么合理的形式模型可以捕捉到在PHP中,func_get_args()不能用作函数参数的事实?
    • 我不知道这个限制,但是手册说这个限制从 5.3 开始不再存在。
    • 很高兴听到这个消息!我的观点将不再适用于任何修复大部分此类怪癖的 PHP 版本(并且存在或曾经有太多)。
    【解决方案5】:

    这并不完全是一个正式的语义,但是,经过这么多年,HHVM 项目已经产生了a PHP specification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2011-01-04
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多