RFC-0036:結構宣告的更新 | |
---|---|
狀態 | 已遭拒 |
領域 |
|
說明 | 為了更清楚傳達重新排序和重新命名欄位的 ABI 帶來的影響,我們提議變更語法,導入結構體欄位的序數,同時採用類似的語法規則和資料表的語法規則。 |
作者 | |
提交日期 (年-月-日) | 2019-03-07 |
審查日期 (年-月-日) | 2019-03-14 |
拒絕原因
優點
- 名稱對 ABI 的重要性或不存在: xunion、struct 和通訊協定全部看起來很類似,不過 不同的規則
缺點
然而,所有疑慮都讓消費者重心 如果在結構體上引進普通法,會增加 尤其是與 protobuf 相比
還有其他行動要解決「這項異動是否會影響 ABI」,即:
- DIFL
- API 差異比較,例如程式庫簽章
名稱對文字格式 (JSON、FIDLText 等) 和訊息傳送時間而言很重要 ,因此無法變更名稱。
摘要
為更清楚傳達重新排序和重新命名欄位的 ABI 可能的影響,我們 提議進行語法變更,引入 struct 欄位的泛型。 並使用類似的語法規則
提振精神
著重於會員能否安全重新命名或重新排序 因此,您可以運用多種宣告和語法差異, 是自然的,並未傳達任何關於 ABI 可能帶來的影響 並輸入變更內容
此外,目前的 struct 宣告語法讓 編譯器,在發生變化時提供協助和指引。
讓我們來看看幾個範例,這些都是小型和統一的:
struct Name { table Name { enum Name {
T abc; 1: T abc; ABC = 1;
U xyz; 2: U xyz; XYZ = 2;
}; }; };
protocol Name { xunion Name { bits Name {
Abc(T t); T abc; ABC = 1;
Xyz(U u); U xyz; XYZ = 2;
}; }; };
從 ABI 的角度來看:
- 重新排序:除了結構體外,其餘結構皆可重新調整順序,沒有任何影響。
- 重新命名:
- 結構體、資料表、列舉和位元可以重新命名,不會產生任何影響
- 通訊協定和 xunion 會在重新命名後影響其 ABI。
(從來源相容性的觀點來看,大多數的繫結將由來源為來源) 相容於重新訂購,且與重新命名作業不相容)。
根據這些觀察,我們提議 結構體宣告。 現在,上述範例如下:
struct Name {
1: T abc;
2: U xyz;
};
具體違規事項如下:
- 序數必須從 1 開始,序空間則不允許有間隔 (如果 最大序數為 7,則 1,2,3,4,5,6,7 全都必須包含。詳情請見 原因。
- 沒有任何兩個欄位可聲明相同序數。
- 欄位序數會決定包含結構 (而非) 欄位的位置 語法位置
- v1 中的 JSON IR 沒有任何變更,序數會透過順序傳輸 組成成員。請查看第 2 版中的 JSON IR 預定異動。
編譯器指南
實作指引,編譯器可提供建議的 語法時,我們會參考幾個範例並比較它們的處理方式。
移除欄位 (中間)
No Ordinals With Ordinals
---------------- -------------
struct Name { struct Name {
T abc; 1: T abc;
- U def; - 2: U def;
V ghi; 3: V ghi;
}; };
---------------- ---------------
Breaks ABI, no Breaks ABI,
compiler help compiler error
移除欄位 (完)
No Ordinals With Ordinals
---------------- -------------
struct Name { struct Name {
T abc; 1: T abc;
U def; 2: U def;
- V ghi; - 3: V ghi;
}; };
---------------- ---------------
Breaks ABI, no Breaks ABI, no
compiler help compiler help
新增欄位
No Ordinals With Ordinals
---------------- -------------
struct Name { struct Name {
T abc; 1: T abc;
+ U def; + 3: U def;
V ghi; 2: V ghi;
}; };
---------------- ---------------
Breaks ABI, no Breaks ABI, no
compiler help compiler error
重新排序欄位
No Ordinals With Ordinals
---------------- -------------
struct Name { struct Name {
+ U def; + 2: U def;
T abc; 1: T abc;
- U def; - 2: U def;
V ghi; 3: V ghi;
}; };
---------------- ---------------
Breaks ABI, no Safe
compiler warning
不允許「保留」關鍵字
由於我們要為資料表的結構體對齊序數規則 也有機會允許「reserve」字詞。
我們則應進行完全相反的:正確剖析誤用 保留關鍵字,並提供明確的編譯器錯誤和解釋。適用對象 執行個體「Cannotserv member in structs.新增或移除成員 變更結構體版面配置,請考慮手動改為中立成員 初始化。」
其他重要原因也禁止 「reserve」關鍵字:
- 與資料表不同的是,結構體中導入邊框間距必須使用 明確大小 (即位元組數);
- 在結構體中使用邊框間距是為了特定目的而使用 開發人員需要特定的記憶體配置 由於 FIDL 版面配置始終是固定的,因此這種使用案例很少見,甚至不存在 已對齊 8 個位元組。
- 如要進一步瞭解實作,我們已在 RFC-0066 中說明並說明相關做法: Programmer Advisory Explicit Defaults 某些值進行初始化時,超出了某些要求 繫結 (例如 C、LLPP)。 因此,應該引述「reserve」結構體中 我們必須向後端公開該資訊 以便正確初始化 這似乎不是必要的。
探索道路 JSON IR
我們同時支援欄位排序 (按照序數) 和 說明文件目的 (應遵循宣告順序),則 較佳的做法:
- 以宣告欄位的顯示順序來表示宣告順序 「成員」鍵。
- 以「普通」表示序數鍵。
設計
未定
執行策略
- 新語法開始支援,同時支援 上一個;
- 將所有來源檔案遷移至新的語法;
- 使用先前的語法新增警告,請預留一週的期間 確保不會新增任何先前使用的語法;
- 停止支援先前語法。
人體工學
本提案藉由傳達 ABI 對 AI 造成的影響,改善人體工學 都能透過語法協助開發人員請參閱這件事的對立觀點 。
說明文件和範例
須符合以下條件:
回溯相容性
這與來源層級回溯不相容。 請參閱實作策略,進行初步遷移。
成效
沒有影響。
安全性
沒有影響。
測試
在 fidlc
中進行單元測試,用於驗證其他使用者:
- 剖析;
- 序數從 1 開始,可能沒有間隔;
- JSON IR 沒有任何變更。
缺點、替代方案和未知
替代做法:資料表的序數雜湊
此外,我們也會考慮為資料表使用序式雜湊,也就是語法變化 會捨棄明確的基因,讓結構體是唯一的宣告 語法和資料表相同
首先,為結構體採用明確序數的好處將維持不變。 開發人員還是可以透過語法重新排列欄位順序, 序數表示 ABI 中斷。
其次,我們無法對探索採取行動來移除一般資料 ,因為在執行階段成本之間取捨 (效能較低) 大於人體工學的效益
缺點:結構和表格可能會令人困惑
結合結構體和資料表的語法,以及 有些普通人認為結構體與表格混淆,並誤以為 而且移除欄位也與 ABI 相容 雖然在結構體中間移除欄位會導致錯誤發生,原因是 序數序列中出現的間距,移除含有 最大序數則保持無聲
既有藝術品和參考資料
未定