WebAssembly Component Model'in asenkron yeteneklerini gösteren dijital arayüzler ve kod akışlarıyla soyut ve fütüristik bir temsil.

WASI 0.3.0: WebAssembly’e Doğal Asenkron Yetenekler Geliyor

WASI 0.3.0: WebAssembly Bileşenlerine Doğal Asenkron Yetenekler Geliyor

WebAssembly System Interface (WASI) Subgroup’u tarafından yapılan oylama sonucunda WASI 0.3.0 resmi olarak onaylandı. Bu önemli sürüm, WASI’yi WebAssembly Bileşen Modeli’nin asenkron (async) temel öğeleri üzerine yeniden konumlandırarak büyük bir adım atıyor. Daha önceki WASI 0.2 sürümünde asenkron işlemleri yönetmek için bazı ‘akrobatik’ çözümler gerekirken, artık asenkron yetenekler bileşen modeline doğal olarak entegre edildi. Bu sayede, aynı işlevler çok daha ergonomik bir şekilde yazılabiliyor.

Asenkron Programlamada Dönüşüm: WASI 0.2’den 0.3’e

WASI 0.2’deki ‘wasi:io’ paketiyle kodlanan desenler, Component Model’in doğal asenkron yapısıyla WASI 0.3’te şu şekilde basitleştirildi:

  • resource pollable artık future<T> oldu.
  • resource input-stream yerini stream<u8>‘e bıraktı.
  • resource output-stream ise yazma yönünde yine stream<u8> olarak standardize edildi.
  • poll(list<pollable>) çağrıları, çalışma zamanı tarafından yönetilen await ifadelerine dönüştü.
  • Kaynaklardaki subscribe() metotları, doğrudan çağrıdan future<...> döndürmeye başladı.
  • start-foo / finish-foo çiftleri, tek bir foo: async func(...) fonksiyonuna birleşti.

‘wasi:cli’ Modülündeki Yenilikler

Yapısal olarak ‘stdin.wit’, ‘stdout.wit’, ‘stderr.wit’, ‘run.wit’, ‘exit.wit’, ‘terminal.wit’, ‘environment.wit’ gibi dosyalar aynı kalırken, en ilgi çekici değişiklik stdio arayüzlerinde yaşandı:

WASI 0.2 (Örnek):

interface stdin { use wasi:io/streams.{input-stream}; get-stdin: func() -> input-stream; }

interface stdout { use wasi:io/streams.{output-stream}; get-stdout: func() -> output-stream; }

WASI 0.3 (Örnek):

interface stdin { use types.{error-code}; read-via-stream: func() -> tuple<stream<u8>, future<result<_, error-code>>>; }

interface stdout { use types.{error-code}; write-via-stream: func(data: stream<u8>) -> future<result<_, error-code>>; }

WASI 0.2’de bir output-stream alıp ona zorunlu olarak yazılırken, WASI 0.3’te bir stream<u8> geçirilir ve yazma işlemi tamamlandığında çözülecek bir future döndürülür. Yeni wasi:cli/types arayüzü ise paylaşılan error-code varyantlarını (io, illegal-byte-sequence, pipe) taşır.

‘wasi:sockets’: Ağ Erişiminde Büyük Sadeleşme

network kaynağı tamamen kaldırıldı. WASI 0.2’de ağ erişimi, her bağlama, bağlantı kurma ve arama çağrısına geçirilen bir yetenek kaynağı olarak modelleniyordu. WASI 0.3, bu kaynağı tamamen ortadan kaldırarak ağ erişimini dünya (world) içe aktarımları aracılığıyla sağlıyor.

Her start/finish çifti, tek bir async func haline geldi. Gelişmekte olan ara durumlar (bind-in-progress, connect-in-progress, listen-in-progress) ve bunları tetikleyen subscribe() -> pollable mekanizmaları artık mevcut değil.

WASI 0.2 (Örnek):

start-bind: func(network: borrow<network>, local: ip-socket-address) -> result<_, error-code>; finish-bind: func() -> result<_, error-code>; start-connect: func(network: borrow<network>, remote: ip-socket-address) -> result<_, error-code>; finish-connect: func() -> result<tuple<input-stream, output-stream>, error-code>;

WASI 0.3 (Örnek):

bind: async func(local-address: ip-socket-address) -> result<_, error-code>; connect: async func(remote-address: ip-socket-address) -> result<_, error-code>; listen: async func() -> result<_, error-code>; accept: async func() -> result<tuple<tcp-socket, ip-socket-address>, error-code>;

