cel-expr/cel-spec
GitHub: cel-expr/cel-spec
CEL 是一种小型、快速且可嵌入的表达式语言规范,旨在为不同应用和平台之间提供统一、可互操作的表达式求值语义与二进制表示。
Stars: 3899 | Forks: 302
# 通用 Expression Language
Common Expression Language (CEL) 实现了表达式求值的通用语义,使不同的应用程序能够更轻松地实现互操作。
关键应用
* 安全策略:组织拥有复杂的基础设施,需要通用的工具来对整个系统进行推理。
* 协议:表达式是一种有用的数据类型,需要在不同的编程语言和平台之间实现互操作性。
指导原则:
1. 保持小巧与快速。
* CEL 以线性时间求值,无状态变更,且非图灵完备。这种限制是该语言设计的一个特性,使得其实现求值的速度比同等沙箱化的 JavaScript 快上几个数量级。
2. 保持可扩展性。
* CEL 专为嵌入应用程序而设计,允许通过其上下文进行扩展,从而支持由嵌入它的软件提供函数和数据。
3. 对开发者友好。
* 该语言对开发者来说易于上手。初始规范是基于开发 Firebase Rules 的经验以及对许多先前迭代的可用性测试而制定的。
* 库本身及其配套工具应当易于那些希望将 CEL 集成到其平台中的团队采用。
支持 CEL 的系统所需组件包括:
* 开发者编写的表达式的文本表示形式。其语法类似于 C/C++/Java/JavaScript 中的表达式
* 程序的抽象语法树 (AST) 表示。
* 一个将文本表示转换为二进制表示的编译器库。这可以提前完成(在控制平面中),也可以在求值之前(在数据平面中)完成。
* 包含一个或多个类型化变量的上下文,通常是 protobuf 消息。大多数用例将使用 `attribute_context.proto`
* 一个求值器库,它在上下文中获取二进制格式并产生结果,通常是一个 Boolean。
对于需要持久化或跨进程通信的用例,强烈建议将经过类型检查的表达式序列化为 protocol buffer。CEL 团队将维护 AST 的标准 protocol buffer,并将永远保持这些版本相同且在网络传输上兼容:
* [CEL 标准](https://github.com/cel-expr/cel-spec/tree/master/proto/cel/expr)
* [CEL v1alpha1](https://github.com/googleapis/googleapis/tree/master/google/api/expr/v1alpha1)
布尔条件和对象构造的示例:
```
// Condition
account.balance >= transaction.withdrawal
|| (account.overdraftProtection
&& account.overdraftLimit >= transaction.withdrawal - account.balance)
// Object construction
common.GeoPoint{ latitude: 10.0, longitude: -5.5 }
```
了解更多详情,请参见:
* [简介](doc/intro.md)
* [语言定义](doc/langdef.md)
基于 [Apache License](LICENSE) 发布。
标签:自动化payload嵌入