Questions tagged «ghc»

格拉斯哥Haskell编译器是功能语言Haskell的最先进的开源编译器和交互式环境。将此标签用于专门针对GHC而不是有关Haskell的问题,因为除非另有说明,否则几乎每个人都将使用它。

1
GHC中自动专业化的及物性
从GHC 7.6 的文档中: 您通常甚至根本不需要SPECIALIZE编译指示。编译模块M时,GHC的优化器(带有-O)自动考虑M中声明的每个顶级重载函数,并将其专门化为M中调用它的不同类型。优化器还考虑每个导入的INLINABLE重载函数,并将其专门用于M中不同类型的调用。 和 此外,给定函数f的SPECIALIZE编译指示,GHC将自动为f调用的任何类型类重载函数创建专用化,如果它们与SPECIALIZE编译指示在同一模块中,或者它们是不可插入的;等等。 因此,GHC应该自动对标记为没有杂用语的某些/大多数/全部(?)函数进行特殊化处理,如果我使用显式的杂用语,则该特殊化是可传递的。我的问题是:自动专业化是可传递的吗?INLINABLE 具体来说,这是一个小例子: Main.hs: import Data.Vector.Unboxed as U import Foo main = let y = Bar $ Qux $ U.replicate 11221184 0 :: Foo (Qux Int) (Bar (Qux ans)) = iterate (plus y) y !! 100 in putStr $ show $ foldl1' (*) ans Foo.hs: …
392 haskell  ghc 

