WASI 0.3-ის ოფიციალური რელიზი შედგა, რაც WebAssembly-ის განვითარების ისტორიაში მნიშვნელოვან ეტაპს წარმოადგენს. ამიერიდან, ასინქრონული პროგრამირება (async) ამ ტექნოლოგიის განუყოფელი და „ნეითივ“ ნაწილი ხდება. WASI-ის ქვეგანყოფილებამ უკვე დაამტკიცა ახალი სპეციფიკაცია, რომელიც კომპონენტების მოდელს ასინქრონულ პრიმიტივებზე აფუძნებს.

რა შეიცვალა WASI 0.3-ში?

წინა ვერსიაში, WASI 0.2-ში, დეველოპერებს უწევდათ ისეთი კომპლექსური მექანიზმების გამოყენება, როგორიცაა wasi:io (pollables, input/output streams). ახლა ეს ფუნქციები პირდაპირ კომპონენტების მოდელის კანონიკურ ABI-შია ინტეგრირებული. შედეგად, კოდი გახდა უფრო მარტივი, გასაგები და ადვილად წაკითხვადი.

მთავარი სიახლე ისაა, რომ ჰოსტი ახლა სრულად აკონტროლებს საერთო „ივენთ-ლუფს“ (event loop), რომელსაც ყველა კომპონენტი იზიარებს. ეს გამორიცხავს კონფლიქტებს, რომლებიც ადრე სხვადასხვა კომპონენტის ასინქრონულ რანთაიმებს შორის წარმოიქმნებოდა.

ასინქრონული მოდელის უპირატესობები

  • სრულფასოვანი ასინქრონულობა: stream<T> და future<T> ახლა პირველი კლასის მოქალაქეები არიან, რაც მონაცემთა გადაცემას ბევრად ეფექტურს ხდის.
  • შესრულებაზე ორიენტირებული: ახალი მოდელი ემყარება „დასრულებაზე დაფუძნებულ“ (completion-based) მიდგომას, რაც Linux-ის io_uring-ის მსგავსად, მაღალ წარმადობას უზრუნველყოფს.
  • სტრიმების სტაბილურობა: ახალი ვერსია აგვარებს შეცდომების აღმოჩენის პრობლემას, რაც წინა ვერსიაში სტრიმების ნაადრევად შეწყვეტისას წარმოიქმნებოდა.

გავლენა პროგრამირების ენებზე

WASI 0.3-ის წყალობით, ენების ბინდინგების გენერატორებს შეუძლიათ შექმნან „ნეითივ“ ასინქრონული ბინდინგები. ეს ეხება ისეთ პოპულარულ ენებს, როგორებიცაა Rust, JavaScript, Python, C# და Go. მაგალითად, Go-ს შემთხვევაში, რანთაიმს შეუძლია სინქრონული გამოძახებები ასინქრონულად გადააქციოს ვირტუალური ძაფების (goroutines) გამოყენებით.

მიკროსერვისების რევოლუცია

განსაკუთრებული ყურადღება დაეთმო wasi:http ინტერფეისს. ახალი „middleware“ სამყარო საშუალებას იძლევა, კომპონენტები ერთმანეთს პირდაპირ, ქსელის გავლის გარეშე დაუკავშირდნენ. ეს პროცესი, რომელსაც „service chaining“-ს უწოდებენ, მიკროსერვისებს შორის კომუნიკაციის დროს მილიწამებიდან ნანოწამებამდე ამცირებს — რაც ექვსი რიგითი სიდიდით უკეთესი შედეგია.

WASI 0.2 (wasi:io)WASI 0.3 (Component Model)
resource pollablefuture
resource input-streamstream
resource output-streamstream (written-to direction)
poll(list)await on a future (runtime-handled)
subscribe() on resourcereturn a future from the call
start-foo / finish-foofoo: async func(...)

ამჟამად Wasmtime 46 უკვე უზრუნველყოფს WASI 0.3-ის სრულ მხარდაჭერას. დეველოპერებს შეუძლიათ დაიწყონ ახალი სტანდარტის გამოყენება და თავიანთი პროექტების ადაპტირება, რადგან სპეციფიკაცია უკვე სტაბილურია და მისი მომავალი ვერსიები თავსებადობას შეინარჩუნებს.