SORU
17 NİSAN 2013, ÇARŞAMBA


Yom yabancı primop (tamsayı-gmp örnek)format çağrı

integer-gmp kaynak kodu yabancı primops GHC Primops page belirtildiği gibi ürün açısından uygulanabilir anlamak için kontrol edilmiştir. Onları llvm hack kullanarak veya fvia-C/gcc - bu bir öğrenme deneyimi daha beni interger-gmp Kütüphanesi kullanır, bu üçüncü yaklaşımı anlamak için uygulamak için teknikleri farkındayım.

Yani, ben baktım YOM öğretici MİCROSOFT sayfa (pdf link) gitti GHC CMM page, ve hala bazı cevapsız sorular (sabit tutmak için tüm bu kavramları kafasız kazma içine hangi ÜRÜN ne yapıyorum şimdi). integer-bmp cmm file parça: bu kod var

integer_cmm_int2Integerzh (W_ val)
{
   W_ s, p; /* to avoid aliasing */

   ALLOC_PRIM_N (SIZEOF_StgArrWords   WDS(1), integer_cmm_int2Integerzh, val);

   p = Hp - SIZEOF_StgArrWords;
   SET_HDR(p, stg_ARR_WORDS_info, CCCS);
   StgArrWords_bytes(p) = SIZEOF_W;

   /* mpz_set_si is inlined here, makes things simpler */
   if (%lt(val,0)) {
        s  = -1;
        Hp(0) = -val;
   } else {
     if (%gt(val,0)) {
        s = 1;
        Hp(0) = val;
     } else {
        s = 0;
     }
  }

   /* returns (# size  :: Int#,
                 data  :: ByteArray#
               #)
   */
   return (s,p);
}

ghc cmm header: olarak tanımlanmıştır

W_ is alias for word.
ALLOC_PRIM_N is a function for allocating memory on the heap for primitive object.
Sp(n) and Hp(n) are defined as below (comments are mine):
#define WDS(n) ((n)*SIZEOF_W) //WDS(n) calculates n*sizeof(Word)
#define Sp(n)  W_[Sp   WDS(n)]//Sp(n) points to Stackpointer   n word offset?
#define Hp(n)  W_[Hp   WDS(n)]//Hp(n) points to Heap pointer   n word offset?

5-9 hatları (hat 1 1/0 karışıklık varsa Başlat) anlamıyorum. Daha ayrıntılı olarak:

  • Neden işlevi ALLOC_PRİM_N biçimi (bayt,eğlenceli,arg) çağrı yolu var mı?
  • P neden bu şekilde manipüle edilir?

İşlev olarak anlıyorum (bakıyor işlevi imza Prim.hs) alır bir referans döndürür (int, byte dizisi) (saklı s,p sırasıyla kod).

if block, satır içi arama hakkında merak herkes için gmp ürün uygulama mpz_init_si function. Benim tahminim ise arama fonksiyonu tanımlı nesne dosyası ccall, olamaz inlined (hangi mantıklı beri nesne kodu, bir ara kod - LLVM yaklaşım gibi görünüyor daha uygun satır içi uygulaması ile LLVM IR). Bu yüzden, optimizasyon inlined olması işlevi Ürün Gösterimi tanımlamak için. Eğer bu tahminim yanlışsa lütfen beni düzeltin.