2
约束追踪技术
这是一种情况:我已经编写了一些带有类型签名的代码,GHC抱怨无法为x x和y推导某些代码y。通常,您可以将GHC扔掉,然后将同构添加到功能约束中,但这是一个坏主意,原因有以下几个: 它不强调理解代码。 您最终可以得到5个约束,而其中一个约束就足够了(例如,如果5个约束被一个更具体的约束隐含) 如果您做错了某事或GHC无助,您可能会受到虚假约束的限制 我只花了几个小时与案例3进行斗争。我正在玩syntactic-2.0,并且试图定义一个与域无关的版本share,类似于中定义的版本NanoFeldspar.hs。 我有这个: {-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-} import Data.Syntactic -- Based on NanoFeldspar.hs data Let a where Let :: Let (a :-> (a -> b) :-> Full b) share :: (Let :<: sup, Domain a ~ sup, Domain b ~ sup, SyntacticN (a -> …
322 haskell  constraints  ghc 

8
Haskell / GHC中的“ forall”关键字有什么作用?
我开始了解如何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东西... 我倾向于使用清晰,无术语的英语,而不是学术环境中通常使用的那种语言。我尝试阅读的大多数解释(通过搜索引擎可以找到的解释)都存在以下问题: 他们不完整。他们解释如何使用这个关键字(如“生存型”)的一个组成部分,这使得直到我读码我感到高兴的是,使用它在一个完全不同的方式(比如runST,foo和bar以上)。 假设我在本周流行的离散数学,范畴论或抽象代数的任何分支中都读到了最新的东西,他们的想法密密麻麻。(如果我从来不读的话“咨询文件无论执行的细节”再次,这将是太快了。) 它们的编写方式经常将甚至是简单的概念变成曲折而破碎的语法和语义。 所以... …
312 haskell  syntax  types  ghc  forall 

4
为什么Haskell(GHC)这么快?
Haskell(使用GHC编译器)比您期望的要快得多。正确使用它可以接近低级语言。(Haskellers最喜欢做的事情是尝试获得5%的C(甚至击败它),但这意味着您正在使用效率低下的C程序,因为GHC将Haskell编译为C。)我的问题是,为什么? Haskell是声明性的,基于lambda演算。机器架构显然必须基于图灵机。实际上,Haskell甚至没有特定的评估顺序。另外,无需处理机器数据类型,而是始终创建代数数据类型。 最奇怪的是高阶函数。您可能会认为,即时创建函数并将其扔掉会使程序变慢。但是使用高阶函数实际上会使Haskell更快。实际上,为了优化Haskell代码,您似乎需要使其更优雅,更抽象,而不是像机器一样。如果不能改善Haskell的更高级功能,它们似乎都不会影响它的性能。 抱歉,这听起来很抱歉,但这是我的问题:考虑到Haskell的抽象性质以及与物理机器的区别,为什么Haskell(与GHC编译)这么快? 注意:我说C和其他命令式语言在某种程度上类似于图灵机的原因(但在某种程度上来说,Haskell与Lambda微积分不一样)是,在命令式语言中,您具有有限数量的状态(即行号)以及Tape(撞锤),以便状态和当前磁带决定对磁带执行什么操作。从图灵机到计算机的过渡,请参阅Wikipedia条目,图灵机等效项。

2
-XAllowAmbiguousTypes什么时候合适?
我最近发布了一个问题,关于句法2.0有关的定义share。我已经在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 -> b), SyntacticN (a …
212 haskell  ghc 

4
阅读GHC核心
核心是GHC的中间语言。Reading Core可以帮助您更好地了解程序的性能。有人要求我提供有关阅读Core的文档或教程,但找不到很多。 哪些文档可用于阅读GHC Core? 到目前为止,这是我发现的内容: 与C一样快地编写Haskell:利用严格性,惰性和递归 Haskell速度与C一样快:在高海拔下工作可获得低水平性能 RWH:第25章。分析和优化 CUFP上的高性能Haskell演讲(幻灯片65-80)

3
GHC可以可靠地执行哪些优化?
GHC可以执行很多优化,但是我不知道它们全都有,也不知道它们在多大程度上会在什么情况下执行。 我的问题是:我希望每次或几乎都会应用哪些转换?如果我查看一段要经常执行(评估)的代码,而我的第一个念头是“嗯,也许我应该优化它”,在这种情况下,我的第二个念头应该是:“甚至不要考虑它, GHC收到了这个?” 我正在阅读论文《流融合:从列表到流再到什么都没有》,而他们使用的将列表处理重写为另一种形式的技术对我来说是新颖的,GHC的常规优化然后可以将其可靠地优化为简单的循环。我如何知道自己的程序何时可以进行这种优化? 《 GHC手册》中有一些信息,但这只是回答问题的一部分。 编辑:我开始赏金。我想要的是较低级转换的列表,例如lambda / let / case-floating,type / constructor / function参数专门化,严格性分析和拆箱,worker / wrapper以及我遗漏的其他重要GHC所做的其他事情,以及输入和输出代码的说明和示例,以及理想情况下总效果超过其各个部分之和的情况的说明。理想情况下,提到何时不进行转换发生。我不希望每个转换都有新颖的解释,只要大的图景就可以用几个句子和内联的单行代码示例就足够了(或者链接,如果不是到二十页的科学论文)。最后清除。我希望能够看一段代码,并能够很好地猜测它是否可以编译成一个紧密的循环,或者为什么不编译,或者我必须进行更改以使其得以实现。(我对诸如流融合之类的大型优化框架不那么感兴趣(我只是读过一篇文章),而对编写这些框架的人所拥有的知识则没有那么大的兴趣。)

1
有约束的专业化
我在让GHC专门化具有类约束的函数时遇到问题。我有我的问题的一个小例子,在这里:Foo.hs和 Main.hs。这两个文件将编译(GHC 7.6.2,ghc -O3 Main)并运行。 注意: Foo.hs真的被剥夺了。如果您想了解为什么需要约束,可以在此处查看更多代码。如果我将代码放在单个文件中或进行许多其他小的更改,GHC只会内联对的调用plusFastCyc。在实际代码中不会发生这种情况,因为plusFastCyc即使GHC标记为,也无法内联INLINE。关键是要专门针对plusFastCyc,而不是内联它。plusFastCyc在实际代码中的很多地方都调用了,因此即使希望强制GHC进行复制,也无法复制这么大的函数。 感兴趣的代码是plusFastCycin Foo.hs,在此处复制: {-# INLINEABLE plusFastCyc #-} {-# SPECIALIZE plusFastCyc :: forall m . (Factored m Int) => (FastCyc (VT U.Vector m) Int) -> (FastCyc (VT U.Vector m) Int) -> (FastCyc (VT U.Vector m) Int) #-} -- Although the next specialization makes `fcTest` fast, …
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插件进行类型/语法检查等。但是,我发现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 argument of ‘containers-0.5.6.2:Data.Map.Base.map’, namely || ‘zippedMap’ …
143 haskell  ghc  ghc-mod 

5
减少Haskell程序中的垃圾收集暂停时间
我们正在开发一个程序,该程序可以接收和转发“消息”,同时保留这些消息的临时历史记录,以便在需要时可以告诉您消息的历史记录。消息是通过数字标识的,通常大小约为1 KB,我们需要保留成百上千的此类消息。 我们希望针对延迟优化此程序:发送和接收消息之间的时间必须小于10毫秒。 该程序用Haskell编写,并由GHC编译。但是,我们发现,垃圾回收暂停对于我们的延迟要求来说太长了:在我们的实际程序中超过100毫秒。 以下程序是我们应用程序的简化版本。它使用a Data.Map.Strict来存储消息。消息ByteString由标识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 data Msg = Msg !Int !ByteString.ByteString type Chan = Map.Map Int ByteString.ByteString message :: Int -> Msg message n = …


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 我知道实际的内存分配是由于延迟垃圾回收而导致的。由于懒惰的评估,它可能有很大的不同(并且thunk的大小与值的大小无关)。问题是,在给定数据类型的情况下,充分评估其值会占用多少内存? 我发现:set +sGHCi中有一个选项可以查看内存统计信息,但是目前尚不清楚如何估算单个值的内存占用量。

1
为什么Haskell的“不执行任何操作”功能id会占用大量内存?
Haskell具有一个标识函数,该函数不变地返回输入。定义很简单: 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 几秒钟后(根据任务管理器,大约有2 gb的内存),编译将失败ghc: out of …
112 haskell  ghc 

4
GHC Haskell中的备忘录何时自动生成?
我无法弄清楚为什么m1显然被记忆而m2不在以下内容: m1 = ((filter odd [1..]) !!) m2 n = ((filter odd [1..]) !! n) m1 10000000在第一次调用时大约需要1.5秒,而在随后的调用中则花费一小部分(大概是缓存列表),而m2 10000000总是花费相同的时间(每次调用都重建列表)。知道发生了什么吗?关于GHC是否以及何时记忆功能有任何经验法则吗?谢谢。
106 haskell  ghc  memoization 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.