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
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
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
Összefoglalás ●
Bővebben itt lehet olvasni a Feldsparról: http://feldspar.inf.elte.hu/ Köszönjük a figyelmet!