前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识CEL(一)

初识CEL(一)

作者头像
rxg456
发布于 2022-06-16 15:12:33
发布于 2022-06-16 15:12:33
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

一、cel简介

1.1 什么是CEL

CEL是一种非图灵的完整表达式语言,被设计为快速、可移植和安全执行。CEL可以单独使用,也可以嵌入到一个更大的产品中。

CEL被设计成一种可以安全执行用户代码的语言。虽然在用户的python代码上盲目地调用eval()是危险的,但你可以安全地执行用户的CEL代码。因为 CEL 防止了会使其性能降低的行为,它可以在纳秒到微秒的时间内安全地进行评估;它是性能关键型应用的理想选择。

CEL评估表达式,这类似于单行函数或lambda表达式。虽然CEL通常用于布尔决策,但它也可用于构建更复杂的对象,如JSON或protobuf消息。

1.2 CEL理想应用领域

由于CEL是在纳秒到微秒的时间内对AST中的表达式进行评估,所以CEL的理想使用场合是具有性能关键点的应用。将CEL代码编译到AST中不应该在关键路径中进行;理想的应用是配置经常被执行修改相对不频繁的应用。

例如,在对服务的每个HTTP请求中执行安全策略是CEL的一个理想用例,因为安全策略很少改变,CEL对响应时间的影响可以忽略不计。在这种情况下,CEL返回一个布尔值,即请求是否应该被允许,但它可以返回一个更复杂的消息。

1.3 使用CEL的相关资料

下面会进行涵盖常见用例的编码练习。要想更深入地了解语言、语义和功能,请参见GitHub上的CEL语言定义CEL Go文档.。

二、CEL的核心概念

2.1 应用领域

CEL是通用的,并已被用于不同的应用,从路由RPC到定义安全策略。CEL是可扩展的,与应用无关,并为一次编译、多次评估的工作流程而优化。

许多服务和应用程序评估声明式配置。例如,基于角色的访问控制(RBAC)是一个声明式的配置,它产生一个给定角色和一组用户的访问决定。如果声明式配置是80%的用例,那么当用户需要更多的表达能力时,CEL是一个有用的工具,可以完善剩下的20%。

2.2 编译

一个表达式被针对环境进行编译。编译步骤产生一个protobuf形式的抽象语法树(AST)。编译后的表达式通常会被存储起来供将来使用,以保持尽可能快的评估速度。一个已编译的表达式可以用许多不同的输入进行评估。

2.3 表达式

用户定义表达式;服务和应用程序定义它的运行环境。一个函数签名声明了输入,并写在CEL表达式的外面。CEL可用的函数库是自动导入的。

在下面的例子中,表达式接受了一个请求对象,并且请求包括一个索赔标记。该表达式返回一个布尔值,表明该索赔令牌是否仍然有效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过检查"exp"要求,检查JSON网络令牌是否已经过期。
//
// Args:
//   claims - 认证要求.
//   now    - 表示当前系统时间的时间戳.
// 返回true表示令牌已经过期.
//
timestamp(claims["exp"]) < now

2.4 运行环境

环境是由服务定义。嵌入 CEL 的服务和应用程序声明表达式环境。环境是可以在表达式中使用的变量和函数的集合。

基于原语的声明被 CEL 类型检查器使用,以确保表达式中的所有标识符和函数引用被正确声明和使用。

2.5 解析表达式

处理一个表达式有三个阶段:解析检查评估。CEL最常见的模式是控制平面在配置时对表达式进行解析和检查,并存储AST。

在运行时,数据平面反复检索和评估AST。CEL对运行时的效率进行了优化,但解析和检查不应该在延迟关键的代码路径中进行

使用 ANTLR词典/解析器(Lexer/Parser)语法将CEL从人类可读的表达式解析为抽象的语法树。解析阶段发出一个基于proto的抽象语法树,其中AST中的每个Expr节点都包含一个整数ID,用于解析和检查期间产生的元数据。在解析过程中产生的 syntax.proto 忠实地代表了表达式的字符串形式中输入内容的抽象表示。

一旦表达式被解析,就可以根据环境对其进行检查,以确保表达式中的所有变量和函数标识符都被声明并且正确使用。类型检查器产生一个 checked.proto ,其中包括类型、变量和函数解析元数据,可以极大地提高评估效率。

最佳实践:执行类型检查以提高解析表达式的速度和安全性,即使是像JSON这样类型推理有限的动态数据。

CEL评估器需要3样东西:

  • 任何自定义扩展的函数绑定
  • 变量绑定
  • 要评估的AST

函数和变量绑定应该匹配用于编译AST时的内容一样。这些输入中的任何一个都可以在多次评估中重复使用,比如一个AST在多个变量绑定集上评估,或者相同的变量被用于多个AST,或者在一个进程的生命周期中使用函数绑定(这是一种常见的情况)。

