
JSON օբյեկտների վերլուծություն առանց միջանկյալ AST-ի
Բլոգում նկարագրվում է մոտեցում, որով JSON օբյեկտները վերլուծվում են անմիջապես դոմենային տիպերի՝ մասնակի նախաստեղծ արժեքի միջոցով, առանց AST-ի։ Միկրո-չափումները ցույց են տալիս մոտ երեք անգամ ավելի բարձր արագություն։
JSON-ի գրադարանների մեծ մասը հետևում է նույն երկքայլ սխեմային. սկզբում հում բայթերը վերածվում են փաստաթուղթը կրկնող միջանկյալ ծառի, ապա այդ ծառով անցնելով կառուցվում են տվյալների այն տիպերը, որոնք հավելվածն իրականում օգտագործում է։ arthi-chaud.github.io-ում հրապարակված բլոգային գրառումը հարցնում է՝ ինչ կլինի, եթե միջանկյալ ծառն ամբողջությամբ հանենք, և առաջարկում է լուծում՝ հիմնված մասնակի նախաստեղծ արժեքների վրա։
Ինչու է միջանկյալ ներկայացումը թանկ
Հեղինակը սովորական ձևավորումը նկարագրում է որպես խողովակաշար. վերլուծիչը ByteString-ը դարձնում է JSON AST, իսկ առանձին ֆունկցիան՝ օրինակ fromJSON-ը, այդ AST-ն դարձնում է դոմենային տվյալ, օրինակ Album գրառում։ Այդ բաժանումը հարմար է. վերլուծությունը մնում է անկախ վալիդացիայից, իսկ փոխարկման կոդը հաճախ գեներացվում է Template Haskell-ի կամ Generics-ի միջոցով։ Սակայն այն անվճար չէ. AST-ն լրացուցիչ օբյեկտ է հիշողության մեջ, առնվազն այնքան մեծ, որքան վերջնական արժեքը, և դրա կառուցումը պահանջում է հաշվարկ, որը դեն է նետվում դոմենային օբյեկտի ստեղծումից անմիջապես հետո։
Մասնակի նախաստեղծ օբյեկտներ և բիթերի բազմություն
Այլընտրանքը մասնակի նախաստեղծ դոմենային օբյեկտն անցկացնում է հենց վերլուծիչի միջով. դաշտերը գրվում են կարդալուն պես, և AST ընդհանրապես չի կառուցվում։ Haskell-ում դա հենվում է ծուլության վրա. յուրաքանչյուր դաշտ սկսվում է undefined-ով, հետևաբար թիրախ տիպի դաշտերը չպետք է խիստ լինեն։ Անվտանգությունը վերականգնում է բիթերի բազմությունը՝ Word64, նախաստեղծված maxBound-ով։ Դաշտ գրելիս ջնջվում է նրա դիրքի բիթը տիպի սահմանման մեջ, իսկ վերլուծության ավարտին մնացած զրոն վկայում է, որ օբյեկտն ամբողջությամբ նախաստեղծ է։ Հակառակ դեպքում վերլուծիչը ձախողվում է և կարող է սխալի հաղորդագրության մեջ թվարկել բացակայող դաշտերը, իսկ Maybe տիպի դաշտերը բավական է դնել Nothing։
Չափումներ և սահմանափակումներ
Նախատիպը կառուցված է flatparse գրադարանով, իսկ մասնագիտացված վերլուծիչները կոմպիլյացիայի պահին գեներացնում է Template Haskell-ը։ Criterion-ի միկրո-չափումներում (Intel, երկու Xeon Gold 6244, 32 ԳԲ RAM) aeson-ը՝ Haskell-ի հիմնական JSON գրադարանը, գրքի համար ցույց է տալիս 1.051 μs, իսկ գրքերի ցուցակով հեղինակի համար՝ 2.901 μs։ Նույն գրադարանը միջանկյալ AST-ով՝ 922.7 ns և 2.813 μs, իսկ առանց AST-ի՝ 314.2 ns և 1.027 μs՝ մոտ երեք անգամ ավելի արագ։ Հեղինակը նշում է, որ վերլուծիչը լիովին չի համապատասխանում JSON ստանդարտին, և որ նման միկրո-չափումները միշտ չէ, որ արտացոլում են իրական հավելվածները։
Ինչ է ցույց տալիս փորձը
Գրառումը հստակ նշում է, որ սա փաստարկ չէ միջանկյալ ներկայացումների դեմ. դրանք առանձնացնում են վերլուծությունը վալիդացիայից և կոդը դարձնում սպասարկելի։ Խոսքը այդ բաժանման գործարկման ժամանակի արժեքի մասին է, և այն մասին, որ երկու քայլի միավորումը պակաս էլեգանտ, բայց աշխատող փոխզիջում է։ Գաղափարը նույնպես նոր չէ. Rust-ի serde շրջանակը staged ծրագրավորմամբ միջանկյալ շերտը տեղափոխում է կոմպիլյացիայի ժամանակ, իսկ խիստ լեզուներում նույն հնարքը կարելի է սկսել undefined-ի փոխարեն դատարկ արժեքներից։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։