作者需開發高並發服務器,C# 異步模式(APM/EAP/Task)導致回調地獄、異常處理分散、循環/控制流難表達。決定創造新語言 Parallet,目標:同步寫法,異步執行。
async/await,函數默認可掛起
// 傳統 C# 回調風格
void LoadConfigAsync(Action callback) {
var req = WebRequest.Create("config.aspx");
req.BeginGetResponse(ar => {
var resp = req.EndGetResponse(ar);
var config = Parse(resp.GetResponseStream());
callback(config);
}, null);
}
// 調用者:層層回調,try/catch 極難統一
LoadConfigAsync(cfg => {
try { Init(cfg); } catch { Log(); }
});
// Parallet:同步寫法,自動異步
function LoadConfig() {
var xhr = new XHR();
xhr.open("get", "server.aspx");
xhr.send(""); // 這裡自動掛起,不阻塞線程
return ParseConfig(xhr.responseText); // 恢復後繼續
}
try {
var config = LoadConfig(); // 看起來同步,實則異步
InitMySystem(config.OptionName);
} catch (e) { // 統一異常處理!
alert("initialize failed");
}
try/catch 自然覆蓋異步調用鏈,無需手動傳遞錯誤回調for/while/if 正常工作,無需展平為狀態機| 語言/框架 | 異步模型 | 語法成本 | 異常處理 | 備註 |
|---|---|---|---|---|
| Parallet | 隱式協程 | 零(同步寫法) | 統一 try/catch | 自創,研究性強 |
| Go | Goroutine | 關鍵字 go | 多返回值 error | 成熟生產級 |
| C# async/await | 編譯器狀態機 | 關鍵字 async/await | try/catch 跨 await | 主流方案 |
| JS Promise | 鏈式回調 | .then/.catch | .catch 鏈式 | 單線程事件循環 |
| Kotlin Coroutine | 掛起函數 | suspend 關鍵字 | try/catch 結構化 | JVM 生態最佳 |