- Zig 0.15 sürümünde yeni IO arayüzü (
std.Io.Reader, std.Io.Writer) kullanıma sunuldu
- Amaç, önceki IO yaklaşımındaki karmaşıklık ve performans sorunlarını iyileştirmekti; ancak gerçek kullanım biçimi konusunda kafa karışıklığı doğdu
tls.Client ve buffer kullanımıyla ilgili, parametrelerin tutarsız aktarım biçimi bu kafa karışıklığını artırıyor
- En temel kullanım örneklerini kurarken bile farklı buffer boyutları ve seçenek alanları belirtme gibi karmaşık gereksinimler var
- Resmî belgeler, kod örnekleri ve yardımcı fonksiyonların eksikliği nedeniyle bu yapı yeni başlayanlar için sezgisel değil
Zig 0.15'te sunulan yeni IO arayüzü ve arka planı
- Zig 0.15 sürümünde
std.Io.Reader ve std.Io.Writer adlı yeni IO tipleri kullanıma sunuldu
- Önceki IO arayüzü, performans sorunları, tiplerin karışması ve
anytype kullanımının aşırılığı nedeniyle karmaşıklığa yol açıyordu
- Yeni IO yapısında arayüzler arasında daha net tip ayrımı ve performans iyileştirmesi başlıca hedefler
tls.Client ve IO arayüzü kullanımındaki pratik sorunlar
- Mevcut smtp kütüphanesini güncellerken
tls.Client.init fonksiyonunun kullanımında kafa karışıklığı yaşanıyor
- Belgelerde
init fonksiyonunun Reader ve Writer pointer'ları ile bir seçenekler kümesini argüman olarak aldığı belirtiliyor
- Zig'in
net.Stream yapısı sırasıyla reader() ve writer() metodlarıyla Stream.Reader/Writer döndürüyor
- Ancak
Stream.Reader/Writer ile std.Io.Reader/Writer tam olarak aynı tipler olmadığı için dönüştürme gerekiyor
- Reader için
interface() metodunu çağırmak, Writer içinse &interface alanını kullanmak gerektiğinden tutarlılık eksikliği hissediliyor
Buffer ve seçenek alanlarını ayarlama sorunu
stream.writer, stream.reader sırasıyla buffer'ı argüman olarak alıyor
- Buffer'ın yeni IO arayüzünde zorunlu bir unsur olduğu özellikle vurgulanıyor
tls.Client.init çağrısında ca_bundle, host, write_buffer, read_buffer gibi dört seçenek alanı mutlaka gerekli
- Seçenek parametresi içinde verilen değerlerle doğrudan argüman olarak verilen değerlerin nasıl ayrıldığı belirsiz hissettiriyor
var tls_client = try std.crypto.tls.Client.init(
reader.interface(),
&writer.interface,
.{
.ca = .{.bundle = bundle},
.host = .{ .explicit = "www.openmymind.net" } ,
.read_buffer = &read_buf2,
.write_buffer = &write_buf2,
},
)
- Pratikte buffer pointer'ları doğru verilmezse program düzgün çalışmayabiliyor; takılma, çökme gibi çeşitli sorunlar ortaya çıkabiliyor
Reader kullanırken sezgisellik sorunu
tls.Client'ın reader alanı kendi başına "şifresi çözülmüş akış" olsa da, gerçekte std.Io.Reader içinde alışıldık bir read metodu bulunmuyor
- Bunun yerine
peek, takeByteSigned, readSliceShort gibi daha az sezgisel metodlar sunuluyor
- Kullanıma en yakın görünen API ise
stream metodu üzerinden buffer'a veri okuma biçimi
var buf: [1024]u8 = undefined;
var w: std.Io.Writer = .fixed(&buf);
const n = try tls_client.reader.stream(&w, .limited(buf.len));
Tüm kod örneği ve gerçek dünya sorunları
- Baştan sona çalışan en küçük örneği oluşturmaya çalışırken bile seçenekler, buffer boyutları ve tip dönüşümleri gibi birçok ayrıntıya dikkat etmek gerekiyor
- Test, belge ve örnek eksikliği öğrenme zorluğunu ve giriş bariyerini artırıyor
- Zig dilindeki tutarlılığı ya da alttaki tasarımı yeterince anlamayanlar için garip gelen pek çok nokta var
- Standart kütüphane içinde bile bu yaklaşım yaygın kullanılmadığından, gerçek kullanım için başvurulacak kaynaklar sınırlı
Deneyim ve sonuç
std.fmt.printInt gibi adlandırma değişiklikleri ve API tasarımındaki dönüşümler nedeniyle migration sürecinin kendisi de kolay değil
reader.interface(), &writer.interface kullanımı, seçeneklerin aktarım biçimi ve birden fazla buffer gerekliliği gibi tekrar eden birçok zorluk yaşanıyor
- TLS gibi ağ/güvenlik protokollerine aşina olmayan biri açısından gereksinimleri kavramak daha da zor gelebiliyor
- Genel olarak, önceki sürümlere kıyasla açıklık, dokümantasyon ve kullanım kolaylığı açısından hâlâ yetersiz kalan birçok nokta bulunuyor
Henüz yorum yok.