Bu belge, Common Expression Language (CEL) için birleştirilmiş API dokümanı referansı olarak kullanılır. Resmi CEL yığınlarındaki imzalarını, davranışlarını ve destek durumlarını belirterek tüm makroları, operatörleri ve standart işlevleri listeler.
Dil davranışı ve spesifikasyonları hakkında daha fazla bilgi için CEL Language Definition'a (CEL Dil Tanımı) bakın.
Yığın Sürümleri
Bu referans belgesi, CEL yığınlarının aşağıdaki sürümlerine dayanmaktadır:
- CEL Go:
v0.32.0(ve daha yeni sürümler) - CEL C++:
v0.16.1 - CEL Java:
v0.14.0 - CEL Python:
v0.1.3 - CEL C: Geliştirme anlık görüntüsü (yayınlanmamış)
GitHub aynaları
CEL'nin resmi uygulamaları, GitHub'da cel-expr
kuruluşu altında yansıtılır:
1. Temel Makrolar
Bunlar, derleme sırasında genişletilen yerleşik makrolardır.
| Makro | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
has(container.field) |
Bir alanın mesajda veya bir haritadaki anahtarın mevcut olup olmadığını test eder. İmzalar: has(container.field) -> boolÖrnekler: has(request.auth.claims.email) |
✓ | ✓ | ✓ | ✓ | ✓ |
list.all(var, predicate) |
Bir listedeki tüm öğelerin bir yüklemi karşılayıp karşılamadığını test eder. İmzalar: list.all(var, predicate) -> boolÖrnekler: [1, 2, 3].all(x, x > 0) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists(var, predicate) |
Bir listedeki en az bir öğenin bir yüklemi karşılayıp karşılamadığını test eder. İmzalar: list.exists(var, predicate) -> boolÖrnekler: [1, 2, 3].exists(x, x > 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists_one(var, predicate) |
Bir listedeki öğelerden yalnızca birinin bir yüklemi karşılayıp karşılamadığını test eder. İmzalar: list.exists_one(var, predicate) -> boolÖrnekler: [1, 2, 3].exists_one(x, x == 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.filter(var, predicate) |
Bir listedeki öğeleri bir yükleme koşuluna göre filtreler. İmzalar: list.filter(var, predicate) -> listÖrnekler: [1, 2, 3].filter(x, x > 1) // [2, 3] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, transform) |
Bir listedeki her öğeyi ifade kullanarak dönüştürür. İmzalar: list.map(var, transform) -> listÖrnekler: [1, 2, 3].map(x, x * 2) // [2, 4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, filter, transform) |
Bir filtre koşulunu karşılayan liste öğelerini dönüştürür. İmza: list.map(var, filter, transform) -> list�Örnekler: [1, 2, 3].map(x, x > 1, x * 2) // [4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
¹ Makrolar, derleme sırasında ana makine derleyicisi tarafından comprehensions'a genişletildiği için C çalışma zamanında desteklenir.
2. Temel Operatörler
| Operatör | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
Aritmetik (+, -, *, /, %) |
Standart aritmetik işlemler. Olumsuzlama (-x) ve Kimlik (+x). Liste birleştirme (list + list) Go, C++, Java ve Python'da desteklenir.İmzalar: T + T -> TT - T -> TT * T -> TT / T -> TT % T -> T-T -> T+T -> Tlist + list -> listÖrnekler: 1 + 2 * 3 // 7[1] + [2] // [1, 2] |
✓ | ✓ | ✓ | ✓ | ✓² |
Karşılaştırma (==, !=, <, <=, >, >=) |
Standart karşılaştırma. Sayısal karşılaştırmalar heterojendir (ör. 1 == 1.0).İmzalar: T == T -> boolT != T -> boolT < T -> boolT <= T -> boolT > T -> boolT >= T -> boolÖrnekler: x < 42.01 == 1.0 // true |
✓ | ✓ | ✓ | ✓ | ✓ |
Mantıksal (!, &&, ||, ? :) |
Mantıksal DEĞİL, VE, VEYA ve Üçlü Koşullu. VEYA kısa devre değerlendirmesini kullanın. İmzalar: !bool -> boolbool && bool -> boolbool || bool -> boolbool ? T : T -> TÖrnekler: x > 0 ? "positive" : "non-positive" |
✓ | ✓ | ✓ | ✓ | ✓ |
Dizine ekleme ([]) |
Bir listenin öğesine dizinle erişin veya bir haritada arama anahtarı arayın. İmzalar: list[int] -> Tmap[K] -> VÖrnekler: tags[0]users['john'] |
✓ | ✓ | ✓ | ✓ | ✓ |
Üyelik (in) |
Öğenin listede veya anahtarın haritada olup olmadığını kontrol edin. İmzalar: T in list -> boolK in map -> boolÖrnekler: 'admin' in roles |
✓ | ✓ | ✓ | ✓ | ✓ |
² Liste birleştirme (list + list), diğer aritmetik operatörler desteklenmesine rağmen C çalışma zamanında desteklenmez.
3. Temel işlevler
Genel ve Dize İşlevleri
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
size |
Bir dizenin (karakter), bayt, liste veya haritanın boyutunu döndürür. İmza: size(T) -> int (burada T, string, bytes, list veya map'dır)Örnekler: size("hello") // 5 |
✓ | ✓ | ✓ | ✓ | ✓ |
contains |
Dizenin alt dize içerip içermediğini döndürür. İmza: string.contains(string) -> boolÖrnekler: "hello".contains("ell") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
startsWith |
Dizenin önekle başlayıp başlamadığını döndürür. İmza: string.startsWith(string) -> boolÖrnekler: "hello".startsWith("he") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
endsWith |
Dizenin sonekle bitip bitmediğini döndürür. İmza: string.endsWith(string) -> boolÖrnekler: "hello".endsWith("lo") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
matches |
Dizenin RE2 normal ifadesiyle eşleşip eşleşmediğini döndürür. İmza: string.matches(string) -> boolÖrnekler: "123".matches(r"^\d+$") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
Tarih ve Saat Seçici İşlevleri
Bu işlevler, google.protobuf.Timestamp veya google.protobuf.Duration'den bileşenleri çıkarır.
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
getFullYear |
4 haneli yılı döndürür. İmza: timestamp.getFullYear([tz]) -> intÖrnekler: timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMonth |
Ayı (0-11) döndürür. İmza: timestamp.getMonth([tz]) -> intÖrnekler: timestamp("2026-07-23T00:00:00Z").getMonth() // 6 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfMonth |
Ayın gününü (1-31) döndürür. İmzalar: timestamp.getDayOfMonth([tz]) -> intÖrnekler: timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfWeek |
Haftanın gününü (0 = Pazar) döndürür. İmza: timestamp.getDayOfWeek([tz]) -> intÖrnekler: timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfYear |
Yılın gününü (0-365) döndürür. İmzalar: timestamp.getDayOfYear([tz]) -> intÖrnekler: timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203 |
✓ | ✓ | ✓ | ✓ | ✗ |
getHours |
Saatleri (0-23) döndürür. İmza: timestamp.getHours([tz]) -> intduration.getHours() -> intÖrnekler: duration("1h30m").getHours() // 1 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMinutes |
Dakikayı (0-59) döndürür. İmza: timestamp.getMinutes([tz]) -> intduration.getMinutes() -> intÖrnekler: duration("1h30m").getMinutes() // 30 |
✓ | ✓ | ✓ | ✓ | ✗ |
getSeconds |
Saniyeleri (0-59) döndürür. İmzalar: timestamp.getSeconds([tz]) -> intduration.getSeconds() -> intÖrnekler: duration("1h30m45s").getSeconds() // 45 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMilliseconds |
Milisaniyeleri (0-999) döndürür. İmzalar: timestamp.getMilliseconds([tz]) -> intduration.getMilliseconds() -> intÖrnekler: duration("1.5s").getMilliseconds() // 500 |
✓ | ✓ | ✓ | ✓ | ✗ |
Tür Dönüşümleri
| Hedef Türü | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
bool |
Boole değerine dönüştürür. İmza: bool(bool) -> boolbool(string) -> boolÖrnekler: bool("true") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
bytes |
Bayta dönüştürür. İmza: bytes(bytes) -> bytesbytes(string) -> bytesÖrnekler: bytes("hello") // b"hello" |
✓ | ✓ | ✓ | ✓ | ✓ |
double |
Çift duyarlıklı kayan nokta biçimine dönüştürür. İmzalar: double(double) -> doubledouble(int) -> doubledouble(uint) -> doubledouble(string) -> doubleÖrnekler: double(1) // 1.0 |
✓ | ✓ | ✓ | ✓ | ✓ |
duration |
Süreye dönüştürür. İmza: duration(duration) -> durationduration(string) -> durationÖrnekler: duration("1.5s") // 1.5s duration |
✓ | ✓ | ✓ | ✓ | ✓ |
int |
64 bit imzalı tam sayıya dönüştürür. İmzalar: int(int) -> intint(uint) -> intint(double) -> int (sıfıra yuvarlar)int(string) -> intint(timestamp) -> int (dönemden beri geçen saniye sayısı)Örnekler: int(1.5) // 1 |
✓ | ✓ | ✓ | ✓ | ✓ |
string |
Dizeye dönüştürür. İmzalar: string(T) -> string (bool, int, uint, double, bytes, timestamp, duration desteklenir)Örnekler: string(1.5) // "1.5" |
✓ | ✓ | ✓ | ✓ | ✓ |
timestamp |
Zaman damgasına dönüştürür. İmzalar: timestamp(timestamp) -> timestamptimestamp(string) -> timestamp (RFC3339)Örnekler: timestamp("2026-07-23T00:00:00Z") |
✓ | ✓ | ✓ | ✓ | ✓ |
uint |
64 bit işaretsiz tam sayıya dönüştürür. İmzalar: uint(uint) -> uintuint(int) -> uintuint(double) -> uintuint(string) -> uintÖrnekler: uint(1) // 1u |
✓ | ✓ | ✓ | ✓ | ✓ |
dyn |
Tür kontrolü için değeri dinamik türe dönüştürür. İmzalar: dyn(T) -> dynÖrnekler: dyn([1, "two"]) |
✓ | ✓ | ✓ | ✓ | ✗ |
type |
Değerin türünü döndürür. İmza: type(T) -> typeÖrnekler: type(1) // int |
✓ | ✓ | ✓ | ✓ | ✗ |
4. Uzantılar (Kitaplıklar)
Bindings Library
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
cel.bind |
Yinelenen değerlendirmeyi önlemek için yerel bir değişkeni bağlar. İmza: cel.bind(varName, initExpr, resultExpr) -> TÖrnekler: cel.bind(x, a + b, x * x) |
✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Bindings()geçirin. - C++:
CompilerBuilderöğesineBindingsCompilerLibrary()ekleyin. (Çalışma zamanı otomatik olarak yönetilir.) - Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.bindings()ekleyin. - Python:
cel_expr_python.ext.ext_bindingsöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtBindings()öğesini kullanın.
Kodlayıcı Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
base64.encode |
Baytları Base64 dizesi olarak kodlar. İmzalar: base64.encode(bytes) -> stringÖrnekler: base64.encode(b"hello") // "aGVsbG8=" |
✓ (v0.6.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
base64.decode |
Base64 dizesinin kodunu baytlara dönüştürür. Geçersiz girişlerde hata verir. İmzalar: base64.decode(string) -> bytesÖrnekler: base64.decode("aGVsbG8=") // b"hello" |
✓ (v0.6.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
json.encode |
CEL değerini JSON dizesine dönüştürür. İmzalar: json.encode(dyn) -> stringÖrnekler: json.encode([1, 2]) // "[1,2]" |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Encoders()geçirin. - C++:
- Derleyici:
EncodersCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterEncodersFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.encoders()ekleyin. - Python:
cel_expr_python.ext.ext_encodersöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtEncoders()öğesini kullanın.
Matematik Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
math.greatest |
Sayısal bağımsız değişkenlerin (veya sayı listesinin) en büyüğünü döndürür. İmza: math.greatest(arg, ...) -> TÖrnekler: math.greatest(1, 3, 2) // 3 |
✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
math.least |
Sayısal bağımsız değişkenlerin (veya sayısal değerler listesinin) en küçüğünü döndürür. İmza: math.least(arg, ...) -> TÖrnekler: math.least([1, 3, 2]) // 1 |
✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
math.abs |
Mutlak değer. İmzalar: math.abs(T) -> T (int, uint, double desteklenir)Örnekler: math.abs(-1) // 1 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.sqrt |
Karekök. İmzalar: math.sqrt(T) -> double (int, uint, double desteklenir)Örnekler: math.sqrt(9) // 3.0 |
✓ (v0.25.1) | ✓ (v0.12.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
math.bitAnd |
Bit düzeyinde VE. İmzalar: math.bitAnd(T, T) -> T (int, uint desteklenir)Örnekler: math.bitAnd(5, 3) // 1 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitOr |
Bit Tabanlı VEYA. İmzalar: math.bitOr(T, T) -> T (int, uint desteklenir)Örnekler: math.bitOr(5, 3) // 7 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitXor |
Bit düzeyinde XOR. İmzalar: math.bitXor(T, T) -> T (int, uint desteklenir)Örnekler: math.bitXor(5, 3) // 6 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitNot |
Bit düzeyinde NOT. İmzalar: math.bitNot(T) -> T (int, uint desteklenir)Örnekler: math.bitNot(1) // -2 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitShiftLeft |
Bit düzeyinde sola kaydırma. İmzalar: math.bitShiftLeft(T, int) -> T (int, uint desteklenir)Örnekler: math.bitShiftLeft(1, 2) // 4 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitShiftRight |
Bit düzeyinde sağa kaydırma. İmzalar: math.bitShiftRight(T, int) -> T (int, uint desteklenir)Örnekler: math.bitShiftRight(4, 2) // 1 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.ceil |
Yukarı yuvarlama. İmzalar: math.ceil(double) -> doubleÖrnekler: math.ceil(1.2) // 2.0 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.floor |
Aşağı yuvarlama. İmzalar: math.floor(double) -> doubleÖrnekler: math.floor(1.8) // 1.0 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.round |
En yakın tam sayıya yuvarlama. İmza: math.round(double) -> doubleÖrnekler: math.round(1.5) // 2.0 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.trunc |
Kısaltma yuvarlaması (sıfıra doğru). İmzalar: math.trunc(double) -> doubleÖrnekler: math.trunc(-1.8) // -1.0 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isInf |
Çift değerin pozitif veya negatif sonsuz olup olmadığını kontrol eder. İmza: math.isInf(double) -> boolÖrnekler: math.isInf(1.0/0.0) // true |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isNaN |
Çift değerin NaN olup olmadığını kontrol eder. İmzalar: math.isNaN(double) -> boolÖrnekler: math.isNaN(0.0/0.0) // true |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isFinite |
Çift değerin sonlu olup olmadığını kontrol eder. İmza: math.isFinite(double) -> boolÖrnekler: math.isFinite(1.2) // true |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.sign |
Değerin işaretini (-1, 0 veya 1) döndürür. İmzalar: math.sign(T) -> T (int, uint, double desteklenir)Örnekler: math.sign(-42) // -1 |
✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Math()geçirin. - C++:
- Derleyici:
MathCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterMathExtensionFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.math()ekleyin. - Python:
cel_expr_python.ext.ext_mathöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtMath()öğesini kullanın.
Protos Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
proto.getExt |
Proto2 uzantı alanını veya ayarlanmamışsa varsayılan değeri alır. İmza: proto.getExt(msg, extName) -> TÖrnekler: proto.getExt(msg, google.api.expr.test.int32_ext) |
✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
proto.hasExt |
Proto2 uzantı alanının ayarlanıp ayarlanmadığını kontrol eder. İmzalar: proto.hasExt(msg, extName) -> boolÖrnekler: proto.hasExt(msg, google.api.expr.test.int32_ext) |
✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Protos()geçirin. - C++:
CompilerBuilderöğesineProtoExtCompilerLibrary()öğesini ekleyin. (Çalışma zamanı otomatik olarak yönetilir.) - Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.protos()ekleyin. - Python:
cel_expr_python.ext.ext_protoöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtProto()öğesini kullanın.
Listeler Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
distinct |
Farklı öğeleri döndürür. İmzalar: list.distinct() -> listÖrnekler: [1, 2, 2].distinct() // [1, 2] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
flatten |
İç içe yerleştirilmiş listeleri düzleştirir. İmza: list.flatten([depth]) -> listÖrnekler: [[1], [2, 3]].flatten() // [1, 2, 3] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.7.1) | ✓ (v0.1.1) | ✗ |
lists.range |
Tam sayı listesi [0, ..., n-1] döndürür.İmzalar: lists.range(int) -> list(int)Örnekler: lists.range(3) // [0, 1, 2] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
reverse |
Listeyi tersine çevirir. İmza: list.reverse() -> listÖrnekler: [1, 2].reverse() // [2, 1] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
slice |
İade alt listesi (başlangıç dahil, bitiş hariç). İmza: list.slice(start, end) -> listÖrnekler: [1, 2, 3].slice(1, 3) // [2, 3] |
✓ (v0.17.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
sort |
Karşılaştırılabilir öğelerin listesini sıralar. İmzalar: list.sort() -> listÖrnekler: [3, 1, 2].sort() // [1, 2, 3] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
sortBy |
Listeyi, ifadeden değerlendirilen anahtara göre sıralar. İmzalar: list.sortBy(var, expr) -> listÖrnekler: [{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}] |
✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
first |
İlk öğeyi isteğe bağlı olarak döndürür. İsteğe bağlı uzantı gerekir. İmzalar: list.first() -> optionalÖrnekler: [1, 2].first() // optional(1) |
✓ (v0.23.0) | ✓ (v0.15.0) | ✓ (v0.11.0) | ✓ (v0.1.2) | ✗ |
last |
Son öğeyi isteğe bağlı olarak döndürür. İsteğe bağlı uzantı gerekir. İmzalar: list.last() -> optionalÖrnekler: [1, 2].last() // optional(2) |
✓ (v0.23.0) | ✓ (v0.15.0) | ✓ (v0.11.0) | ✓ (v0.1.2) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Lists()geçirin. - C++:
- Derleyici:
ListsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistryüzerindeRegisterListsFunctions()veMacroRegistryüzerindeRegisterListsMacros()işlevini çağırın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.lists()ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içinextensionslistesinelistsekleyin.
Set Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
sets.contains |
Liste1'in, liste2'deki tüm öğeleri içerip içermediğini kontrol eder. İmza: sets.contains(list1, list2) -> boolÖrnekler: sets.contains([1, 2], [1]) // true |
✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
sets.equivalent |
Listelerin küme eşdeğeri olup olmadığını (aynı benzersiz öğeleri içerip içermediğini) kontrol eder. İmza: sets.equivalent(list1, list2) -> boolÖrnekler: sets.equivalent([1, 2], [2, 1, 1]) // true |
✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
sets.intersects |
Listelerin en az bir öğeyi paylaşıp paylaşmadığını kontrol eder. İmza: sets.intersects(list1, list2) -> boolÖrnekler: sets.intersects([1, 2], [2, 3]) // true |
✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Sets()geçirin. - C++:
- Derleyici:
SetsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterSetsFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.sets()ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içinextensionslistesinesetsekleyin.
Dizeler Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
charAt |
Dizindeki karakteri döndürür. İmza: string.charAt(int) -> stringÖrnekler: "hello".charAt(1) // "e" |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
indexOf |
Alt dizenin ilk geçtiği yerin dizinini veya -1'i döndürür. İmza: string.indexOf(substr, [start]) -> intÖrnekler: "hello".indexOf("l") // 2 |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
lastIndexOf |
Alt dizenin son oluşumunun dizinini veya -1'i döndürür. İmzalar: string.lastIndexOf(substr, [end]) -> intÖrnekler: "hello".lastIndexOf("l") // 3 |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
join |
Dizeleri birleştirir. İmzalar: list(string).join([separator]) -> stringÖrnekler: ["a", "b"].join("-") // "a-b" |
✓ (v0.10.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
split |
Dizeyi ayırıcıya göre böler. İmza: string.split(separator, [limit]) -> list(string)Örnekler: "a-b".split("-") // ["a", "b"] |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
substring |
Alt dizeyi döndürür (başlangıç dahil, bitiş hariç). İmza: string.substring(start, [end]) -> stringÖrnekler: "hello".substring(1, 3) // "el" |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
trim |
Unicode boşluklarını kırpar. İmzalar: string.trim() -> stringÖrnekler: " hello ".trim() // "hello" |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
replace |
Eski değerleri yeni değerlerle değiştirir. İmza: string.replace(old, new, [limit]) -> stringÖrnekler: "hello".replace("l", "w") // "hewwo" |
✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
reverse |
Unicode kod noktalarını tersine çevirir. İmza: string.reverse() -> stringÖrnekler: "abc".reverse() // "cba" |
✓ (v0.18.0) | ✓ (v0.14.0) | ✓ (v0.13.0) | ✓ (v0.1.1) | ✗ |
lowerAscii |
ASCII karakterleri küçük harfe dönüştürür. İmzalar: string.lowerAscii() -> stringÖrnekler: "Hello".lowerAscii() // "hello" |
✓ (v0.6.0) | ✓ (v0.11.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
upperAscii |
ASCII karakterleri büyük harfe dönüştürür. İmza: string.upperAscii() -> stringÖrnekler: "Hello".upperAscii() // "HELLO" |
✓ (v0.6.0) | ✓ (v0.11.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
quote |
Güvenli yazdırma için dizeden kaçar. İmzalar: strings.quote(string) -> stringÖrnekler: strings.quote("a\tb") // "\"a\\tb\"" |
✓ (v0.14.0) | ✓ (v0.14.0) | ✓ (v0.13.0) | ✓ (v0.1.1) | ✗ |
format |
Dizeyi printf tarzı yer tutucular kullanarak biçimlendirir. İmzalar: string.format(list) -> stringÖrnekler: "str: %s, int: %d".format(["a", 1]) // "str: a, int: 1" |
✓ (v0.14.0) | ✓ (v0.11.0) | ✗ | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Strings()geçirin. - C++:
- Derleyici:
StringsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterStringsFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.strings()ekleyin. - Python:
cel_expr_python.ext.ext_stringsöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtStrings()öğesini kullanın.
Normal İfade Kitaplığı
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
regex.replace |
Eşleşmeleri değiştirme dizesiyle değiştirir (geri referansları destekler). İmza: regex.replace(target, pat, repl, [limit]) -> stringÖrnekler: regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123" |
✓ (v0.25.1) | ✓ (v0.13.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
regex.extract |
Kalıbın ilk eşleşmesini döndürür (bir yakalama grubu olmalıdır). İmza: regex.extract(target, pat) -> optional(string)Örnekler: regex.extract("a123b", r"(\d+)") // optional("123") |
✓ (v0.25.1) | ✓ (v0.13.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
regex.extractAll |
Kalıbın tüm eşleşmelerini döndürür (bir yakalama grubu olmalıdır). İmza: regex.extractAll(target, pat) -> list(string)Örnekler: regex.extractAll("a1b2", r"(\d+)") // ["1", "2"] |
✓ (v0.25.1) | ✓ (v0.13.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Regex()geçirin. - C++:
- Derleyici:
RegexExtCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterRegexExtensionFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.regex()ekleyin. - Python:
cel.EnvConfigaracılığıyla etkinleştirmek içinregexveoptionalöğeleriniextensionslistesine ekleyin.
İki Değişkenli Anlama
| Makro | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
all |
Anahtar/dizin ve değer üzerinde mantıksal VE'nin kısa devre edilmesi. İmzalar: list.all(i, v, pred) -> boolmap.all(k, v, pred) -> boolÖrnekler: [1, 2].all(i, v, v > 0) // true |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
exists |
Anahtar/dizin ve değer üzerinde mantıksal VEYA'yı kısa devre yapma. İmzalar: list.exists(i, v, pred) -> boolmap.exists(k, v, pred) -> boolÖrnekler: [1, 2].exists(i, v, v == 2) // true |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
existsOne |
Tam olarak bir çiftin yüklemi karşılayıp karşılamadığını kontrol eder. İmzalar: list.existsOne(i, v, pred) -> boolmap.existsOne(k, v, pred) -> boolÖrnekler: [1, 2].existsOne(i, v, v == 2) // true |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformList |
Listeyi/haritayı listeye dönüştürür/filtreler. İmza: list.transformList(i, v, [filter], transform) -> listmap.transformList(k, v, [filter], transform) -> listÖrnekler: [1, 2].transformList(i, v, v * 2) // [2, 4] |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformMap |
Liste/harita değerlerini haritaya dönüştürür (anahtarlar sabit kalır). İmzalar: list.transformMap(i, v, [filter], transform) -> mapmap.transformMap(k, v, [filter], transform) -> mapÖrnekler: [1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4} |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformMapEntry |
Haritaya dönüşür. İmzalar: list.transformMapEntry(i, v, [filter], transform_entry) -> mapmap.transformMapEntry(k, v, [filter], transform_entry) -> mapÖrnekler: [1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4} |
✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.TwoVarComprehensions()geçirin. - C++:
- Derleyici:
ComprehensionsV2CompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistryüzerindeRegisterComprehensionsV2Functions()veMacroRegistryüzerindeRegisterComprehensionsV2Macros()çağrısı yapın.
- Derleyici:
- Java:
CelExtensions.comprehensions()öğesiniCelCompilerveCelRuntimeoluşturucularına ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içintwo-var-comprehensionsöğesiniextensionslistesine ekleyin.
Yerel Türler Kitaplığı
| Özellik | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
| Yerel Yapılar | Ana makine yerel türlerini (Go yapıları / Java POJO'ları) CEL'de kaydetme ve örnekleme. Örnekler: Account{id: 123} (CEL'de örneklenen Java POJO'su) |
✓ (v0.13.0) | ✗ | ✓ (v0.13.0) | ✗ | ✗ |
Etkinleştirme
- Git:
cel.NativeTypes(...)veyaext.NativeTypes(...)(yansıtma türleri sağlama)cel.NewEnv()'a. - C++: Desteklenmez.
- Java:
CelCompilerveCelRuntimeoluşturucularınaCelExtensions.nativeTypes()(Java sınıfları sağlayan) öğesini ekleyin. - Python: Desteklenmez.
Ağ Kitaplığı
Ağ kitaplığı, IP adreslerini ve CIDR bloklarını ayrıştırma, doğrulama ve işleme işlevleri sağlar.
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
ip |
Bir dizeyi IP adresine ayrıştırır veya bir CIDR'den IP'yi çıkarır. İmzalar: ip(string) -> IPCIDR.ip() -> IPÖrnekler: ip("192.168.0.1")cidr("192.168.0.0/24").ip() |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isIP |
Bir dizenin geçerli bir IP adresi olup olmadığını kontrol eder. İmza: isIP(string) -> boolÖrnekler: isIP("192.168.0.1") // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
ip.isCanonical |
Bir IP adresi dizesinin kanonik biçimde olup olmadığını kontrol eder. İmza: ip.isCanonical(string) -> boolÖrnekler: ip.isCanonical("192.168.0.1") // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
cidr |
Bir dizeyi CIDR bloğuna ayrıştırır. İmzalar: cidr(string) -> CIDRÖrnekler: cidr("192.168.0.0/24") |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isCIDR |
Bir dizenin geçerli bir CIDR bloğu olup olmadığını kontrol eder. İmza: isCIDR(string) -> boolÖrnekler: isCIDR("192.168.0.0/24") // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsIP |
Bir CIDR bloğunun IP adresi içerip içermediğini kontrol eder. İmzalar: CIDR.containsIP(IP) -> boolCIDR.containsIP(string) -> boolÖrnekler: cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsCIDR |
Bir CIDR bloğunun başka bir CIDR bloğu içerip içermediğini kontrol eder. İmza: CIDR.containsCIDR(CIDR) -> boolCIDR.containsCIDR(string) -> boolÖrnekler: cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
family |
IP ailesini (IPv4 için 4, IPv6 için 6) döndürür. İmza: IP.family() -> intÖrnekler: ip("192.168.0.1").family() // 4 |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isGlobalUnicast |
IP'nin genel tek yayın adresi olup olmadığını kontrol eder. İmzalar: IP.isGlobalUnicast() -> boolÖrnekler: ip("192.168.0.1").isGlobalUnicast() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalMulticast |
IP'nin yerel bağlantı çoklu yayın adresi olup olmadığını kontrol eder. İmzalar: IP.isLinkLocalMulticast() -> boolÖrnekler: ip("224.0.0.1").isLinkLocalMulticast() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalUnicast |
IP'nin bağlantı yerel tek noktaya yayın adresi olup olmadığını kontrol eder. İmzalar: IP.isLinkLocalUnicast() -> boolÖrnekler: ip("169.254.0.1").isLinkLocalUnicast() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLoopback |
IP'nin geri döngü adresi olup olmadığını kontrol eder. İmzalar: IP.isLoopback() -> boolÖrnekler: ip("127.0.0.1").isLoopback() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isMask |
CIDR'nin geçerli bir alt ağ maskesi olup olmadığını kontrol eder. İmzalar: CIDR.isMask() -> boolÖrnekler: cidr("255.255.255.0/24").isMask() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isUnspecified |
IP'nin belirtilmemiş bir adres olup olmadığını kontrol eder (ör. 0.0.0.0).İmzalar: IP.isUnspecified() -> boolÖrnekler: ip("0.0.0.0").isUnspecified() // true |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
masked |
Maskelenmiş CIDR bloğunu döndürür. İmza: CIDR.masked() -> CIDRÖrnekler: cidr("192.168.0.1/24").masked() // 192.168.0.0/24 |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
prefixLength |
CIDR bloğunun önek uzunluğunu döndürür. İmza: CIDR.prefixLength() -> intÖrnekler: cidr("192.168.0.0/24").prefixLength() // 24 |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
string |
IP veya CIDR'yi dizeye dönüştürür. İmzalar: string(IP) -> stringstring(CIDR) -> stringÖrnekler: string(ip("192.168.0.1")) // "192.168.0.1" |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.Network()geçirin. - C++: Desteklenmez.
- Java: Desteklenmez.
- Python: Desteklenmez.
JWT Kitaplığı
JWT kitaplığı, JSON Web Jetonlarını (JWT) ayrıştırmak ve standart ile özel talepleri incelemek için veri türleri ve yardımcı işlevler sağlar.
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
jwt.parse |
Bir ham jeton dizesini, isteğe bağlı bir içine sarılmış yapılandırılmış bir jwt.Token öğesine ayrıştırır.İmzalar:jwt.parse(string) -> optional(jwt.Token)Örnekler: jwt.parse(token_string).hasValue() |
✓ (v0.32.0) | ✗ | ✗ | ✗ | ✗ |
claim |
Jeton yükünden anahtar adına göre özel talep değeri sorgular. İmzalar: jwt.Token.claim(string) -> optional(dyn)optional(jwt.Token).claim(string) -> optional(dyn)Örnekler: jwt.parse(token).claim("tenant").orValue("") |
✓ (v0.32.0) | ✗ | ✗ | ✗ | ✗ |
presentedBy |
Jetonun yayınlayıcısı ve kitlesinin beklenen değerlerle eşleştiğini doğrular. İmzalar: jwt.Token.presentedBy(string, string) -> booloptional(jwt.Token).presentedBy(string, string) -> boolÖrnekler: jwt.parse(token).presentedBy("https://auth.example.com", "https://api.example.com") |
✓ (v0.32.0) | ✗ | ✗ | ✗ | ✗ |
Etkinleştirme
- Git:
cel.dev/cel-go/ext/security/jwtve kartıjwt.Library()hizmetindencel.NewEnv()hizmetine aktarın. - C++: Desteklenmez.
- Java: Desteklenmez.
- Python: Desteklenmez.
HMAC Kitaplığı
HMAC kitaplığı, dizeler ve bayt dizileri üzerinde karma tabanlı mesaj kimlik doğrulama kodlarını (HMAC) hesaplamak ve doğrulamak için kriptografik işlevler sağlar.
| İşlev | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
hmac.compute |
Belirtilen algoritma ve gizli anahtar kullanılarak ham HMAC imza baytlarını hesaplar. İmzalar: hmac.compute(string, string|bytes, string|bytes) -> bytesÖrnekler: hmac.compute(hmac.SHA256, "secret", "message") |
✓ (v0.32.0) | ✗ | ✗ | ✗ | ✗ |
hmac.verify |
Bir HMAC imzasının beklenen özetle eşleşip eşleşmediğini doğrular. İmzalar: hmac.verify(string, string|bytes, string|bytes, string|bytes) -> boolÖrnekler: hmac.verify(hmac.SHA256, secret, msg, expected_sig) // true |
✓ (v0.32.0) | ✗ | ✗ | ✗ | ✗ |
Etkinleştirme
- Git:
cel.dev/cel-go/ext/security/hmacve kartıhmac.Library()hizmetindencel.NewEnv()hizmetine aktarın. - C++: Desteklenmez.
- Java: Desteklenmez.
- Python: Desteklenmez.
5. İleri Seviye Özellikler
İleri Seviye Özellikler Özeti
| Özellik | Açıklama | Go | C++ | Java | Python | C |
|---|---|---|---|---|---|---|
| Kısmi Değerlendirme | Eksik girişlerle değerlendirme; bilinmeyenleri veya basitleştirilmiş bir ifadeyi döndürür. | ✓³ | ✓⁴ | ✓⁴ | ✗ | ✗ |
| Eş zamansız değerlendirme | Uzantı işlevlerinin eşzamanlı olarak engellenmeden yürütülmesi. | ✓⁵ | ✗ | ✓⁶ | ✗ | ✗ |
| AST Doğrulayıcıları | Tür kontrolünden sonra Checked AST üzerinde statik analiz kontrolleri. | ✓ | ✓ | ✓ | ✗ | ✗ |
| AST Optimizasyonları | Performansı artırmak için AST yeniden yazma (sabit katlama, satır içi, CSE) | ✓ | ✓ | ✓ | ✗ | ✗ |
| CEL Policy Compiler | YAML tabanlı politika yapılarını standart CEL AST'lerine derler. | ✓ | ✓ | ✓ | ✗ | ✗ |
| Resmi Doğrulama | Güvenlik değişmezlerini, karşılanabilirliği, geçerliliği ve AST eşdeğerliğini kanıtlar. | ✗ | ✗ | ✓ (v0.14.0) | ✗ | ✗ |
³ Go, Residual AST (budanmış AST) oluşturmayı destekler. ⁴ C++ ve Java, çalışma zamanında UnknownSet / CelUnknownSet döndürmeyi destekler ancak kalan AST oluşturma için herkese açık API'ler sunmaz. ⁵ Go, AsyncBinding / AsyncOp geri dönen kanalları kullanır. ⁶ Java, CelAsyncRuntime döndürmek için ListenableFuture kullanır.
Kısmi Değerlendirme (Bilinmeyenler)
Kısmi değerlendirme, yalnızca giriş değişkenlerinin (bağımsız değişkenler) bir alt kümesi bilindiğinde bir ifadenin değerlendirilmesine olanak tanır. Değerlendirme başarısız olmak yerine neyin eksik olduğunu gösteren bir sonuç veya basitleştirilmiş bir ifade üretir.
- Go: Tam desteklenir. Bilinmeyen özelliklerin kalıplarıyla
PartialActivationtanımlamaya olanak tanır. Değerlendirme,types.Unknowndeğeri döndürüyor. Go, yalnızca değerlendirilemeyen ifadenin bölümlerini içeren, budanmış ve basitleştirilmiş bir Residual AST (Env.ResidualAst) oluşturmayı destekler. - C++:
Unknowndeğerlerini destekler. Bilinmeyen özellik kalıplarıActivation::set_unknown_attribute_patternsüzerinden yapılandırılır. DeğerlendirmeUnknownSetdöndürür. Genel API şu anda artık AST oluşturmayı kullanıma sunmamaktadır. - Java:
PartialVarspassed toProgram.eval()aracılığıyla kısmi değerlendirmeyi destekler. Evaluation işleviCelUnknownSetdeğerini döndürür. Genel API, şu anda artık AST oluşturmayı kullanıma sunmamaktadır. - Python / C: Yerel destek yoktur.
Eşzamansız Değerlendirme
Asenkron değerlendirme, CEL ifadelerinin asenkron olarak yürütülen işlevleri (ör.RPC'ler veya veritabanı sorguları oluşturma) çağıırmasına ve sonuçlar kullanılabilir hale gelene kadar değerlendirmeyi engellemesine olanak tanır. Bu sırada ana yürütme iş parçacığı engellenmez.
- Go:
AsyncBindingveAsyncOparacılığıyla eşzamansız işlev aşırı yüklemelerini destekler. Eşzamansız işlevler bir Go kanalı (<-chan ref.Val) döndürür ve yorumlayıcı, eşzamanlı yürütme ve senkronizasyonu yönetir. - Java:
CelAsyncRuntimeveAsyncProgramüzerinden asenkron değerlendirmeyi destekler. Beklemedeki değerleri temsil etmek içinListenableFuturesimgesini kullanır ve gelecekteki işlemler çözümlendikçe değerlendirmeyi otomatik olarak tamamlar. - C++ / Python / C: Yerleşik destek yoktur.
AST Doğrulayıcıları
Doğrulayıcılar, program yürütülmeden önce alana özgü kısıtlamaları zorunlu kılmak için tür denetiminden sonra Checked AST üzerinde statik analiz gerçekleştirir.
- Go:
ASTValidatorarayüzünü destekler. Standart doğrulayıcılar arasındacel.validator.duration,cel.validator.timestamp,cel.validator.matches(normal ifade),cel.validator.homogeneous_literalsvecel.validator.comprehension_nesting_limitbulunur. - C++:
cel::Validatordesteklenir. Standartlaştırma doğrulamaları arasındaAstDepthValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,MatchesValidatorveTimestampLiteralValidatorbulunur. - Java:
CelValidatorveCelAstValidatordesteklenir. Standart doğrulayıcılar arasındaAstDepthLimitValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,RegexLiteralValidatorveTimestampLiteralValidatoryer alır. - Python / C: Doğrudan desteklenmez.
AST Optimizasyonları
Optimizasyon araçları, yürütme performansını artırmak için AST'yi yeniden yazar. Optimizasyon araçları, statik ve çalışma zamanı optimizasyon araçları olmak üzere iki kategoride yer alır. C++, Java ve Go, çalışma zamanı optimizasyonunu destekler. CEL Java ve Go, statik optimize edicileri de destekler.
Tipik optimizasyonlar arasında sabit katlama (sabit girişlerle alt ifadeleri önceden değerlendirme) ve ortak alt ifadeyi ortadan kaldırma (CSE) bulunur.
- Go: Derleme/planlama sırasında AST katlamayı destekler.
- C++: Planlama sırasında
cel::extensions::EnableConstantFoldinguzantısı aracılığıyla sabit katlamayı destekler. - Java:
CelOptimizerarayüzünü destekler. Standartlaştırılmış optimizasyon araçları arasındaConstantFoldingOptimizer(ön sipariş geçişini, Protobuf mesajı sabit katlamayı ve toplu veya isteğe bağlı budamayı destekler),InliningOptimizerveSubexpressionOptimizer(CSE) bulunur. - Python / C: Doğrudan desteklenmez.
CEL Policy Compiler
CEL politikası, değişkenler, eşleşme blokları, koşullu çıkışlar ve iç içe kurallarla birlikte birden fazla CEL ifadesi oluşturmak için kullanılan YAML tabanlı bir biçimdir. Tek bir CEL ifadesinin okunamaz hale geleceği karmaşık politika motorları (ör. Kubernetes Kabul Kontrolü) için tasarlanmıştır.
Resmi dil tanımı, söz dizimi ve uygunluk paketi için CEL Politikası Spesifikasyonu'na bakın.
Politika derleyicisi, bu YAML politikalarını tek bir standart CEL AST'ye derler. Bu da politikaların standart CEL çalışma zamanlarıyla tamamen uyumlu olduğu ve tüm performans ve güvenlik garantilerini devraldığı anlamına gelir.
- Git: Git politikası (toplu kural değerlendirme semantiği dahil) aracılığıyla desteklenir.
- C++: C++ politikası aracılığıyla desteklenir.
- Java: Java politikası (politika yapılandırmalarındaki toplu kural değerlendirme semantiği ve kısa tür belirleyiciler dahil) aracılığıyla desteklenir.
- Python / C: Doğrudan desteklenmez.
Resmi Doğrulama Çerçevesi
Resmi Doğrulama çerçevesi, kullanıcıların CEL ifadeleri ve yapılandırılmış CEL politikaları arasında güvenlik değişmezlerini, mantıksal denkliği, karşılanabilirliği ve geçerliliği matematiksel olarak kanıtlamasına olanak tanır.
- Java: CEL Java Doğrulayıcı ile desteklenir
(
dev.cel:verifiervedev.cel:verifier-cli). Özellikler arasında tanık girişi oluşturma ile karşılanabilirlik (isSatisfiable), karşıt örnek oluşturma ile geçerlilik (isAlwaysTrue), comprehensions için sınırlı model kontrolü (BMC), AST'ler arasında mantıksal eşdeğerlik kanıtları ve özelassume/assertpolitika değişmez doğrulaması yer alır. - Go / C++ / Python / C: Java komut satırı araç zinciri aracılığıyla dolaylı olarak desteklenir.
Giriş ve gerçek hayattan örnekler için Google Açık Kaynak blog yayınını inceleyin: Securing the agentic era: Introducing formal verification for CEL (Aracı çağına güvenlik: CEL için resmi doğrulama tanıtımı).