如何向 PHP 添加新的操作码?
Posted
技术标签:
【中文标题】如何向 PHP 添加新的操作码?【英文标题】:How do I add a new opcode to PHP? 【发布时间】:2021-10-29 05:58:48 【问题描述】:搜索它我发现了这篇博文:https://www.npopov.com/2017/04/14/php-7-Virtual-machine.html
它是否涵盖了添加新操作码所需的“一切”,或者我需要在引擎中触及的所有地方?还是在代码库中开始 grepping 更好?也许有一个可以用作原型或示例的提交?
编辑,最后添加的操作码是这样的:https://github.com/php/php-src/pull/7019/files#diff-773bdb31563a0f907c75068675f6056b25f003e61f46928a31d9837ae107460d
【问题讨论】:
【参考方案1】:PHP 源代码写在c programming language。这就是您在“添加的最后一个操作码”的链接中看到的内容。那不是操作码,它是源代码。 PHP 解释器(Zend 虚拟机)的输出读取 php 文件的内容并将其转换为操作码。操作码不是程序员直接编写的。
如果你想为 PHP 编写一个自定义扩展,你需要用 c 编写它并对其进行结构化,以便它可以作为外部 mod 加载。说“这不是微不足道的”是轻描淡写的。
有一个混合系统允许您编写类似 PHP 的代码,这些代码可以编译成独立的 PHP 扩展。查看Zephir language。堆栈溢出有很多带有“zephir”标签的问题。我读过但没用过。
【讨论】:
我认为 fork php-src 比编写新扩展更容易。这只是为了学习目的。或者像学习贡献的第一步一样。 如果你想贡献,你会写 c。您链接的博客页面可能不如他之前关于 PHP 7 中的内部值表示的两篇文章有价值。 编写扩展实际上没有您想象的那么艰巨。查看 Phalcon PHP 框架。它基于自定义扩展可以快速而有趣的想法。当您四处挖掘时,您会注意到它们落后于我在答案中提到的 Aephir 语言。 好的,但是你真的可以通过扩展添加关键字和新类型的操作码吗...? php 解释器读取包含 php 代码的文本文件,对其进行分析并转换为操作码。 VM 使用操作码映射到通过编译 c 源文件生成的机器代码。在 c 源代码编译过程中,VM 计算出将 php 代码与该函数的 c 版本相关联的操作码。以上是关于如何向 PHP 添加新的操作码?的主要内容,如果未能解决你的问题,请参考以下文章
php [使用操作和过滤器自定义结帐字段]向WooCommerce添加新的送货字段