Η Ruby και η Python είναι δύο σπουδαίες γλώσσες προγραμματισμού με βάση την ερμηνεία και τη δυναμική τυποποίηση. Μπορείτε να διαβάσετε για τις εφαρμογές τους, τη δημοτικότητα και την κοινότητά τους σε μία από τις καταχωρήσεις αυτού του ιστολογίου. Οι γλώσσες αυτές έχουν πολλά κοινά στοιχεία, αλλά και πολλές διαφορές. Σε αυτό το άρθρο, θα παρουσιάσω μερικές από αυτές.
Ομοιότητες
Καθώς οι γλώσσες αυτές μπορούν να συμπεριληφθούν στην ίδια κατηγορία των δυναμικά τυποποιημένων διερμηνευόμενων γλωσσών, δεν υπάρχει αμφιβολία ότι είναι παρόμοιες.
Δυναμική πληκτρολόγηση
Και οι δύο Python και η Ruby είναι δυναμικά τυποποιημένες γλώσσες. Ως αποτέλεσμα, ο προγραμματιστής δεν χρειάζεται να καθορίσει τον τύπο των μεταβλητών κατά τη συγγραφή της κωδικός. Ο τύπος τους καθορίζεται κατά την εκτέλεση του προγράμματος και μπορεί να αλλάξει. Ο τύπος μιας μεταβλητής προκύπτει από την τιμή που είναι αποθηκευμένη σε αυτήν. Ο παρακάτω κώδικας θα εκτελεστεί σωστά σε αυτές τις γλώσσες:
μεταβλητή = 1
variable += 2.5
variable = 'sample string'
variable = [2, 3.5, 'sample string']
Καθαρό συντακτικό
Αυτό σχετίζεται με το παραπάνω σημείο, μεταξύ άλλων. Λόγω του γεγονότος ότι δεν χρειάζεται να δηλώνονται τύποι, να τελειώνουν οι εντολές με άνω τελεία, αλλά και του γεγονότος ότι είναι γλώσσες σεναρίων, τόσο η γραφή όσο και η ανάγνωση είναι εύκολη. Ο καλογραμμένος κώδικας θα είναι αναγνώσιμος ακόμη και από άτομα που δεν είχαν καμία προηγούμενη επαφή με αυτές τις γλώσσες.
Έχουν διαδραστικούς διερμηνείς κονσόλας
Όταν θέλετε να εκτελέσετε μια απλή λειτουργία ή να δοκιμάσετε ένα κομμάτι κώδικα, δεν χρειάζεται να δημιουργήσετε ένα αρχείο και να εκτελέσετε τον κώδικα χρησιμοποιώντας μια ειδική εντολή. Τόσο η Ruby όσο και το Python διαθέτουν διαδραστικούς διερμηνείς κονσόλας (REPL). Για το Python, μπορούμε να τρέξουμε έναν τέτοιο διερμηνέα με την εντολή python
(ήpython3
), ενώ για τη Ruby θα μπορούσε να είναι, για παράδειγμα, irb:
$ irb
2.5.8 :001 > result = 2 + 1
=> 3
2.5.8 :002 > αποτέλεσμα += 3.5
=> 6.5
Διαφορές
Καθώς αυτά είναι διαφορετικά γλώσσες προγραμματισμού, φυσικά πρέπει να έχουν διαφορές (το ξέρω, τι αποκαλυπτική δήλωση). Στην περίπτωση του Python και του Ruby, οι διαφορές αυτές είναι πολλές. Θα περιγράψω μερικές από τις σημαντικότερες κατά τη γνώμη μου.
Εσοχές
Η εσοχή είναι πολύ σημαντική στο Python. Όλα τα μπλοκ κώδικα ορίζονται από την εσοχή. Είναι σημαντικό κάθε γραμμή σε ένα συγκεκριμένο μπλοκ να έχει την ίδια εσοχή. Διαφορετικά, όταν προσπαθήσουμε να εκτελέσουμε τον κώδικα, θα λάβουμε IndentationError. Η Ruby ακολουθεί μια διαφορετική προσέγγιση. Εδώ, το μπλοκ κώδικα περιορίζεται από λέξεις-κλειδιά. Διακρίνουμε την αρχική λέξη (π.χ.begin, if, class, def
) και η τελική λέξη τέλος.
Δεν έχει σημασία πώς είναι στοιχισμένος ο κώδικας μέσα στο μπλοκ κώδικα.
Κληρονομικότητα
Ένα από τα βασικά χαρακτηριστικά του αντικειμενοστραφούς προγραμματισμού. Στα σωστά χέρια, μπορεί να κάνει θαύματα. Το Python υποστηρίζει κληρονομικότητα πολλαπλών βάσεων:
example.py
class ClassA:
def callA(self):
): print('callA')
class ClassB:
def callB(self):
classB: print('callB')
class ClassAB(ClassA, ClassB):
pass
class_inst = ClassAB()
class_inst.callA()
class_inst.callB()
Ως αποτέλεσμα, έχουμε:
$ python3 example.py
callA
callB
Η Ruby υποστηρίζει μόνο κληρονομικότητα μίας βάσης χρησιμοποιώντας τον τελεστή < από προεπιλογή. Ωστόσο, είναι δυνατή η προσομοίωση κληρονομικότητας πολλαπλών βάσεων με τη χρήση ενοτήτων:
example.rb
class ClassA
def calla
puts 'calla'
end
end
module ModuleB
def callb
puts 'callb'
end
end
class ClassAB < ClassA
include ModuleB
end
classinst = ClassAB.new
classinst.calla
classinst.call_b
Τι μας δίνει:
$ ruby example.rb
call_a
call_b
περιλαμβάνουν
είναι μόνο ένα από τα mixins που είναι διαθέσιμα στη Ruby. Τα mixins είναι ένας τρόπος για να προσθέσετε επιπλέον λειτουργικότητα στις κλάσεις. Υπάρχουν τρία mixins στη Ruby.
Συμπεριλάβετε το
Όταν καλούμε περιλαμβάνουν
στον ορισμό της κλάσης, η συμπεριλαμβανόμενη ενότητα γίνεται ο άμεσος πρόγονος αυτής της κλάσης. Αυτό σημαίνει ότι κάθε μέθοδος της ενότητας γίνεται μέθοδος παραδείγματος αυτής της κλάσης. Μπορούμε να τις υπερκεράσουμε στην κλάση και επίσης να καλέσουμε την αρχική μέθοδο (που ορίζεται στην ενότητα) χρησιμοποιώντας super
λέξη-κλειδί.
example.rb
module ModuleA
def print_something
puts 'Μήνυμα από την ενότητα'
end
end
κλάση ClassB
include ModuleA
def print_something
puts 'Μήνυμα από την τάξη'
super
end
end
ClassB.new.print_something
Αποτέλεσμα:
$ ruby example.rb
Μήνυμα από την κλάση
Μήνυμα από την ενότητα
Προσθήκη
Λειτουργεί σχεδόν όπως περιλαμβάνουν
, αλλά η ενότητα που προτάσσεται γίνεται άμεσος απόγονος της κλάσης. Αυτό σημαίνει ότι δεν μπορούμε να αντικαταστήσουμε τη μέθοδο της ενότητας στην κλάση, αλλά η μέθοδος της ενότητας μπορεί να καλέσει τη μέθοδο της κλάσης χρησιμοποιώνταςsuper
λέξη-κλειδί.
example.rb
module ModuleA
def print_something
puts 'Μήνυμα από την ενότητα'
super
end
end
κλάση ClassB
prepend ModuleA
def print_something
puts 'Μήνυμα από την τάξη'
end
end
ClassB.new.print_something
Αποτέλεσμα:
$ ruby example.rb
Μήνυμα από την ενότητα
Μήνυμα από κλάση
Επέκταση
Λειτουργεί παρόμοια με την include με τη διαφορά ότι οι μέθοδοι που ορίζονται στην ενότητα γίνονται μέθοδοι της κλάσης.
Αποτέλεσμα:
$ ruby example.rb Μήνυμα από τη μονάδα
Λειτουργίες και μπλοκ
Το Python έχει λειτουργίες. Η Ruby υποστηρίζει μόνο μεθόδους. Τι συνεπάγεται αυτό; Μεταξύ άλλων, το Python μπορεί να κρατήσει μια συνάρτηση σε μια μεταβλητή και να την περάσει ως όρισμα σε μια άλλη συνάρτηση. Στη Ruby, δεν μπορούμε να το κάνουμε τόσο εύκολα. Αυτό σχετίζεται επίσης με τις παρενθέσεις. Δεδομένης μιας συνάρτησης χωρίς ορίσματα στο Python, ή με προεπιλεγμένα ορίσματα, αν χρησιμοποιήσετε το όνομά της χωρίς παρενθέσεις, η συνάρτηση θα επιστραφεί. Μόνο η προσθήκη των παρενθέσεων οδηγεί στην εκτέλεσή της. Στη Ruby, μπορούμε να καλέσουμε συναρτήσεις χωρίς παρενθέσεις:
example.py
def inner_function():
print('Inner function')
def wrapper_function(function):
print('Wrapper function')
# function είναι μια μεταβλητή που περιέχει αντικείμενο συνάρτησης
function() # εσωτερική συνάρτηση καλείται εδώ
wrapperfunction(innerfunction)
Αποτέλεσμα:
$ python3 example.py
Συνάρτηση περιτύλιξης
Εσωτερική συνάρτηση
Στο Ruby:
example.rb
def inner_function
puts 'Εσωτερική συνάρτηση'
end
def wrapper_function(function)
puts 'Wrapper function'
function
end
wrapperfunction(innerfunction) # Η inner_function καλείται εδώ
Αποτέλεσμα:
$ ruby example.rb
Εσωτερική συνάρτηση
Συνάρτηση περιτυλίγματος
Φυσικά, σε αυτή την περίπτωση, μπορείτε να κάνετε κάποια κόλπα στη Ruby για να επιτύχετε το επιθυμητό αποτέλεσμα. Πρώτον, μπορούμε να χρησιμοποιήσουμε το αντικείμενο Proc:
example.rb
def inner_function
puts 'Εσωτερική συνάρτηση'
end
def wrapper_function(function)
puts 'Wrapper function'
function.call
end
func = Proc.new { innerfunction }
wrapperfunction(func)
Αποτέλεσμα:
$ ruby example.rb
Συνάρτηση περιτύλιξης
Εσωτερική συνάρτηση
Η δεύτερη προσέγγιση είναι η χρήση μπλοκ:
example.rb
def inner_function
puts 'Εσωτερική συνάρτηση'
end
def wrapper_function
puts 'Wrapper function'
yield
end
wrapperfunction do
innerfunction
end
Αποτέλεσμα:
$ ruby example.rb
Συνάρτηση περιτύλιξης
Εσωτερική συνάρτηση
Κατανόηση λίστας
Αυτό είναι ένα πολύ χρήσιμο χαρακτηριστικό του Python. Συνίσταται στη δημιουργία μιας λίστας με βάση μια άλλη λίστα. Ας υποθέσουμε ότι έχουμε μια τέτοια εργασία: δεδομένου ενός καταλόγου αριθμών, φτιάξτε έναν κατάλογο τετραγώνων περιττών αριθμών. Στο Python, χρησιμοποιούμε την κατανόηση λίστας:
numbers = [1, 3, 4, 7, 8, 12, 15]
result = [num*num for num in numbers if num % 2]
Το πλεονέκτημα είναι ότι έχουμε μόνο δύο λίστες στη μνήμη.
Στη Ruby, τα πράγματα είναι λίγο διαφορετικά. Υπάρχουν διάφοροι τρόποι για την επίλυση αυτής της εργασίας. Θα παρουσιάσω τον πιο ευανάγνωστο από αυτούς:
numbers = [1, 3, 4, 7, 8, 12, 15]
result = []
numbers.each { |num| result << num * num if num.odd? }
Όπως βλέπουμε, μπορεί να γίνει, αλλά όχι τόσο κομψά όσο στο Python.
Όλες οι κλάσεις είναι μεταβλητές
Στη Ruby, όλες οι κλάσεις είναι μεταβλητές. Τι σημαίνει αυτό; Μπορούμε να προσθέσουμε ή να αντικαταστήσουμε μεθόδους όλων των κλάσεων, ακόμα και των ενσωματωμένων. Ας υποθέσουμε ότι θέλουμε μια μέθοδο που να αλλάζει κάθε γράμμα an σε b στο αλφαριθμητικό. Μπορούμε να το κάνουμε με έναν απλό τρόπο:
example.rb
κλάση String
def atob!
self.gsub!(/a/, 'b')
end
end
string = 'Παράδειγμα συμβολοσειράς με πολλά γράμματα a'
puts string
string.atob!
puts string
Αποτέλεσμα:
$ ruby example.rb
Παράδειγμα συμβολοσειράς με πολλά γράμματα a
Παράδειγμα συμβολοσειράς με mbny b γράμματα
Περίληψη
Ανάπτυξη ιστοσελίδων είναι ένας δυναμικός τομέας που υιοθετεί και διαμορφώνει συνεχώς διάφορες γλώσσες προγραμματισμού για να ταιριάζει στις ανάγκες της. Δύο δημοφιλείς επιλογές σε αυτόν τον τομέα περιλαμβάνουν το Γλώσσα προγραμματισμού Python και Ruby. Και οι δύο έχουν αποδείξει την αξία τους σε κατασκευή εφαρμογών ιστού και άλλες μορφές λογισμικού, καθεμία από τις οποίες έχει τα μοναδικά της πλεονεκτήματα και μειονεκτήματα.
Python είναι μια γλώσσα προγραμματισμού υψηλού επιπέδου σεβαστή για την απλότητα και την αναγνωσιμότητα κώδικα, ένα χαρακτηριστικό που συχνά απευθύνεται σε αρχάριους προγραμματιστές. Το Γλώσσα προγραμματισμού Python είναι ευέλικτο και μπορεί να χρησιμοποιηθεί για μια ποικιλία εργασιών. Αυτό το γλώσσα προγραμματισμού γενικού σκοπού χρησιμοποιείται συχνά σε τομείς όπως η μηχανική μάθηση, τα μεγάλα δεδομένα και, κυρίως, ανάπτυξη ιστοσελίδων. Μια ευρεία κοινότητα προγραμματιστών Python συμβάλλει στο πλούσιο οικοσύστημα βιβλιοθηκών και πλαισίων, ενισχύοντας την καταλληλότητά του για κατασκευή εφαρμογών ιστού. Django, Flask, και Pyramid είναι μεταξύ των διαφόρων Python web frameworks αξιοποιείται από προγραμματιστές ιστοσελίδων σε όλο τον κόσμο.
Από την άλλη πλευρά, η Ruby, μια άλλη γλώσσα προγραμματισμού υψηλού επιπέδου, γενικού σκοπού, λάμπει με την ευελιξία και την εκφραστικότητά της. Αυτό το αντικειμενοστραφής γλώσσα προγραμματισμού είναι η ραχοκοκαλιά πολλών διαδικτυακές εφαρμογές. Η γοητεία της Ruby έγκειται στην ικανότητά της να διευκολύνει ανάπτυξη ιστοσελίδων μέσω του Πλαίσιο Rails, ένα ισχυρό εργαλείο για κατασκευή εφαρμογών ιστού γρήγορα.
Το Ruby, αν και λιγότερο δημοφιλές από το Python, διαθέτει ένα ενεργό και αφοσιωμένο Κοινότητα Ruby που αναπτύσσει και συντηρεί συνεχώς μια σειρά από βιβλιοθήκες και εργαλεία, εμπλουτίζοντας έτσι την εμπειρία των προγραμματιστές ιστοσελίδων χρησιμοποιώντας αυτή τη γλώσσα. Ως αντικειμενοστραφής γλώσσα, η Ruby εκτιμάται για την κομψότητά της και τον καθαρό, ευανάγνωστο κώδικα που παράγει, καθιστώντας την κατάλληλη επιλογή τόσο για μικρές όσο και για μεγάλες κλίμακες διαδικτυακές εφαρμογές.
Python και Ruby, όπως αντικειμενοστραφείς γλώσσες προγραμματισμού, μοιράζονται πολλές ομοιότητες. Υποστηρίζουν επίσης λειτουργικός προγραμματισμός, προσφέροντας στους προγραμματιστές διάφορα στυλ για να κωδικοποιήσουν. Κωδικός Python, ειδικότερα, εκτιμάται για το απλό συντακτικό της, το οποίο υπογραμμίζει την έμφαση της γλώσσας στην απλότητα και την αναγνωσιμότητα.
Κάθε γλώσσα έχει τα δυνατά της σημεία, του Python ευελιξία και ευρύτητα κοινότητα υποστήριξη την καθιστούν ένα εξαιρετικό εργαλείο για διάφορες εργασίες, ενώ η εκφραστικότητα της Ruby και η Πλαίσιο Rails το καθιστά ισχυρό υποψήφιο για διαδικτυακή εφαρμογή ανάπτυξη. Είναι οι μοναδικές ανάγκες και προτιμήσεις των προγραμματιστές ιστοσελίδων που θα καθορίσει ποια γλώσσα εξυπηρετεί καλύτερα τους έργο.
Στη σφαίρα της λειτουργικά συστήματα, και οι δύο γλώσσες εμφανίζουν ένα εντυπωσιακό επίπεδο φορητότητας, ενισχύοντας περαιτέρω την καταλληλότητά τους για ένα πλήθος εργασιών, που δεν περιορίζεται μόνο σε ανάπτυξη ιστοσελίδων. Ως εκ τούτου, είναι δύσκολο να ανακηρυχθεί ένας οριστικός "νικητής" σε αυτή τη μονομαχία.
Ενώ η Γλώσσα προγραμματισμού Python έχει ευρύτερη εμβέλεια και μεγαλύτερο κοινότητα, οι δυνατότητες της Ruby δεν πρέπει να υποτιμώνται. Για να εκτιμήσει κανείς πλήρως αυτές τις γλώσσες, πρέπει να εντρυφήσει σε αυτές, να κατανοήσει τις ιδιαιτερότητές τους και να τις εφαρμόσει εκεί όπου λάμπουν περισσότερο. Είτε είστε δημιουργία διαδικτυακών εφαρμογών με Python ή Ruby, το καθένα γλώσσα προσφέρει μια ισχυρή πλατφόρμα για την παροχή υψηλής ποιότητας διαδικτυακές εφαρμογές. Το Ruby, αν και λιγότερο γνωστό, σίγουρα αξίζει την εκτίμησή του στον κόσμο της γλώσσες προγραμματισμού.