Η γλώσσα Fortress Γιώργος Κορφιάτης Εργαστήριο Λογισμικού, ΕΜΠ Ερευνητικά Θέματα Υλοποίησης Γλωσσών Προγραμματισμού, 2009-10
Η γλώσσα Fortress Νέα γλώσσα από τη Sun Για υπολογισμούς υψηλής απόδοσης Προγραμματισμός σε υψηλό επίπεδο Γενικής χρήσης, έμφαση σε επιστημονικές εφαρμογές (εξού όνομα που θυμίζει Fortran...) http://projectfortress.sun.com
Βασικά χαρακτηριστικά Ευρεία υποστήριξη παραλληλισμού (implicit) Σύνταξη βασισμένη στα μαθηματικά Μαθηματικές έννοιες (διανύσματα, πίνακες, σύνολα, ) Στατικό typing με type inference Αντικείμενα και traits Στοιχεία συναρτησιακού προγραμματισμού Επεκτασιμότητα
Ένα πρώτο παράδειγμα component Factorial export Executable factorial(n: Z32) = if 0 n 1 then 1 elif n > 1 then n ( factorial(n 1) ) else fail Non-negative integer expected. run() = println(factorial 5)
Σύνταξη sum : RR64 : = 0 f o r k< 1: n do a [ k ] := (1 alpha ) b [ k ] sum += c [ k ] x^k sum: R64 := 0 for k 1 : n do a k := (1 α)b k sum += c k x k ελληνικοί κ.α χαρακτήρες unicode δείκτες, εκθέτες μεταβλητές σε πλάγια συμπαράθεση όρων (juxtaposition) υπερφορτωμένη (πολλαπλασιασμός αριθμών, εφαρμογή συνάρτησης σε όρισμα, string concatenation) 1:n γεννήτρια τιμών από 1 ως n
Σύνταξη sum : RR64 : = 0 f o r k< 1: n do a [ k ] := (1 alpha ) b [ k ] sum += c [ k ] x^k sum: R64 := 0 for k 1 : n do a k := (1 α)b k sum += c k x k ελληνικοί κ.α χαρακτήρες unicode δείκτες, εκθέτες μεταβλητές σε πλάγια συμπαράθεση όρων (juxtaposition) υπερφορτωμένη (πολλαπλασιασμός αριθμών, εφαρμογή συνάρτησης σε όρισμα, string concatenation) 1:n γεννήτρια τιμών από 1 ως n
Παραλληλία Το πρόγραμμα έχει έμμεσα παραλληλία όπου είναι δυνατόν Πρέπει ρητά να σειριοποιηθεί όπου χρειάζεται πχ. ορίσματα συναρτήσεων αποτιμώνται παράλληλα το ίδιο και για το for loop for i 1 : 5 do print (i ) print (i ) Output 5 1 5 1 4 4 2 2 3 3 for i sequential(1 : 5) do print (i ) print (i ) Output 1 1 2 2 3 3 4 4 5 5
Παραλληλία Το πρόγραμμα έχει έμμεσα παραλληλία όπου είναι δυνατόν Πρέπει ρητά να σειριοποιηθεί όπου χρειάζεται πχ. ορίσματα συναρτήσεων αποτιμώνται παράλληλα το ίδιο και για το for loop for i 1 : 5 do print (i ) print (i ) Output 5 1 5 1 4 4 2 2 3 3 for i sequential(1 : 5) do print (i ) print (i ) Output 1 1 2 2 3 3 4 4 5 5
Παραλληλία Το πρόγραμμα έχει έμμεσα παραλληλία όπου είναι δυνατόν Πρέπει ρητά να σειριοποιηθεί όπου χρειάζεται πχ. ορίσματα συναρτήσεων αποτιμώνται παράλληλα το ίδιο και για το for loop for i 1 : 5 do print (i ) print (i ) Output 5 1 5 1 4 4 2 2 3 3 for i sequential(1 : 5) do print (i ) print (i ) Output 1 1 2 2 3 3 4 4 5 5
Παραλληλία Η υλοποίηση αποφασίζει αν θα αποτιμήσει μία έκφραση παράλληλα ή σειριακά...ανάλογα με τους διαθέσιμους πόρους Προσέγγιση work stealing, όπως στη Cilk fib(n: Z32): Z32 = case n of 0 0 1 1 else fib(n 1) + fib(n 2)
Παραλληλία Η υλοποίηση αποφασίζει αν θα αποτιμήσει μία έκφραση παράλληλα ή σειριακά...ανάλογα με τους διαθέσιμους πόρους Προσέγγιση work stealing, όπως στη Cilk fib(n: Z32): Z32 = case n of 0 0 1 1 else fib(n 1) + fib(n 2)
Παραλληλία Transactional memory με ατομικές εκφράσεις factorial(n: Z32) = do var result: Z32 = 1 for i 1 : n do atomic result := result i result
Λίστες trait List E exts { AnyList, LexicographicOrder List E, E } getter extractleft(): Maybe [ (E, List E ) ] getter extractright(): Maybe [ (List E, E) ] getter reverse(): List E opr ( self, other: List E ) : List E addleft(e : E): List E addright(e : E): List E take(n: Z32): List E split(): ( List E, List E ) zip F ( other: List F ) : Generator [ (E, F) ] filter(p: E Boolean): List E
import List.{...} Παράλληλη προσπέλαση λίστας nohello ( xs: List String ) : List String = case xs of 0 xs 1 if xs 0 = Hello then String else xs else (ys, zs) = xs.split() nohello(ys) nohello(zs) strings = String Hello, there, how, are, you,? run() = println (nohello strings)
Παράλληλη προσπέλαση λίστας nohello ( xs: List String ) : List String = do r : List String := String for x xs do if x Hello then atomic r = String x r Output < are, how, there, you,? >
Σειριοποίηση της προσπέλασης nohello ( xs: List String ) : List String = do r : List String := String for x seq(xs), x Hello do r = String x r Output < there, how, are, you,? >
List Comprehension nohello ( xs: List String ) : List String = String x x xs, x Hello
Κατανομή δεδομένων χρήσιμο σε μεγάλα μηχανήματα για καλύτερη απόδοση ιεραρχία από regions δεδομένων υπολογισμός έχει φθηνή πρόσβαση σε κοντινά regions κατανομή παρέχεται αυτόματα από constructors της γλώσσας όπως generators
Contracts component Fibonacci export Executable fib(n: Z32): Z32 requires { n 0 } = case n of 0 0 1 1 else fib(n 1) + fib(n 2) run() = println ( fib ( 1) ) Η συνθήκη αποτιμάται πριν την κλήση F o r tress e r r o r appears below. / Fibonacci. f s s :3:31~37: C a l l e r V i o l a t i o n
Contracts component Fibonacci export Executable fib(n: Z32): Z32 requires { n 0 } = case n of 0 0 1 1 else fib(n 1) + fib(n 2) run() = println ( fib ( 1) ) Η συνθήκη αποτιμάται πριν την κλήση F o r tress e r r o r appears below. / Fibonacci. f s s :3:31~37: C a l l e r V i o l a t i o n
Traits Κάτι σαν τα interfaces στη Java Μπορεί να είναι πολυμορφικό (generic) Πολλαπλή κληρονομικότητα Μπορεί να περιέχει ορισμούς μεθόδων Δεν περιέχει πεδία trait List E exts { AnyList, LexicographicOrder List E, E } excludes { Number, HasRank, String } getter extractleft(): Maybe [ ] (E, List E ) getter reverse(): List E =...
Traits Κάτι σαν τα interfaces στη Java Μπορεί να είναι πολυμορφικό (generic) Πολλαπλή κληρονομικότητα Μπορεί να περιέχει ορισμούς μεθόδων Δεν περιέχει πεδία trait List E exts { AnyList, LexicographicOrder List E, E } excludes { Number, HasRank, String } getter extractleft(): Maybe [ ] (E, List E ) getter reverse(): List E =...
Αντικείμενα Κάτι σαν τις κλάσεις στη Java Μπορεί να είναι πολυμορφικό (generic) Πολλαπλή κληρονομικότητα Περιέχει ορισμούς μεθόδων και πεδία Δεν μπορεί να επεκταθεί (ext) object ArrayList E ( underlying, firstused, canextleft, firstunused, canextright) exts { List E, DelegatedIndexed E, Z32 } getter size(): Z32 = self getter extractleft(): Maybe [ (E, ArrayList E ) ] =...
Αντικείμενα Κάτι σαν τις κλάσεις στη Java Μπορεί να είναι πολυμορφικό (generic) Πολλαπλή κληρονομικότητα Περιέχει ορισμούς μεθόδων και πεδία Δεν μπορεί να επεκταθεί (ext) object ArrayList E ( underlying, firstused, canextleft, firstunused, canextright) exts { List E, DelegatedIndexed E, Z32 } getter size(): Z32 = self getter extractleft(): Maybe [ (E, ArrayList E ) ] =...
Ιεραρχία τύπων trait Ast comprises { Type, Expr } getter asstring(): String trait Type exts Ast comprises { StringType, IntegerType } excludes Expr object StringType exts Type object IntegerType exts Type trait Expr exts Ast comprises { Val, BinOpApp } excludes Type trait Val exts Expr comprises { Str, Num } getter asvalue(): Object object Str(string: String) exts Val getter asstring() = string getter asvalue() = string
Ιεραρχία τύπων
Growing a language... Μικρός πυρήνας της γλώσσας Εκτεταμένες βιβλιοθήκες Πολλοί τύποι και constructs (for) ορίζονται σε βιβλιοθήκη trait Z32 exts { Z64, Integral Z32 } comprises { Int, IntLiteral } getter zero(): Z32 = 0 getter one(): Z32 = 1 getter minimum(): Z32 = 2147483647 1 opr self : Z32 = if self 0 then self else self...
Growing a language... Απαιτεί πολύ εκφραστικό σύστημα τύπων Συγγραφείς βιβλιοθηκών έχουν πρόσβαση στο AST Ανάλυση προγράμματος, βελτιστοποιήσεις ενθαρρύνει συνεργατικότητα και συγγραφή εξειδικευμένων βιβλιοθηκών