GHC Çekirdeği Okuma


193

Çekirdek GHC'nin ara dilidir. Okuma Çekirdeği, programınızın performansını daha iyi anlamanıza yardımcı olabilir. Birisi benden Core okuma ile ilgili dokümantasyon veya öğreticiler istedi, ancak fazla bir şey bulamadım.

GHC Core'u okumak için hangi belgeler mevcut?

Şimdiye kadar bulduğum şey:



Yanıtlar:


272

GHC Core, tüm Haskell'in çevrildiği System FC dilidir. Çekirdek için (yaklaşık) dilbilgisi şöyle verilir:

resim açıklamasını buraya girin

Çekirdek, daha basit ve daha iyi bilinen Sistem F ile yakından ilişkilidir . GHC'nin Core seviyesinde yaptığı tüm dönüşümler , performansı artırmak için bu Core temsilinin tipini koruyan yeniden düzenlemeleridir. Ve çok iyi bilinmeyen, GHC'yi programlamak için doğrudan Core'a yazabilirsiniz.

GHC Core derleyici boru hattına uyar (2002'de olduğu gibi sans-LLVM ve CMM):

resim açıklamasını buraya girin

GHC Core hakkında bilgi edinmek için birincil belgeler:

Anlamaya yardımcı olabilecek ilgili materyaller:

Çekirdek sırayla şuna benzeyen STG koduna çevrilir:

resim açıklamasını buraya girin

Core'daki komik isimler "Z-kodlaması" nda kodlanmıştır:

resim açıklamasını buraya girin

GHC Core'un türleri ve çeşitleri (Tolmach'ın belgesinden):

resim açıklamasını buraya girin

Son olarak, Haskell'inizi GHC'nin bildiği temel talimatlara göre optimize ettiğinizde GHC'nin primopları GHC Core çıktısında düzenli olarak görünür. Primop seti, önceden işlenmiş bir dosyada Temel işlevler kümesi olarak verilir .


61
Verdiğiniz her cevap her zaman gülünç derecede eksiksizdir. Başka bir oy verin ve devam edin; Ben yığınları eğiyorum.
Robert Massaioli

3
Don ve genel Haskell topluluğunun SO aracılığıyla yayınladığı CC-wiki belgelerinin miktarı şaşırtıcı. Herkese iyi Q ve A'ları takip edin!
Dan Burton

4
Bahsettiğini biliyorum, ama cevapta ghc-core'un yararlılığının vurgulanması gerektiğini düşünüyorum.
Nikita Volkov

24

İpucu: Tip ek açıklamaları ve zorlamalarla ilgilenmiyorsanız -ddump-simpl, -dsuppress-allseçenekle birlikte kullanın. Çekirdek çıkışı çok daha okunabilir olmalıdır.


5
-dsuppress-allgerçekten faydalıdır. Ayrıca -dsuppress-coercionsyalnızca atmalardan kurtulmak istiyorsanız da kullanabilirsiniz (etrafında çok sayıda yeni tip olduğunda faydalıdır).
tibbe

8

Tam olarak GHC Çekirdek dili olmasa da, Don'un belirttiği gibi STG dili oldukça benzerdir. Son zamanlarda STG dil + makinesinin tip güvenliğini kanıtlama egzersizinden geçtim ve daha sonra Core'u kolayca anlayabildiğimi buldum.

STG'yi öğrenmek için kullandığım metne oldukça erişilebilir: Stok Donanımına Tembel Fonksiyonel Dillerin Uygulanması: Simon Peyton-Jones'un Spineless Tagless G makinesi . Makalenin çoğu uygulama ayrıntılarıyla ilgilidir, ancak 4. bölüme özellikle karşı sezgisel tasarım kararlarının bazıları için motivasyon veren ve benzer örneklerin çevirilerini sağlayan STG dilinin yukarıdan aşağıya bir açıklaması olarak tavsiye ederim map.


STG, Core'dan çok daha düşük bir seviyedir. Derleme hattı: Haskell -> Çekirdek -> STG -> C-- -> Makine Kodu
Akangka

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.