-
Γιατί η σύγχρονη καθημερινότητα, δημιουργεί προβλήματα αυξημένης πολυπλοκότητας
-
Γιατί η πληροφορική γίνεται, μέρα με τη μέρα, απαραίτητη σε όλους τους επιστημονικούς τομείς
-
Γιατί επιστήμονες όπως βιολόγοι, μαθηματικοί, κοινωνιολόγοι, φυσικοί κλπ υλοποιούν προσομοιώσεις μεγάλης υπολογιστικής ισχύος χωρίς να έχουν background μηχανικού
Γιατί σε σχέση με άλλες γλώσσες προγραμματισμού συνδυάζει όλα τα παρακάτω στοιχεία:
- Σύγχρονη
- Απλή
- Αποδοτική
-
Ασχολείται εκείνος με τα προβλήματά μας για να κάνει τη ζωή μας εύκολότερη
-
Του λέμε κάτι και προσπαθεί να μας δώσει αυτό που θέλουμε
-
Μπορεί να κάνει κάποια πράγματα στα κρυφά γιατί "έτσι είναι καλύτερα"
-
Αποκλείεται να πάρουμε γρήγορη απάντηση
-
Αναφέρουμε ένα πρόβλημα και θέλει να του πούμε ΟΛΕΣ τις λεπτομέρειες
-
Ξοδεύουμε ώρες επί ωρών για να ανακαλύψουμε όλες τις πλευρές του προβλήματος
-
Όταν καταφέρουμε να του εξηγήσουμε το πρόβλημα όπως ακριβώς θέλει, η συζήτηση μαζί του κοιλά πολύ γρηγορότερα γιατί είναι πανέξυπνος
-
Αν θέλουμε να συζητήσουμε μαζί του κάποιο άλλο θέμα, πρέπει να το πιάσουμε πάλι από τα βασικά
- Just-In-Time Compilation
- Dynamic Typing
- Type Stability
- Multiple Dispatch
| Type | Pre-Runtime | Runtime |
|---|---|---|
| Compiler | Source Code -> Object Code -> Machine Code | |
| Interpreter | Source Code -> Machine Code | |
| JIT Compiler | Source Code -> Byte Code | Byte Code -> Machine Code |
function foo(a)
a+5
end
b=foo(4)
println("b is: ", typeof(b))
b=foo('4')
println("b is: ", typeof(b))
println("foo is: ", typeof(foo))b is: Int64
b is: Char
foo is: #foo
-
Οι τύποι δεν δηλώνονται αυστηρά
-
Type inference μόνο για λόγους βελτιστοποίησης (Οι συναρτήσεις μπορεί να γραφτούν στο πόδι αλλά "θα παίξει")
-
Haskell/OCaml: Type <-> Expression (Η συνάρτηση καταλαβαίνει και περιμένει συγκεκριμένους τύπους)
-
Julia: Type <-> Value (Η συνάρτηση δεν περιμένει τύπους αλλά προσπαθεί να διαχειριστεί τις τιμές)
-
Βασική σχεδιαστική αρχή
-
Ορίζουμε τις συναρτήσεις για τιμές εισόδου συγκεκριμένου τύπου ώστε οι τιμές εξόδου να είναι συγκεκριμένου τύπου
-
Ουσιαστικά είναι σαν να έχουμε ορίσει στατικά τους τύπους!
-
Δυνατότητα compilation optimization ίδια με C!
-
Δυνατότητα πολυμορφισμού
-
Ανάλογα με τον τύπο της εισόδου, εκτελείται διαφορετικός κώδικας για την ίδια συνάρτηση
-
Method overloading (Java): Εξαρτάται από το τύπο των μεταβλητών εισόδου (Compile time)
-
Multiple dispatch (Julia): Εξαρτάται από τον τύπο των τιμών εισόδου (Runtime)
-
Η συνάρτηση του πολλαπλασιασμού μπορεί να είναι type stable
-
Για διαφορετικούς τύπους τιμών εισόδου κάνει διαφορετικά πράγματα λόγω του multiple dispatch
-
Γνωρίζοντας ποια "μορφή" της συνάρτησης θα εκτελεστεί, γνωρίζει και τον τύπο της εξόδου
-
Ο τύπος αυτός μπορεί να χρησιμοποιηθεί και στη συνέχεια του προγράμματος για περαιτέρω optimization
-
Χρειαζόμαστε type stability για να πετύχουμε μεγάλη απόδοση
-
Το multiple dispatch είναι απαραίτητο για να κάνουμε τον κώδικα απλούστερο στην εμφάνιση
-
JIT Python != Julia
[2]http://nbviewer.jupyter.org/url/julialang.org/benchmarks/benchmarks.ipynb
[3]https://en.wikipedia.org/wiki/Just-in-time_compilation
[4]https://stackoverflow.com/questions/95635/what-does-a-just-in-time-jit-compiler-do