三、官方示例

项目地址:https://github.com/google/cel-go.git

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 拉取项目
git clone https://github.com/google/cel-go.git
​
cd cel-go
// 下载依赖包
go mod tidy
// 运行
go run codelab/codelab.go
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 打印内容
=== Exercise 1: Hello World ====== Exercise 2: Variables ====== Exercise 3: Logical AND/OR ====== Exercise 4: Customization ====== Exercise 5: Building JSON ====== Exercise 6: Building Protos ====== Exercise 7: Macros ====== Exercise 8: Tuning ===

3.1 codelab/codelab.go包介绍

  • compile function: 根据环境解析、检查和输入表达式
  • eval function:根据输入计算已编译程序的值
  • report function: 打印出评估结果
  • 此外,还提供了和request和auth ,以协助各种练习的输入构建。
  • 还有一些辅助包如下所示:

PACKAGE

地址

描述

cel

cel-go/cel/cel.go

顶层接口

decls

cel-go/checker/decls/decls.go

变量和函数声明实用工具

functions

cel-go/interpreter/functions/functions.go

运行时捆绑

ref

cel-go/common/types/ref/reference.go

参考文献接口

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
脚本分享—gbk文件中提取蛋白质序列以及注释信息
本脚本用于从 GenBank(GBK)格式文件中提取蛋白质序列,并将结果输出为 FASTA 格式文件。主要功能包括:
用户1075469
2025/05/09
750
脚本分享—gbk文件中提取蛋白质序列以及注释信息
脚本分享—根据序列ID从fasta文件提取特定的序列
hello,hello!小伙伴们大家好,我是小编豆豆,今天小编继续来给小伙伴们分享免费好用的脚本。之前有公司将小编以前开发拿来贩卖,为了杜绝万恶的资本家
用户1075469
2025/05/21
500
脚本分享—根据序列ID从fasta文件提取特定的序列
脚本分享—从fasta格式文件中批量提取特定位置的序列
这个脚本主要用于从FASTA格式文件中批量提取指定位置的序列,可以应用在很多不同场景,比如:
用户1075469
2025/04/30
1030
脚本分享—从fasta格式文件中批量提取特定位置的序列
生物信息中的Python 05 | 从 Genbank 文件中提取 CDS 等其他特征序列
在基因结构分析或其他生物功能分析中会时常用到 CDS 序列,以及其他诸如 mRNA 序列,misc RNA序列等具有生物意义的序列片段。而NCBI 的基因库中已经包含有这些的信息,但是只有一部分是整理可下载的。而剩下的一部分可以通过 genbank给出的位点信息来提取,个人能力有限,这里只做抛转之用。下面以提取 CDS 为例,记录提取序列过程,其他特征序列类似。
白墨石
2021/01/13
5.1K0
生物信息中的Python 05 | 从 Genbank 文件中提取 CDS 等其他特征序列
mVISTA:在线程序展示叶绿体基因组相似性小实例
叶绿体基因组类的文章通常会有一幅图来展示叶绿体基因组的相似性(Sequence identity plot),出图的工具是mVISTA:mVISTA分为本地版和在线版两种。本文简要介绍使用在线版mVISTA获得Sequence identity plot的步骤。
用户7010445
2020/03/03
8.1K1
生物信息中的Python 02 | 用biopython解析序列
上一篇文章生物信息中的Python 01 | 从零开始处理基因序列自己造轮子实现了序列的基础操作,但是在Python的世界里,一项工作只要重复的次数多了,那么一定就会有大神来开发相应的包来解决,这个包名就是 Biopython 。接下来我们试着使用它来实现简单的序列处理。
白墨石
2021/01/13
1.9K0
生物信息中的Python 02 | 用biopython解析序列
gb格式注释文件转换成gff3注释文件格式
今天在NCBI下载了酵母的参考基因组,没有找到gff格式的基因组注释文件,只找到了genbank格式的基因组注释文件。应该会有现成的工具来实现常用的基因组注释文件不同格式之间的相互转换。比如gtf、gff、和genbank之间的相互转换。
用户7010445
2020/07/17
7.5K0
Python 自动化提取基因的 CDS
Python 开发环境:搭建 Python 高效开发环境: Pycharm + Anaconda
白墨石
2021/01/12
1.6K0
脚本分享—从GeneBank数据库批量下载序列
hello,hello!小伙伴们大家好,我是小编豆豆,好久没有给大家分享使用的脚本了,最近小编在一直在忙着16s整理数据库,需要下载大量物种的16s rRNA序列。
用户1075469
2024/03/26
7812
脚本分享—从GeneBank数据库批量下载序列
宏转录组学习笔记--另一个教程
这项工作已获得Creative Commons Attribution-ShareAlike 4.0 International协议的许可。这意味着您可以复制,共享和修改作品,只要结果以相同的许可证分发即可。本教程由Mobolaji Adeolu(adeolum@mcmaster.ca),John Parkinson(john.parkinson@utoronto.ca)和Xuejian Xiong(xuejian@sickkids.ca)制作。
用户1075469
2020/03/31
3.1K0
宏转录组学习笔记--另一个教程
基因组注释服务-完美解决gff文件缺失的难题
有了gff注释文件就可以愉快的开展各种组学的生信分析项目了,当然也可以愉快的进行数据库的挖掘从而降低同质化减少内卷。
R语言数据分析指南
2023/09/11
8060
基因组注释服务-完美解决gff文件缺失的难题
python脚本提取叶绿体基因组的大小单拷贝区、反向重复区
叶绿体基因组类的文章通常是我们自己做几个,然后结合已经发表的数据做分析。已经公布在NCBI的叶绿体基因组中通常没有反向重复区的信息。这个时候就需要我们自己重新注释。注释用到的是在线工具GeSeq https://chlorobox.mpimp-golm.mpg.de/geseq.html
用户7010445
2020/03/03
2K0
基因组注释服务-完美解决gff文件缺失的难题(火热进行中)
有了gff注释文件就可以愉快的开展各种组学的生信分析项目了,当然也可以愉快的进行数据库的挖掘从而降低同质化减少内卷。
R语言数据分析指南
2023/09/27
5581
基因组注释服务-完美解决gff文件缺失的难题(火热进行中)
使用biopython可视化染色体和基因元件
基因组结构元件的可视化有多种方式,比如IGV等基因组浏览器中以track为单位的展示形式,亦或以circos为代表的圈图形式,比如在细胞器基因组组装中,基因元件常用圈图形式展示,示例如下
生信修炼手册
2021/01/11
1.1K0
使用biopython可视化染色体和基因元件
如何快速从基因组中提取基因、转录本、蛋白、启动子、非编码序列?
NGS基础 - GTF/GFF文件格式解读和转换这篇文章有读者留言想要提取外显子,内含子,启动子,基因体,非编码区,编码区,TSS上游1500,TSS下游500的序列。下面我们就来示范如何提取这些序列。
生信宝典
2022/01/18
5.5K0
解锁生物信息学必备!核心数据库使用指南
生物信息学研究离不开数据支撑,这些数据库能让你事半功倍! 本文详解常用数据库的检索下载技巧,并提供可直接复用的代码模板。
天意生信云
2025/02/08
3320
解锁生物信息学必备!核心数据库使用指南
gget,一个能高效进行各式各样网络数据库查询的工具
希望所有的学徒,实习生以及马拉松授课学员都可以在咱们《生信技能树》的舞台上大放异彩。前面有粉丝自告奋勇希望可以把他自己在简书等平台的生物信息学笔记分享在我们《生信技能树》公众号,在专业的舞台上跟大家切磋!非常欢迎,他前面的分享是:
生信技能树
2022/06/27
1.3K0
gget,一个能高效进行各式各样网络数据库查询的工具
脚本分享——对fasta文件中的序列进行排序和重命名
hello,hello! 小伙伴们大家下午好,我是小编豆豆,时光飞逝,不知不觉来南京工作已经一年了,从2018年参加工作至今,今年是我工作最快乐的一年,遇到一群志同道合的小伙伴,使我感觉太美好了。
用户1075469
2023/01/11
6.1K1
RNA-seq 保姆教程:差异表达分析(一)
RNA-seq 目前是测量细胞反应的最突出的方法之一。RNA-seq 不仅能够分析样本之间基因表达的差异,还可以发现新的亚型并分析 SNP 变异。本教程[1]将涵盖处理和分析差异基因表达数据的基本工作流程,旨在提供设置环境和运行比对工具的通用方法。请注意,它并不适用于所有类型的分析,比对工具也不适用于所有分析。此外,本教程的重点是给出一般的分析流程。对于更大规模的研究,强烈建议使用集群来增加内存和计算能力。
数据科学工厂
2023/02/27
1.9K0
RNA-seq 保姆教程:差异表达分析(一)
非模式生物构建10x单细胞转录组CellRanger参考文件
10X单细胞上游定量标准流程运行Cellranger定量需要对应的参考基因组文件以及其配套的基因组注释信息文件,如果是人类和小鼠,官网即可下载构建好的文件压缩包,详见:https://www.10xgenomics.com/support/software/cell-ranger/downloads#reference-downloads
生信技能树
2024/04/19
6200
非模式生物构建10x单细胞转录组CellRanger参考文件
推荐阅读
相关推荐
脚本分享—gbk文件中提取蛋白质序列以及注释信息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档