為什麼使用專用語言
Osprey 為何使用專用的 SML,也就是 Some Madeup Language,而不直接支援一般 Python?簡短的答案是,SML 的限制讓 Osprey 規則引擎可以在正式環境中安全執行不受信任或由第三方撰寫的邏輯,同時保持足以即時處理的速度。
-
Grammar 刻意維持精簡。 SML parser
osprey_worker/src/osprey/engine/ast/py_ast.py只理解受限制的 Python AST nodes,包括 assignments、calls、comparisons、boolean 或 binary operators、literals 及 f-strings。範圍以外的任何內容都會產生 syntax error,因此不能使用for、while、def、class或任意import。這項設計從結構上排除無限 loops 與 recursion,避免 Rule 讓 worker 停滯或遭到 DoS。 -
每個名稱只能指派一次。
UniqueStoredNamesvalidator 會拒絕在 ruleset 中重複宣告同一個名稱,NoUnusedLocals則會拒絕宣告從未讀取的名稱。兩者結合後,每個 Rule 與 Feature 都能編譯為單一、靜態且沒有 cycle 的 dependency graphexecution_graph.py,不會成為帶有 mutable state 的 imperative script。 -
靜態關係圖讓引擎更快,也更容易檢查。 由於邏輯沒有 side effects,也不會在 loop 中執行,executor 可以使用 gevent greenlets
executor.py安全地平行評估關係圖的獨立分支。介面也能為任何 Rule 或 Feature 呈現完整 dependency graph,支援 Rules Visualizer,以及 Rules 與 Features Registry 頁面中的交叉參照。 -
Rules 執行前會先檢查 Types。
validate_static_types.py與validate_call_rvalue.py會在驗證或 push 時找出 type errors 及誤用 return values,避免罕見 code path 第一次於正式環境執行時才發生 runtimeAttributeError。
SML 是合法的 Python syntax subset,因此將編輯器設為 Python mode 即可取得基本 syntax highlighting。目前的編輯器設定請見英文官方文件的 IDE Setup。