Feldspar: Nyelv digitális jelfeldolgozáshoz Eötvös Loránd Tudományegyetem, Budapest Támogatja: Ericsson, KMOP-1.1.2-08
Feldspar funkcionális beágyazott nyelv Feldspar digitális jelfeldolgozáshoz párhuzamossághoz
Feldspar funkcionális beágyazott digitális jelfeldolgozáshoz nyelv párhuzamossághoz
A Feldspar csapata Ericsson (Göteborg, Svédország) Chalmers University of Technology (Göteborg, Svédország) ELTE (Budapest, Magyarország)
A Feldspar csapata Ericsson (Göteborg, Svédország) Chalmers University of Technology (Göteborg, Svédország) ELTE (Budapest)
A Feldspar csapata Ericsson Chalmers University of Technology (Göteborg) ELTE (Budapest)
A Feldspar csapata Ericsson Chalmers University of Technology (Göteborg) ELTE (Budapest)
A Feldspar rövid története 2009-ben indult Támogatás: Ericsson Egyéb állami hozzájárulások: Swedish Foundation for Strategic Research Nemzeti Fejlesztési Ügynökség Nyílt forráskódú projekt, BSD3 licenc A fejlesztés Subversion és Trac segítségével történik
Motiváció chip Valós idejű DSP hardver C nyelv Processzorfüggő utasítások Olvasható Hatékony kód Hardverfüggő programok A programokat nehéz... megírni karbantartani új hardverhez igazítani
Célkitűzések Magasszintű nyelv Hardverfüggetlen Tesztelhető a hardvertől függetlenül Több különböző célplatform: Hardverek támogatása Hardvergyártók saját maguk is fejleszthetnek hozzá platformot
A jelenlegi állapot 0.4 2011. április Nyelvi alapok arithmetikai-, logikai- és bitműveletek Párhuzamos vektorművetelek Streamek Mátrixok Fordítás: C99, Texas Instruments kiterjesztések Fejlesztés alatt: LLVM támogatás; Feldspar,,operációs rendszer''
Telepítés A Haskell nyelvet használjuk Telepítés: A szabványos Haskell csomagkezelő Nyelvi elemek, értelmező cabal install feldspar-language cabal install feldspar-compiler Feldspar kód írása Betöltés Haskell értelmezőbe: kiértékelés / fordítás Fordítás C-re Parancssoros Feldspar fordító
Nyelvek beágyazása Beágyazás (embedding): egy programozási nyelvet egy másik felhasználásával dolgozunk ki Beágyazott nyelv (embedded language) Gazdanyelv (host language) A nyelv elemeivel absztrakt szintaxisfákat hozunk létre Értelmező: a szintaxisfát értelmezi Fordító: a szintaxisfából kódot állít elő
Példa nyelvbeágyazásra data Expr = True False Not Expr And Expr Expr Or Expr Expr data Prog = Skip Print Expr Seq Prog Prog If Expr Prog (&&) :: Expr Expr Expr a && b = And a b ( ) :: Expr Expr Expr a b = Or a b cmds cmds cmds cmds eval :: Prog [Bool] eval p = compile :: Prog String compile p =... :: [Prog] Prog [] = Skip [p] = p (p:ps) = Seq p (cmds ps) myprogram :: Prog myprogram = cmds [ Print True, If (False && True) (Print False) ]
Miért érdemes beágyazni? Lexer Parser Szemantikus ellenőrzés Prototípus gyors elkészítése Gazdanyelv: nagy kifejezőerejű metanyelv, amellyel beágyazott programok hozhatóak létre genprog = cmds [ if n % 2 == 0 then Print True else Print False n [0..99] ] Ellenben: a forrásszöveg a fordító számára nem áll rendelkezésre Hogyan csináljunk nyomkövetést akkor?
Haskell Tiszta Lusta Erős típusrendszer Remekül használható gazdanyelvként: Minimalista szintakszis A számok túlterhelhetőek http://haskell.org
Vektor műveletek map :: (a b) Vector a Vector b fold :: (a b a) a Vector b a (++) :: Vector a Vector a Vector a reverse :: Vector a Vector a take :: Data Length Vector a Vector a zipwith :: (a b c) Vector a Vector b Vector c és a Haskell listafüggvényei Feldsparban
Példa scalarprod :: Numeric t => Vector (Data t) -> Vector (Data t)-> Data t scalarprod a b = sum (zipwith (*) a b)
Példa Egyszerű fordítás scalarprod :: Numeric t => Vector (Data t) -> Vector (Data t)-> Data t scalarprod a b = sum (zipwith (*) a b) for(i=0; i<len; ++i) { temp[i] = in1[i] * in2[i]; } for(i=0; i<len; ++i) { out = out + temp[i]; }
Példa Fusion alkalmazása scalarprod :: Numeric t => Vector (Data t) -> Vector (Data t)-> Data t scalarprod a b = sum (zipwith (*) a b) for(i=0; i<len; ++i) { out = out + in1[i] * in2[i]; }
Fusion...? Az (egyszerűsített) vektor típusunk: data Vector a = Vector { length :: Data Length, idxfun :: Data Index a }
Fusion...? Az (egyszerűsített) vektor típusunk: data Vector a = Vector { length :: Data Length, idxfun :: Data Index a } map, reverse, map f (Vector n ixf) = Vector n (f. ixf) reverse (Vector n ixf) = Vector n (\i ixf (n 1 - i))
Fusion...? Az (egyszerűsített) vektor típusunk: data Vector a = Vector { length :: Data Length, idxfun :: Data Index a } map, reverse, map f (Vector n ixf) = Vector n (f. ixf) reverse (Vector n ixf) = Vector n (\i ixf (n 1 - i)) Fordítási séma: for(i=0; i<n; ++i) { out[i] = ixf i }
Összefoglalás Bővebben itt lehet olvasni a Feldsparról: http://feldspar.inf.elte.hu/ Köszönjük a figyelmet!