Վերադառնալ
Բրաունի հետազոտություն. async/await-ը տարբեր լեզուներում տարբեր է վարվում
SiTech AI Team2 წთ. საკითხავი

Բրաունի հետազոտություն. async/await-ը տարբեր լեզուներում տարբեր է վարվում

Բրաունի համալսարանի լաբորատորիան ցույց է տալիս, որ յոթ ժամանակակից async runtime-ներ նույնիսկ փոքրիկ ծրագրում չորս տարբեր արդյունք են տալիս, և քարտեզագրում է տարբերության հետևում կանգնած ինը չափումները։

Բրաունի համալսարանի Cognitive Engineering Lab-ի նոր հոդվածն ուսումնասիրում է, թե ինչպես է async/await-ը վարվում յոթ ժամանակակից runtime-ում, և պարզում է, որ դրանք համաձայնում են ընդհանուր շարահյուսության թելադրածից շատ ավելի քիչ։ Գրառումը հրապարակել է Գևին Գրեյը 2026 թ. սեպտեմբերի 8-ին։

Փոքր ծրագիր, չորս պատասխան

Ավելի քան տասնհինգ տարի լեզուները ձգտում են «ուղիղ գծի ասինխրոնության», որ զուգահեռ կոդը սովորական գծային կոդի տեսք ունենա (Python, Rust, Swift)։ Սակայն փոքր նկարագրային կոդը ցույց է տալիս տարբերությունը. write_to_log-ը տպում է «A», սպասում երկու վայրկյան sleep-ին և տպում «B»; fire_and_forget-ը այդ ֆունկցիան գործարկում է որպես ֆոնային խնդիր և վերադառնում առանց սպասելու; main-ը սպասում է fire_and_forget-ին, քնում մեկ վայրկյան և տպում «C»։ Յոթ runtime՝ Asyncio, C#, JavaScript, Tokio, Smol, Trio և Swift, տալիս են չորս տարբեր արդյունք, իսկ ծրագրի երեք տարբերակներից ոչ մի երկու runtime նույն պատասխանը չի տալիս։

Տաք ու սառը մեկնարկ, ինը չափում

Բացատրության մի մասը «շտապողականությունն» է. տաք մեկնարկը վերադարձնում է արդեն runtime-ում աշխատող խնդիր, սառը մեկնարկը՝ իներտ օբյեկտ, որը ոչինչ չի անում մինչև await; Python-ը և Rust-ը գնահատում են ծույլ։ Հոդվածը առանձնացնում է այդպիսի ինը դիզայնի չափում՝ որոշումներ, որոնք փոխում են կատարման դիտարկելի սեմանտիկան, ոչ միայն արդյունավետությունը, և խմբավորում դրանք երեքում՝ կյանքի սկիզբ, կյանքի վերջ և չեղարկում։

Ինչու Swift-ը տպում է «AC», իսկ Trio-ն՝ «ABC»

Օրինակում գերիշխում են երկու չափում։ Դինամիկ շրջանակի դեպքում խնդիրը չի կարող ապրել ավելի երկար, քան այն ֆունկցիան, որը ստեղծել է այն, ինչն ընտրել են Swift-ը և Python+Trio-ն։ Նրանք տարբերվում են ոչնչացմամբ. Swift-ը չեղարկում է խնդիրը, Trio-ն՝ քաղաքավարի սպասում է դրա ավարտին։ Դրա համար էլ Swift-ը տպում է «AC», իսկ Trio-ն՝ «ABC»։ Չեղարկումը տարբերվում է նաև այլ առումներով՝ գիտակցություն, կայունություն (խնդիրը կարող է անտեսել չեղարկումը և շարունակել, կամ մնալ չեղարկված) և ազդանշանի տարածումը՝ վերևից ներքև, ներքևից վերև կամ բոլոր կախվածություններին միաժամանակ։

Դիզայնի տարածքի հետևում կանգնած հաշվարկը

Տարածքը ճշգրիտ դարձնելու համար հեղինակները այն թարգմանել են ասինխրոն ծրագրերի միջուկային հաշվարկի ֆորմալ սեմանտիկայի։ Վերացական մեքենայի հետքերը ընդգծում են կատարումը ճյուղավորող սեմանտիկ որոշումները և քայլ առ քայլ բացատրում, թե ինչու են ծրագրերը տարբերվում։ Յուրաքանչյուր չափում արդյունավետության, հիշողության, էրգոնոմիկայի ու սեմանտիկայի փոխզիջում է. ճիշտ պատասխաններ չկան, և ամեն լեզու ունի իր տրամաբանությունը, սակայն նույնիսկ փոքր ծրագրերը լուրջ բացատրություն են պահանջում։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։