使用 go 和仓颉重构了整个 PHP

53 天前
 2024

折言(origami-lang)

折言(origami-lang) 是一门创新性的融合型脚本语言,深度结合 PHP 的快速开发基因与 Go 的高效并发模型。同时还有部分 go 、ts 习惯引入。

⚠️ 当前状态

当前未对代码分支进行任何优化,性能尚未优化。 请作为一个工具使用,请勿用于生产环境。

🚀 核心特征

🎯 Go 反射集成

语法融合

特殊语法

数组方法

面向对象

📝 示例

Go 反射集成

// 定义 Go 结构体
type Calculator struct {
    Name string
}

func (c *Calculator) Add(a, b int) int {
    return a + b
}

func (c *Calculator) GetName() string {
    return c.Name
}

// 注册到脚本域
vm.RegisterReflectClass("Calculator", &Calculator{})
<?php
// 在脚本中使用
$calc = new Calculator(Name: "MyCalc");
echo $calc->GetName();     // 输出: MyCalc
echo $calc->Add(5, 3);     // 输出: 8
?>

函数注册

// 注册 Go 函数
vm.RegisterFunction("add", func(a, b int) int { return a + b })
vm.RegisterFunction("isEven", func(n int) bool { return n%2 == 0 })
<?php
// 脚本中调用
$result = add(5, 3);     // 返回 8
$even = isEven(4);       // 返回 true
?>

基础语法

int $count = 0;
string $name = "World";
echo "Hello {$name}";

function greet(string $name): string {
    return "Hello " . $name;
}

参数后置语法

function div($obj) {
    return "<div>" + $obj->body + "</div>";
}

function span($obj) {
    return "<span>" + $obj->body + "</span>";
}

$html = div {
    "body": span {
        "body": "内容",
    }
}

泛型类

class Users {
    public $name = "";
}

class DB<T> {
    public $where = {};

    public function where($key, $value) {
        $this->where[$key] = $value;
        return $this;
    }

    public function get() {
        return [new T()];
    }
}

$list = DB<Users>()->where("name", "张三")->get();

异步协程

function fetchData($url: string): string {
    // 模拟网络请求
    sleep(1);
    return "Data from " . $url;
}

// 启动异步协程
spawn fetchData("https://api.example.com");

echo "Main thread continues...\n";

HTML 内嵌

$content = <div class="container">
    <h1>{$title}</h1>
    <p>This is embedded HTML</p>
</div>;

数组操作

$numbers = [1, 2, 3, 4, 5];
$doubled = $numbers->map(($n) => $n * 2);
$evens = $numbers->filter(($n) => $n % 2 == 0);

中文编程

函数 用户(名称) {
  输出 名称;
}
用户("张三");

🚀 快速开始

git clone https://github.com/php-any/origami.git
cd origami
go build -o origami .
./origami script.php

📚 文档

💬 讨论群

📄 许可证

MIT 许可证

4343 次点击
所在节点    分享创造
49 条回复
2024
52 天前
@redbule #20 因为我还有一个仓颉的版本
Dlad
52 天前
不是,你来真的啊
cs8425
52 天前
op 这东西让我想到 frankenphp 这个专案...
https://frankenphp.dev/cn/
2024
52 天前
@cs8425 #23 它是嵌入官方 php 解释器,然后 go 和 php 经过进程间通讯,性能可能比 php-fpm 快几倍,但是快不过 swoole 和 webmen 等没有代理层的框架。业务还是单进程模式,受 zend 接口限制
Georgedoe
52 天前
还能这样语法杂交啊? 看的头都晕了
panlatent
52 天前
@2024 #18

如果作为一个玩票性质的项目,大概率是技养想“发明”一个编程语言或写一个 Parser 。作为一个有一定完成度的项目,给你个赞。

如果作为一个真正可用的工具,我认为你没有解决任何问题。觉得 PHP 劣质的人绝不会不会发明另一种 PHP 。现实是任何企图从 PHP 改进分化的项目,大大小小都失败了,反而是 Roadrunner ,Frankenphp 这类强化 PHP 生态的项目才能跟 PHP 共同进步。

如果没有任何的痛点,就算市面上所有的语法糖被你全部实现,也没有实际用处,就只能是一个适合你自己的 DSL 。
2024
52 天前
@panlatent #26 现在解决的是 php 多线程、异步、GUi 友好,连接池、性能问题。生态问题呢,未来在依赖管理里引入 go 的库,我一键给你生成脚本域类不行吗?那你觉得怎么样的问题才算痛点呢,或者也能解决也不一定。集思广益。
panlatent
52 天前
@2024 #27 痛点这个倒是没法给你建议,因为每个人的痛点不尽相同。PHP 于我而言不需要异步和多线程,性能也不是问题,能快速开发才是第一要务。所以我比较侧重 DX 和 生态。另外你说的东西,每一样都有一个流行的解决方案,你提供的东西不足以打动我抛弃这些。最后你开发开发就会发现,你发明了另一种 PHP / HHVM / Go ,在那之前如何保持充沛的动力去开发也是挺现实的困难,所以我的建议是一定要围绕真正去解决问题去开发。 当然,这些积累也可能某一天成为一个成功项目的基石,但我不太看好,编程语言现在还是有点卷,何况 AI 来了。
redbule
52 天前
@2024 #21 牛的
stabc
52 天前
我认为 PHP 最大的优势是他的“无服务器”特性,也就是每个请求开始到结束,所有东西都是这个请求独占的,请求之间绝对隔离,这使 web 开发异常简单。没有任何其他语言有这个特性。如果抛开这个特性,那还不如忘记 PHP,专注写一门新语言。
2024
52 天前
@stabc #30 没有抛弃,一个实现下上下文管理类就能做到的事情
SethShi
52 天前
@panlatent #26 如果真心想要多线程, 异步, GUI 友好, 连接池, 性能问题, 我的建议是给官方提交代码
多线程, 连接池, 性能问题 官方有解决方案, swoole, roadrunner, workman 都可以
GUI 友好直接去用 electron / flutter / android, 不要尝试一个语言做所有事情, 尝试的人都失败了
stabc
52 天前
@2024 当然有实现方式,但我说的是过程。用 context 就和 node,go 语言这些没区别了。PHP 的优势就是可以省去这个心智负担,整个代码就相当于给用户跑一个脚本,比如错误处理,程序中断等都极其简单粗暴。
stabc
52 天前
PHP 目前我认为最大的瓶颈是 FPM 的数量。如果你能把他做成像 goroutine 那种能开成千上万的 FPM,绝对是行业爆炸级新闻
2024
52 天前
@stabc #33 你理解错了,我说的上下文是模拟虚拟机层的,用于存储已有的语法节点的对象,把它对齐后,代码缓存和状态就没有了
2024
52 天前
@seth19960929 #32 你说的哪些库是多进程方案,不是他们不想,是 php 底层实现很难做到。
2024
52 天前
@stabc #34 goroutine 会处理每个请求,请求开始地方设置一个宏处理,插入一个修改函数级别的上下文,并对 vm 克隆隔离就能实现请求内变量和新加载的文件不会影响到其他请求。
stabc
52 天前
@2024 那你怎么启动一个 web 服务器并且保存 web 请求上下文呢?
2024
52 天前
@stabc 点了 start 再说,下班了
stabc
52 天前
@2024 其实你不必回答,我只是像引出一个结论,问题又回到了我一开始说的点上,你的 web 服务器实现方式还是和其他语言没区别,抛弃了 PHP 最具有优势的地方,那就是“无服务器”,或者说脚本化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1149147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX