คำถามติดแท็ก ghc

Glasgow Haskell Compiler เป็นคอมไพเลอร์โอเพ่นซอร์สที่ล้ำสมัยและสภาพแวดล้อมแบบโต้ตอบสำหรับภาษาที่ใช้งานได้ Haskell ใช้แท็กนี้สำหรับคำถามเฉพาะเกี่ยวกับ GHC และไม่เกี่ยวกับ Haskell โดยทั่วไปเนื่องจากเกือบทุกคนจะใช้แท็กนี้เว้นแต่จะระบุไว้เป็นอย่างอื่น

1
ความไวของความเชี่ยวชาญอัตโนมัติใน GHC
จากเอกสารสำหรับ GHC 7.6: [Y] คุณไม่ต้องการแม้แต่ความเชี่ยวชาญเป็นพิเศษในตอนแรก เมื่อทำการรวบรวมโมดูล M เครื่องมือเพิ่มประสิทธิภาพของ GHC (พร้อม -O) จะพิจารณาฟังก์ชั่นโอเวอร์โหลดระดับสูงสุดแต่ละรายการที่ประกาศใน M โดยอัตโนมัติและเชี่ยวชาญสำหรับประเภทต่าง ๆ ที่เรียกว่าเป็น M เครื่องมือเพิ่มประสิทธิภาพจะพิจารณาฟังก์ชั่นโอเวอร์โหลด และเชี่ยวชาญสำหรับประเภทต่าง ๆ ที่มันถูกเรียกว่าใน M และ ยิ่งไปกว่านั้นเมื่อได้รับ SPECIALIZE pragma สำหรับฟังก์ชั่น f GHC จะสร้างความเชี่ยวชาญเฉพาะสำหรับฟังก์ชั่นประเภทเกินพิกัดใด ๆ ที่เรียกโดย f หากอยู่ในโมดูลเดียวกันกับ SPECAGIZE pragma หรือหากไม่มีการเชื่อมโยง; และอื่น ๆ ต่อเนื่อง ดังนั้น GHC ควรใช้ฟังก์ชันบางส่วน / มากที่สุด / ทั้งหมด (?) ที่ทำเครื่องหมายINLINABLE โดยไม่มี …
392 haskell  ghc 

2
เทคนิคการติดตามข้อ จำกัด
นี่คือสถานการณ์: ผมเคยเขียนโค้ดบางประเภทที่มีลายเซ็นและ GHC บ่นไม่สามารถอนุมาน x ~ Y สำหรับบางคนและx yโดยทั่วไปคุณสามารถขว้าง GHC กระดูกและเพิ่ม isomorphism ให้กับข้อ จำกัด ของฟังก์ชันได้ แต่นี่เป็นความคิดที่ไม่ดีด้วยเหตุผลหลายประการ: ไม่เน้นการเข้าใจรหัส คุณสามารถจบลงด้วยข้อ จำกัด 5 ข้อที่ใครจะพอเพียง (ตัวอย่างเช่นหากข้อ 5 ถูกระบุโดยข้อ จำกัด เฉพาะอีกข้อหนึ่ง) คุณสามารถจบลงด้วยข้อ จำกัด ปลอมหากคุณทำอะไรผิดพลาดหรือหาก GHC ไม่ช่วยเหลือ ฉันใช้เวลาหลายชั่วโมงในการต่อสู้คดี 3. ฉันเล่นด้วยsyntactic-2.0และผมพยายามที่จะกำหนดรุ่นโดเมนที่เป็นอิสระของคล้ายกับรุ่นที่กำหนดไว้ในshareNanoFeldspar.hs ฉันมีสิ่งนี้: {-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-} import Data.Syntactic -- Based on NanoFeldspar.hs data Let a …
322 haskell  constraints  ghc 

8
คำหลัก "forall" ใน Haskell / GHC ทำอะไรได้บ้าง
ฉันเริ่มเข้าใจวิธีการใช้forallคำหลักใน "ประเภทที่มีอยู่" เช่นนี้: data ShowBox = forall s. Show s => SB s อย่างไรก็ตามนี่เป็นเพียงส่วนย่อยของวิธีการforallใช้งานและฉันก็ไม่สามารถห่อหุ้มใจการใช้งานในสิ่งต่าง ๆ เช่นนี้: runST :: forall a. (forall s. ST s a) -> a หรืออธิบายว่าทำไมสิ่งเหล่านี้จึงแตกต่าง: foo :: (forall a. a -> a) -> (Char, Bool) bar :: forall a. ((a -> a) -> (Char, Bool)) หรือทั้งหมดRankNTypes... ฉันมักจะชอบภาษาอังกฤษที่ชัดเจนและไร้คำศัพท์มากกว่าภาษาที่เป็นเรื่องปกติในสภาพแวดล้อมทางวิชาการ …
312 haskell  syntax  types  ghc  forall 