Çizgiler 5-9 açıklaması çok takdir edilecektir. Diğer makrolar tamsayı-gmp dosyasında tanımlanan ilgili sorularım var, ama bir yazı istesem çok şey olabilir. Eğer cevap soru ile bir Haskell wiki sayfası ya da bir blog (post bağlantı olarak cevap olacağını çok takdir (ve eğer yaparsan, ben de takdir adım adım yürüyüş-through bir tamsayı-gmp Yom makro gibi GMP_TAKE2_RET1).

CEVAP
22 EYLÜL 2014, PAZARTESİ


Bu satırları Başladıktan# Haskell yeni bir yığın ayırmak, onları anlamak için daha önce DZD yığın yönetilmektedir hakkında biraz bilmek gerekiyor.

  • Her yeteneği (= Haskell kodu çalıştırır OS thread) kendi adamıştırkreşyığın içine normal yapar bir alan, bunun gibi küçük bir ayırma. Nesneler sadece yeteneği çöp toplayıcı tetikler çocuk odasında kalan alan, aşan bir ayırma yapmak için çalışır kadar yüksek adreslerine düşük adresleri bu alana sırayla tahsis edilir.

  • Nesneleri kelime boyutunun katı, yani 4 çekirdek yığın 32-bit 64-bit sistemleri üzerinde sistem ve 8 bayt bayt.

  • Yom-seviye Hp puan için kayıt (başlangıç) tahsis edilmiş olan son sözü kreş. HpLim kreş ayrılabilecek olan son sözü işaret eder. (HpLim de GC için dünya durdurmak için, ya da zaman uyumsuz bir özel durum göndermek için başka bir iş parçacığı tarafından 0 olarak ayarlayabilirsiniz.)

  • https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/HeapObjects bireysel yığın nesnelerin düzeni hakkında bilgi vardır. Özellikle her yığın bir nesne ile başlarbilgi işaretçine olduğunu tanımlayan.,

Haskell türü Başladıktan# öbek ile uygulanan bir tür ARR_WORDS nesne. ARR_WORDS bir nesnenin (bilgi işaretçisi takip ederek) boyutu (bayt olarak) rastgele veri (yükü) kapsamaktadır. Yükü işaretçisi yığın nesneleri Haskell için saklayabilirsiniz. böylece GC tarafından yorumlanır değil, ama başka bir şey saklayabilirsiniz. SİZEOF_StgArrWords boyutu Başlığı ortak ARR_WORDS yığın nesneler, ve bu durumda yükü sadece tek bir kelime, yani SİZEOF_StgArrWords WDS(1) miktarı alana ihtiyacımız var ayrılacak.

ALLOC_PRİM_N (SİZEOF_StgArrWords WDS(1), integer_cmm_int2İntegerzh, val) gibi bir şey için genişler

Hp = Hp   (SIZEOF_StgArrWords   WDS(1));
if (Hp > HpLim) {
    HpAlloc = SIZEOF_StgArrWords   WDS(1);
    goto stg_gc_prim_n(integer_cmm_int2Integerzh, val);
}

İlk satır miktarı Hp tarafından tahsis edilecek artar. Yığın taşması için ikinci satır kontrol eder. Üçüncü hat GC geri böylece ayırmaya çalıştık miktar kayıtları. Dördüncü satır GC çağırır.

Dördüncü satırı en ilgincidir. Bağımsız çöp toplama yapıldıktan sonra konu yeniden nasıl GC söyle: bağımsız değişken ile integer_cmm_int2İntegerzh val. reinvoke gerekir ""Stg_gc_prim_n içinde ("") ALLOC_PRİM_N. o val olmayan bir işaretçi değişken olduğunu gösterir (bu durumda bir İnt#).? < Eğer val bir işaretçi Haskell yığın nesne, GC bilmesine gerek olduğunu canlı (çok değil elde toplanan ve reinvoke fonksiyonu ile yeni adresi olan nesne. Bu durumda _p değişken kullanmak istiyorum. Ayrıca, birden çok işaretçi değişkenler için _pp gibi türevleri vardır, _d için Çift# değişkenler, vb.

Satırdan sonra başarıyla SİZEOF_StgArrWords WDS(1) baytlık bir blok tahsis ettik ve unutma 5, Hp son sözünü işaret eder. Yani, = - SİZEOF_StgArrWords Hp p Bu bloğu başlangıcına p ayarlar. Satır 8 p info işaretçi, ARR_WORDS olarak yeni oluşturulan yığın nesne tespit doldurur. OKBS maliyet-center yığını geçerli, sadece profil için kullanılır. Profil oluşturma etkin olduğunda her yığın nesne temel olarak tahsisi için kimin sorumlu olduğunu tanımlayan ekstra bir alan içerir. Olmayan bir profil oluşturur, OKBS yok ve SET_HDR sadece işaretçi bilgileri ayarlar. Son olarak, satır 9 Bayt büyüklüğünde alanı doldurur#. İşlev geri kalanı yük doldurur ve imzalar değer ve Konumdan dönüş# nesne işaretçisi.

Yani, bu konuda Yom dilinden DZD yığını daha fazla olarak sona erdi, ama bu yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LearnCode.academy

    LearnCode.ac

    20 Aralık 2012
  • MADFINGER Games a.s.

    MADFINGER Ga

    21 NİSAN 2009
  • Tutorials Junction

    Tutorials Ju

    1 Ocak 2014