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

50 天前
 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 许可证

4334 次点击
所在节点    分享创造
49 条回复
twig
49 天前
链接不中啊
putaozhenhaochi
49 天前
$做变量开头 手打的不累吗
imdong
49 天前
U.14 ,PHP 成前端语言了😅
imdong
49 天前
2024
49 天前
2024
49 天前
@putaozhenhaochi #2 支持没有美元符号,可以看中文编程部分,甚至支持注册关键字,你把它当成 java 用都行
2024
49 天前
@imdong #3 编译成 WebAssembly ,完全可以当 js 用也不是不行,支持这么多 UI 友好语法,主要是考虑老 php 不能写桌面 UI ,但是 go 版本完全可以写
sssxyd
49 天前
点个星,很棒的项目,不管有没有用
ferock
49 天前
go 对 php 翻译?
2024
49 天前
@ferock #9 不是,而是用 go 写一门新的语言,只是以 php 作为蓝本,如果不写$符号,当成 js 、java 写也不是不可以。比如字符串、数组操作直接用 js 命名实现,注解用 java 方式实现
strobber16
49 天前
我还以为你用 go 写了一遍 php 解释器呢
2024
49 天前
@strobber16 #11 也可以这里理解啊,只是没有全部兼容 php 语法,更像是 py 新版本不兼容老版本的更新
qxmqh
49 天前
看得头晕。
panlatent
49 天前
解决了什么问题?
qW7bo2FbzbC0
49 天前
“后来这教授的一个学生去了 Facebook ,帮他们做 HipHop ,一个从 PHP 到 C++ 的“编译器”。其实这种“源到源”编译器做起来不算难,但给 PHP 这样劣质的语言做编译器,实在是狗血的工作,繁琐而头痛。没有任何理论价值不说,在工业界有什么价值也难说。我的一个前同事曾经对 Facebook 的这个项目发表了一个尖锐而幽默的评价:“Facebook 现在不但给母猪涂上了口红,而且真的开始 f.. 它了!”

https://www.yinwang.org/blog-cn/2019/12/24/compilers
qW7bo2FbzbC0
49 天前
创意很好,应该是个 php 爱好者,技术力也不错,点赞
dusu
49 天前
项目是不错,优化了 php 语法诟病
虽然可以用 go 生态,但基本只能自己撸
没法延用 php 生态
而且没有 jit 之类的性能话基本上也没太大保障
OP 使用场景有点堪忧啊 🤔️
2024
49 天前
@panlatent #14 解决楼下提出的问题,php 很劣质,所以升级它。
2024
49 天前
@dusu #17 性能已经比 php8.3 好了,自己运行下 performance_test.cjp 看结果。go 生态直接用, 对多封装一个函数或类
redbule
49 天前
和仓颉有啥关系?

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

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

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

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

© 2021 V2EX