Η Julia είναι μια δυναμική γλώσσα προγραμματισμού με ισχυρή τυποποίηση. Το στυλ προγραμματισμού είναι κυρίως συναρτησιακό, αν και με μεγαλύτερη ευελιξία από ό,τι σε γλώσσες όπως η Haskell.
Υπάρχει ένα ισχυρό και ευέλικτο σύστημα τύπων, το οποίο θα γίνει σημαντικό σε επόμενες έννοιες. Στην πράξη, η Julia συνήθως συνάγει μια κατάλληλη προεπιλογή από τα συμφραζόμενα.
Παρά την έμφαση στην αναγνωσιμότητα, που την κάνει να μοιάζει με γλώσσα σεναρίων όπως η Python και η Ruby, ο κώδικας της Julia μεταγλωττίζεται πριν εκτελεστεί. Ο μεταγλωττιστής Just In Time (JIT) παράγει άκρως βελτιστοποιημένο κώδικα για κάθε συνάρτηση τη στιγμή που τη συναντά, κάτι που οδηγεί σε υψηλή ταχύτητα εκτέλεσης.
Η Julia δεν είναι αντικειμενοστρεφής γλώσσα και δεν έχει ιεραρχία κλάσεων σαν αυτή που είναι κεντρική σε πολλές άλλες γλώσσες.
Αντ' αυτού (και μην πανικοβληθείς καθώς το διαβάζεις αυτό!), η Julia βασίζεται σε:
Αυτοί οι μάλλον μπερδεμένοι όροι θα γίνουν πιο σαφείς καθώς προχωράμε στο πρόγραμμα σπουδών.
Η επίσημη τεκμηρίωση περιέχει πολλές πολύτιμες πληροφορίες για την τρέχουσα έκδοση, αν και μπορεί να είναι λίγο συντριπτική για αρχάριους.
Μερικά βίντεο:
Το να συμπεριλαμβάνεις σχόλια στον κώδικά σου είναι εξαιρετικά σημαντικό, ώστε να βοηθάς τους ανθρώπους να διαβάζουν τον κώδικά σου και να καταλαβαίνουν τις προθέσεις σου: ίσως άλλους ανθρώπους, αλλά και τον μελλοντικό εαυτό σου. (Ως επί το πλείστον) αγνοούνται από τον μεταγλωττιστή.
Στη Julia υπάρχουν δύο επιλογές:
#
#= και τελειώνουν με =#. Η εμφώλευση επιτρέπεται.# This is a single-line comment
x = 3 # This is an inline comment
#=
Multi-line comments can be used for longer explanations.
They are especially useful to comment out blocks of code during debugging.
=#
Για να δημιουργήσεις μια μεταβλητή, αρκεί να της αναθέσεις μια τιμή:
julia> myvar = 42 # an integer (in fact, Int64)
42
julia> bigint = 1_234_567_890 # optionally use underscore as digit separator, for readability
1234567890
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
Η ανάθεση "δεσμεύει" μια τιμή στη μεταβλητή.
Ο καθορισμός τύπου είναι προαιρετικός και ως επί το πλείστον η Julia συνάγει μια κατάλληλη προεπιλογή από τα συμφραζόμενα.
Οι τύποι είναι ένα σημαντικό θέμα στη Julia. Θα τους εξερευνήσουμε περαιτέρω σε επόμενες έννοιες. Για την ώρα, το καλύτερο είναι να μην ανησυχείς γι' αυτούς.
Σε αντίθεση με πολλές συναρτησιακές γλώσσες, οι μεταβλητές στη Julia μπορούν να ανατεθούν εκ νέου, και είσαι ελεύθερος να αλλάξεις και την τιμή και τον τύπο που είναι δεσμευμένος στη μεταβλητή:
julia> myvar = 3
3
julia> myvar = "now a string"
"now a string"
Οι καθολικές μεταβλητές, που δημιουργούνται έξω από οποιαδήποτε συνάρτηση, είναι:
*.jl· το REPL λειτουργεί διαφορετικά).Αν μια τιμή πρέπει να είναι διαθέσιμη σε όλο το πρόγραμμα, αλλά δεν αναμένεται να αλλάξει, χρησιμοποίησε μια σταθερά.
Βάζοντας τη λέξη-κλειδί const πριν από την ανάθεση, επιτρέπεις στον μεταγλωττιστή να παράγει πιο αποδοτικό κώδικα.
Αν κατά λάθος προσπαθήσεις να αλλάξεις την τιμή μιας const, θα πάρεις μια προειδοποίηση:
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
Οι αριθμητικές πράξεις λειτουργούν ως επί το πλείστον συμβατικά:
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division)
8 % 3 # 2 (remainder)
2 ^ 3 # 8 (exponentiation)
Πρόσεξε ότι η διαίρεση με / δίνει πάντα μια τιμή κινητής υποδιαστολής.
Θα επανέλθουμε σε αυτό σε επόμενες έννοιες, όπου θα δούμε την ακέραιη διαίρεση με div() ή ÷ για να κόβεται το δεκαδικό μέρος, και το // για να παίρνεις ρητό αριθμό.
Για την καλύτερη δυνατή ταχύτητα εκτέλεσης, είναι καλύτερο να τοποθετείς το μεγαλύτερο μέρος του κώδικα μέσα σε συναρτήσεις. Το να έχεις πολλές μικρές συναρτήσεις είναι μια χαρά, σε αντίθεση με κάποιες άλλες γλώσσες.
Υπάρχουν δύο συνηθισμένοι τρόποι να ορίσεις μια ονομασμένη συνάρτηση στη Julia:
Με τη λέξη-κλειδί function
function muladd(x, y, z)
x * y + z
end
Η εσοχή με 4 κενά είναι συνηθισμένη για λόγους αναγνωσιμότητας, αλλά ο μεταγλωττιστής την αγνοεί.
Η λέξη-κλειδί end είναι απαραίτητη: περισσότερο σαν τη Ruby παρά σαν την Python.
Πρόσεξε ότι θα μπορούσαμε να γράψουμε return x * y + z.
Ωστόσο, οι συναρτήσεις της Julia επιστρέφουν πάντα την τελευταία έκφραση που αξιολογήθηκε, οπότε η λέξη-κλειδί return είναι προαιρετική.
Πολλοί προγραμματιστές προτιμούν να τη συμπεριλαμβάνουν, για να κάνουν τις προθέσεις τους πιο σαφείς.
Με τη «μορφή ανάθεσης»
muladd(x, y, z) = x * y + z
Χρησιμοποιείται πιο συχνά για ορισμούς συναρτήσεων μιας γραμμής ή για μαθηματικές συναρτήσεις, όπου το σώμα της συνάρτησης είναι μία μόνο έκφραση.
Η λέξη-κλειδί return δεν χρησιμοποιείται ποτέ στη μορφή ανάθεσης.
Οι δύο μορφές είναι ισοδύναμες και χρησιμοποιούνται με τον ίδιο ακριβώς τρόπο, οπότε διάλεξε όποια είναι πιο ευανάγνωστη.
Για να καλέσεις μια συνάρτηση, γράφεις το όνομά της και περνάς ορίσματα για κάθε παράμετρο της συνάρτησης:
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
Από το γεγονός ότι τις αποκαλούμε "ονομασμένες" συναρτήσεις, μπορεί να υποψιάστηκες ότι υπάρχουν και "ανώνυμες" συναρτήσεις. Θα τις καλύψουμε σε μια επόμενη έννοια.
Όπως πολλές γλώσσες, η Julia απαιτεί τα ονόματα (μεταβλητών, συναρτήσεων και πολλών άλλων) να ξεκινούν με ένα γράμμα και να ακολουθούνται από οποιονδήποτε συνδυασμό γραμμάτων, ψηφίων και κάτω παύλων.
Κατά σύμβαση, τα ονόματα μεταβλητών, σταθερών και συναρτήσεων γράφονται με πεζά, με τις κάτω παύλες να αποφεύγονται, εκτός αν χρειάζονται για να αποφευχθεί σύγχυση.
Ωστόσο, η Julia χρησιμοποιεί Unicode παντού, οπότε το "γράμμα" ερμηνεύεται αρκετά ευέλικτα.
Υποστηρίζονται και άλλες γλώσσες εκτός των αγγλικών, όπως και τα emoji (αν και σε παρακαλώ να δείξεις καλό γούστο και να διαλέξεις κάτι κατάλληλο).
Συγκεκριμένα, όλα τα ελληνικά γράμματα που αγαπούν οι μαθηματικοί είναι διαθέσιμα (και αρκετές χρήσιμες τιμές είναι προκαθορισμένες):
julia> π # a built-in constant
π = 3.1415926535897...
Οι επεξεργαστές κώδικα που γνωρίζουν τη Julia, όπως το REPL, το Pluto.jl και το VS Code με το πρόσθετο της Julia, κάνουν την εισαγωγή αυτών των χαρακτήρων εύκολη.
Για το π, πληκτρολόγησε \pi και μετά πάτησε <Tab>. Αυτό που πληκτρολόγησες θα αντικατασταθεί από τον ελληνικό χαρακτήρα.
Θα δεις πολλά περισσότερα παραδείγματα αυτού σε επόμενες έννοιες.
Στην πραγματικότητα, οι συντομογραφίες με ανάστροφη κάθετο δεν είναι κάτι που αφορά μόνο τη Julia. Προέρχονται από το LaTeX, ένα σύστημα στοιχειοθεσίας που πολλοί επιστήμονες και μηχανικοί χρησιμοποιούν σχεδόν καθημερινά για να γράφουν αναφορές.