WASI 0.2’nin finish-connect fonksiyonunun TCP akış çiftini doğrudan döndürdüğü unutulmamalıdır. WASI 0.3’te connect özel bir şey döndürmez; bayt G/Ç, soket kaynağının kendi akış metotları üzerinde yaşar. UDP de aynı sadeleştirmeyi gördü; gelen/giden datagram akış kaynakları, düz async send ve async receive ile değiştirildi. TCP, UDP ve isim çözme genelindeki hata kodları, yeni bir connection-broken durumu ve açık uçlu other(option<string>) kuyruğu ile tek bir error-code varyantında birleştirildi.

‘wasi:http’: İstek ve Yanıt İşlemede Birlik

Bu sürümün en belirgin yeniden düzenlemesi HTTP modülünde gerçekleşti.

Kaynakların Birleşimi: 8’den 2’ye Düşüş

WASI 0.2, gelen/giden × istek/yanıt/gövde alanı için tam bir kaynak matrisine sahipti (incoming-request, outgoing-request, incoming-response, outgoing-response, incoming-body, outgoing-body, future-trailers, future-incoming-response). WASI 0.3 ise sadece request ve response kaynaklarına sahip. Gövdeler doğrudan stream<u8> olarak, fragmanlar (trailers) ise future<result<option<trailers>, error-code>> olarak temsil ediliyor. future-incoming-response ise düz bir future<result<response, error-code>>‘un bu işi yapmasıyla ortadan kalkıyor.

İşleyici (Handler) Artık Asenkron Bir Fonksiyon

WASI 0.2’deki incoming-handler, doğal asenkron dönüşlerin eksikliğini gidermek için bir response-outparam parametresi kullanıyordu:

WASI 0.2 (Örnek):

interface incoming-handler { handle: func(request: incoming-request, response-out: response-outparam); }

WASI 0.3 (Örnek):

interface handler { handle: async func(request: request) -> result<response, error-code>; }

Giden taraf da benzer bir şekilde düzenlendi:

interface client { send: async func(request: request) -> result<response, error-code>; }

Ara Yazılım (Middleware) İçin Yeni Dünyalar

Eski proxy dünyasının yerini service ve hem handler‘ı içe aktaran hem de dışa aktaran middleware dünyası aldı. Bu, istek yolunda bulunan bileşenlere birinci sınıf destek sağlıyor.

‘wasi:filesystem’: Akış Tabanlı Dosya İşlemleri

Akış tabanlı okuma/yazma işlemleri, artık akış ve future çifti şeklinde değişti:

WASI 0.2 (Örnek):

read-via-stream: func(offset: filesize) -> result<input-stream, error-code>; write-via-stream: func(offset: filesize) -> result<output-stream, error-code>;

WASI 0.3 (Örnek):

read-via-stream: func(offset: filesize) -> tuple<stream<u8>, future<result<_, error-code>>>; write-via-stream: func(data: stream<u8>, offset: filesize) -> future<result<_, error-code>>;

Dizin yinelemesi de kaynak tabanlı iteratörden akışa geçiş yaptı:

WASI 0.2 (Örnek):

read-directory: func() -> result<directory-entry-stream, error-code>;

WASI 0.3 (Örnek):

read-directory: func() -> tuple<stream<directory-entry>, future<result<_, error-code>>>;

‘wasi:clocks’: İsimlendirme ve Basitleştirmeler

wasi:clocks modülündeki değişiklikler, bilinçli olarak çoğunlukla yeniden adlandırmalardan oluşuyor. Bu değişiklikler, alt sistemlerde görülen döngüsel etkileri vurgulamak için belirtilmiştir.

WASI#79 (Tipler için standart dışı isim kullanımından kaçınma) değişikliği, paketi geleneksel isimlere taşıdı: wall-clock, system-clock oldu ve datetime, instant haline geldi. Bu değişimin motivasyonu, ekosistemin geri kalanıyla (POSIX, Rust’ın std::time vb.) saatler hakkında konuşma tutarlılığını sağlamaktı. ‘Wall clock’ ve ‘datetime’ WASI’ye özgü ifadelerdi ve diğer sistemlerle uyumlu değildi. Benzer bir nedenle wasi:filesystem zaman damgaları da aynı değişikliği takip etti. Küçük bir types.wit dosyası, duration = u64 takma adını paylaşmak için eklendi. Ayrıca monotonic-clock, pollable döndüren subscribe-instant ve subscribe-duration çağrılarını kaldırdı; çağıranlar artık her yerde kullanılan aynı desen olan ana bilgisayar tarafından sağlanan bir zamanlayıcı future’ını await ediyor.

Bu değişikliklerin alt sistemlere etkisi genellikle mekanik bul-değiştir işlemleridir. Örneğin, WASI test süitindeki güncelleme WebAssembly/wasi-testsuite@f13976f adresinde incelenebilir.

Comments

No comments yet. Why don’t you start the discussion?

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir