Kısa hâli

Vexil, ikili protokollerle ilgili bir rahatsızlığımdan doğdu: Bir noktadan sonra gerçek sözleşme, yazılı tanım olmaktan çıkıyor.

Onun yerini birkaç kodlayıcı, yerleşmiş alışkanlıklar, bir avuç test ve baytların o anda ne anlama gelmesi gerektiğine dair ortak bir inanç alıyor.

Sözleşmenin kendisinin açık olmasını istedim.

Bir Vexil şeması hem verinin yapısını hem de ikili temsilini tanımlıyor. Bit genişlikleri, alan sıraları, tamsayı kodlamaları, sınırlar ve evrim kuralları elle yazılmış kodlayıcılara dağılmak yerine aynı yerde duruyor.

Araç zinciri tek bir sözleşmeden Rust, TypeScript, Go ve Python için kodlayıcılar üretiyor. Hedef yalnızca daha küçük mesajlar değil. Aynı değerin her yerde aynı baytları üretmesini ve protokoldeki sapmaların yayıma çıkmadan önce görünür olmasını istiyorum.

Ayrıntıların tamlığına gereğinden fazla önem verme eğilimimin doğru yerde kullanıldığı projelerden biri bu olabilir.

Neden yapıyorum

İkili formatlar çoğu zaman birkaç makul kodlama kararıyla başlayıp yavaşça uygulamalar arasında belgelenmemiş bir anlaşmaya dönüşüyor. Bir sayıyı kodlamak kolay. Diller, uygulamalar ve sürümler birbirinden uzaklaşırken anlaşmayı korumak işin ilginç kısmı.

Vexil bu anlaşmayı başlı başına bir dil olarak ele alıyor. Şemaların standart bir özeti var; uyumluluk denetleyicisi değişiklikleri üretimde sürprize dönüşmeden önce sınıflandırıyor. İkili biçim, kodun tesadüfi bir sonucu olmaktan çıkıp bir insanın inceleyebileceği ve üzerine akıl yürütebileceği bir sözleşmeye dönüşüyor.

Bugün var olanlar

  • Tam genişlikli tamsayılar, numaralandırmalar, mesajlar, koleksiyonlar, içe aktarmalar ve açık ikili kodlamalar içeren bir şema dili.
  • Şemaları denetleyen, kodlayıcı üreten ve uyumluluğu değerlendiren bir derleyici ve komut satırı aracı.
  • Rust, TypeScript, Go ve Python için üretilen çalışma zamanı kitaplıkları.
  • Bağlayıcı bir dil tanımı ve ikili biçim tanımı.
  • Ortak uyumluluk test vektörleri ve diller arası örnekler.
  • Gelişmeye başlayan bir dil sunucusu.

İlginç kısıt

İkili biçim kasıtlı olarak kendini tanımlamıyor. İki taraf da kullanmayı amaçladığı şemayı derliyor ve özetlerini karşılaştırabiliyor.

Bu tercih, çalışma zamanı esnekliğinin bir kısmından küçük boyut ve eksiksiz, incelenebilir bir sözleşme uğruna vazgeçiyor. Temsilin yalnızca bir uygulama ayrıntısı olmadığı telemetri, gömülü sistemler ve benzeri protokoller için yararlı bir ödünleşim.

Gerçekte nerede

Vexil henüz 1.0 öncesinde.

Rust ve TypeScript şu anda üretilen kod açısından en geniş sınama alanına sahip. Go ve Python ortak ikili biçim matrisinin temsil edici bir bölümünü kapsıyor ama henüz aynı genişlikte değil. Ana daldaki dil sunucusu derleyici tanılarını raporluyor; daha zengin düzenleyici özellikleri hâlâ ileride.

Bu ayrımı görünür tutmak benim için önemli. Bu sitenin, yarım kalmış her özelliğin zaman kipini sessizce değiştirip tamamlanmış gibi gösterdiği bir yere dönüşmesini istemiyorum.

İncele

Proje sitesi belgeleri ve teknik tanımları içeriyor. GitHub deposunda kaynak kod, örnekler ve uyumluluk testleri var.

Hızlı başlangıç rehberi tek bir şemayı kod üretiminden ortaya çıkan baytlara ve gidiş-dönüş kodlamasına kadar izliyor. Diller arası örnekse aynı test verisini üretilen dört hedefte de çalıştırıyor.