2016-09-10 22 views
11

'da neler yapıyor Haskell'in C FFI ile ilgili bazı belgeleri okuyordum. Ve ben sadece çok iyi anlamadığım Storable adında bir typeclass karşılaştım.Stoken tipinde yazım işleri Haskell

Bu tip bir sınıfın örnekleri, bu türlerin C koduyla arayüz oluştururken bunlara "işaretçi" eklemeleri gerekiyor mu? Ayrıca, sizeOf,, peek, poke bireysel işlevleri neler yapar? peek ve poke görünüyor ve veri Ptr a tarafından işaret edilen bir yere veri okumak veya veri yazmak için kullanılır. Bu doğru mu?

Ancak, sizeOf ve alignment'un ne anlama geldiğini bilmiyorum. Birisi kullanımlarını açıklığa kavuşturmak için örnekler verebilir mi?

cevap

10

Haskell değerleri hafızada C ile çok uyumlu olmayan bir şekilde saklar. Sonuç olarak, haskell'den bir C fonksiyonu çağırmak ve doğrudan haskell değerlerine geçmek mümkün değildir. Bunun yerine, değerin bir kopyasını oluşturmalısınız, ancak tam bir kopya değil, daha ziyade C tarafından anlaşılan bir biçimde. Bu, Storable'un yaptığı gibi. Bu nedenle, haskell değerlerinin C dostu bir forma (örneğin, C düşüncesi yapılarına) serileştirilmesini sağlar. Aynı zamanda zıt işlemi destekler, değerleri seri halinde kaldırabilir. Bu, bir C işlevi haskell den çağrıldığında faydalıdır ve karmaşık (yani ilkel olmayan) bir değer döndürür.

Serileştirme/serpiştirme işlemi poke/peek yardımı ile gerçekleşir. sizeOf, değerin C temsilinin bayt boyutunu döndürür. Bu mekanizmanın yalnızca sabit boyutta bir C temsiline sahip olan değerler için çalıştığını unutmayın (ör. Yapılar). C dizeleri gibi şeyler desteklemez, onlar differently tedavi edilir. alignment için olduğu gibi, haskell alanında yapılan bellek ayırma işlemlerinin platformun hizalama gereksinimlerini karşıladığından emin olmak için kullanılır.

+0

@smilingbuddha evet, düzeltdim. Sonuç olarak, bir değerin haskell temsilinin büyüklüğü hakkında konuşmak mantıklı değildir, çünkü bu gösterim kullanıcı için çok opaktır. Haskell'in değerlerini nasıl sakladığını denetlemenin hiçbir yolu yoktur. – redneb

+0

Teşekkürler! "Alignment" işlevini biraz daha ayrıntılı olarak açıklar mısınız? "Verilerim MyData = MyData {intarray :: [Int], dbarray :: [Double], length :: Int}" Hizalama için nasıl bir uygulama yazabilirim? " – smilingbuddha

+0

Hizalama için, genellikle C'nin 'int 'türünün hizalamasını kopyalarsınız. Bunu şöyle yapabilirsin: 'alignment _ = alignment (undefined :: CInt)'. – redneb