c# - Rust ile diğer diller arasında etkileşim sağlarken modelleri yönetmenin en iyi yolu nedir?


Arka plan

Şu anda tamamen Rust ile yazılmış bir kütüphane üzerinde çalışıyorum, ancak bu kütüphane Rust dışındaki programlama dilleri tarafından kullanılacak. FFI sınırı üzerinden iletişim kurmak basit olsa da, Rust modelleri ile 1:1 eşleşen modelleri diğer programlama dillerinde yazmak kolay olmadı. Bu soru, FFI sınırı üzerinden model üretme fikrini kolaylaştıracak araçlar veya en iyi uygulamaların olup olmadığıyla ilgilidir.

Mevcut Yaklaşım

Bu konudaki mevcut yaklaşımım şu şekildedir:

  • Çapraz FFI sınırı iletişimi için gerekli olan tüm modeller Serde tarafından serileştirilebilir.
  • Tüm extern fonksiyonları bir string göstericisi alır ve bir string göstericisi döndürür.
  • Fonksiyon çağrıları, JSON olarak serileştirilmiş argümanların bir string'ini alır ve JSON olarak serileştirilmiş yanıtın bir string'ini döndürür. Bu, istemci dilinin, Rust ile yazılanlarla aynı şekilde serileştiren bir model setine sahip olması gerektiği anlamına gelir.

Problem

Arka planda bahsedildiği gibi, FFI sınırı boyunca iletişim oldukça basit olmasına rağmen, Rust'ta yazılmış olanlarla tam olarak eşleşen (ve serileştiren) modelleri yazmak öyle olmamıştır. Şu anda, Rust kütüphanemin 5 farklı programlama dilinde yazılmış 5 sarmalayıcısı bulunuyor ve bu DTO modellerini yazma, test etme ve üzerinde yineleme süreci hiç de basit olmamıştır.

Sorular

  • Kütüphanemden dışa aktarılan modelleri ve fonksiyonları, daha sonra bazı araçlar tarafından modeller üretmek veya en azından minimal bir sarmalayıcı oluşturmak için kullanılabilecek mantıklı bir şekilde tanımlamanın bir yöntemi var mı?
  • JSON'u FFI sınırında göndermek herhangi bir şekilde bir sorun mu?
  • Bilinçsiz olduğum herhangi bir en iyi uygulama var mı? Yoksa bu sorunlara çözüm var mı?

Denenen Alternatif Yöntemler

  • Protokol Tamponları: JSON ve elle yazılmış modeller yerine protokol tamponlarını kullanmayı denedim. Ancak, protokol tamponları benim kullanım durumum için ideal olmalarını engelleyen iki ana sorunla karşılaşıyor:

    • Protokol tamponlarında ihtiyacım olan bazı ilkel tipler yok. Örneğin: 8-bit tamsayılar, 16-bit tamsayılar ve 128-bit tamsayı tipleri. Bazı tiplerin 8-bit ile sınırlı olmasını ve bu tiplerden üretilen modellerin diğer dilde mevcut olan 8-bit tamsayı tipini kullanmasını sağlamayı istiyorum.
    • Protokol tamponları tüm alanların isteğe bağlı olduğunu varsayar ve aksi şekilde yapılamaz. Bu, çoğu uygulama için sorun olmasa da, ben geliştirdiğim kütüphane isteğe bağlı alanların varsayılan değerleriyle uğraşmaktansa çalıştırma zamanında panik yapmayı tercih eder.
  • Cap'n'proto: Bunun yukarıdakine oldukça benzer sorunları var, tüm alanların isteğe bağlı yapılmasını zorunlu kılıyor ki bu benim kullanım durumum için kabul edilemez.
  • OpenAPI: Tüm modelleri, istemci dillerinin modelleri oluşturmak için kullanabileceği bir OpenAPI şeması kullanarak kısa bir süre için tanımlamayı denedim. Bunun aşağıdaki sorunları vardı:

    • OpenAPI kod üreticileri aracılığıyla oluşturulan modeller çoğu zaman okunaksızdır, derlenmez ve anlaması veya üzerinde yineleme yapmak zordur.

Cevap #1

Bu amaç için sade eski jsonschema kullanmayı düşündünüz mü? OpenAPI özellikle web API'lerine daha fazla yönelik olsa da, modelleriniz için o şemayı yazabilir ve hem kütüphaneniz hem de istemciler için şemadan oluşturulan modelleri kullanabilirsiniz.

Düzenleme: "JSON dizelerini FFI sınırları üzerinden gönderme" ile ilgili görebildiğim tek önemli sorun, zorunlu olarak serileştirme/seri çözme yükünü eklemeniz gerekecek olması ve bunun önemsiz olmayabileceğidir.

İlgili makaleler