4
ทำไม Haskell (GHC) ถึงเร็วขนาดนี้
Haskell (พร้อมGHCคอมไพเลอร์) นั้นเร็วกว่าที่คุณคาดไว้มาก ใช้อย่างถูกต้องสามารถใช้ภาษาใกล้เคียงกับภาษาระดับต่ำได้ (สิ่งที่ชื่นชอบสำหรับ Haskellers ที่ต้องทำคือพยายามและรับภายใน 5% ของ C (หรือแม้กระทั่งเอาชนะ แต่นั่นหมายความว่าคุณกำลังใช้โปรแกรม C ที่ไม่มีประสิทธิภาพเนื่องจาก GHC รวบรวม Haskell ถึง C) คำถามของฉันคือทำไม? Haskell เป็นการประกาศและขึ้นอยู่กับแคลคูลัสแลมบ์ดา สถาปัตยกรรมเครื่องจักรมีความจำเป็นอย่างชัดเจนโดยขึ้นอยู่กับเครื่องจักรทัวริง ที่จริง Haskell ไม่มีคำสั่งประเมินที่เฉพาะเจาะจง นอกจากนี้แทนที่จะจัดการกับชนิดข้อมูลเครื่องคุณทำประเภทข้อมูลพีชคณิตตลอดเวลา ที่แปลกประหลาดที่สุดคือฟังก์ชั่นการสั่งซื้อที่สูงขึ้น คุณอาจคิดว่าการสร้างฟังก์ชั่นได้ทันทีและการขว้างมันไปรอบ ๆ จะทำให้โปรแกรมช้าลง แต่การใช้ฟังก์ชันคำสั่งซื้อที่สูงกว่าทำให้ Haskell เร็วขึ้น ดูเหมือนว่าในการเพิ่มประสิทธิภาพรหัส Haskell คุณจะต้องทำให้มันดูสง่างามและเป็นนามธรรมมากกว่าการใช้เครื่องจักร ไม่มีคุณสมบัติขั้นสูงใด ๆ ของ Haskell ที่ดูเหมือนจะส่งผลกระทบต่อประสิทธิภาพการทำงานของมันหากไม่ได้ปรับปรุง ขออภัยถ้านี่คือเสียงที่ฟังดู แต่นี่คือคำถามของฉัน: ทำไม Haskell (เรียบเรียงกับ GHC) เร็วขนาดนี้โดยพิจารณาจากธรรมชาติที่เป็นนามธรรมและความแตกต่างจากเครื่องจักรทางกายภาพ? หมายเหตุ: …

2
เมื่อ -XAllowAmbiguousTypes เหมาะสมเมื่อใด
ผมเคยโพสต์เมื่อเร็ว ๆ นี้คำถามเกี่ยวกับประโยค-2.0shareเกี่ยวกับความหมายของ ฉันเคยทำงานในGHC 7.6 : {-# LANGUAGE GADTs, TypeOperators, FlexibleContexts #-} import Data.Syntactic import Data.Syntactic.Sugar.BindingT data Let a where Let :: Let (a :-> (a -> b) :-> Full b) share :: (Let :<: sup, sup ~ Domain b, sup ~ Domain a, Syntactic a, Syntactic b, Syntactic (a …
212 haskell  ghc 

4
กำลังอ่าน GHC Core
หลักคือภาษากลางของ GHC Reading Core สามารถช่วยให้คุณเข้าใจประสิทธิภาพของโปรแกรมได้ดีขึ้น มีคนถามหาเอกสารหรือแบบฝึกหัดเกี่ยวกับการอ่าน Core แต่ฉันไม่สามารถหาได้มากนัก มีเอกสารอะไรบ้างสำหรับการอ่าน GHC Core นี่คือสิ่งที่ฉันพบ: เขียน Haskell เร็วเท่ากับ C: ใช้ประโยชน์จากความเข้มงวดความเกียจคร้านและการเรียกซ้ำ Haskell เร็วเท่ากับ C: ทำงานที่ระดับความสูงสูงเพื่อประสิทธิภาพระดับต่ำ RWH: บทที่ 25 การทำโปรไฟล์และการเพิ่มประสิทธิภาพ Haskell ประสิทธิภาพสูงคุยกันที่ CUFP (สไลด์ 65-80)

3
GHC คาดว่าจะสามารถเพิ่มประสิทธิภาพการทำงานได้อย่างน่าเชื่อถือ?
GHC มีการปรับแต่งมากมายที่สามารถทำงานได้ แต่ฉันไม่รู้ว่าพวกเขาทั้งหมดคืออะไรและมีแนวโน้มว่าจะต้องดำเนินการอย่างไรและอยู่ภายใต้สถานการณ์ใด คำถามของฉันคืออะไรฉันสามารถคาดหวังการเปลี่ยนแปลงอะไรที่จะนำไปใช้ทุกครั้งหรือเกือบจะเป็นเช่นนั้น? ถ้าฉันดูรหัสที่จะถูกดำเนินการ (ประเมิน) บ่อยครั้งและความคิดแรกของฉันคือ "hmm บางทีฉันควรปรับให้เหมาะสม" ซึ่งในกรณีนี้ความคิดที่สองของฉันควรเป็น "ไม่ต้องคิดเลย GHC ได้รับสิ่งนี้ "? ฉันกำลังอ่านStream Stream Fusionของกระดาษ: จากรายการไปจนถึงสตรีมไปยังไม่มีอะไรเลยและเทคนิคที่พวกเขาใช้ในการเขียนรายการประมวลผลในรูปแบบอื่นซึ่งการปรับตามปกติของ GHC จะเพิ่มประสิทธิภาพลงในลูปแบบง่าย ๆ ฉันจะบอกได้อย่างไรว่าโปรแกรมของฉันมีสิทธิ์ได้รับการเพิ่มประสิทธิภาพแบบนั้น? มีข้อมูลบางอย่างในคู่มือ GHC แต่มีเพียงบางส่วนที่จะตอบคำถาม แก้ไข: ฉันเริ่มได้รับรางวัล สิ่งที่ฉันต้องการคือรายการของการแปลงระดับล่างเช่นแลมบ์ดา / เคส / กรณีลอย, พิเศษ / ประเภทคอนสตรัค / ฟังก์ชั่นการโต้แย้งการวิเคราะห์ความเข้มงวดและ unboxing, คนงาน / ห่อหุ้มและสิ่งอื่น ๆ ที่สำคัญ GHC พร้อมด้วยคำอธิบายและตัวอย่างของอินพุตและเอาต์พุตโค้ดและภาพประกอบที่สมบูรณ์แบบของสถานการณ์เมื่อเอฟเฟกต์ทั้งหมดมากกว่าผลรวมของส่วนต่างๆ และเป็นที่กล่าวถึงเมื่อการเปลี่ยนแปลงไม่ได้ผลเกิดขึ้น ฉันไม่ได้คาดหวังว่าคำอธิบายที่มีความยาวนวนิยายของการเปลี่ยนแปลงทุกอย่างสองสามประโยคและตัวอย่างโค้ดอินไลน์ซับหนึ่งอาจเพียงพอ ชัดเจนในตอนท้ายของมัน ฉันต้องการที่จะดูรหัสและสามารถคาดเดาได้ดีว่ามันจะรวบรวมเป็นวงแคบหรือไม่หรือทำไมไม่หรือสิ่งที่ฉันจะต้องเปลี่ยนเพื่อให้ได้ (ฉันไม่สนใจมากที่นี่ในกรอบการเพิ่มประสิทธิภาพขนาดใหญ่เช่นการหลอมกระแส …

1
ความเชี่ยวชาญด้วยข้อ จำกัด
ฉันมีปัญหาในการทำให้ GHC เชี่ยวชาญฟังก์ชั่นที่มีข้อ จำกัด ด้านชั้นเรียน ผมมีตัวอย่างที่น้อยที่สุดของปัญหาของฉันที่นี่: Foo.hsและ Main.hs รวบรวมไฟล์สองไฟล์ (GHC 7.6.2, ghc -O3 Main) และเรียกใช้ หมายเหตุ: Foo.hsถูกปล้นจริง ๆ ถ้าคุณต้องการที่จะเห็นว่าทำไมข้อ จำกัด เป็นสิ่งจำเป็นที่คุณสามารถดูรหัสเล็ก ๆ น้อย ๆที่นี่ ถ้าฉันใส่รหัสในไฟล์เดียวหรือทำการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ อื่น ๆ อีกมากมายเพียงแค่ GHC inlines plusFastCycการเรียกร้องให้ สิ่งนี้จะไม่เกิดขึ้นในรหัสจริงเนื่องจากplusFastCycมีขนาดใหญ่เกินไปที่ GHC จะอินไลน์แม้ว่าจะถูกทำเครื่องหมายไว้INLINEก็ตาม ประเด็นก็คือจะต้องชำนาญการโทรplusFastCycไม่ใช่แบบอินไลน์ plusFastCycถูกเรียกในหลาย ๆ ที่ในรหัสจริงดังนั้นการทำซ้ำฟังก์ชันที่มีขนาดใหญ่จะไม่เป็นที่ต้องการแม้ว่าฉันจะบังคับให้ GHC ทำเช่นนั้น รหัสที่น่าสนใจคือplusFastCycในFoo.hsทำซ้ำที่นี่: {-# INLINEABLE plusFastCyc #-} {-# SPECIALIZE …
156 haskell  ghc 

6
ทำไม GHC ถึงใหญ่ / ใหญ่
มีคำตอบง่ายๆ: ทำไม GHC ถึงมีขนาดใหญ่? OCaml: 2MB Python: 15MB SBCL: 9MB OpenJRE - 26MB GHC: 113MB ไม่สนใจในการประกาศเรื่อง "ทำไมฉันไม่ควรสนใจเรื่องขนาดถ้า Haskell เป็นเครื่องมือที่เหมาะสม"; นี่เป็นคำถามทางเทคนิค
147 haskell  ghc 

2
GHC-mod ต้องใช้ชื่อเต็มสำหรับประเภทหรือไม่
ฉันพยายามใช้ghc-modvim plugin เพื่อทำการพิมพ์ / ตรวจสอบไวยากรณ์ ฯลฯ อย่างไรก็ตามฉันพบว่าghc-modใช้เส้นทางแบบเต็มทุกประเภทในข้อความแสดงข้อผิดพลาดเช่น: test.hs|71 col 13 error| Couldn't match type ‘Data.Text.Internal.Text’ || with ‘[GHC.Types.Char]’ || Expected type: containers-0.5.6.2:Data.Map.Base.Map || [GHC.Types.Char] || ([(integer-gmp-1.0.0.0:GHC.Integer.Type.Integer, || integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)], || containers-0.5.6.2:Data.Set.Base.Set || integer-gmp-1.0.0.0:GHC.Integer.Type.Integer) || Actual type: containers-0.5.6.2:Data.Map.Base.Map || Data.Text.Internal.Text || ([(integer-gmp-1.0.0.0:GHC.Integer.Type.Integer, || integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)], || containers-0.5.6.2:Data.Set.Base.Set || integer-gmp-1.0.0.0:GHC.Integer.Type.Integer) || In the second …
143 haskell  ghc  ghc-mod 

5
การลดเวลาหยุดการรวบรวมขยะในโปรแกรม Haskell
เรากำลังพัฒนาโปรแกรมที่รับและส่งต่อ "ข้อความ" ในขณะที่เก็บประวัติชั่วคราวของข้อความเหล่านั้นเพื่อให้สามารถบอกประวัติข้อความหากมีการร้องขอ ข้อความจะถูกระบุเป็นตัวเลขโดยทั่วไปจะมีขนาดประมาณ 1 กิโลไบต์และเราจำเป็นต้องเก็บรักษาข้อความเหล่านี้นับแสนรายการ เราต้องการเพิ่มประสิทธิภาพโปรแกรมนี้สำหรับเวลาแฝง: เวลาระหว่างการส่งและรับข้อความต้องน้อยกว่า 10 มิลลิวินาที โปรแกรมนี้เขียนใน Haskell และคอมไพล์ด้วย GHC อย่างไรก็ตามเราพบว่าการเก็บรวบรวมขยะหยุดชั่วคราวนานเกินไปสำหรับข้อกำหนดด้านเวลาแฝงของเรา: มากกว่า 100 มิลลิวินาทีในโปรแกรมจริงของเรา โปรแกรมต่อไปนี้เป็นเวอร์ชันที่เรียบง่ายของแอปพลิเคชันของเรา มันใช้Data.Map.Strictเพื่อเก็บข้อความ ข้อความจะถูกByteStrings Intระบุด้วย 1,000,000 ข้อความถูกแทรกในลำดับตัวเลขที่เพิ่มขึ้นและข้อความที่เก่าที่สุดจะถูกลบออกอย่างต่อเนื่องเพื่อเก็บประวัติไว้ที่สูงสุด 200,000 ข้อความ module Main (main) where import qualified Control.Exception as Exception import qualified Control.Monad as Monad import qualified Data.ByteString as ByteString import qualified Data.Map.Strict as Map …

2
โปรแกรม Small Haskell ที่คอมไพล์ด้วย GHC เป็นไบนารีขนาดใหญ่
แม้แต่โปรแกรม Haskell ขนาดเล็กเล็กน้อยก็กลายเป็นโปรแกรมปฏิบัติการขนาดมหึมา ฉันได้เขียนโปรแกรมขนาดเล็กที่คอมไพล์ (ด้วย GHC) เป็นไบนารีโดยมีขนาดขยาย 7 MB! อะไรทำให้แม้แต่โปรแกรม Haskell ขนาดเล็กที่คอมไพล์เป็นไบนารีขนาดใหญ่ได้ ฉันจะทำอะไรได้บ้างเพื่อลดสิ่งนี้

2
รอยเท้าหน่วยความจำของชนิดข้อมูล Haskell
ฉันจะหาจำนวนหน่วยความจำจริงที่ต้องใช้ในการจัดเก็บค่าของข้อมูลบางประเภทใน Haskell (ส่วนใหญ่เป็น GHC) ได้อย่างไร เป็นไปได้ไหมที่จะประเมินที่รันไทม์ (เช่นใน GHCi) หรือสามารถประเมินความต้องการหน่วยความจำของชนิดข้อมูลผสมจากส่วนประกอบได้หรือไม่ โดยทั่วไปหากทราบข้อกำหนดของหน่วยความจำประเภทaและbค่าใช้จ่ายของหน่วยความจำประเภทข้อมูลพีชคณิตเช่น: data Uno = Uno a data Due = Due a b ตัวอย่างเช่นค่าเหล่านี้ใช้หน่วยความจำกี่ไบต์? 1 :: Int8 1 :: Integer 2^100 :: Integer \x -> x + 1 (1 :: Int8, 2 :: Int8) [1] :: [Int8] Just (1 :: Int8) Nothing …

1
ทำไมฟังก์ชัน "ไม่ทำอะไร" ของ Haskell, id, ใช้หน่วยความจำมากมาย
Haskell มีฟังก์ชัน Identity ซึ่งส่งคืนอินพุตที่ไม่เปลี่ยนแปลง คำจำกัดความนั้นง่ายมาก: id :: a -> a id x = x ดังนั้นเพื่อความสนุกสนานสิ่งนี้ควรส่งออก8: f = id id id id id id id id id id id id id id id id id id id id id id id id id id id main = print $ f 8 …
112 haskell  ghc 

4
การบันทึกอัตโนมัติใน GHC Haskell เป็นอย่างไร
ฉันคิดไม่ออกว่าทำไม m1 จึงถูกบันทึกในขณะที่ m2 ไม่ได้อยู่ในสิ่งต่อไปนี้: m1 = ((filter odd [1..]) !!) m2 n = ((filter odd [1..]) !! n) m1 10,000000 ใช้เวลาประมาณ 1.5 วินาทีในการโทรครั้งแรกและเศษของการโทรครั้งต่อ ๆ ไป (น่าจะเป็นการแคชรายการ) ในขณะที่ m2 10,000000 จะใช้เวลาเท่ากันเสมอ (การสร้างรายการใหม่ด้วยการโทรแต่ละครั้ง) มีความคิดเกิดอะไรขึ้น? มีกฎง่ายๆว่า GHC จะบันทึกฟังก์ชันหรือไม่และเมื่อใด ขอบคุณ.
106 haskell  ghc  memoization 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.