この記事では GHC 8.0.1 を用いています. STG言語 STG(Spinless Tagless G-machine)とは,遅延評価で高階関数をサポートする関数型言語のための抽象機械である. STG(Shared Term Graph*1)言語はSTG機械のための言語で,GHCでは Haskellソース → Core言語 → STG言語 → C-- → アセンブラ,LLVM というコンパイル過程で中間言語として現れる. STG言語は,ghcで --ddump-stg オプションをつけてコンパイルすると出力される. Core言語 Core言語は概ねHaskellのサブセットであり,脱糖したHaskellとみることができる.Haskellと異なる点は, 多相関数が引数に明示的に型パラメータをとる(@ a) パターンマッチはcase式でのみ可能で,ネストしたパターンは使えない. 変数はリ
Simplexhc - a STG to LLVM compiler Link to Github repo. I’m trying to understand GHC’s design choices when it comes to compilation. The way GHC currently compiles is to first reduce Haskell to a Core language, which is a minimal subset of Haskell, in some sense. Next, it compiles Core to STG, which is an “abstract machine” that is Haskell’s view of what the hardware should be like. STG stands for
So yesterday I saw someone ask about how many times the variable m gets evaluated in the following Haskell snippet: maxOccurs :: [Int] -> (Int, Int) maxOccurs a = (m, n) where m = maximum a n = length (filter (==m) a) I knew just based on common sense that m only gets evaluated once (when it is first needed, no sooner, no later) but I realised I didn't know the exact mechanics behind that. I grabb
この記事は遅延評価を探る試みの一つです。遅延評価にはメリット, デメリット両方存在しており、この記事を根拠に遅延評価最高!と喧伝は出来ません。 以下、GHCは7.10.1です。 遅延評価と言えばタライ回しです。 遅延評価を持つ言語でタライ回しはやたら速いと言われています。Haskellで書いてみましょう。 import System.Environment (getArgs) tarai :: Int -> Int -> Int -> Int tarai x y z | x <= y = y | otherwise = tarai (tarai (x-1) y z) (tarai (y-1) z x) (tarai (z-1) x y) {-# NOINLINE tarai #-} main :: IO () main = do args <- getArgs let (x:y:z:_)
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く