タグ付けされた質問 「ghc」

Glasgow Haskell Compilerは、最先端のオープンソースコンパイラであり、関数型言語Haskellのインタラクティブな環境です。特に明記されていない限り、ほとんどすべての人がこれを使用するため、一般的にHaskellについてではなく、GHCについての質問にこのタグを使用します。

1
GHCにおける自動専門化の推移性
GHC 7.6 のドキュメントから: そもそも、SPECIALIZEプラグマは必要ないことがよくあります。モジュールMをコンパイルすると、GHCのオプティマイザー(-O付き)は、Mで宣言された各トップレベルのオーバーロード関数を自動的に考慮し、Mで呼び出されるさまざまな型に特化します。オプティマイザーは、インポートされた各INLINABLEオーバーロード関数も考慮します。 Mで呼び出されるさまざまな型に特化しています。 そして さらに、関数fにSPECIALIZEプラグマが指定されると、GHCは、それらがSPECIALIZEプラグマと同じモジュールにある場合、またはINLINABLEである場合、fによって呼び出されるすべての型クラスオーバーロード関数の特殊化を自動的に作成します。など、推移的に。 したがって、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 …
392 haskell  ghc 

2
制約を追跡する手法
シナリオは次のとおりです。型シグネチャを使用していくつかのコードを記述しましたが、GHCは一部のxとについてx〜yを推定できませんでしたy。通常、GHCに骨を投げて、関数の制約に同型を単に追加できますが、これはいくつかの理由で悪い考えです。 コードの理解を強調するものではありません。 最終的に5つの制約で十分な場合があります(たとえば、5がもう1つの特定の制約によって暗示されている場合) 何か間違ったことをしたり、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 -> (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が行うのが好きなことは、Cの5%以内を試すことです(またはそれを打つこともできますが、GHCはHaskellをCにコンパイルするため、非効率的なCプログラムを使用していることになります)。私の質問は、なぜですか? Haskellは宣言型であり、ラムダ計算に基づいています。マシンアーキテクチャは明らかにチューリングマシンに基づいているため、必須です。実際、Haskellには特定の評価順序さえありません。また、マシンデータタイプを処理する代わりに、代数データタイプを常に作成します。 最も奇妙なのは高次関数です。関数をその場で作成し、それらを使い果たすと、プログラムが遅くなると考えるでしょう。しかし、より高次の関数を使用すると、実際にHaskellが高速になります。実際、Haskellコードを最適化するには、マシンのようにではなく、よりエレガントで抽象的なものにする必要があるようです。Haskellのより高度な機能は、それを改善しなければ、パフォーマンスに影響を与えるようには見えません。 これが不満に聞こえる場合は申し訳ありませんが、ここに私の質問があります。その抽象的な性質と物理マシンとの違いを考慮して、なぜHaskell(GHCでコンパイル)がそれほど高速なのですか? 注:私がCや他の命令型言語がチューリングマシンにいくらか似ている(しかし、HaskellがLambda計算に似ているというわけではない)理由は、命令型言語では有限数の状態(別名行番号)があるためです、およびテープ(RAM)とともに、状態と現在のテープがテープに対して何を行うかを決定します。チューリングマシンからコンピューターへの移行については、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の中間言語です。リーディングコアは、プログラムのパフォーマンスをよりよく理解するのに役立ちます。Coreを読むためのドキュメントやチュートリアルを誰かに頼まれましたが、あまり見つかりませんでした。 GHCコアを読むために利用できるドキュメントにはどのようなものがありますか? これが私がこれまでに見つけたものです: HaskellをCと同じ速さで書く:厳格さ、遅延、再帰を利用する Cと同じくらい速いHaskell:高レベルで作業して低レベルのパフォーマンスを実現 RWH:第25章プロファイリングと最適化 CUFPでの高性能Haskell講演(スライド65-80)

3
GHCが確実に実行すると期待できる最適化は何ですか?
GHCには実行可能な多くの最適化がありますが、それらすべてがどのようなものであるか、またそれらがどの程度の確率で実行される可能性があるのか​​、またどのような状況で実行されるのかはわかりません。 私の質問は次のとおりです。毎回、どのような変換が適用されると期待できますか、またはほぼ同じでしょうか。頻繁に実行(評価)されるコードを見て、最初の考えが「うーん、多分それを最適化する必要がある」である場合、2番目の考えは「それについてさえ考えないでください」 GHCはこれを得た」? 私は「Stream Fusion:From Lists to Streams to Nothing at All」というペーパーを読んでいて、彼らがリスト処理を別の形式に書き換えて、GHCの通常の最適化が単純なループに確実に最適化する手法は私にとっては斬新でした。自分のプログラムがそのような最適化の対象となる時期を知るにはどうすればよいですか? GHCマニュアルにはいくつかの情報がありますが、それは質問への回答の一部に過ぎません。 編集:私は賞金を始めています。私が欲しいのは、ラムダ/レット/ケースフローティング、タイプ/コンストラクタ/関数の引数の特殊化、厳密性分析とボックス化解除、ワーカー/ラッパー、および私が省略した他の重要なGHCのすべてのような下位レベルの変換のリストです、および入力コードと出力コードの説明と例、および理想的には、全体の効果がその部分の合計よりも多い状況の図。そして、理想的には、変換が行われない場合のいくつかの言及起こります。私はすべての変換について斬新な長さの説明を期待していません。全体像がわかる限り、2、3の文とインラインの1行のコード例(または20ページの科学論文でない場合はリンク)で十分です。それの終わりまでに明らかに。コードを見て、コンパイルしてタイトなループになるか、そうでないのか、それを作成するために何を変更する必要があるのか​​を推測できるようにしたいと思います。(ここでは、ストリームフュージョンなどの大きな最適化フレームワークにはあまり興味がありません(それについての論文を読んだだけですが、これらのフレームワークを作成する人々が持っている種類の知識に関心があります)。

1
制約付きの専門化
GHCにクラス制約のある関数を特殊化させるのに問題があります。私はここに私の問題の最低限の例がありますFoo.hsと Main.hsを。2つのファイルがコンパイルされ(GHC 7.6.2、ghc -O3 Main)、実行されます。 注: Foo.hsは実際には削除されています。制約が必要な理由を知りたい場合は、ここでもう少しコードを見ることができます。コードを1つのファイルに配置するか、その他多くの小さな変更を加えた場合、GHCはへの呼び出しを単にインライン化しますplusFastCyc。plusFastCycマークされていても、GHCがインライン化するには大きすぎるため、これは実際のコードでは発生しませんINLINE。重要なのは、インライン化ではなく、への呼び出しを特化するplusFastCycことです。plusFastCycは実際のコードの多くの場所で呼び出されるため、GHCに強制することができたとしても、そのような大きな関数を複製することは望ましくありません。 対象のコードはplusFastCycで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:2 MB Python:15 MB SBCL:9MB OpenJRE-26MB GHC:113 MB 「なぜHaskellが適切なツールであるならば、なぜ私はサイズを気にする必要がないのか」という伝道には興味がありません。これは技術的な質問です。
147 haskell  ghc 

2
GHC-modは型にフルネームを使用する必要がありますか?
ghc-modタイプ/構文チェックなどを行うためにvimプラグインを使用しようとしています。ただし、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キロバイトのサイズであり、数十万のメッセージを保持する必要があります。 このプログラムを遅延に対して最適化したいと思います。メッセージの送信と受信の間の時間は10ミリ秒未満でなければなりません。 プログラムはHaskellで書かれており、GHCでコンパイルされています。ただし、ガベージコレクションの一時停止は、待機時間の要件に対して長すぎることがわかりました。実際のプログラムでは100ミリ秒を超えています。 次のプログラムは、アプリケーションの簡易バージョンです。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 = Msg n …

2
GHCで巨大なバイナリにコンパイルされた小さなHaskellプログラム
些細な小さな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 ガベージコレクションの遅延により、実際のメモリ割り当てが高くなることを理解しています。遅延評価のために大きく異なる場合があります(サンクサイズは値のサイズとは関係ありません)。問題は、データ型が与えられた場合、完全に評価されたときにその値がどれだけのメモリを消費するかということです。 :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のメモ化はいつ自動化されますか?
m2が以下に含まれていないのにm1が明らかにメモ化されている理由がわかりません。 m1 = ((filter odd [1..]) !!) m2 n = ((filter odd [1..]) !! n) m1 10000000は最初の呼び出しで約1.5秒かかり、その後の呼び出しではその数分の1(おそらくリストをキャッシュする)ですが、m2 10000000では常に同じ時間がかかります(呼び出しごとにリストを再構築します)。何が起こっているのでしょうか?GHCが関数をメモするかどうか、いつメモするかについての経験則はありますか?ありがとう。
106 haskell  ghc  memoization 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.