Σύγχρονη γλώσσα προγραμματισμού υψηλού επιπέδου: παραδείγματα και συγκρίσεις. Σύντομη επισκόπηση διάσημων γλωσσών προγραμματισμού Επεκτάσεις γλωσσών προγραμματισμού

Οι GPU χρησιμοποιούνται τώρα όλο και περισσότερο για την επίλυση υπολογιστικών προβλημάτων, αλλά το ερώτημα παραμένει ανοιχτό: πώς να γράψετε αποτελεσματικά προγράμματα για τις κατάλληλες διαμορφώσεις;

15/06/2011 Andrey Adinets

Οι GPU χρησιμοποιούνται τώρα όλο και περισσότερο για την επίλυση υπολογιστικών προβλημάτων, αλλά το ερώτημα παραμένει ανοιχτό: πώς να γράψετε αποτελεσματικά προγράμματα για τις κατάλληλες διαμορφώσεις; Η τυπική λύση - ένας συνδυασμός CUDA ή OpenCL - σας επιτρέπει να εφαρμόσετε τον αλγόριθμο σχετικά γρήγορα, αλλά η χρήση τους για τη δημιουργία μιας έκδοσης βελτιστοποιημένης για μια συγκεκριμένη διαμόρφωση είναι δύσκολη. Απαιτούνται εργαλεία για τον προγραμματισμό GPU σε υψηλότερο επίπεδο, τα οποία μπορούν να δημιουργηθούν, για παράδειγμα, χρησιμοποιώντας επεκτάσιμες γλώσσες.

Μόλις πριν από τρία χρόνια, οι μονάδες γραφικής επεξεργασίας (Graphical Processing Units, GPU) θεωρούνταν μόνο ως κάρτες γραφικών για υπολογιστές, αλλά τώρα η στάση τους έχει αλλάξει - εμφανίστηκαν ειδικά μοντέλα GPU διακομιστή, επικεντρωμένα στην επίλυση προβλημάτων υπολογιστών, την απόδοση διπλού -Οι υπολογισμοί ακριβείας έχουν αυξηθεί, τα συστήματα έχουν αναδείξει επιδόσεις ρεκόρ, κατατάσσοντας στην κορυφή των Top500. Πώς να γράψετε αποτελεσματικά προγράμματα για τέτοιες μηχανές; Η τυπική απάντηση είναι ένας συνδυασμός CUDA ή OpenCL για προγραμματισμό GPU και MPI σε επίπεδο συμπλέγματος. Αυτά τα εργαλεία είναι διαθέσιμα, υποστηρίζονται ενεργά από κατασκευαστές εξοπλισμού και πολλά προγράμματα έχουν ήδη γραφτεί για αυτά, αλλά υπάρχουν και μειονεκτήματα.

Το CUDA και το OpenCL είναι προεκτάσεις της γλώσσας C· δεν είναι δύσκολο να μάθουν, αν και είναι εργαλεία αρκετά χαμηλού επιπέδου. Με τη βοήθειά τους, μπορείτε να εφαρμόσετε σχετικά γρήγορα έναν αλγόριθμο για τη GPU, αλλά η δημιουργία μιας έκδοσης βελτιστοποιημένης για μια συγκεκριμένη εφαρμογή και διαμόρφωση αποδεικνύεται πολύ πιο δύσκολη. Όλες οι βελτιστοποιήσεις θα πρέπει να γίνουν χειροκίνητα, γεγονός που θα αυξήσει το μέγεθος του κώδικα και θα υποβαθμίσει την αναγνωσιμότητά του. Αν και τα προγράμματα που δημιουργούνται με το OpenCL θα είναι φορητά σε ένα ευρύ φάσμα αρχιτεκτονικών, η απόδοση δεν θα διατηρηθεί σε αυτή τη φορητότητα. Απαιτεί εργαλεία προγραμματισμού GPU υψηλότερου επιπέδου.

Τέτοια εργαλεία μπορούν να δημιουργηθούν με διάφορους τρόπους: εισαγωγή μιας νέας γλώσσας προγραμματισμού. προσθέστε οδηγίες σε μια υπάρχουσα γλώσσα, όπως γίνεται στο μοντέλο PGI Accelerator ή CAPS HMPP. εκμεταλλευτείτε επεκτάσιμες γλώσσες. Επεκτάσιμες γλώσσες- γλώσσες προγραμματισμού, των οποίων η σύνταξη και η σημασιολογία δεν είναι σταθερές, αλλά μπορούν να αλλάξουν ανάλογα με τις ανάγκες του προγραμματιστή. Σε σύγκριση με τις παραδοσιακές, οι επεκτάσιμες γλώσσες έχουν πολλά πλεονεκτήματα: είναι ευκολότερο να προστεθούν νέες δυνατότητες σε αυτές. είναι ανοιχτά? Η εκμάθηση νέων μοντέλων προγραμματισμού που βασίζονται σε τέτοιες γλώσσες είναι ευκολότερη, καθώς χρειάζεται να μάθουν μόνο σχετικά μικρές επεκτάσεις. Με τη βοήθεια τέτοιων γλωσσών, είναι ευκολότερο να τελειοποιήσετε και να βελτιστοποιήσετε προγράμματα.

Επεκτάσιμες γλώσσες

Για να είναι επεκτάσιμη μια γλώσσα, πρέπει να περιέχει:

  • έναν μηχανισμό επέκτασης χωρίς αλλαγή του μεταγλωττιστή, που υποστηρίζεται εξίσου από όλους τους μεταγλωττιστές, που σημαίνει, ειδικότερα, την παρουσία μιας τυπικής διεπαφής για αλληλεπίδραση με μεταγλωττιστές.
  • Κατασκευές για την επέκταση και τον χειρισμό του δέντρου κώδικα, όπως μακροεντολές ή οιονεί παραθέσεις, για την επέκταση της γλώσσας.
  • ισχυρά εργαλεία για τη σύνταξη επεκτάσεων, όπως η ίδια η γλώσσα που επεκτείνεται και μια άλλη γλώσσα της οποίας η ισχύς σημαίνει ότι ο κώδικας επέκτασης μπορεί να κάνει το ίδιο πράγμα με οποιοδήποτε πρόγραμμα σε αυτήν τη γλώσσα.

Αποδεικνύεται ότι υπάρχουν σχετικά λίγες γλώσσες που ικανοποιούν αυτές τις απαιτήσεις: Lisp, Nemerle, Seed7, xoc και Stratego. Ταυτόχρονα, το xoc, το οποίο προορίζεται να επεκτείνει τη γλώσσα C, χρησιμοποιεί μια ξεχωριστή γλώσσα Zeta για τη σύνταξη επεκτάσεων και το Stratego είναι μια γλώσσα τομέα για τη δημιουργία μετατροπέων πηγαίου κώδικα. Η Nemerle είναι μια επεκτάσιμη γλώσσα που χρησιμοποιεί ένα πλαίσιο. Καθαρά.

Όλες οι επεκτάσιμες γλώσσες υποστηρίζουν μηχανισμούς για εργασία με το δέντρο του προγράμματος, και κυρίως αυτή είναι η κατασκευή της οιονεί παραπομπής - η προδιαγραφή ενός αντικειμένου που αντιπροσωπεύει το δέντρο του προγράμματος χρησιμοποιώντας τον ίδιο τον πηγαίο κώδικα.

Η γλώσσα Nemerle χρησιμοποιεί μια κατασκευή για αυτό, για παράδειγμα τη δημιουργία ενός δέντρου που αποτελείται από μια δήλωση μεταβλητής i με αρχική τιμή 0. Η οιονεί εισαγωγική είναι παρόμοια με τη δημιουργία αντικειμένων συμβολοσειρών με σταθερές συμβολοσειράς. Στο Σχ. 1 δείχνει ένα παράδειγμα οιονεί παραπομπής. Η κατασκευή παρεμβολής επιτρέπει την αντικατάσταση μεταβλητών τιμών σε ένα σταθερό μοτίβο μέσα σε ένα οιονεί εισαγωγικό. Στο Nemerle, οι κατασκευές $(...) χρησιμοποιούνται για αυτό εάν πρέπει να αντικαταστήσετε μια λίστα, για παράδειγμα. Οι επεκτάσιμες γλώσσες περιέχουν επίσης κατασκευές ανάλυσης δέντρων προγραμμάτων. Στη γλώσσα Nemerle, ο τελεστής match(...) ( ... ) χρησιμοποιείται για αυτό, ένα ανάλογο του διακόπτη από τη γλώσσα C, οι κλάδοι του οποίου είναι οιονεί κατασκευές εισαγωγικών. Στην περίπτωση αυτή, η παρεμβολή ερμηνεύεται ως η δήλωση νέων μεταβλητών, οι οποίες, εάν η σύγκριση είναι επιτυχής, λαμβάνουν τις τιμές των αντίστοιχων υποδέντρων. Για παράδειγμα, για τον αντίστοιχο τελεστή match(e) (| => ... ), εάν το e περιέχει ένα δέντρο, θα μπει στη μεταβλητή a και στη μεταβλητή b .

Τα εργαλεία για την εργασία με το δέντρο προγράμματος χρησιμοποιούνται σε κατασκευές επέκτασης γλώσσας. Στη γλώσσα Nemerle, αυτές είναι μακροεντολές - ειδικές συναρτήσεις που εκτελούνται στο στάδιο της μεταγλώττισης και επιστρέφουν ένα τμήμα του δέντρου προγράμματος, το οποίο αντικαθίσταται στη θέση της κλήσης τους. Σε αυτήν την περίπτωση, η μακροεντολή δέχεται τμήματα προγράμματος ως παραμέτρους και μπορεί να τα μετασχηματίσει. Κατ 'αρχήν, μπορείτε να καλέσετε μια μακροεντολή με τον ίδιο τρόπο όπως μια κανονική συνάρτηση. αλλά ένα πιο ενδιαφέρον χαρακτηριστικό είναι η σύνδεση της κλήσης μακροεντολής σε μια ειδική σύνταξη. Αυτό σας επιτρέπει να εισάγετε νέες συντακτικές δομές στη γλώσσα Nemerle και έτσι να επεκτείνετε τη γλώσσα.

Στο Σχ. Το σχήμα 2 δείχνει ένα παράδειγμα μακροεντολής με συντακτική επέκταση που σας επιτρέπει να δηλώσετε έναν πολυδιάστατο βρόχο με μεταβλητές και τον αριθμό των επαναλήψεων για κάθε διάσταση, και στο Σχ. Το σχήμα 3 δίνει ένα παράδειγμα του μετασχηματισμού προγράμματος που εκτελεί αυτή η μακροεντολή. Σημειώστε ότι η μακροεντολή που υλοποιεί αυτήν την επέκταση καταλαμβάνει λιγότερες από 30 γραμμές πηγαίου κώδικα και περιλαμβάνει αρκετούς ελέγχους σφαλμάτων. Με την παραδοσιακή προσέγγιση, η υλοποίηση μιας τέτοιας επέκτασης θα απαιτούσε πολύ περισσότερο κώδικα και, επιπλέον, θα απαιτούσε τη μελέτη των εσωτερικών λειτουργιών του μεταγλωττιστή.

Ιστορικά, ο μηχανισμός μακροεντολών ήταν ο πρώτος που εμφανίστηκε στο Lisp, στον οποίο το πρόγραμμα αναπαρίσταται ως κανονική λίστα και δεν απαιτεί ειδικές κατασκευές για την εργασία με το δέντρο προγράμματος, επομένως σε αυτή τη γλώσσα ο επεκτάσιμος προγραμματισμός έχει γίνει πιο διαδεδομένος. Οι μακροεντολές στο Nemerle είναι παρόμοιες με αυτές στο Lisp. Στο σύστημα xoc, ο μηχανισμός επέκτασης υλοποιείται μέσω των γραμματικών επεκτάσεων και των χαρακτηριστικών του δέντρου ανάλυσης. Οποιαδήποτε επέκταση προσδιορίζει απαραίτητα δύο χαρακτηριστικά: τον τύπο της συντακτικής δομής και την έκφραση στη βασική γλώσσα στην οποία μετατρέπεται.

Οι επεκτάσιμες γλώσσες χαρακτηρίζονται από την υλοποίηση πολλών τυπικών δομών μέσω μακροεντολών. Στη γλώσσα Nemerle, όλοι οι βρόχοι και οι τελεστές υπό όρους, εκτός από την αντιστοίχιση, υλοποιούνται μέσω μακροεντολών και στη Lisp, οι μακροεντολές είναι τυπικές κατασκευές βρόχων και δηλώσεις συναρτήσεων.

Πώς να χρησιμοποιήσετε γλώσσες;

Για μια επεκτάσιμη γλώσσα προγραμματισμού, μπορείτε να γράψετε κατασκευές που σας επιτρέπουν να προγραμματίζετε τις GPU με τον πιο βολικό τρόπο, ο οποίος έγινε ως μέρος του έργου NUDA (Nemerle Unified Device Architecture), στόχος του οποίου είναι η δημιουργία επεκτάσεων της γλώσσας Nemerle για προγραμματισμό GPU. Το OpenCL χρησιμοποιείται ως διεπαφή για την αλληλεπίδραση με την GPU και ως γλώσσα-στόχος για την παρουσίαση του προγράμματος.

Πρώτα, πρέπει να εφαρμόσουμε την εκτέλεση στη GPU ενός υποσυνόλου κώδικα στη γλώσσα Nemerle. Ταυτόχρονα, θα πρέπει να υποστηρίζονται γνωστοί τελεστές γλώσσας, όπως βρόχοι και διακλαδώσεις, καθώς και η εργασία με απλούς τύπους δεδομένων, δομές και πίνακες. Ο κώδικας για τη GPU τοποθετείται σε ξεχωριστές συναρτήσεις ή σε πυρήνες NUDA. Κάθε πυρήνας επισημαίνεται με μια μακροεντολή nukernel, η οποία, με βάση τον κώδικα του πυρήνα, δημιουργεί κώδικα OpenCL και μια μέθοδο stub για την κλήση του πυρήνα στην πλευρά του κεντρικού υπολογιστή. Πριν από τη δημιουργία κώδικα, όλες οι μακροεντολές επεκτείνονται, με εξαίρεση τις μακροεντολές βρόχου και διακλάδωσης. Εάν πρέπει να κληθεί μια συνάρτηση μέσα στον πυρήνα, η συνάρτηση πρέπει να επισημανθεί με μια μακροεντολή nucode, η οποία θα δημιουργήσει κώδικα OpenCL για τη συνάρτηση. Ο πυρήνας καλείται χρησιμοποιώντας τη μακροεντολή nucall. Εκτός από τις παραμέτρους του πυρήνα, του δίνεται και η διαμόρφωση του πλέγματος νημάτων με το οποίο ξεκινά.

Τις περισσότερες φορές, το σώμα του βρόχου χρησιμοποιείται ως πυρήνας για τη GPU, επομένως θα ήθελα να μεταφέρω αμέσως τον βρόχο στη GPU. Αυτό μπορεί να εφαρμοστεί στο Nemerle - η αντίστοιχη μακροεντολή στο NUDA ονομάζεται nuwork. Λαμβάνει το μέγεθος του μπλοκ νήματος ως απαιτούμενες παραμέτρους και, με βάση το τρέχον περιβάλλον και την ανάλυση του κώδικα σώματος του βρόχου, καθορίζει ένα σύνολο μεταβλητών που πρέπει να περάσουν στον πυρήνα ως παράμετροι. Το σώμα του πυρήνα σχηματίζεται από το σώμα του βρόχου, τον υπολογισμό των δεικτών βρόχου μέσω του παγκόσμιου αριθμού νήματος, καθώς και μια συνθήκη που επιτρέπει στον βρόχο να εκτελεστεί σωστά ακόμα και όταν το μέγεθος του παγκόσμιου πλέγματος δεν διαιρείται με το μέγεθος της ομάδας νημάτων. Ο βρόχος αντικαθίσταται από μια κλήση στη μακροεντολή nucall, η οποία καλεί τον παραγόμενο πυρήνα.

Κατ' αρχήν, είναι δυνατό να επιτραπεί η χρήση κανονικών πινάκων γλώσσας Nemerle σε προγράμματα GPU, αλλά αυτό οδηγεί σε υψηλό κόστος - ο πίνακας πρέπει να αντιγράφεται στη μνήμη GPU κάθε φορά που καλείται ο πυρήνας και στη συνέχεια να αντιγράφεται ξανά. Επομένως, τα προγράμματα GPU χρησιμοποιούν ειδικούς τύπους συστοιχιών με αργό συγχρονισμό μεταξύ της GPU και της CPU. Αυτό επιτρέπει, αφενός, να μην γεμίζει το κείμενο του προγράμματος με εντολές για την αντιγραφή δεδομένων και, αφετέρου, να αποφευχθεί το γενικό κόστος για την αντιγραφή δεδομένων. Για τέτοιους πίνακες, όπως και για τους κανονικούς πίνακες στο Nemerle, η διαχείριση μνήμης χρησιμοποιείται χρησιμοποιώντας τη συλλογή σκουπιδιών. Για να εκχωρήσετε μνήμη για τέτοιους πίνακες, υπάρχει μια μακροεντολή nunew, η οποία πρέπει να εφαρμοστεί στον συνήθη τελεστή εκχώρησης μνήμης.

Στο Σχ. Το 4 στα αριστερά είναι ένα κανονικό πρόγραμμα προσθήκης πίνακα και στα δεξιά ένα παρόμοιο πρόγραμμα, αλλά που εκτελεί υπολογισμούς στη GPU. Είναι πολύ απλό να αποκτήσετε προγράμματα GPU από κανονικά - χρειάζεται μόνο να εφαρμόσετε μακροεντολές σε βρόχους και λειτουργίες εκχώρησης μνήμης, ενώ η ποσότητα του κώδικα παραμένει πρακτικά αμετάβλητη. Ένα πρόγραμμα γραμμένο με χρήση NUDA παίρνει λιγότερες από 20 γραμμές κώδικα. Ένα παρόμοιο πρόγραμμα, αλλά σε καθαρό C και OpenCL παίρνει περισσότερες από 100 γραμμές.

Εκτός από τις μακροεντολές που διευκολύνουν την εργασία με την GPU, το σύστημα επέκτασης NUDA περιλαμβάνει επίσης σχολιασμούς για τη μετατροπή βρόχου. Οι σχολιασμοί είναι ουσιαστικά ειδικές μακροεντολές. Για παράδειγμα, ο ενσωματωμένος σχολιασμός εφαρμόζεται σε έναν βρόχο με σταθερό αριθμό επαναλήψεων και τον ξετυλίγει εντελώς. Ο σχολιασμός dmine εκτελεί ξετύλιγμα σε βάθος βρόχου. Το "Deep unrolling" σημαίνει ότι η δημιουργία πολλαπλών αντιγράφων του σώματος του βρόχου και η ανακάτεμα εκτελούνται όχι μόνο για τον ίδιο τον βρόχο, αλλά και για ένθετους βρόχους εάν είναι ανεξάρτητοι.

Αποτέλεσμα

Γιατί ένας προγραμματιστής χρειάζεται να μάθει μια νέα γλώσσα και να κυριαρχήσει σε νέες βιβλιοθήκες επεκτάσιμων γλωσσών; Η κύρια απάντηση είναι η παραγωγικότητα. Έχοντας έναν αλγόριθμο παράλληλων βρόχων που δουλεύουν με πίνακες και είναι γραμμένοι στη γλώσσα Nemerle, αρκεί να προσθέσετε μερικούς σχολιασμούς για να αποκτήσετε ένα πρόγραμμα για τη GPU. Σε αυτήν την περίπτωση, το πρόγραμμα θα εκτελεστεί σε οποιαδήποτε συσκευή υποστηρίζει OpenCL, συμπεριλαμβανομένων των GPU nVidia και AMD, καθώς και σε επεξεργαστές x86. Για να επιτύχετε το ίδιο πράγμα χρησιμοποιώντας μόνο τις τεχνολογίες OpenCL ή CUDA, θα χρειαστεί να ξοδέψετε πολύ περισσότερους πόρους, οι οποίοι θα δαπανηθούν όχι μόνο για τη σύνταξη του πηγαίου κώδικα, αλλά και για τον εντοπισμό σφαλμάτων της αλληλεπίδρασης μεταξύ του κεντρικού υπολογιστή και της GPU.

Ένας άλλος λόγος είναι η απόδοση του παραγόμενου κώδικα. Στο CUDA ή στο OpenCL, οι μετατροπές βρόχου θα πρέπει να γίνονται χειροκίνητα και ξεχωριστά για κάθε αρχιτεκτονική. Αυτή είναι μια μακρά και επιρρεπής σε σφάλματα διαδικασία και ο κώδικας που προκύπτει είναι δύσκολο να διαβαστεί και δεν μπορεί να διατηρηθεί. Με το NUDA, αυτή η εργασία μπορεί να γίνει χρησιμοποιώντας σχολιασμούς. Για παράδειγμα, για πολλούς πυρήνες, μπορείτε να βελτιστοποιήσετε τη λειτουργία συνέλιξης εικόνας ή πολλαπλασιασμού μήτρας χρησιμοποιώντας σχολιασμούς inline και dmine. Χωρίς να αυξήσετε το μέγεθος του πηγαίου κώδικα, μπορείτε να επιτύχετε κέρδη απόδοσης δύο έως πέντε φορές. Επιπλέον, εάν οι ίδιοι μετασχηματισμοί πραγματοποιούνταν χειροκίνητα, αυτό θα οδηγούσε σε αύξηση του κώδικα κατά πολλές φορές, και μερικές φορές κατά μια τάξη μεγέθους, για να μην αναφέρουμε τον χρόνο που δαπανάται για τον εντοπισμό σφαλμάτων και την επιλογή των βέλτιστων παραμέτρων σάρωσης. Για παράδειγμα, ένα καθολικό πρόγραμμα με σχολιασμό επτά γραμμών στο NUDA για πολλαπλασιασμό μήτρας-μήτρας μεταφερόμενης διπλής ακρίβειας εκτελείται σε nVidia Tesla C2050 μόνο 40% πιο αργά από την τρέχουσα ταχύτερη υλοποίηση (CUBLAS 3.2). Ένα παρόμοιο πρόγραμμα γραμμένο με το χέρι θα έπαιρνε 70 γραμμές κώδικα. Φυσικά, για τυπικές εργασίες μπορείτε να γράψετε χειροκίνητα τον κώδικα μία φορά για να αυξήσετε την παραγωγικότητα, αλλά για συγκεκριμένες εργασίες, η μείωση του κόστους εργασίας και η αύξηση της παραγωγικότητας θα είναι πολύ χρήσιμη. Τέλος, τα κέρδη παραγωγικότητας ισχύουν και για τη δημιουργία των ίδιων των επεκτάσεων: είναι ευκολότερο να δημιουργηθούν χρησιμοποιώντας επεκτάσιμες γλώσσες παρά με παραδοσιακά εργαλεία. Ολόκληρο το σύστημα NUDA, παρά τη λειτουργικότητά του, παίρνει μόνο 12 χιλιάδες γραμμές κώδικα, χωρίς να υπολογίζονται οι δοκιμές. Αυτό είναι σχετικά λίγο· για παράδειγμα, ο μεταγλωττιστής γλώσσας Nemerle (κατασκευή 9025) παίρνει περίπου 130 χιλιάδες γραμμές.

Η επεκτάσιμη γλώσσα είναι ένα ισχυρό εργαλείο και η χρήση της σε παράλληλους υπολογιστές είναι ακόμη σε αρχικό στάδιο. Υπάρχουν πολλά ενδιαφέροντα προβλήματα στην ανάπτυξη παράλληλων γλωσσών προγραμματισμού και οποιοδήποτε από αυτά μπορεί να λυθεί χρησιμοποιώντας έναν συνδυασμό επεκτάσεων και βιβλιοθηκών. Μπορείτε να προσθέσετε ασύγχρονα μπλοκ κώδικα και παράλληλους βρόχους στη γλώσσα και μπορείτε να δημιουργήσετε βολικές κατασκευές για τον προγραμματισμό συστημάτων συμπλέγματος, όπως κατανεμημένους πίνακες. Τέλος, μπορείτε να χρησιμοποιήσετε επεκτάσεις για να δημιουργήσετε μια πλήρη παράλληλη γλώσσα προγραμματισμού, όπως η Chapel ή η X10.

Andrey Adinets([email προστατευμένο]) - κατώτερος ερευνητής Ερευνητικό Κέντρο Υπολογιστών του Κρατικού Πανεπιστημίου της Μόσχας (Μόσχα).



Εκτός από τη χρήση σχολίων για την απόκτηση ενός παράλληλου προγράμματος, συχνά επεκτείνουν τις υπάρχουσες γλώσσες προγραμματισμού. Εισάγονται πρόσθετοι τελεστές και νέα στοιχεία για την περιγραφή μεταβλητών, επιτρέποντας στον χρήστη να ορίσει ρητά την παράλληλη δομή του προγράμματος και, σε ορισμένες περιπτώσεις, να ελέγξει την εκτέλεση του παράλληλου προγράμματος. Έτσι, η γλώσσα Fortran υψηλής απόδοσης (HPF), εκτός από τους παραδοσιακούς τελεστές Fortran και το ειδικό σύστημα σχολίων, περιέχει έναν νέο τελεστή FORALL, που εισήχθη για την περιγραφή παράλληλων βρόχων προγραμμάτων. Το πιο ενδιαφέρον χαρακτηριστικό του HPF είναι ο πίνακας χαρτογράφησης πολλαπλών επιπέδων - πίνακας προτύπων - πίνακας εικονικών επεξεργαστών - φυσικοί επεξεργαστές, που επιτρέπει την πιο ευέλικτη αντιστοίχιση των δεδομένων χρήστη σε πραγματικό υπολογιστή.

Ένα άλλο παράδειγμα είναι η γλώσσα mpC, που αναπτύχθηκε στο Ινστιτούτο Προγραμματισμού Συστημάτων της Ρωσικής Ακαδημίας Επιστημών ως επέκταση του ANSI C. Ο κύριος σκοπός του mpC είναι η δημιουργία αποτελεσματικών παράλληλων προγραμμάτων για ετερογενή υπολογιστικά συστήματα. Ο χρήστης μπορεί να καθορίσει την τοπολογία του δικτύου, τη διανομή δεδομένων και υπολογισμών και τις απαιτούμενες μεταφορές δεδομένων. Η αποστολή μηνυμάτων οργανώνεται χρησιμοποιώντας τη διεπαφή MPI.

Το σύστημα DVM έχει σχεδιαστεί για να δημιουργεί φορητές και αποτελεσματικές εφαρμογές υπολογιστών στις γλώσσες C-DVM και Fortran-DVM για παράλληλους υπολογιστές με διαφορετικές αρχιτεκτονικές. Η συντομογραφία DVM αντιστοιχεί σε δύο έννοιες: Κατανεμημένη εικονική μνήμη και κατανεμημένη εικονική μηχανή. Το πρώτο αντικατοπτρίζει την παρουσία ενός ενιαίου χώρου διευθύνσεων. Το δεύτερο αντικατοπτρίζει τη χρήση εικονικών μηχανών για ένα σχήμα δύο σταδίων για χαρτογράφηση δεδομένων και υπολογισμούς σε μια πραγματική παράλληλη μηχανή. Το μοντέλο προγραμματισμού περιλαμβάνει τον καθορισμό εντολών DVM χρησιμοποιώντας ειδικά σχόλια, που σημαίνει μια έκδοση του προγράμματος για διαδοχική και παράλληλη εκτέλεση. Υποστηρίζονται τρεις ομάδες οδηγιών: οδηγίες διανομής δεδομένων, οδηγίες διανομής υπολογιστών και προδιαγραφές απομακρυσμένων δεδομένων. Ο μεταγλωττιστής μεταφράζει το πρόγραμμα σε γλώσσα Fortran ή C, χρησιμοποιώντας μία από τις υπάρχουσες τεχνολογίες παράλληλου προγραμματισμού (MPI, PVM, Router) για την οργάνωση της αλληλεπίδρασης μεταξύ των επεξεργαστών. Το σύστημα DVM περιλαμβάνει επίσης τη βιβλιοθήκη υποστήριξης LIB-DVM, έναν εντοπισμό σφαλμάτων DVM, έναν πρόβλεψη εκτέλεσης προγράμματος DVM και έναν αναλυτή απόδοσης προγράμματος DVM. Το σύστημα αναπτύχθηκε στο Ινστιτούτο Εφαρμοσμένων Μαθηματικών που πήρε το όνομά του. M.V.Keldysh RAS.



Ειδικές γλώσσες προγραμματισμού

Εάν είναι απαραίτητο να αντικατοπτριστούν με μεγαλύτερη ακρίβεια είτε οι ιδιαιτερότητες της αρχιτεκτονικής των παράλληλων συστημάτων είτε οι ιδιότητες μιας συγκεκριμένης κατηγορίας προβλημάτων σε μια συγκεκριμένη θεματική περιοχή, τότε χρησιμοποιούνται ειδικές γλώσσες παράλληλου προγραμματισμού. Η γλώσσα Occam δημιουργήθηκε για τον προγραμματισμό συστημάτων transputer και η γλώσσα μίας ανάθεσης Sisal σχεδιάστηκε για προγραμματισμό μηχανών ροής. Μια πολύ ενδιαφέρουσα και πρωτότυπη εξέλιξη είναι η δηλωτική γλώσσα NORM, που δημιουργήθηκε υπό την ηγεσία του I.B. Zadykhailo στο Ινστιτούτο Εφαρμοσμένων Μαθηματικών που πήρε το όνομά του. M.V.Keldysh RAS για να περιγράψει τη λύση υπολογιστικών προβλημάτων χρησιμοποιώντας μεθόδους πλέγματος. Το υψηλό επίπεδο αφαίρεσης της γλώσσας σας επιτρέπει να περιγράφετε προβλήματα σε μια σημειογραφία κοντά στην αρχική διατύπωση του προβλήματος από έναν μαθηματικό, τον οποίο οι συγγραφείς της γλώσσας ονομάζουν συμβατικά προγραμματισμό χωρίς προγραμματιστή. Μια γλώσσα απλής ανάθεσης δεν περιέχει παραδοσιακές κατασκευές γλώσσας προγραμματισμού που καθορίζουν τη σειρά υπολογισμού και έτσι αποκρύπτουν τον φυσικό παραλληλισμό του αλγορίθμου.

Βιβλιοθήκες και διεπαφές που υποστηρίζουν την αλληλεπίδραση μεταξύ παράλληλων διεργασιών

Με την εμφάνιση των μαζικά παράλληλων υπολογιστών, οι βιβλιοθήκες και οι διεπαφές που υποστηρίζουν την αλληλεπίδραση παράλληλων διεργασιών έχουν γίνει ευρέως διαδεδομένες. Χαρακτηριστικός εκπρόσωπος αυτής της κατεύθυνσης είναι το Message Passing Interface (MPI), η υλοποίηση του οποίου είναι διαθέσιμη σχεδόν σε κάθε παράλληλη πλατφόρμα, από υπερυπολογιστές vector-pipeline μέχρι συμπλέγματα και δίκτυα προσωπικών υπολογιστών. Ο ίδιος ο προγραμματιστής καθορίζει ρητά ποιες διαδικασίες παράλληλων εφαρμογών σε ποιο μέρος του προγράμματος και με ποιες διαδικασίες θα πρέπει είτε να ανταλλάσσουν δεδομένα είτε να συγχρονίζουν την εργασία τους. Συνήθως οι χώροι διευθύνσεων των παράλληλων διεργασιών είναι διαφορετικοί. Συγκεκριμένα, η MPI και η PVM ακολουθούν αυτήν την ιδεολογία. Άλλες τεχνολογίες, όπως το Shmem, επιτρέπουν τη χρήση τόσο τοπικών (ιδιωτικών) μεταβλητών όσο και κοινών (κοινόχρηστων) μεταβλητών που είναι προσβάσιμες σε όλες τις διαδικασίες εφαρμογής και εφαρμόζουν ένα σχήμα για εργασία με κοινόχρηστη μνήμη χρησιμοποιώντας λειτουργίες Put/Get.

Το σύστημα Linda ξεχωρίζει κάπως, προσθέτοντας μόνο τέσσερις επιπλέον λειτουργίες in, out, read και eval σε οποιαδήποτε διαδοχική γλώσσα, κάτι που σας επιτρέπει να δημιουργείτε παράλληλα προγράμματα. Δυστυχώς, η απλότητα της υποκείμενης ιδέας μετατρέπεται σε μεγάλα προβλήματα στην εφαρμογή, γεγονός που καθιστά αυτήν την όμορφη τεχνολογία περισσότερο αντικείμενο ακαδημαϊκού ενδιαφέροντος παρά πρακτικό εργαλείο.

Παράλληλες θεματικές βιβλιοθήκες

Συχνά στην πράξη, οι προγραμματιστές εφαρμογών δεν χρησιμοποιούν καθόλου σαφείς παράλληλες κατασκευές, στρέφοντας σε υπορουτίνες και συναρτήσεις παράλληλων θεματικών βιβλιοθηκών σε χρονικά κρίσιμα τμήματα. Όλος ο παραλληλισμός και όλη η βελτιστοποίηση κρύβονται στις κλήσεις και ο χρήστης μπορεί να γράψει μόνο το εξωτερικό μέρος του προγράμματός του και να χρησιμοποιήσει κανονικά τυπικά μπλοκ. Παραδείγματα τέτοιων βιβλιοθηκών είναι οι Lapack, ScaLapack, Cray Scientific Library, HP Mathematical Library, PETSc και πολλές άλλες.

Μερικές παράλληλες θεματικές βιβλιοθήκες

Οι BLAS και LAPACK είναι βιβλιοθήκες που υλοποιούν βασικές πράξεις γραμμικής άλγεβρας, όπως πολλαπλασιασμός πίνακα, πολλαπλασιασμός πίνακα-διανύσματος κ.λπ.

Το ScaLAPACK περιλαμβάνει ένα υποσύνολο διαδικασιών LAPACK που επανασχεδιάστηκαν για χρήση σε υπολογιστές MPP, συμπεριλαμβανομένων: επίλυσης συστημάτων γραμμικών εξισώσεων, αντιστροφής πίνακα, ορθογώνιων μετασχηματισμών, αναζητήσεων ιδιοτιμών κ.λπ.

FFTW, DFFTPack - γρήγορος μετασχηματισμός Fourier.

Το PETSc είναι ένα σύνολο διαδικασιών και δομών δεδομένων για την παράλληλη επίλυση επιστημονικών προβλημάτων με μοντέλα που περιγράφονται με τη μορφή μερικών διαφορικών εξισώσεων.

Εξειδικευμένα πακέτα και συστήματα λογισμικού

Και τέλος, ο τελευταίος τομέας που αξίζει να αναφερθεί είναι η χρήση εξειδικευμένων πακέτων και συστημάτων λογισμικού. Συνήθως, σε αυτήν την περίπτωση ο χρήστης δεν χρειάζεται να προγραμματίσει καθόλου. Το κύριο καθήκον είναι να καθορίσετε σωστά όλα τα απαραίτητα δεδομένα εισόδου και να χρησιμοποιήσετε σωστά τη λειτουργικότητα του πακέτου. Έτσι, πολλοί χημικοί χρησιμοποιούν το πακέτο GAMESS για να εκτελέσουν κβαντικούς χημικούς υπολογισμούς σε παράλληλους υπολογιστές, χωρίς να σκέφτονται πώς υλοποιείται η παράλληλη επεξεργασία δεδομένων στο ίδιο το πακέτο.

Εργασία μαθήματος

με θέμα: «Γλώσσες προγραμματισμού»


Εισαγωγή

1. Γλώσσες προγραμματισμού

1.1 Ιστορία της ανάπτυξης των γλωσσών προγραμματισμού

2. Ανασκόπηση σύγχρονων γλωσσών προγραμματισμού

2,1 C τις ποικιλίες του

2.2 Πασκάλ

2.3 Fortran

2.4 ΒΑΣΙΚΟ

Συμπεράσματα και προσφορές

Κατάλογος χρησιμοποιημένης βιβλιογραφίας

Εισαγωγή

Στο παρόν στάδιο ανάπτυξης της τεχνολογίας των υπολογιστών, είναι αδύνατο να φανταστεί κανείς κάποιον εξειδικευμένο ειδικό που δεν γνωρίζει την τεχνολογία των πληροφοριών. Δεδομένου ότι η δραστηριότητα οποιουδήποτε θέματος εξαρτάται σε μεγάλο βαθμό από τον βαθμό γνώσης των πληροφοριών, καθώς και από την ικανότητα αποτελεσματικής χρήσης τους. Για ελεύθερο προσανατολισμό στις ροές πληροφοριών, ένας σύγχρονος ειδικός οποιουδήποτε προφίλ πρέπει να μπορεί να λαμβάνει, να επεξεργάζεται και να χρησιμοποιεί πληροφορίες, κυρίως με τη βοήθεια υπολογιστών, καθώς και τηλεπικοινωνιών και άλλων νέων μέσων επικοινωνίας, συμπεριλαμβανομένης της ικανότητας χειρισμού γλωσσών προγραμματισμού.

Η συνάφεια αυτού του θέματος οφείλεται στο γεγονός ότι η πρόοδος της τεχνολογίας των υπολογιστών έχει καθορίσει τη διαδικασία εμφάνισης νέων και ποικίλων συστημάτων σήμανσης για την εγγραφή αλγορίθμων - γλωσσών προγραμματισμού.

Αντικείμενο της μελέτης ήταν οι γλώσσες προγραμματισμού και η ιστορία της ανάπτυξης των γλωσσών προγραμματισμού.

Σκοπός του μαθήματος είναι η μελέτη της ταξινόμησης των γλωσσών προγραμματισμού και η ανάπτυξή τους.

Στόχοι της έρευνας:

1. Προβολή γενικών πληροφοριών και επιπέδων γλωσσών προγραμματισμού.

2. Δείτε την ιστορία της ανάπτυξης γλωσσών προγραμματισμού.

3. Επανεξέταση σύγχρονων γλωσσών προγραμματισμού.

Στόχοι της έρευνας:

1. Εισαγωγή στις γλώσσες προγραμματισμού.

2. Εξέταση της ιστορίας της ανάπτυξης των γλωσσών προγραμματισμού.

3. Ανασκόπηση σύγχρονων γλωσσών προγραμματισμού.

Το πρώτο κεφάλαιο συζητά γενικές πληροφορίες για τις γλώσσες προγραμματισμού και την ιστορία της ανάπτυξής τους.

Το δεύτερο κεφάλαιο παρέχει μια επισκόπηση των σύγχρονων γλωσσών προγραμματισμού.

Αυτή η εργασία μαθήματος χρησιμοποίησε ερευνητικές μεθόδους.

Τεχνικά μέσα που χρησιμοποιούνται: PC: Core 2 DuoE6600 2,4 GHz 2 x 4 MB L2; 2 x 1024 MB DDR3-1333 MHz; NVIDIAGEForce 8600 GT 512 MB; HDDHitachiDesktar 7K1000 1TB; Εκτυπωτής: Canon LBP3010.

Λογισμικό Windows OS XPProfessionalSP3. Αυτή η εργασία μαθήματος ολοκληρώθηκε στο Microsoft Word 2003 και χρησιμοποιήθηκαν επίσης άλλα προγράμματα: Microsoft PowerPoint, Nero StartSmart.

1. Γλώσσες προγραμματισμού

Μια γλώσσα προγραμματισμού είναι ένα σύστημα σημειογραφίας που χρησιμοποιείται για την ακριβή περιγραφή προγραμμάτων ή αλγορίθμων υπολογιστών. Οι γλώσσες προγραμματισμού είναι τεχνητές γλώσσες. Διαφέρουν από τις φυσικές γλώσσες στον περιορισμένο αριθμό "λέξεων" και τους πολύ αυστηρούς κανόνες για τη σύνταξη εντολών (τελεστές). Επομένως, όταν χρησιμοποιούνται για τον προορισμό τους, δεν επιτρέπουν την ελεύθερη ερμηνεία εκφράσεων που χαρακτηρίζουν τη φυσική γλώσσα.

Είναι δυνατό να διαμορφωθούν ορισμένες απαιτήσεις για γλώσσες προγραμματισμού και να ταξινομηθούν οι γλώσσες ανάλογα με τα χαρακτηριστικά τους.

Βασικές απαιτήσεις για γλώσσες προγραμματισμού:

σαφήνεια - η χρήση στη γλώσσα, εάν είναι δυνατόν, ήδη υπαρχόντων συμβόλων που είναι καλά γνωστά και κατανοητά τόσο στους προγραμματιστές όσο και στους χρήστες υπολογιστών.

ενότητα - η χρήση των ίδιων συμβόλων για να δηλώσουν τις ίδιες ή σχετικές έννοιες σε διαφορετικά μέρη του αλγορίθμου. Ο αριθμός αυτών των χαρακτήρων πρέπει να είναι όσο το δυνατόν ελάχιστος.

ευελιξία - η δυνατότητα μιας σχετικά βολικής, απλής περιγραφής κοινών μεθόδων μαθηματικών υπολογισμών χρησιμοποιώντας το περιορισμένο σύνολο οπτικών μέσων που είναι διαθέσιμα στη γλώσσα.

αρθρωτότητα - η ικανότητα περιγραφής πολύπλοκων αλγορίθμων με τη μορφή ενός συνόλου απλών ενοτήτων που μπορούν να μεταγλωττιστούν ξεχωριστά και να χρησιμοποιηθούν σε διάφορους πολύπλοκους αλγόριθμους.

μονοσήμαντη - μονοσήμαντη καταγραφή οποιουδήποτε αλγορίθμου. Η απουσία του θα μπορούσε να οδηγήσει σε λανθασμένες απαντήσεις κατά την επίλυση προβλημάτων.

Επί του παρόντος, υπάρχουν αρκετές εκατοντάδες πραγματικά χρησιμοποιούμενες γλώσσες προγραμματισμού στον κόσμο. Το καθένα έχει τη δική του περιοχή εφαρμογής.

Οποιοσδήποτε αλγόριθμος είναι μια ακολουθία εντολών, μετά την οποία μπορείτε να μετακινηθείτε από τα αρχικά δεδομένα στο αποτέλεσμα σε έναν πεπερασμένο αριθμό βημάτων. Ανάλογα με τον βαθμό λεπτομέρειας των οδηγιών, συνήθως καθορίζεται το επίπεδο της γλώσσας προγραμματισμού - όσο λιγότερες λεπτομέρειες, τόσο υψηλότερο είναι το επίπεδο της γλώσσας.

Με βάση αυτό το κριτήριο, μπορούν να διακριθούν τα ακόλουθα επίπεδα γλωσσών προγραμματισμού:

· μηχανή;

· Μηχανοκεντρική (συναρμολογητές).

· Μηχανοκίνητες (γλώσσες υψηλού επιπέδου).

Οι γλώσσες μηχανής και οι γλώσσες προσανατολισμένες στη μηχανή είναι γλώσσες χαμηλού επιπέδου που απαιτούν τον καθορισμό λεπτομερών λεπτομερειών της διαδικασίας επεξεργασίας δεδομένων. Οι γλώσσες υψηλού επιπέδου, από την άλλη πλευρά, μιμούνται τις φυσικές γλώσσες χρησιμοποιώντας ορισμένες προφορικές γλωσσικές λέξεις και κοινά μαθηματικά σύμβολα. Αυτές οι γλώσσες είναι πιο φιλικές προς τον άνθρωπο.

Διαφορετικοί τύποι επεξεργαστών έχουν διαφορετικά σύνολα εντολών. Εάν μια γλώσσα προγραμματισμού εστιάζει σε έναν συγκεκριμένο τύπο επεξεργαστή και λαμβάνει υπόψη τις δυνατότητές του, τότε ονομάζεται γλώσσα προγραμματισμού χαμηλού επιπέδου. Σε αυτή την περίπτωση, «χαμηλό επίπεδο» δεν σημαίνει «κακό». Αυτό σημαίνει ότι οι χειριστές γλώσσας είναι κοντά στον κώδικα μηχανής και εστιάζονται σε συγκεκριμένες εντολές του επεξεργαστή.

Κατά τον προγραμματισμό σε γλώσσα μηχανής, ο προγραμματιστής μπορεί να ελέγξει κάθε εντολή και κάθε κυψέλη μνήμης και να χρησιμοποιήσει όλες τις δυνατότητες των διαθέσιμων λειτουργιών του μηχανήματος. Όμως η διαδικασία συγγραφής ενός προγράμματος σε γλώσσα μηχανής είναι πολύ χρονοβόρα και κουραστική. Το πρόγραμμα αποδεικνύεται δυσκίνητο, δύσκολο στην προβολή και δύσκολο στον εντοπισμό σφαλμάτων, την αλλαγή και την ανάπτυξη.

Επομένως, στην περίπτωση που είναι απαραίτητο να έχετε ένα αποτελεσματικό πρόγραμμα που να λαμβάνει υπόψη τις ιδιαιτερότητες ενός συγκεκριμένου υπολογιστή στο μέγιστο βαθμό, αντί για γλώσσες μηχανής, χρησιμοποιούνται γλώσσες προσανατολισμένες στη μηχανή (συναρμολογητές) που βρίσκονται κοντά τους .

Η γλώσσα συναρμολόγησης είναι μια γλώσσα χαμηλού επιπέδου για τη μηχανή, στην οποία τα σύντομα μνημονικά ονόματα αντιστοιχούν σε μεμονωμένες οδηγίες μηχανής. Χρησιμοποιείται για την αναπαράσταση προγραμμάτων γραμμένων σε κώδικα μηχανής σε αναγνώσιμη από τον άνθρωπο μορφή.

Η γλώσσα συναρμολόγησης επιτρέπει στον προγραμματιστή να χρησιμοποιεί μνημονικούς κώδικες κειμένου (δηλαδή, που απομνημονεύονται εύκολα από ένα άτομο), να εκχωρεί συμβολικά ονόματα σε καταχωρητές υπολογιστή και μνήμης κατά την κρίση του και επίσης να ορίζει μεθόδους διευθυνσιοδότησης που είναι βολικές για τον εαυτό του. Επιπλέον, σας επιτρέπει να χρησιμοποιείτε διαφορετικά συστήματα αριθμών (για παράδειγμα, δεκαδικά ή δεκαεξαδικά) για την αναπαράσταση αριθμητικών σταθερών, τη χρήση σχολίων στο πρόγραμμα κ.λπ.

Οι γλώσσες χαμηλού επιπέδου δημιουργούν πολύ αποτελεσματικά και συμπαγή προγράμματα επειδή ο προγραμματιστής έχει πρόσβαση σε όλες τις δυνατότητες του επεξεργαστή. Από την άλλη, απαιτεί πολύ καλή κατανόηση του υπολογιστή, δυσκολεύει τον εντοπισμό σφαλμάτων μεγάλων εφαρμογών και το τελικό πρόγραμμα δεν μπορεί να μεταφερθεί σε υπολογιστή με διαφορετικό τύπο επεξεργαστή. Τέτοιες γλώσσες χρησιμοποιούνται συνήθως για τη σύνταξη μικρών εφαρμογών συστήματος, προγραμμάτων οδήγησης συσκευών και λειτουργικών μονάδων διασύνδεσης με μη τυπικό εξοπλισμό, όταν η συμπαγής, η απόδοση και η δυνατότητα άμεσης πρόσβασης σε πόρους υλικού γίνονται οι πιο σημαντικές απαιτήσεις. Σε ορισμένους τομείς, όπως τα γραφικά υπολογιστών, οι βιβλιοθήκες είναι γραμμένες σε γλώσσα assembly για την αποτελεσματική εφαρμογή υπολογιστικά εντατικών αλγορίθμων επεξεργασίας εικόνας.

Έτσι, τα προγράμματα γραμμένα σε γλώσσα assembly απαιτούν σημαντικά λιγότερη μνήμη και χρόνο εκτέλεσης. Η γνώση της γλώσσας συναρμολόγησης και του κώδικα μηχανής ενός προγραμματιστή του δίνει μια κατανόηση της αρχιτεκτονικής του μηχανήματος. Αν και οι περισσότεροι επαγγελματίες λογισμικού αναπτύσσουν προγράμματα σε γλώσσες υψηλού επιπέδου, το πιο ισχυρό και αποτελεσματικό λογισμικό είναι γραμμένο εξ ολοκλήρου ή εν μέρει σε γλώσσα assembly.

Γλώσσες υψηλού επιπέδου αναπτύχθηκαν προκειμένου να απελευθερωθεί ο προγραμματιστής από το να λάβει υπόψη τα τεχνικά χαρακτηριστικά συγκεκριμένων υπολογιστών και την αρχιτεκτονική τους. Το επίπεδο της γλώσσας χαρακτηρίζεται από το βαθμό εγγύτητάς της με τη φυσική, ανθρώπινη γλώσσα. Η γλώσσα μηχανής δεν είναι παρόμοια με την ανθρώπινη γλώσσα· είναι εξαιρετικά φτωχή στα οπτικά της μέσα. Τα μέσα γραφής προγραμμάτων σε γλώσσες υψηλού επιπέδου είναι πιο εκφραστικά και οικεία στον άνθρωπο. Για παράδειγμα, ένας αλγόριθμος υπολογισμού που χρησιμοποιεί έναν σύνθετο τύπο δεν χωρίζεται σε ξεχωριστές πράξεις, αλλά γράφεται συμπαγής με τη μορφή μιας μοναδικής έκφρασης χρησιμοποιώντας γνωστά μαθηματικά σύμβολα. Είναι πολύ πιο εύκολο να δημιουργήσετε το δικό σας ή να κατανοήσετε το πρόγραμμα κάποιου άλλου σε αυτή τη γλώσσα.

Ένα σημαντικό πλεονέκτημα των γλωσσών υψηλού επιπέδου είναι η καθολικότητα και η ανεξαρτησία τους από τους υπολογιστές. Ένα πρόγραμμα γραμμένο σε μια τέτοια γλώσσα μπορεί να εκτελεστεί σε διαφορετικές μηχανές. Ο μεταγλωττιστής προγράμματος δεν χρειάζεται να γνωρίζει το σύστημα εντολών του υπολογιστή στον οποίο σκοπεύει να πραγματοποιήσει υπολογισμούς. Όταν μετακινείστε σε άλλον υπολογιστή, το πρόγραμμα δεν απαιτεί τροποποίηση. Τέτοιες γλώσσες δεν είναι μόνο ένα μέσο επικοινωνίας μεταξύ ενός ατόμου και μιας μηχανής, αλλά και μεταξύ ανθρώπων. Ένα πρόγραμμα γραμμένο σε γλώσσα υψηλού επιπέδου μπορεί να γίνει εύκολα κατανοητό από οποιονδήποτε ειδικό που γνωρίζει τη γλώσσα και τη φύση της εργασίας.

Έτσι, μπορούμε να διατυπώσουμε τα κύρια πλεονεκτήματα των γλωσσών υψηλού επιπέδου έναντι των γλωσσών μηχανής:

Το αλφάβητο της γλώσσας υψηλού επιπέδου είναι πολύ ευρύτερο από το αλφάβητο της γλώσσας μηχανής, γεγονός που αυξάνει σημαντικά τη σαφήνεια του κειμένου του προγράμματος.

το σύνολο των λειτουργιών που επιτρέπεται για χρήση δεν εξαρτάται από το σύνολο των λειτουργιών της μηχανής, αλλά επιλέγεται για λόγους ευκολίας στη διαμόρφωση αλγορίθμων για την επίλυση προβλημάτων μιας συγκεκριμένης κατηγορίας.

η μορφή της πρότασης είναι αρκετά ευέλικτη και βολική στη χρήση, γεγονός που σας επιτρέπει να καθορίσετε ένα αρκετά σημαντικό στάδιο επεξεργασίας δεδομένων χρησιμοποιώντας μία πρόταση.

οι απαιτούμενες πράξεις καθορίζονται χρησιμοποιώντας γενικά αποδεκτές μαθηματικές σημειώσεις.

Zalina 13 Ιανουαρίου 2016 στις 03:42 μ.μ

Διαφορετικές γλώσσες προγραμματισμού και οι τομείς εφαρμογής τους. Διάλεξη στο Yandex

  • Ιστολόγιο της εταιρείας Yandex,
  • Ανάπτυξη ιστοσελίδας,
  • Προγραμματισμός,
  • Βιομηχανικός προγραμματισμός

Αποφασίσαμε να αφιερώσουμε την πρώτη μας ανάρτηση φέτος σε ένα πολύ βασικό θέμα, μια διάλεξη για το οποίο δόθηκε στο Small ShAD. Συμμετέχουν μαθητές γυμνασίου που ενδιαφέρονται για την τεχνολογία, εξ ου και η ιδιαιτερότητα της παρουσίασης - η διάλεξη θα είναι ιδιαίτερα ενδιαφέρουσα για όσους μόλις αρχίζουν να προγραμματίζουν και σκέφτονται ποια κατεύθυνση να αναπτύξουν. Για αυτούς, η Yandex έχει ένα μάθημα "Εισαγωγή στον Προγραμματισμό (C++)", το οποίο μπορεί να παρακολουθηθεί στην πλατφόρμα Stepic.org.

Ο Λέκτορας Mikhail Gustokashin είναι ο επιμελητής ακαδημαϊκών προγραμμάτων στο Yandex, διευθυντής του κέντρου φοιτητικών διαγωνισμών στη Σχολή Επιστήμης Υπολογιστών στην Ανώτατη Οικονομική Σχολή. Ο Μιχαήλ έχει εκπαιδεύσει δεκάδες νικητές και νικητές των Πανρωσικών Ολυμπιάδων Προγραμματισμού.

Η διάλεξη μιλά για το ποιες γλώσσες προγραμματισμού υπάρχουν, πώς διαφέρουν, πώς εμφανίστηκαν και ποιες είναι καλύτερες και ποιες χειρότερες. Στην αρχή, θα μιλήσουμε λίγο για την ιστορία των γλωσσών - πώς εμφανίστηκαν, πώς άρχισαν να προγραμματίζουν οι άνθρωποι, πώς αναπτύχθηκαν τα πάντα, τι συμβαίνει τώρα. Το δεύτερο μέρος θα θίξει ποιες εργασίες για ποια γλώσσα είναι κατάλληλη, πώς να «επιλέξετε την αγαπημένη σας γλώσσα και να απολαύσετε τη ζωή». Ο λέκτορας θα μιλήσει επίσης λίγο για το πώς, κατά τη γνώμη του, μπορείς να τα μάθεις όλα αυτά και μετά να βρεις δουλειά.

Όπως πάντα, κάτω από την περικοπή υπάρχει μια λεπτομερής απομαγνητοφώνηση της διάλεξης, ώστε να μπορείτε να πλοηγηθείτε στο περιεχόμενό της.

Ιστορία των γλωσσών προγραμματισμού

Ας τα πάρουμε από την αρχή. Στην αρχή οι υπολογιστές δεν είχαν καν πληκτρολόγια! Δηλαδή, όλα ήταν πολύ άσχημα - δεν είχαν ούτε πληκτρολόγιο ούτε οθόνη, είχαν μόνο κάρτες διάτρησης (αυτά είναι μικροπράγματα με τρύπες ή χωρίς τρύπες). Αντίστοιχα, είτε κόλλησαν εκεί τις καρφίτσες, είτε έριξαν φως εκεί. Εάν υπάρχει μια τρύπα (ή το αντίστροφο όχι) - αυτό σήμαινε ένα μηδέν ή ένα. Και τα προγράμματα εκείνη την εποχή γράφονταν χρησιμοποιώντας κώδικες μηχανής - κάθε λειτουργία σε έναν υπολογιστή (πρόσθεση, αφαίρεση, μερικές πιο περίπλοκες πράξεις) είχε κάποιο είδος κώδικα μηχανής. Οι ίδιοι οι άνθρωποι επέλεξαν αυτόν τον κωδικό από μια πινακίδα, όλων των ειδών τις διευθύνσεις στη μνήμη, τα έσκασαν όλα με τα χέρια τους και τον έβαλαν στον αναγνώστη - και όλα μετρήθηκαν. Φυσικά, η δουλειά ενός προγραμματιστή μάλλον δεν ήταν ιδιαίτερα ενδιαφέρουσα τότε - κάνοντας τρύπες - και με την ανάπτυξη της επιστήμης και της τεχνολογίας, φυσικά, άρχισαν να βρίσκουν κάθε λογής πιο «ενδιαφέροντα» πράγματα. Για παράδειγμα, assembler, που ήδη έκανε τη ζωή κάπως πιο εύκολη.

Λοιπόν, πώς έκανε τη ζωή πιο εύκολη; Αντί να θυμόμαστε ότι υπήρχε κάποιο είδος «μαγικού» κώδικα για την εντολή, χρησιμοποιήθηκαν όλα τα είδη λέξεων που ήταν παρόμοιες με τα «ανθρώπινα» αγγλικά - μερικές add ή mov - και στη συνέχεια καταχωρήσεις ή περιοχές μνήμης, μεταβλητές με τις οποίες χρειάζονταν καταγράφηκαν εκτελούν λειτουργίες. Αλλά είναι σαφές ότι αυτό, σε γενικές γραμμές, απαιτούσε επίσης πολλή διανοητική προσπάθεια για να κρατήσουμε στο μυαλό μας σε ποιο μητρώο έχουμε τι, πού είναι οι μεταβλητές και τι συμβαίνει γενικά. Γιατί συνέβη αυτό; Γιατί οι υπολογιστές ήταν «ανόητοι» και δεν μπορούσαν να καταλάβουν τίποτα πιο «έξυπνο». Στην πραγματικότητα, η συναρμολόγηση του κώδικα μηχανής από το assembler απαιτεί επίσης χρόνο και μνήμη (εκείνη την εποχή, φυσικά, ήταν λίγος).

Σταδιακά, έγινε σαφές ότι η ανάπτυξη τόσο μεγάλων πολύπλοκων προγραμμάτων ήταν πολύ δύσκολη. Η παραγωγικότητα του προγραμματιστή σε αυτές τις ομάδες ήταν εξαιρετικά χαμηλή - δηλαδή έγραφε πολλές γραμμές την ημέρα (με νόημα) και κάθε γραμμή δεν έκανε κάτι ιδιαίτερο - κάποιες απλές αριθμητικές πράξεις. Και οι άνθρωποι ήθελαν να κάνουν τις γλώσσες πολύ πιο παρόμοιες με την ανθρώπινη γλώσσα, με τα Αγγλικά συγκεκριμένα, για να κάνουν τη σύνταξη προγραμμάτων ευκολότερη και πιο βολική. Και φεύγουμε!

Παλιές και νεκρές γλώσσες

Μία από τις πρώτες γλώσσες ήταν η Fortran. Παρεμπιπτόντως, ήταν επίσης διάτρητη σε διάτρητες κάρτες - υπήρχαν ειδικές διάτρητες κάρτες για τη διάτρηση των προγραμμάτων Fortran. Αλλά αν πάρετε αυτό το Fortran τώρα, κατά τη γνώμη μου, είναι κάπου μεταξύ 50-60. εμφανίστηκε - και αν προσπαθήσετε να γράψετε κάτι σε αυτό, θα είστε πολύ δυσάρεστοι, σας εγγυώμαι! Το σύγχρονο Fortran είναι ακόμα ζωντανό, αλλά είναι αρκετά διαφορετικό από αυτό που ήταν πριν.

Άλλες γλώσσες - τώρα θα γράψω ένα πράγμα που πιθανότατα έχετε ακούσει μόνο σε διάφορες εκδηλώσεις όπου μιλούν για την ιστορία του προγραμματισμού - αυτό είναι το COBOL. Ήταν μια γλώσσα για τη σύνταξη επιχειρηματικών εφαρμογών. Τι είναι οι επιχειρηματικές εφαρμογές; Κάποιες συναλλαγές σε τράπεζες, κάτι άλλο, όλα αυτά γράφτηκαν στην Cobol. Φυσικά, δεν είναι πολύ δημοφιλές εδώ. Νομίζω ότι θα δυσκολευτείτε πολύ να βρείτε έναν προγραμματιστή Cobol στη Μόσχα. Και κάπου όχι στη Μόσχα - με ακόμη μεγαλύτερη δυσκολία. Αλλά, παραδόξως, μόλις πριν από 10 χρόνια, περισσότερο από το ήμισυ του συνόλου του κώδικα που γράφτηκε από την ανθρωπότητα γράφτηκε στο Cobol. Και μέχρι σήμερα, ένα σημαντικό μέρος όλων των τραπεζικών συναλλαγών πραγματοποιείται χρησιμοποιώντας προγράμματα γραμμένα σε αυτό (COBOL) και οι άνθρωποι εξακολουθούν να γράφουν κάτι σε αυτό.

Υπάρχει επίσης μια «αστεία» γλώσσα, ονομαζόταν Algol (η 68η έκδοση, που χαρακτηρίζει το έτος δημιουργίας της). Αυτή είναι μια αλγοριθμική γλώσσα. Γενικά, μπόρεσαν να κάνουν κάτι εκεί, αλλά τώρα δεν μας ενδιαφέρει πολύ τι μπορούν να κάνουν. Και με αυτό μπορούμε να ολοκληρώσουμε την εκδρομή μας στην αρχαιότητα και σε σχετικά αχρησιμοποίητες γλώσσες και να προχωρήσουμε σε αυτό που είναι ακόμα ζωντανό (και ενεργά).

Παλιές αλλά ζωντανές γλώσσες

Το Algol εφευρέθηκε στην Ευρώπη και το Fortran χρησιμοποιήθηκε κυρίως στις Ηνωμένες Πολιτείες - δεν υπάρχουν μεγάλες διαφορές. Ποια τάση είναι αισθητή; Στην αρχή όλα ήταν περίπλοκα και για να γράψεις έπρεπε να είσαι σχεδόν μηχανικός, ηλεκτρολόγος μηχανικός, για να καταλάβεις πού συνδέονται ποιες επαφές και κάτι άλλο για προγραμματισμό. Έπειτα έπρεπε επίσης να κάθεσαι με τα χαρτάκια και να μετράς τη μνήμη, να την προσέχεις. Και σταδιακά όλα έγιναν πιο απλά, πιο απλά, πιο απλά και μετά ακόμα πιο απλά για τον προγραμματιστή - να σκέφτεται όσο το δυνατόν λιγότερο για έναν άνθρωπο, να κάνει όσο το δυνατόν περισσότερα αυτόματα. Γύρω στο τέλος αυτής της περιόδου (ο ομιλητής επισημαίνει το Algol και το Kobol), αρχίζουν να εμφανίζονται γλώσσες που, κατά μία έννοια, έχουν «επιβιώσει» μέχρι σήμερα.

ΒΑΣΙΚΟΣ. Ίσως κάποιοι εξακολουθούν να γράφουν κάτι σε αυτό, τουλάχιστον είδα ότι σε ορισμένα ιδρύματα διδάσκουν στο QBasic - υπάρχει ένα μπλε παράθυρο όπου γράφεται το "1989". Γενικά, «ζει με όλη του τη δύναμη»! Εφευρέθηκε ως γλώσσα για μη προγραμματιστές. Εκείνη την εποχή, ο προγραμματιστής ήταν ένα τόσο πολύ εξειδικευμένο επάγγελμα. Και εδώ σας λένε: "Έχουμε μια δροσερή βασική γλώσσα και κάθε λογικός άνθρωπος μπορεί να γράψει ένα πρόγραμμα σε αυτήν - είναι εύκολο." Και πάλι, ότι το BASIC και το σύγχρονο BASIC είναι μια τεράστια διαφορά. Όλες αυτές οι γραμμές αριθμούνται μετά το 10, κάθε λογής GOTO και άλλα φρικτά - δεν έχουν πλέον καμία σχέση με το σύγχρονο BASIC, ακόμα και με το BASIC του 1989 δεν έχουν καμία σχέση με αυτό.

Μια άλλη αστεία ιστορία είναι η γλώσσα Pascal, ευρέως γνωστή στους πανεπιστημιακούς κύκλους, κυρίως στη Ρωσία και στις χώρες της πρώην Σοβιετικής Ένωσης. Χρησιμοποιήθηκε και συνεχίζει να χρησιμοποιείται απροσδόκητα ως γλώσσα διδασκαλίας. Στον υπόλοιπο κόσμο είναι λιγότερο κοινό, αλλά είναι επίσης ζωντανό και καλά. Υπάρχει ένα τέτοιο άτομο όπως ο Wirth - είναι επιστήμονας, θεωρητικός. Συμμετείχε στη συζήτηση για το Algol, δεν του άρεσε αυτό που συνέβη και βρήκε τη δική του γλώσσα - τον Pascal. Και τότε η εταιρεία Borland (και πριν από αυτό πολλές άλλες εταιρείες - η Apple συμμετείχε, συγκεκριμένα) το πήρε και κατέστρεψε τα πάντα. Είχε μια όμορφη, συνεκτική θεωρία - «όλα θα πάνε καλά» - και την πήραν και την γέμισαν με αυτά που χρειάζονταν οι άνθρωποι για να δουλέψουν. Λοιπόν, δεν έγινε τόσο όμορφο όσο ήθελε.

Και τελικά... Το C επινοήθηκε από μηχανικούς. Αν ο Pascal εφευρέθηκε από έναν επιστήμονα, τότε το C εφευρέθηκε από τον Kernighan και τον Ritchie, εργάστηκαν ως μηχανικοί στο Bell. Πως εγινε αυτο? Εκείνη την εποχή, ήταν αδύνατο να γραφτεί οτιδήποτε συστημικό σε αυτές τις γλώσσες (ο λέκτορας δείχνει τα Fortran, COBOL, Algol). Τι είναι το «συστημικό»; Για παράδειγμα, ένα λειτουργικό σύστημα, μερικά προγράμματα οδήγησης, κάτι άλλο. Αυτές οι γλώσσες προορίζονταν για μαθηματικούς υπολογισμούς, για επαγγελματικούς υπολογισμούς, για όλα αυτά. Και όλα τα άλλα γράφτηκαν στη Συνέλευση. Υπήρχαν κάποιες γλώσσες, είναι πλέον νεκρές, δηλαδή η γλώσσα C δεν εμφανίστηκε αμέσως από το Assembly, αλλά μέσω κάποιων ενδιάμεσων πραγμάτων.

Ποιο ειναι το νοημα? Ο Kernighan και ο Ritchie αγαπούσαν να παίζουν το παιχνίδι Asteroids - ένα διαστημόπλοιο πετάει, και υπάρχουν αστεροειδείς, τους πυροβολεί και καταρρέουν. Είχαν έναν διακομιστή όπου έπαιζαν, αλλά υπήρχε πολύς κόσμος εκεί και το παιχνίδι ήταν αργό. Και ανακάλυψαν κάπου στο γραφείο τους ότι είχαν κάποιο είδος υπολογιστή που δεν χρησιμοποιούσε κανείς. Αλλά υπήρχε ένα πρόβλημα - ήταν διαφορετικής αρχιτεκτονικής και το παιχνίδι γράφτηκε σε Assembly.

Το ξαναέγραψαν, φυσικά, πρόσθεσαν ακόμη και κάποια χαρακτηριστικά για να παίξουν σε αυτό. Αλλά αυτό τους οδήγησε στην ιδέα ότι το να ξαναγράφεις για μια νέα αρχιτεκτονική κάθε φορά δεν είναι πολύ έξυπνο. Και αποφάσισαν να γράψουν μια γλώσσα υψηλού επιπέδου που θα ήταν κατάλληλη για προγραμματισμό συστήματος, δηλαδή, στην οποία θα ήταν δυνατή η διαχείριση της μνήμης, στην οποία θα ήταν δυνατό να κατανοήσουμε πού βρίσκονται τα πράγματα και πώς να αποκτήσετε πρόσβαση σε αυτά τα κομμάτια μνήμης . Και έτσι εμφανίστηκε η γλώσσα C, η οποία είχε τεράστια επιρροή σε όλα όσα ακολούθησαν. Όλοι τους (ο ομιλητής επισημαίνει το Algol, το Fortran και άλλες γλώσσες που αναφέρονται) είχαν μεγάλη επιρροή, αλλά C - απλά ναι...

Αντίστοιχα, ήταν η κύρια γλώσσα στο Unix, ένα λειτουργικό σύστημα που ήταν ακόμα πιο δημοφιλές εκείνη την εποχή από ό,τι είναι τώρα. Και γύρω στη δεκαετία του '80, η κατάσταση ήταν κάπως έτσι (ο λέκτορας δείχνει Basic, C και άλλες αναφερόμενες γλώσσες). Ας πούμε ότι όλα αυτά έχουν ήδη σβήσει σιγά σιγά στη χώρα μας (ο λέκτορας σβήνει τις αναφορές για τη γλώσσα Assembly, το Fortran και το Algol)... Και στη δεκαετία του '80, οι υπολογιστές έγιναν μικρότεροι, πιο έξυπνοι, φθηνότεροι και οι άνθρωποι ήθελαν κάθε λογής περίεργα πράγματα να κάνει τη ζωή ακόμα καλύτερη, να ζήσει ακόμα πιο διασκεδαστικά.

Γλώσσες από τη δεκαετία του '80

Ένα από τα πρώτα περίεργα ήταν ότι ήταν γλώσσα C++. Η γλώσσα C έχει έναν τεράστιο αριθμό ελλείψεων (καλά, γενικά τεράστιες) - μπορείτε να κάνετε τα πάντα σε αυτήν, συμπεριλαμβανομένου του να πυροβολήσετε τον εαυτό σας στο πόδι, να πυροβολήσετε τον εαυτό σας στο πόδι με μυθοπλασία, στο άλλο πόδι, να πυροβολήσετε το ένα πόδι στο άλλο πόδι, γενικά - ό,τι θέλεις να κάνεις. Αλλά ταυτόχρονα, ορισμένα αρχιτεκτονικά πράγματα γίνονται εκεί αρκετά δύσκολα - και πάλι, όπως στη Συνέλευση, πρέπει να παρακολουθούμε πού βρισκόμαστε, τι και τι μνήμη έχουμε διαθέσει. Είναι εκεί όλη την ώρα που «ρέει» κάπου, αυτή η μνήμη -δηλαδή, τη διαθέσαμε, ξεχάσαμε να τη διαγράψουμε, διαγράψαμε το λάθος πράγμα, ξεπέρασε τα όρια της μνήμης, γενικά - αντιμετωπίσαμε ένα σωρό προβλήματα.

Η C++ δημιουργήθηκε αρχικά ως ένα σύνολο προσθηκών στη γλώσσα C που θα έκαναν την ανάπτυξη ευκολότερη. Εκείνη την εποχή, ο αντικειμενοστραφής προγραμματισμός έγινε της μόδας και οι άνθρωποι αποφάσισαν ότι όλα θα μπορούσαν να περιγραφούν με τη μορφή μιας ιεραρχίας, δηλαδή, έχεις μια μπάλα (αφηρημένη), κληρονομείς από αυτήν μια μπάλα ποδοσφαίρου, μια μπάλα βόλεϊ, μια άλλη αφηρημένη μπάλα. . Ήταν της μόδας τότε ότι «τώρα γράφουμε τα πάντα με τη μορφή κάποιας ιεραρχίας, και όλα θα πάνε καλά, η ζωή θα γίνει καλύτερη, όλα θα πάνε καλά και αυτό είναι». Η C++, κατά μία έννοια, εφάρμοσε αυτήν την αντικειμενική προσέγγιση - δεν ήταν η πρώτη αντικειμενοστραφής γλώσσα προγραμματισμού, αλλά έγινε αρκετά δημοφιλής και όλα τα είδη των χαρακτηριστικών άρχισαν να εμφανίζονται σε αυτήν. Ταυτόχρονα, η C++ διατήρησε σχεδόν πλήρη συμβατότητα (εκείνη την εποχή) με τη γλώσσα C· ένα πρόγραμμα γραμμένο σε C μεταγλωττίστηκε επιτυχώς ως C++ στο 99% των περιπτώσεων και μάλιστα λειτουργούσε με τον ίδιο τρόπο. Αυτό είχε σκοπό να διευκολύνει τη μετάβαση από το C σε C++.

Εκτός από την προσέγγιση αντικειμένων (σε C++), εμφανίστηκε γρήγορα μια τυπική βιβλιοθήκη προτύπων (STL). Νομίζω ότι στο σχολείο, όσοι μάθαιναν ακόμα Pascal ανακάλυψαν ότι, πρώτον, δεν έχετε ενσωματωμένη ταξινόμηση (στο αρχαίο, μπλε Borland Pascal, τώρα είναι ήδη σε σύγχρονες εκδόσεις) - υπάρχει ένα παράδειγμα (πηγή κωδικός) ταξινόμηση, μπορεί να αντιγραφεί και να επικολληθεί. Αλλά αν θέλετε να ταξινομήσετε ακέραιους αριθμούς εδώ, πραγματικούς αριθμούς εδώ, και συμβολοσειρές εδώ που μπορούν να συγκριθούν μεταξύ τους, έπρεπε να γράψετε τρεις διαφορετικές κατηγορίες που κάνουν ακριβώς το ίδιο πράγμα, απλώς έχουν διαφορετικούς τύπους δεδομένων. Αυτό δεν είναι πολύ καλό και τα πρότυπα που δεν εμφανίστηκαν αμέσως στη C++ μείωσαν σημαντικά αυτό το πρόβλημα. Δηλαδή, είχατε ένα αφηρημένο πρόγραμμα που ταξινόμησε με επιτυχία κάτι που μπορούσε να συγκριθεί μεταξύ τους.

Γλώσσες γραφής από τη δεκαετία του '90

Αλλά ο χρόνος δεν έμεινε ακίνητος· στη δεκαετία του '80 συνέβησαν πολλά ενδιαφέροντα πράγματα. Αλλά κάπου στις αρχές της δεκαετίας του '80 και του '90, οι υπολογιστές έγιναν τόσο καλοί που ήταν δυνατό να κάνουμε πολύ περίεργα και πολύ αναποτελεσματικά πράγματα. Συγκεκριμένα, αυτές ήταν γλώσσες σεναρίου που δεν μεταγλωττίστηκαν σε κώδικα μηχανής, αλλά μάλλον ερμηνεύτηκαν. Το BASIC ερμηνεύτηκε επίσης κάποια στιγμή, αλλά αυτές οι γλώσσες δέσμης ενεργειών προορίζονταν κυρίως για επεξεργασία κειμένου - αυτές είναι, για παράδειγμα, Perl, Python (δεν ήταν πολύ διάσημο τότε), PHP, Ruby - αυτές είναι οι γλώσσες σεναρίου ότι στο ένα ή το άλλο σε διαφορετικό βαθμό, ζουν ακόμα (όλοι τους κατάφεραν να εμφανιστούν πριν το 2000, ακόμη και πολύ νωρίτερα).

Ας τα δούμε λίγο γιατί αυτά είναι συγκεκριμένα πράγματα και χρησιμοποιούνται πλέον σε πολλά μέρη. Ποια είναι η ιδέα; Αν δεν κάνουμε μεταγλώττιση, τότε μπορούμε να επιτρέψουμε πολλά περισσότερα. Για παράδειγμα, ένα πρόγραμμα μπορεί να κοιτάξει τον κώδικά του και να τον χρησιμοποιήσει με κάποιο τρόπο. ξέρει τι συμβαίνει μέσα της και λόγω αυτού μπορεί να κάνει πολλά ενδιαφέροντα πράγματα.

Το Perl προοριζόταν για επεξεργασία κειμένου - εκείνες τις μέρες υπήρχε τόση μνήμη στους υπολογιστές που μπορούσες να γεμίσεις κείμενο εκεί και να κάνεις κάτι χρήσιμο με αυτό το κείμενο (για παράδειγμα, να μετράς λέξεις, να κάνεις κάποιο είδος αναζήτησης). Αλλά, κατά τη γνώμη μου, σχεδιάστηκε από ανθρώπους που ήταν λίγο τρελοί, επειδή υπάρχει ένα αστείο σχετικά με αυτό: "Οποιοδήποτε σύνολο χαρακτήρων γραμμένο είναι ένα έγκυρο πρόγραμμα Perl." Κατά τη γνώμη μου, μπορείτε μόνο να γράψετε πάνω του, δεν μπορείτε να το διαβάσετε. Όταν κοιτάζω τον κώδικα Perl και προσπαθώ να καταλάβω κάτι, δεν καταλαβαίνω τίποτα. Ίσως αν τον ήξερα καλύτερα, θα καταλάβαινα κάτι, αλλά όπως άκουσα από εκείνους τους ανθρώπους που ξέρουν ακόμα πώς, λένε ότι είναι πιο εύκολο να το ξαναγράψω. Δηλαδή, τα προγράμματα αποδεικνύονται σύντομα και είναι πραγματικά πιο εύκολο να τα ξαναγράψεις από την αρχή παρά να καταλάβεις τι υπάρχει και να το διορθώσεις.

Εκείνη την εποχή, στα μέσα της δεκαετίας του '90, εμφανίστηκε το Διαδίκτυο. Στην αρχή ήταν ταχυδρομείο, ιστότοποι με στατικό HTML, αλλά οι άνθρωποι ήθελαν να προσθέσουν κάποιο είδος δυναμικής εκεί, ώστε όλα να γίνονται δυναμικά, να συμπληρώνονται κάποιες φόρμες, να δημιουργούνται βιβλία επισκεπτών και κάτι άλλο. Κατά συνέπεια, αυτό απαιτούσε κάποιου είδους αλληλεπίδραση, κατέληξαν σε ένα πρωτόκολλο, πώς αλληλεπιδρά και, το πιο σημαντικό, τη δημιουργία αυτών των στατικών (υπό όρους) σελίδων που θα «φτύσουν» στον χρήστη ως απάντηση στο αίτημά του.

Γενικά, τίποτα άλλο από το Pearl δεν ήταν κατάλληλο εκείνη την εποχή. Το να γράψεις έναν χειριστή σε καθαρή C ή C++ ήταν κακή ιδέα. Και ελλείψει τίποτα καλύτερο, εκείνη την εποχή (και για αρκετό καιρό) η Pearl ήταν η δημοφιλής γλώσσα για την ανάπτυξη ιστού. Φυσικά, η κλίμακα δεν μπορεί να συγκριθεί με αυτό που συμβαίνει τώρα.

Η PHP εμφανίστηκε ως... τυχαία. Ένα άτομο σταμάτησε να το κάνει αυτό αρκετά γρήγορα - έφτιαξε τη δική του σελίδα, είχε κάποιο είδος βιβλίου επισκεπτών, κάτι άλλο, κάποια άλλα πράγματα. Και έγραψε ένα σύνολο από μερικές μακροεντολές για την Perl που ήταν παρόμοιες με το C, επειδή ήξερε πώς να χρησιμοποιεί το C, απλώς επειδή του ήταν τόσο βολικό. Και το ονόμασα Προσωπική Αρχική Σελίδα. Το μοιράστηκε και είπε: «Κοιτάξτε τι έγραψα, όλα εδώ είναι πολύ πιο ξεκάθαρα από ό,τι στο Perl και μπορείτε να τα επεξεργαστείτε». Και άρεσε στον κόσμο.

Μετά παράτησε αυτή την επιχείρηση. Σε γενικές γραμμές, ως αποτέλεσμα, αυτή η PHP άρχισε να ζει και έγινε με τον καιρό πολύ πιο δημοφιλής από την Perl. Αλλά αυτό το «τραύμα γέννησής» του (που σχεδιάστηκε ως ένα σύνολο μακροεντολών για τον Pearl) του έκανε ένα πολύ σκληρό αστείο. Η γλώσσα έγινε περίεργη. Δηλαδή, αναπτύχθηκε από μόνο του, κανείς δεν το σχεδίασε, κανείς δεν διαχειρίστηκε τη διαδικασία ανάπτυξης (ούτε εταιρεία, ούτε κανένα άτομο), αλλά υπήρχαν πολλές ομάδες, καθεμία από τις οποίες πριόνισε αυτό που τους άρεσε. Ως αποτέλεσμα, οι λειτουργίες ονομάζονται διαφορετικά, δεν υπάρχει καν στυλ, όλα είναι υπογραμμισμένα, βασικά τυχαία, οι ρυθμίσεις είναι εδώ κι εκεί και πώς θα λειτουργήσουν όλα αυτά δεν είναι πολύ σαφές. Αλλά μπορείτε να καθίσετε και να γράψετε σε PHP σε δύο ώρες, γιατί έτσι προοριζόταν.

Python και Ruby: Το Ruby είναι λιγότερο δημοφιλές τώρα, το Python είναι κατά κάποιο τρόπο καλύτερα «πλανισμένο», ας το μιλήσουμε αργότερα. Είναι σαφές ότι εκείνες τις μέρες αυτές ήταν (ο ομιλητής επισημαίνει την Perl, Python, Ruby, PHP) εξαιρετικά εξειδικευμένες γλώσσες για εξαιρετικά εξειδικευμένους σκοπούς. Γενικά, κανείς δεν έγραφε κανένα προγραμματισμό συστήματος, καμία επιχειρηματική λογική σε αυτά εκείνη την εποχή και τώρα δεν το κάνει και πολύ.

Συγκεντρωμένες γλώσσες από τη δεκαετία του '90

Θα κινηθούμε τις ίδιες φορές, αλλά προς την άλλη κατεύθυνση. Εκείνη την εποχή, χρησιμοποιούσαμε τη C++ για σχεδόν όλα όσα έπρεπε να γραφτούν, όχι για το διαδίκτυο, όχι για επεξεργασία κειμένου, αλλά για απλές εφαρμογές, για λειτουργικά συστήματα, για παιχνίδια - γενικά, για οτιδήποτε. Αλλά η C++ είναι στην πραγματικότητα μια τρομερή γλώσσα. Γιατί; Επειδή, πρώτον, κληρονόμησε όλα τα προβλήματα C λόγω συμβατότητας προς τα πίσω. Εκεί θα μπορούσατε ακόμα να αυτοκτονήσετε με ένα εκατομμύριο διαφορετικούς τρόπους, τους ίδιους που ήταν στο C (φυσικά, νέοι τρόποι προστέθηκαν στη C++). Ταυτόχρονα, εάν γράψετε τα πάντα καλά και σωστά, όπως προοριζόταν από τους συντάκτες της C++, τότε, φυσικά, δεν ήταν πλέον δυνατό να αυτοκτονήσετε χρησιμοποιώντας τις παλιές μεθόδους κώδικα C και φαίνεται ότι υπάρχουν λιγότερα τους. Ωστόσο, είχε ένα πολύ παράξενο, περίεργο μοντέλο αντικειμένου. Ο διαχωρισμός ενός προγράμματος σε ενότητες, σε κάποια κομμάτια, γενικά προήλθε από το C (αν γνωρίζετε πώς να γράφετε, συμπεριλάβετε σε C ή C++ - στην πραγματικότητα, προοριζόταν ως ένας τρόπος να εισαγάγετε απλώς το κείμενο της βιβλιοθήκης στο πρόγραμμά σας, στο τέλος, όταν γράφετε μια δέσμη περιεχομένων, έχετε τα πάντα - αν είναι "πρωτόγονο", όπως ήταν στην αρχή - όλα εισάγονται σε ένα αρχείο και μετά χρειάζεται τρομερά πολύς χρόνος για τη μεταγλώττιση, γιατί πάει γύρω Ο ίδιος ο Πασκάλ, ο Βιρτόφσκι, ήταν πολύ πιο στοχαστικός από αυτή την άποψη, οι μεταγενέστερες εκδόσεις έγιναν ακόμη καλύτερες.

Γενικά, η C++ έχει πολλά μειονεκτήματα. Ο προγραμματιστής έπρεπε να έχει υψηλά προσόντα για να γράφει σε C++, και τέτοιοι προγραμματιστές ήταν ακριβοί (και η εκπαίδευση, και κάτι άλλο, δηλαδή είναι δύσκολο να βρεις προγραμματιστές στην αγορά, πρέπει να πληρωθούν πολύ, καλά, γενικά Αυτή δεν είναι η περίπτωση... ). Και οι υπολογιστές μας μετρούν όλο και πιο γρήγορα, γίνονται φθηνότεροι, οι άνθρωποι αγοράζουν νέους υπολογιστές και θέλουν περισσότερες εφαρμογές, περισσότερα παιχνίδια για τα τηλέφωνά τους, γενικά - περισσότερη χαρά.

Έτσι εμφανίστηκε η Java. Υπάρχει επίσης μια μάλλον αστεία ιστορία για το πώς πήρε το όνομά της αυτή η γλώσσα. Υπάρχουν προγραμματιστές εκεί, πίνουν συνέχεια καφέ και εκείνη την εποχή ήταν της μόδας να πίνουν καφέ, που φύτρωνε στο νησί της Ιάβας. Η γλώσσα σχεδιάστηκε ως γλώσσα για ενσωματωμένες συσκευές, ιδιαίτερα για καφετιέρα. Έτσι προέκυψε το όνομα...
Τι ξεκίνησε μαζί της, τι ήταν καλό της και γιατί κέρδισε τόση δημοτικότητα; Πρώτον, ξεφορτώθηκαν εντελώς την κληρονομιά του Sishnoi. Δεν υπάρχουν σημάδια, πολύ λιγότεροι τρόποι να αποσπάσεις κάποιο μέρος του σώματός σου και να σπάσεις τα πάντα. Δεύτερον, εισήγαγαν πολύ πιο πρόσφατες ιδέες όσον αφορά το μοντέλο αντικειμένου - δηλαδή, η C++ εμφανίστηκε πολύ νωρίτερα από την Java και χρησιμοποίησε ένα πιο αρχαϊκό, «άγριο» μοντέλο αντικειμένων. Λοιπόν, εδώ (ο ομιλητής επισημαίνει την Java) ήταν ήδη πιο μελετημένο τότε, και θεωρητικά οι άνθρωποι σκέφτηκαν, και στην πράξη εφάρμοζαν και έκαναν τα πάντα πολύ πιο δροσερά.

Και τέλος, τρίτο. Τα προγράμματα Java μας μεταγλωττίστηκαν όχι σε κώδικα μηχανής, αλλά σε κώδικα για μια εικονική μηχανή. Δηλαδή, είχατε μια εικονική μηχανή (VM) JVM - Java. Τα προγράμματά σας συγκεντρώθηκαν σε κάποιο είδος ενδιάμεσης αναπαράστασης και στη συνέχεια, με τη βοήθεια αυτού του μηχανήματος, είχαν ήδη εκτελεστεί. Τι έδωσε; Πρώτον, επιβράδυνε, δεύτερον, έτρωγε τη μνήμη με τρομερή δύναμη, τρίτον, ήταν φορητό οπουδήποτε (θεωρητικά) - ακόμα και σε καφετιέρα, ακόμα και σε μύλο καφέ, ακόμα και σε υπολογιστή, ακόμα και σε κινητό. Από τη μια, αυτό είναι καλό, δηλαδή, απλώς έγραψες μια υλοποίηση μιας εικονικής μηχανής και μετά τρέχεις τα προγράμματα Java σου παντού. Αλλά, από την άλλη πλευρά, είναι κακό που το ίδιο τηλέφωνο είχε τότε λίγη μνήμη, χαμηλή απόδοση και όλα αυτά άρχισαν επίσης να επιβραδύνουν και να επιβραδύνουν.

Αλλά αυτό δεν είναι καν το κύριο πράγμα για το οποίο εφευρέθηκε η γλώσσα εξαρχής. Η γλώσσα Java επινοήθηκε για να μειώσει τις απαιτήσεις προσόντων για προγραμματιστές. Δηλαδή, οι χειρότεροι προγραμματιστές μπορούν να γράφουν καλά προγράμματα σε Java, επειδή δεν σας επιτρέπει να γράφετε κακά προγράμματα - δεν υπάρχει κανένα μέσο για να γράψετε κακά προγράμματα. Εκεί μπορείς να γράψεις μόνο καλά προγράμματα. Λοιπόν, στην κατανόηση των δημιουργών της γλώσσας.

Δηλαδή, αν στο C, στη C++, στην Python, σε οτιδήποτε, μπορούμε να δημιουργήσουμε κάποιου είδους τρομερό σκουπιδότοπο από το έργο μας, όπου τα έχουμε όλα ανακατεμένα, συναρμολογημένα για ώρες και κάτι άλλο. Στην Java, μπορείτε επίσης να δημιουργήσετε μια χωματερή, αλλά για αυτό πρέπει να κάνετε κάποια προσπάθεια. Δηλαδή, από προεπιλογή, δεν είναι "σκουπιδότοπος", προκύπτουν άλλα προβλήματα, ότι κάτι έχει κληρονομηθεί και κληρονομηθεί - γενικά, για μια σημαντική γραμμή, υπάρχουν δέκα όχι πολύ νόημα. Όμως, ένας τέτοιος προγραμματιστής με μέτρια κατάρτιση μπορεί να γράψει κώδικα αρκετά υψηλής ποιότητας.
Είμαστε σχεδόν στο τέλος. Για εμάς το επόμενο που εμφανίστηκε ήταν το .Net (dotnet) και συγκεκριμένα μας ενδιαφέρει το C# (σχεδόν το ίδιο πράγμα [ο λέκτορας δείχνει την Java], δηλαδή υπάρχουν διαφορές στις λεπτομέρειες, αν επιλέξετε μεταξύ τους , κοιτάξτε πού πληρώνουν περισσότερα χρήματα).

Και κάτι ακόμα - JavaScript. Δεν έχει καμία σχέση με τη γλώσσα Java, εμφανίστηκε την ίδια χρονιά - η λέξη ήταν της μόδας, έδωσαν άδεια χρήσης στο εμπορικό σήμα.

Ποιο είναι το κύριο πράγμα που πρέπει να προσέξεις; (Ο ομιλητής σχεδιάζει βέλη από C++ σε Java, .Net, C#, JavaScript και PHP). Για να γράψετε ένα απλό πρόγραμμα σε μία από αυτές τις γλώσσες και σε πολλές άλλες - αν γνωρίζετε C++, γενικά δεν χρειάζεται να γνωρίζετε τίποτα άλλο - γράφετε σε C++ και μετά προσθέτετε δολάρια στην αρχή, κάτι άλλο κάνει μικρά πράγματα και αρχίζει να δουλεύει σε οτιδήποτε (ο καθηγητής δείχνει τις γλώσσες στις οποίες έχουν αντιστοιχιστεί τα βέλη από τη C++). Μοιάζουν δηλαδή εξαιρετικά σε κάποια απλά πράγματα. Εάν λύνετε κάποια σχολικά προβλήματα, εκπαιδευτικά προβλήματα ή κάτι άλλο (δεν σχεδιάζετε ένα μεγάλο έργο - έχετε ένα αρχείο που διαβάζει αριθμούς, εμφανίζει αριθμούς στην κονσόλα και κάνει κάτι άλλο), τότε δεν υπάρχει σχεδόν καμία διαφορά μεταξύ αυτές οι γλώσσες. Είναι ξεκάθαρο ότι η JavaScript και η PHP είναι εξειδικευμένες, όλα είναι λίγο διαφορετικά για αυτούς. Αλλά εδώ (ο λέκτορας υποδεικνύει Java και C#) υπάρχει πολύ μικρή διαφορά.

Έκτοτε, έχουν εμφανιστεί κάθε λογής άλλα ενδιαφέροντα πράγματα, αλλά δεν είναι ξεκάθαρο αν θα ζήσουν ή θα πεθάνουν με επιτυχία. Τι χρησιμοποιούν τώρα, για ποιους σκοπούς;

Επιλογή γλώσσας ανάλογα με την εργασία

Ας υποθέσουμε ότι αντιμετωπίζετε το καθήκον να γράψετε ένα πρόγραμμα οδήγησης για μια κάρτα βίντεο. Ποια γλώσσα θα χρησιμοποιήσετε σήμερα; (Φωνάξτε από το κοινό: Java!) Γιατί... Η Java είναι υπέροχη, αλλά γιατί όχι η Ruby ή η PHP; (Ο ομιλητής μιλάει σαρκαστικά.)

Προγραμματισμός χαμηλού επιπέδου

Εάν γράφετε κάτι χαμηλού επιπέδου, τότε η καλύτερη επιλογή είναι η C, αλλά στην πραγματικότητα έχω ακούσει (αλλά δεν έχω δει) ότι η C++ χρησιμοποιείται για αυτό. Αλλά έχω ελάχιστη πίστη σε αυτό, γιατί στο C μπορείτε ξεκάθαρα να ελέγξετε - αφού δώσατε τόσα πολλά byte μνήμης, αυτό σημαίνει ότι θα υπάρχουν τόσα πολλά. Και στη C++ (STL) πώς υλοποιείται μια συμβολοσειρά; Λοιπόν, κατά κάποιο τρόπο εφαρμόστηκε. Και στο τέλος δεν ξέρουμε πώς και τι συμβαίνει εκεί· ίσως θα μας τελειώσει η μνήμη στην κάρτα γραφικών μας ή θα συμβεί κάτι άλλο. Επομένως, το C εξακολουθεί να ζει και δεν πεθαίνει, τέτοιες εργασίες προγραμματισμού συστήματος εξακολουθούν να υπάρχουν - γράψτε ένα λειτουργικό σύστημα, γράψτε προγράμματα οδήγησης, γράψτε κάτι άλλο - το C είναι εξαιρετικό για αυτό. Επιπλέον, τώρα εμφανίζονται κάθε είδους συσκευές (το Διαδίκτυο των Πραγμάτων υπόσχεται να έρθει σύντομα) που λειτουργούν με μπαταρίες (και, φυσικά, θα υπάρχουν εκατομμύρια από αυτές, όλα θα καλυφθούν με αυτό το Διαδίκτυο των Πραγμάτων), θα πρέπει να είναι πολύ φθηνά και να έχουν πολύ λίγη κατανάλωση ρεύματος. Αντίστοιχα, θα υπάρχουν 2 KB μνήμης, ένας επεξεργαστής 5 kHz και είναι σαφές ότι δεν θα είναι δυνατό να βιδώσετε κάποιο είδος εικονικής μηχανής ή γλώσσας σεναρίου στο εγγύς μέλλον - πράγμα που σημαίνει ότι θα πρέπει να γράψετε κάτι στο Γ. Και ακόμη και τώρα, για παράδειγμα, υπολογιστές σε μια κάρτα βίντεο (OpenCL ή κάποια άλλη τεχνολογία) - δεν βρίσκουν μια νέα γλώσσα για να γράψουν προγράμματα για αυτούς - κάνουν C με μερικούς μεγάλους περιορισμούς. Ακριβώς επειδή οι άνθρωποι ξέρουν ήδη πώς, γιατί να μάθουν κάτι νέο; Τυπικά, αυτό είναι πιθανώς, κατά μία έννοια, C.

Προγραμματισμός Ιστού

Ας υποθέσουμε ότι θέλετε να γράψετε ένα νέο Facebook (κοινωνικό δίκτυο). Σε τι θα το γράψεις αυτό; (Οι άνθρωποι από το κοινό μιλούν για HTML και CSS.) Το HTML και το CSS είναι σχεδιασμός και θέλουμε να μπορούμε να προσθέτουμε φωτογραφίες, φίλους και να αφήνουμε σχόλια εκεί.

Για το μέρος του σεναρίου - δηλαδή, τι θα συμβεί στην πλευρά του πελάτη - αυτό είναι το JavaScript. Επιπλέον, μερικές φορές η JavaScript δημιουργείται σε άλλη γλώσσα και αποστέλλεται (συμβαίνει να δημιουργείται το σενάριο... γιατί μερικές φορές είναι πιο εύκολο να επεξεργαστούμε κάποιες αλλαγές στη λογική).

Παραδόξως, είναι γραμμένο σε PHP - και Facebook, και πολλά άλλα μεγάλα έργα. Έπρεπε βέβαια να γράψουν κάποια δικά τους πράγματα για να συνεχίσει να λειτουργεί κανονικά, και όχι με «τσαμπουκά» τρόπο, αλλά το έκαναν. Κατ 'αρχήν, λίγο πολύ δεν έχει σημασία τι γράφετε, αλλά δεν προτείνω την Perl. Εδώ και τώρα, φυσικά, κανείς δεν γράφει τίποτα για το διαδίκτυο από την αρχή. Όλοι γράφουν κάποιου είδους πλαίσιο ή κάτι άλλο. Ηλεκτρονικό κατάστημα; Κατεβάσαμε ένα πλαίσιο για ένα ηλεκτρονικό κατάστημα - και αυτό ήταν, γράψαμε ένα ηλεκτρονικό κατάστημα.

Προγραμματισμός για επιχειρήσεις

Στη συνέχεια θέλετε να γράψετε κάποια βαρετή αίτηση για μια τράπεζα. Ή, για παράδειγμα, έχετε κάποιον που πουλάει κάρτες SIM; Ίσως να έχετε αγοράσει ποτέ ένα τηλέφωνο ή κάτι άλλο και να σας έχουν πει: "Το σύστημα κολλάει, δεν μπορούμε να κάνουμε τίποτα". Τι θα χρησιμοποιήσετε για να γράψετε μια τέτοια εφαρμογή; (Φωνάξτε από το κοινό για την Python) Δεν μπορείτε να το γράψετε αυτό στην Python, τι λέτε;! Δεν χρειάζεται να γράψετε τίποτα για επαγγελματικούς λόγους στην Python. Γιατί; Επειδή όταν γράφετε κάτι σε Python, είναι αδύνατο να ανιχνεύσετε σημαντικό αριθμό σφαλμάτων κατά τη διαδικασία γραφής. Η Python πληκτρολογείται δυναμικά με κάθε δυνατό τρόπο και γενικά μπορείς να κρύψεις ένα σφάλμα με τέτοιο τρόπο που θα εμφανιστεί σε τέτοια κατάσταση που δεν θα μπορείς καν να καταλάβεις τι έκαναν αυτοί οι απατεώνες χρήστες εκεί, ότι όλα είναι σπασμένο για σένα. Δηλαδή, στην Python είναι καλύτερο να γράφετε μικρά σενάρια για τον εαυτό σας - καταλαβαίνετε τι συμβαίνει εκεί και τι γίνεται. Λοιπόν, ή κάτι που δεν σας πειράζει να πετάξετε: θέλετε να διαθέσετε κάτι μπροστά από τους ανταγωνιστές σας, οπότε τι γίνεται αν σπάει κάθε τόσο. Έγραψες σε Python και αυτό είναι - κατέλαβες την αγορά. Και αν γράφετε κάτι για μεγάλο χρονικό διάστημα, για παράδειγμα, κάποιο είδος τραπεζικής εφαρμογής (ώστε να εγκρίνει δάνεια, κάτι άλλο) - το γράφετε σε Java. Γιατί είναι σοβαρό θέμα, χαρτιά, λεφτά, έγγραφα, κάτι άλλο, αλλά δεν μπορείς να το χαλάσεις τόσο πολύ ώστε να σπάσουν όλα, αλλιώς οι άνθρωποι θα προσβληθούν - τα λεφτά τους έφυγαν και δεν έφτασαν πουθενά, γιατί σε κάποιο είδος της στιγμής η χορδή μετατράπηκε σε αριθμό ή το αντίστροφο. Δηλαδή, σημαίνει ότι το παίρνεις μεθοδικά σε Java και γράφεις, γράφεις... Ε, ή στο .Net, κατ' αρχήν συμβαίνουν και τέτοιες καταστάσεις. Εκεί, φυσικά, μπορεί επίσης να αντιμετωπίσετε προβλήματα, αλλά και πάλι η πιθανότητα να συμβεί αυτό είναι κάπως χαμηλότερη.

Προγραμματισμός για τον στρατό, την αεροδιαστημική βιομηχανία

Τώρα φανταστείτε ότι αποφάσισαν να σας στείλουν στη Σελήνη με έναν πύραυλο. Τι θα προτιμούσατε να χρησιμοποιηθεί για να γράψετε τον κώδικα που ελέγχει τους κινητήρες πυραύλων; Ας ρίξουμε μια ματιά. Αυτό, μάλλον (ο ομιλητής δείχνει Perl, Python, PHP, Ruby), δεν αξίζει τον κόπο - επιβραδύνει, κάτι άλλο συμβαίνει και γενικά δεν θα συμφωνούσα να πετάξω με τέτοιο πύραυλο. Σε C++; Για να είμαι ειλικρινής, ούτε εγώ θα το εμπιστευόμουν, γιατί στη C++ υπάρχουν πάρα πολλοί τρόποι να αυτοκτονήσεις. Όταν είσαι εκεί έξω κάπου στο διάστημα, δεν είναι πολύ καλό.

Ίσως σε Java; Φαίνεται ότι όλα εκεί είναι αρκετά αξιόπιστα και η αρχιτεκτονική είναι καλή, χωρίς άγριους τύπους, χωρίς περιττά ταξίδια πέρα ​​από τα όρια μνήμης. Ας πούμε ότι ήρθε η πιο κρίσιμη στιγμή και η Java μας αποφάσισε να μαζέψει σκουπίδια για εμάς. Πρέπει να προσγειωθούμε, να επιβραδύνουμε και εκείνη λέει: «Όχι, τα σκουπίδια πάνε». Γενικά ούτε και πολύ καλό.

Ειλικρινά, θα προτιμούσα αυτό το πρόγραμμα να ήταν γραμμένο σε Pascal. Φυσικά, δεν μου αρέσει πολύ ο Pascal, αλλά κατά κάποιο τρόπο σε τέτοια θέματα θα ήταν πολύ ωραίο.

Χρήση πολλών γλωσσών για ανάπτυξη λογισμικού

Λοιπόν, τι πρέπει να ειπωθεί γενικά για τις σύγχρονες γλώσσες; Τώρα πολλά έργα δεν ζουν σε καμία γλώσσα, δηλαδή μερικά από αυτά ζουν σε μια γλώσσα, άλλα σε άλλη και άλλα σε τρίτη. Για παράδειγμα, εάν έχετε κάποιο είδος διαδικτυακής εφαρμογής που επεξεργάζεται τεράστιες ποσότητες πληροφοριών, οι κλήσεις σε δίσκους (ούτε καν σε βάσεις δεδομένων, είναι τόσο τεράστιες που ακόμη και μια βάση δεδομένων εκεί δεν μπορεί να χειριστεί καμία ήδη γραμμένη) είναι πιθανώς γραμμένες σε κάποιο είδος μετά χαμηλού επιπέδου C, για να γράφει άγρια ​​γρήγορα στο δίσκο και όλα αυτά. Φυσικά, δεν αξίζει να γράψετε ολόκληρο το έργο στο C. Ίσως υπάρχει κάποιο είδος ενδιάμεσης λογικής γραμμένη σε Java που καλεί τις συναρτήσεις C για γρήγορες κλήσεις. Λοιπόν, το frontend (αυτό που κοιτάζει ο χρήστης), φυσικά, είναι ήδη γραμμένο σε κάτι, σε μερικά σενάρια, σε κάτι που εκτελείται απευθείας από το πρόγραμμα περιήγησης (JavaScript). Και όλα αυτά ζουν μαζί και αλληλεπιδρούν με επιτυχία.

Κατά την ανάπτυξη ορισμένων εφαρμογών, ακόμη και μεγάλων, μερικές φορές τι κάνουν οι άνθρωποι; Το παίρνουν και γράφουν ένα πρωτότυπο σε Python (πώς θα λειτουργήσει όλα), το σκιαγραφούν, σκέφτονται μέσα από κάποιο είδος αρχιτεκτονικής. Το γράψιμο σε αυτό είναι πραγματικά πολύ γρήγορο - έριξαν μαζί ένα πρωτότυπο, πειραματίστηκαν με αυτό και είπαν: «Ουάου! Είναι πολύ πρώτο!" Και το ξαναέγραψαν εντελώς. Φαίνεται ότι έκαναν τη δουλειά δύο φορές, πράγμα που την έκανε να πάρει διπλάσιο χρόνο (καλά, ενάμιση). Αλλά όχι! Συχνά αποδεικνύεται ότι αυτή η μέθοδος δεν είναι κακή, γιατί αν γράψετε κάτι αμέσως, για παράδειγμα σε Java, και στη συνέχεια αποφασίσετε: "Όχι, ας ανακατασκευάσουμε, αλλάξουμε την αρχιτεκτονική εντελώς και όλα αυτά", τότε θα ξοδέψετε 10 φορές περισσότερα χρόνος . Τέτοια πράγματα υπάρχουν και ζουν.

Προϋποθέσεις για την επιτυχία οποιασδήποτε γλώσσας προγραμματισμού

Τώρα ας μιλήσουμε για το γιατί μερικές όμορφες γλώσσες δεν επιβίωσαν ή έζησαν σε έναν πολύ περιορισμένο χώρο. Όταν ο Wirth είδε τι κακές εταιρείες Apple, Borland και όλα αυτά έκαναν στον Pascal του, βρήκε μια ακόμα καλύτερη γλώσσα - την Oberon. Ήταν απλώς τρελά μινιμαλιστικό - δηλαδή, υπήρχαν πολύ λίγες εντολές (Strings; Γιατί χρειαζόμαστε συμβολοσειρές; Θα φτιάξουμε μια σειρά χαρακτήρων!). Λοιπόν, κάτι δεν του βγήκε, στο βαθμό που θα μπορούσε να του βγει.

Ακόμη ένα πράγμα. Ο Αμερικανός στρατός τους ζήτησε να αναπτύξουν μια δροσερή γλώσσα στην οποία όλα λειτουργούν και όλα μπορούν να γραφτούν. Το αποτέλεσμα ήταν μια μάλλον τερατώδης γλώσσα Ada, στην οποία, ωστόσο, γράφουν ακόμα κάτι, αλλά και πάλι, μόνο για τους στρατιωτικούς.

Ποιο είναι το πρόβλημα? Γιατί κάποιες γλώσσες όπως η Python, τις οποίες καμία εταιρεία δεν υποστήριζε στην αρχή, κατέλαβαν την αγορά. Η PHP, η οποία είναι επίσης κακοσχεδιασμένη, ανέλαβε επίσης την αγορά (το μεγαλύτερο μέρος της) από μόνη της. Και επενδύθηκαν κάθε λογής δισεκατομμύρια δολάρια (ο λέκτορας δείχνει τον Άντα) και δεν πήγαν πουθενά, δεν έγινε τίποτα. Με τι συνδέεται αυτό; Αυτό οφείλεται στο γεγονός ότι δεν υπάρχει υποδομή γύρω από αυτές τις γλώσσες. Δηλαδή, η γλώσσα μπορεί να είναι εξαιρετική, αλλά εφόσον δεν υπάρχει τεκμηρίωση, αρκεί να μην υπάρχει κοινότητα που να μπορεί να απαντήσει σε ερωτήσεις (στο Stack Overflow) και, τέλος, το πιο σημαντικό, εφόσον δεν υπάρχει μεγάλος αριθμός των βιβλιοθηκών, η γλώσσα δεν απογειώνεται. Δηλαδή, για παράδειγμα, θέλατε να γράψετε έναν ιστότοπο στο Oberon. Τι είναι, γιατί όχι; Και η ταλαιπωρία αρχίζει... Δεν μπορείτε να ρυθμίσετε τον δικό σας διακομιστή ιστού στο Oberon για να το δοκιμάσετε ελαφρά, δεν μπορείτε να συνδέσετε βιβλιοθήκες, επειδή το Oberon δεν τις διαθέτει. Και όλα αυτά γίνονται μέσω κάποιων πατερίτσες, φεύγει η δύναμη και γενικά τα παρατάς και γράφεις την ιστοσελίδα σου σε καθαρό C αντί για Oberon. Και αυτές οι γλώσσες που ζουν καλά είναι αυτές που ξέρουν πώς να χρησιμοποιούν βιβλιοθήκες από άλλες γλώσσες. Το ίδιο Python σε εκείνα τα μέρη που επιβραδύνει. Λοιπόν, γενικά, όλα τα τυπικά πράγματα όπως η ταξινόμηση και κάτι άλλο είναι γραμμένα σε C, και αυτό (Python) μπορεί να αλληλεπιδράσει μαζί τους.

Η Java διαθέτει επίσης μια εγγενή διεπαφή Java. Αυτό είναι ουσιαστικά το C, δηλαδή εκεί (κατά τη γνώμη μου, θέλουν πάντα να το απαγορεύσουν, αλλά φαίνεται ότι δεν το έχουν απαγορεύσει ακόμα) αυτές οι γλώσσες μπορούν να αλληλεπιδράσουν με ήδη υπάρχουσες βιβλιοθήκες (κυρίως C). Και λόγω αυτού, το παίρνουν και δουλεύουν. Η ιδέα που προσπαθώ να σας μεταφέρω είναι ξεκάθαρη, σωστά; Μην γράφετε σε γλώσσες που δεν υποστηρίζουν τη βιβλιοθήκη C. Λοιπόν, αν θέλετε να χρησιμοποιήσετε κάτι δροσερό. Λοιπόν, σταδιακά αυτές (οι γλώσσες) αποκτούν τη δική τους υποδομή. Και ζουν κάπως καλά.

Γλώσσα προγραμματισμού και επαγγελματικός προσανατολισμός

Τώρα ας μιλήσουμε για το πώς να καταλάβετε τι θέλετε στη ζωή. Ποια είναι τα πιο ωραία πράγματα; Μπορείτε να κάνετε προγραμματισμό συστημάτων, σωστά; Είναι υπέροχο για εσάς να μετράτε αυτά τα κομμάτια, θέλετε να λανσάρετε τετρακόπτερα, κάποιου είδους κάμερες και να κάνετε κάτι άλλο. Τότε, πιθανώς, το C είναι η επιλογή σας.

Αν θέλετε να γράψετε, ίσως όχι τις πιο ενδιαφέρουσες εφαρμογές στη ζωή, αλλά είναι ωραίο να τις σχεδιάζετε, να τα σκεφτείτε όλα και να κερδίσετε πολλά χρήματα επειδή κάθεστε και βαριέστε τις περισσότερες φορές (πρέπει να πληρώσετε για αυτό αν είστε καλοί στο miss), εδώ είναι - Java, .Net. Πας να δουλέψεις σε κάποια τράπεζα, γράφεις, πας στη δουλειά στις εννιά με λευκό πουκάμισο, παίρνεις καλό μισθό και γράφεις σύμφωνα με τις συστάσεις των καλύτερων προγραμματιστών Java, .Net sheep και όλα αυτά...

Αν θέλετε να γράψετε κάποιες εφαρμογές, κάποιο είδος προγράμματος περιήγησης, κάποιο είδος παιχνιδιών ή κάτι άλλο, τότε η C++ είναι υπέροχη. Εάν θέλετε να γράψετε ιστότοπους, τότε είναι εδώ, οι γλώσσες της επιλογής σας (ο ομιλητής δείχνει Perl, Python, PHP, Ruby), δεν υπάρχει μεγάλη διαφορά. Το μόνο πράγμα είναι ότι η PHP θα πεθάνει πριν από την Python, οπότε αν τεμπελιάζετε να μάθετε νέα πράγματα, τότε μάθετε Python. Δεν θα παρατηρήσετε μεγάλη διαφορά, αλλά θα κρατήσετε περισσότερο.

Το τι συμβαίνει με τη Ruby είναι επίσης ασαφές. Λοιπόν, μπορείτε να κάνετε PHP αν το έχετε ήδη μάθει, ευτυχώς είναι τόσο απλό που δεν χρειάζεται τόσο πολύς χρόνος για να το ξαναμάθετε.

Και τέλος, υπάρχει ένας άλλος τομέας εφαρμογής των γλωσσών προγραμματισμού - αυτό είναι όταν ένας μη προγραμματιστής τις χρησιμοποιεί. Ας υποθέσουμε ότι είστε μαθηματικός, φυσικός, χημικός, αναλυτής, οποιοσδήποτε, και πρέπει να υπολογίσετε γρήγορα κάτι, να αναλύσετε ορισμένα δεδομένα (για τους βιολόγους, για παράδειγμα, πόσες αρκτικές αλεπούδες ζουν στα Commander Islands). Μπορείτε να τα βάλετε όλα αυτά σε έναν πίνακα στο Excel ή να τα αναλύσετε με κάτι. Η Python είναι επίσης καλή για αυτό, μπορεί να λειτουργήσει με κείμενο και υπάρχουν πολλές βιβλιοθήκες, στατιστικά και όλα αυτά. Εάν θέλετε να κάνετε κάποιο είδος Μηχανικής Μάθησης, να επεξεργαστείτε κάποια δεδομένα, να κάνετε προβλέψεις, τότε αυτό γίνεται και στην Python με τον πιο γρήγορο τρόπο τώρα. Είναι αλήθεια ότι πρέπει να σημειωθεί ότι τα καθήκοντα είναι πολύ διαφορετικά. Για παράδειγμα, αν θέλετε να κάνετε συναλλαγές στο χρηματιστήριο αμέσως σε συνθήκες όπου οι τιμές αλλάζουν συνεχώς, τότε ανεξάρτητα από το πόσο cool Machine Learning γράφετε στην Python, οι άνθρωποι που το έχουν γραμμένο σε κάτι πιο γρήγορο θα έχουν χρόνο να αγοράσουν τα πάντα πριν από τα πάντα θα μετρηθούν για εσάς, ακόμα κι αν οι αλγόριθμοί τους είναι χειρότεροι. Επομένως, ακόμη και αυτές οι εργασίες μηχανικής εκμάθησης (ορισμένες από αυτές) απαιτούν υψηλή απόδοση (και εξαιρετικά υψηλή απόδοση) και, κατά συνέπεια, άλλες γλώσσες.

Ο μόνος τρόπος για να καταλάβεις τι θέλεις είναι να δοκιμάσεις τα πάντα. Τώρα θα το πω ως ένα από τα οράματα για το πώς μπορείτε να δοκιμάσετε τα πάντα. Πώς να γίνετε προγραμματιστής και ευτυχισμένος; Ετσι. Ας ξεκινήσουμε με καθαρή πλάκα. Εδώ σπουδάζετε μαθηματικά, ρωσική γλώσσα και άλλα υποχρεωτικά και προαιρετικά μαθήματα στο σχολείο και οι γνώσεις σας στον τομέα του προγραμματισμού αντικατοπτρίζονται στον πίνακα (ο καθηγητής δείχνει έναν κενό πίνακα) αυτή τη στιγμή. Και θέλεις να γίνεις ένας ευτυχισμένος άνθρωπος, να κάνεις αυτό που αγαπάς, να κερδίσεις πολλά χρήματα και να μην αρνηθείς τίποτα στον εαυτό σου και να είσαι ευτυχισμένος.

Ένας τρόπος για να επιτευχθεί αυτό. Υπάρχουν, φυσικά, κάθε είδους εμπνευσμένες ιστορίες για άτομα που δεν πήγαν καθόλου στο πανεπιστήμιο ή τα παράτησαν και έγιναν δισεκατομμυριούχοι, ιδιοκτήτες εταιρειών κ.λπ. Πρέπει όμως να σημειωθεί ότι οι περισσότεροι που μπορεί να μην έχουν γίνει δισεκατομμυριούχοι, αλλά και να ζουν καλά, παρόλα αυτά τελείωσαν κάποια στιγμή το πανεπιστήμιο.

Ποια είναι η κατάσταση με την εισαγωγή στο πανεπιστήμιο (σπουδάζετε αυτή τη στιγμή στο σχολείο); Όσο είστε στο σχολείο, πρέπει να καταλάβετε ότι το επόμενο βήμα είναι να εγγραφείτε και να το φροντίσετε. Περάστε την Ενιαία Κρατική Εξέταση ή κερδίστε την Ολυμπιάδα. Στις εξετάσεις Unified State Exam μπορείτε να χρησιμοποιήσετε Pascal, C++ (συμπεριλαμβανομένου του καθαρού C), Python (δεν θα τα αναφέρω περαιτέρω). Στην Ολυμπιάδα υπάρχει το ίδιο Pascal, η ίδια C++, η ίδια Python (θα μιλήσουμε τώρα για τα προβλήματά της) και, τις περισσότερες φορές, υπάρχει η Java. Υπάρχουν και άλλα πράγματα που συμβαίνουν ανάλογα με τους Ολυμπιακούς Αγώνες, αλλά δεν είναι αυτό το θέμα.

Πώς μοιάζει το γράφημα της κατανομής της γλώσσας στην Πανρωσική Ολυμπιάδα στην Πληροφορική; Οι άνθρωποι που συμμετέχουν στους Πανρωσικούς, τους πιο κουλ Ολυμπιακούς Αγώνες, τι γράφουν; Μοιάζει κάπως έτσι (εδώ σημαίνει Pascal, και εδώ είναι περίπου 2000, και εδώ είναι περίπου μηδέν, εδώ είναι C++ και εδώ είναι το 2015).

Το 2000, σχεδόν κανείς δεν έγραφε C++. Έχουν περάσει 15 χρόνια και σχεδόν κανείς δεν γράφει στο Pascal, παρά το γεγονός ότι ο Pascal είναι σύγχρονος. Αυτή είναι μια γλώσσα που μπορεί να κάνει σχεδόν τα πάντα το ίδιο. Απλώς όλοι έχουν γίνει πολύ τεμπέληδες για να μάθουν αυτό, κάθε νέα τάση, και συνεχίζουν να γράφουν τα πάντα στο Borland Pascal, το οποίο φυσικά δεν μπορεί να κάνει τίποτα. Στην C++, οι άνθρωποι γράφουν μερικούς αλγόριθμους (STL) για ταξινόμηση - υπέροχο, έγραψαν sort() και αυτό είναι. Στο Pascal, στο κανονικό, στο παλιό - αυτό είναι ένα πρόβλημα. Γράψαμε κάποιο είδος σετ (χρειαζόταν) - υπέροχο, το γράψαμε σε C++, αλλά στον Pascal ήταν και πάλι ένας πλήρης πόνος. Φυσικά, μπορείτε να το κάνετε αυτό με νέα Pascal, αλλά γενικά κοστίζουν χρήματα. Μπορεί να μην το έχετε προσέξει αυτό, αλλά είναι αλήθεια.

Υπάρχει και Java, αλλά η Java έχει πολλά γράμματα. Είναι για μεγάλα έργα, αλλά για μικρά προγράμματα μιας χρήσης αποδεικνύεται πολύ κακό, επειδή υπάρχουν πολλά επιπλέον γράμματα. Αλλά μερικοί άνθρωποι γράφουν επίσης, μπορείτε να μάθετε να γράφετε σε αυτό. Αλλά δεν είναι στις εξετάσεις του Ενιαίου Κράτους και η πλειοψηφία θα πρέπει ακόμα να δώσει την Εξεταστική Ενιαία Πολιτεία.

Τι είναι καλύτερο για την Ενιαία Κρατική Εξέταση; Για το Unified State Exam, είναι καλύτερο (αν δεν ξέρετε τίποτα και δεν σας διδάσκουν τίποτα στο σχολείο) να μάθετε Python. Μερικά προβλήματα εξετάσεων μπορούν να λυθούν τέλεια σε αυτό. Στην Ολυμπιάδα, γενικά, αποδεικνύεται ότι χρησιμοποιείται C++, επειδή η Python είναι πολύ αργή, δεν λύνονται όλα εκεί.

Έτσι, έχετε μελετήσει ένα μικρό υποσύνολο της γλώσσας και κάποιους αλγόριθμους (πιθανώς) και έχετε λύσει πολλά προβλήματα για να λάβετε ένα δίπλωμα από την Ολυμπιάδα σας και να εισέλθετε στο πανεπιστήμιο για να λάβετε ανώτερη εκπαίδευση.

Θα μιλήσω τώρα για το πώς δομούμε το μάθημα στο HSE, με ποια σειρά διδάσκονται οι γλώσσες, πώς μελετώνται στα εφαρμοσμένα μαθηματικά και την επιστήμη των υπολογιστών στη Σχολή Εφαρμοσμένων Επιστημών, που κάνουμε μαζί με την Yandex. Στο πρώτο εξάμηνο - Python (όχι πλήρως, περίπου όπως πρέπει να μάθετε στο σχολείο) και C++ (ήδη ευρύτερο, πολύ ευρύτερο από ό,τι συνήθως διδάσκεται στα σχολεία). Να στο πω αμέσως για να μη φοβηθείς, αν θελήσεις ξαφνικά να γραφτείς, θα πεις: «Τι, τα ξέρω ήδη όλα αυτά, γιατί να πάω κάπου να σπουδάσω; Προτιμώ να πάω κάπου αλλού». Για όσους ήδη ξέρουν να προγραμματίζουν καλά, υπάρχει η ευκαιρία να προχωρήσουν αμέσως στη μελέτη αλγορίθμων και σε μια αρκετά θεωρητική προετοιμασία. Δεν τους κοιτάμε τώρα, αυτό (δείχνει τον πίνακα) είναι για όσους είναι μεσαίους ή καθόλου προγραμματιστές.

Στο πρώτο εξάμηνο διδάσκονται τα βασικά της Python, μόνο και μόνο για να μάθουν οι άνθρωποι πώς να προγραμματίζουν και για να μην προσβληθεί κανείς πολύ. Η Python σπάνια διδάσκεται στα σχολεία· οι περισσότεροι άνθρωποι έρχονται με γνώση του Pascal ή της C++. Κυρίως ακόμη και ο Πασκάλ, αν αυτό είναι μαζικό σχολείο. Λοιπόν, για να μην προσβληθεί κανείς, όλοι μαθαίνουν μια νέα γλώσσα (λες και είναι σε ίσες συνθήκες). Και η C++ απλά επειδή από τη C++ μπορείτε να πάτε οπουδήποτε.

Στη συνέχεια ακολουθεί το μάθημα Αλγόριθμοι και ένα ξεχωριστό πρόγραμμα μαθημάτων. Κλασικοί αλγόριθμοι με υλοποίηση. Δεν είναι ότι πήραμε κάτι στη θεωρία και υπολογίσαμε την πολυπλοκότητα. Στη διάλεξη το πήραμε, υπολογίσαμε την πολυπλοκότητα, στο σεμινάριο το πήραμε και εφαρμόσαμε τον αλγόριθμο. Ένα έργο είναι όπου οι μαθητές κάνουν κάτι ολοκληρωμένο. Για παράδειγμα, ένα από τα έργα ήταν: μετρήστε... Ας πούμε ότι έχετε πολλά διαμερίσματα στη Μόσχα και καταλαβαίνετε: «Α, έχω πολλά επιπλέον πράγματα, θα νοικιάσω μερικά. Και ορίζουν μια συγκεκριμένη τιμή και για κάποιο λόγο κανείς δεν θέλει να νοικιάσει ένα διαμέρισμα από εσάς - είναι πιθανώς πολύ ακριβό. Ή έβαλαν κάποια τιμή, σου την πήραν αμέσως και σκέφτεσαι: «Α, μάλλον το πούλησα φτηνά» - και στενοχωριέσαι κι εσύ. Δηλαδή, ήταν απαραίτητο να υπολογιστεί πόσο κοστίζει η ενοικίαση ενός διαμερίσματος; Εισαγάγετε τα δεδομένα - δημιουργεί μια εκτίμηση για εσάς. Ένας τέτοιος ιστότοπος, ο οποίος αποτελείται από πολλά πράγματα: πάρτε προτάσεις, αναλύστε τις, εφαρμόστε κάποιου είδους (πιθανώς) απλό αλγόριθμο μηχανικής εκμάθησης και δημιουργήστε ένα όμορφο web πρόσωπο στο οποίο μπορείτε να επιλέξετε κάτι, να εισαγάγετε κάτι, μερικά μέτρα, κάποιο αριθμό δωματίων , αριθμός σάουνων, αριθμός τζακούζι στο διαμέρισμά σας και υπολογίστε κατά προσέγγιση το κόστος. Δηλαδή, κάτι τελειωμένο, όχι πολύ περίπλοκο. Εδώ σημαίνει (ο εισηγητής δείχνει το μάθημα για τους αλγόριθμους) έναν τέτοιο πυρήνα C++, με είσοδο-έξοδο κονσόλας. Λοιπόν, εδώ (ο ομιλητής επισημαίνει την επιγραφή "project") κάτι υπό την καθοδήγηση ενός μέντορα, ίσως με βάσεις δεδομένων, ίσως με ανάλυση κειμένου και κάτι άλλο.
Στη συνέχεια, υπάρχει το τρίτο εξάμηνο - αυτό είναι ένα μάθημα που ονομάζεται "Συστήματα Υπολογιστών". Υπάρχει αρκετή γλώσσα assembly για να καταλάβεις (πολύ λίγο) και μετά κάτι παρόμοιο με καθαρή C και αλληλεπίδραση με λειτουργικά συστήματα, προγραμματισμός συστήματος στην ουσία. Και το έργο για το σεμινάριο είναι επίσης κάτι σχετικά με όλα τα είδη αλληλεπιδράσεων δικτύου, αρκετά χαμηλού επιπέδου: αναπτύξτε κάποιου είδους βοηθητικό πρόγραμμα, για παράδειγμα rsync (συγχρονισμός, ίσως ξέρετε. Σε καθαρή C, λίγο πολύ, γράψτε ένα ανάλογο του rsync, το οποίο θα έχετε μέσω του δικτύου να συγχρονίζει φακέλους με όλες τις προσβάσεις αρχείων και ούτω καθεξής).

Και τέλος, το τέταρτο. Δεν ξέρω καν πώς να το ονομάσω, είναι μια τέτοια βινεγκρέτ τεχνολογιών απαραίτητων για πραγματική ανάπτυξη, για παράδειγμα, ανάπτυξη ιστού. Δηλαδή, αυτή είναι η πρακτική εφαρμογή των βάσεων δεδομένων, πάλι κάτι παρόμοιο με αυτό που έγινε στο έργο (ο λέκτορας δείχνει το έργο του 2ου έτους) αλλά πιο εμπεριστατωμένο. Δηλαδή, αυτά είναι λίγο πολύ συγκεκριμένα πράγματα, πρακτικός προγραμματισμός. Παράλληλα με αυτό υπάρχει κάθε θεωρία, και εδώ κάνουν και επιστήμη.

Και μετά από δύο μαθήματα, οι άνθρωποι πηγαίνουν να κάνουν ό,τι τους ενδιαφέρει, γιατί αυτό το πράγμα καλύπτει τα βασικά του προγραμματισμού αρκετά ευρέως και μέχρι τότε οι άνθρωποι έχουν ήδη καταλάβει ότι δεν θέλουν να δουλέψουν με συστήματα υπολογιστών σε καμία περίπτωση (δεν το έκαναν όπως ο προγραμματισμός συστημάτων, για παράδειγμα ), αλλά θέλουν να δουλέψουν σε μερικούς θεωρητικούς αλγόριθμους, να υπολογίσουν την πολυπλοκότητα, να βρουν κάποια νέα πράγματα, διανεμημένα ή κάτι άλλο. Ή, αντίθετα, πιστεύουν ότι δεν έχουν πολλά εδώ ( ο καθηγητής δείχνει τη γραμμή του πρώτου μαθήματος με Python και C++) πήγε, τότε ( ο λέκτορας δείχνει την τρίτη γραμμή μαθημάτων, με προγραμματισμό συστημάτων) - Δεν μου αρέσει, να μετρώ byte και να βάζω κάθε είδους περιορισμούς στην ανάγνωση και τη γραφή, να κάνω ροές, νήματα και κάτι άλλο. Και σύμφωνα με αυτό, οι άνθρωποι επιλέγουν μια κατεύθυνση και μελετούν. Δηλαδή, κατ 'αρχήν, για να μην αναπτύξετε "σύνδρομο παπάκι" - ήσασταν ο πρώτος που είδατε τον Pascal σας και τώρα είπατε "Ο Pascal είναι δύναμη". ή πιο προχωρημένο - είδατε τη C++ και αρχίσατε να μιλάτε για όλους ότι η C++ είναι δυνατή, αλλά όλα τα άλλα δεν είναι πολύ καλά.

Τώρα πρέπει να το δούμε αυτό (ο καθηγητής επισημαίνει τη λίστα των μαθημάτων στον πίνακα) ευρύτερα - αυτή είναι μια από τις μεθόδους που επιλέχθηκε, ιδιαίτερα στο HSE (εμφανίστηκε πρόσφατα, επομένως είναι αρκετά μοντέρνο). Υπάρχουν άλλοι τρόποι γνωριμίας. Σε άλλα καλά πανεπιστήμια η σειρά είναι λίγο διαφορετική και μπαίνουν άλλοι τόνοι. Αλλά προσπαθούν επίσης να μυήσουν τους ανθρώπους σε όλα όσα έχουν.

Πώς να αναζητήσετε δουλειά ως προγραμματιστής

Είσαι ( ο λέκτορας δείχνει τη λίστα των μαθημάτων) έκανε τα πάντα, σπούδασε στο πανεπιστήμιο, έκανε κάτι άλλο για δύο χρόνια πιο παραγωγικά και πρέπει να πας στη δουλειά. Πώς να επιλέξετε κάτι για δουλειά; Πρώτον, έχεις εξοικειωθεί με τα πάντα, έχεις εμβαθύνει κάπου και ήδη ξέρεις τι αγαπάς. Πρέπει να επιλέξετε αυτό που αγαπάτε, φυσικά. Γιατί αν αγαπάς, καταβάλλεις προσπάθεια, θα έχεις κίνητρο και γενικά όλα θα πάνε καλά. Επειδή δεν έχει να κάνει μόνο με τα χρήματα, αλλά να τα κάνει ενδιαφέρουσα και ευχάριστη για εσάς. Λοιπόν, θέλεις να μπεις σε μια ωραία εταιρεία και να βρεις δουλειά. Τι είδους άτομο θα ήθελα να δω προσωπικά; Ας πούμε εκατό φοιτητές έρχονται σε μένα - να προσλάβω δύο ή έναν. Γιατί έρχονται, δεν καταλαβαίνω καθόλου, ποιοι είναι, τι είναι, πώς είναι; Στην καλύτερη περίπτωση, θα μου δείξουν το δίπλωμα που πήραν στο πανεπιστήμιο και θα πω: "Ουάου!" Αυτό είναι ένα ωραίο δίπλωμα, αλλά αυτό δεν είναι τόσο ωραίο!». Και μπορεί να κάνω λάθος, παρεμπιπτόντως. Ίσως το άτομο να είχε πολύ ελεύθερο χρόνο και να έμαθε πολύ καλύτερα.

Τι θα ήταν υπέροχο; Πρώτον, κάποιο έργο ανοιχτού κώδικα που γράψατε από την αρχή μέχρι το τέλος. Κατά προτίμηση, εάν φτιάχνω κάποιο είδος υποδομής ώστε τα δεδομένα να διαβάζονται γρήγορα ή κάτι άλλο, τότε, φυσικά, θα με ενδιέφερε να γράψω κάτι ανοιχτού κώδικα για μένα. Δεν έφτιαξαν έναν ιστότοπο, αλλά κάτι σχετικά με το θέμα. Γιατί με ενδιαφέρει αυτό; Μπορώ να κοιτάξω τον κώδικά σας, μπορώ να δω πόσο συχνά κάνατε δέσμευση, μπορώ να δω πώς αντιδρούσατε σε σφάλματα από χρήστες, σφάλματα από προγραμματιστές που τον χρησιμοποιούν - όλα καταγράφονται, κοιτάζω τα πάντα και σκέφτομαι: "Ουάου, αυτό το σφάλμα έχει Δεν είμαι εκεί εδώ και δύο χρόνια." έκλεισε, εδώ απάντησες αγενώς στον χρήστη, ιδού κάτι άλλο - δεν θα το πάρω." Δηλαδή, αυτό είναι το προσωπικό σας έργο.

Στη συνέχεια, τι άλλο θα ήταν ωραίο; Θα ήθελα να δω πώς κάνατε την ομαδική δουλειά. Δηλαδή, έρχεσαι σε μένα για συνέντευξη και μου λες: «Τα παιδιά από το πανεπιστήμιο κι εγώ έχουμε κάνει μια καλή αίτηση. Έφτιαχνα μια βάση δεδομένων εκεί, έφτιαχναν κάποιο είδος εφαρμογής για κινητά εκεί, και είχαμε επίσης έναν τύπο που εργαζόταν εκεί, ένα κορίτσι σχεδιαστή, ένα αγόρι με τεχνική υποστήριξη. Ήμασταν πέντε και κάναμε ένα ωραίο έργο». Λοιπόν, βλέπω ότι είναι πραγματικά το έργο σου, λέω: "Ποιο είναι το δικό σου;" Κοιτάζω ξανά τον κώδικα και καταλαβαίνω ότι ξέρεις να δουλεύεις ομαδικά με ανθρώπους.

Προγραμματιστής δεν είναι κάποιος που κάθεται μόνος (indie) σε ένα γκαράζ, κάπου με σβηστά φώτα, δεν μιλάει σε κανέναν, αφήνει γένια και γράφει. Υπάρχει ακόμα κάποια αλληλεπίδραση με τους ανθρώπους. Με ένα αφεντικό, για παράδειγμα, που μπορεί μερικές φορές να σε βρίζει (τα αφεντικά, έτσι είναι, δεν είναι πάντα ευγενικά). Και βλέπω ότι ξέρεις να δουλεύεις με ανθρώπους και με κάνει χαρούμενο αν έχεις κάποιο είδος καλής ομάδας. Ακόμα κι αν δεν είναι καλό, είναι καλύτερο από το να μην έχεις.

Τι άλλο θα ήθελα προσωπικά; Αν αποδείχτηκες σε μεγάλα έργα. Για παράδειγμα, δεσμεύσατε κάτι στον πυρήνα του Linux, εάν ασχολείστε με τον προγραμματισμό συστημάτων, και διορθώσατε κάποιο σφάλμα. Δηλαδή, έδειξαν ότι ξέρεις πώς να διαβάζεις τον κώδικα κάποιου άλλου και ξέρεις πώς να κάνεις κάποιες αλλαγές σε αυτόν. Κοιτάζω: "Ω, πραγματικά, καταλάβατε κάτι περίπλοκο και διορθώσατε μερικά σφάλματα!" Και αρχίζω να χαίρομαι πολύ για αυτό. Επειδή έχω... καλά, δεν ξέρω... ο προγραμματιστής μου παραιτήθηκε επειδή οι ανταγωνιστές του του πρόσφεραν υψηλότερο μισθό και χρειάζομαι επειγόντως κάποιον να γεμίσει τη θέση του - μαζί σας. Βλέπω ότι έγραψες μόνο από την αρχή, αλλά δεν ξέρεις πώς να διαβάζεις και να επεξεργάζεσαι τον κώδικα κάποιου άλλου και στενοχωριέμαι.

Και τέλος, ανάλογα με τη συγκεκριμένη θέση, υπάρχουν διάφορα άλλα πράγματα. Εάν πιάνετε δουλειά ως αναλυτής, θα ήθελα να λύσετε προβλήματα ανάλυσης δεδομένων στο Kaggle. Εάν κάνετε αίτηση για κάποια αλγοριθμικά πράγματα, θα ήθελα να κάνετε μερικούς αλγόριθμους στον αθλητικό προγραμματισμό. Και τέλος, αν έχετε σκεφτεί το επάγγελμα, διαβάστε πώς γίνονται οι συνεντεύξεις, έχετε δει ότι κάποιοι εκεί εκφράζουν μεγάλη δυσαρέσκεια: «Ήρθα, και με ρώτησαν ποιο είναι το χόμπι μου. Κάθομαι σαν κουκουβάγια και δεν απαντώ γιατί δεν έχω χόμπι» και νομίζουν ότι αυτό το κάνουν οι HR. Στην πραγματικότητα, προσπαθούν να καταλάβουν πόσο φιλικοί και επαρκείς είστε. Εάν είστε εχθρικοί και ανεπαρκείς, τότε ανεξάρτητα από το πόσο ιδιοφυΐα και εργασιομανής είστε, ένας σκληρός ειδικός με μεγάλες γνώσεις, θα είναι δύσκολο για την ομάδα να συνεργαστεί μαζί σας και δεν θα μπορείτε να ολοκληρώσετε το έργο μόνοι σας. Επιπλέον, ακόμα κι αν το βγάλεις, μπορείς να φανταστείς ποιο είναι το βάρος για την εταιρεία. Κι αν έρθεις αύριο και πεις: «Αύξησε το μισθό μου 10 φορές, αλλιώς θα σε αφήσω». Είναι σαφές ότι οι εταιρείες δεν θέλουν να βρεθούν σε μια τέτοια κατάσταση. Επομένως, η καλλιέργεια της επάρκειας και της καλής θέλησης στον εαυτό του είναι εξίσου σημαντική (τουλάχιστον) με την ανάπτυξη κάποιων επαγγελματικών δεξιοτήτων.

Για να συνοψίσουμε, τι να πούμε; Ποιες γλώσσες είναι καλές και ποιες κακές; Λοιπόν, μέσα σε μια συγκεκριμένη ομάδα γλωσσών, για παράδειγμα μεταξύ Ruby, Python και PHP, τι πρέπει να επιλέξετε; Φυσικά, η σωστή απάντηση είναι η Python, αλλά στην πραγματικότητα η διαφορά μεταξύ τους είναι στον αριθμό των επιτρεπόμενων σφαλμάτων, στον αριθμό κάτι άλλο - 5%, καλά, ίσως 10%. Δηλαδή, εάν έχετε ήδη ένα έτοιμο έργο γραμμένο σε PHP, τότε κανείς δεν θα έλεγε καλά: «Ας ξαναγράψουμε τα πάντα στην Python». Θα πουν: "Ας προσλάβουμε περισσότερους προγραμματιστές PHP και ας συνεχίσουμε να γράφουμε σε PHP." Τέλεια, είναι μια καλή επιλογή. Είναι σαφές ότι αν ξαφνικά αποφασίσετε να γράψετε κάποιο είδος έργου, τότε ίσως είναι συνετό να επιλέξετε τώρα την Python. Αν και εξαρτάται κι αυτό. Ίσως έχετε πολλούς φτηνούς προγραμματιστές PHP στην αγορά, και αυτοί της Python είναι ακριβοί και σκέφτεστε: "Ναι, η τεχνολογία είναι πιο δροσερή, αλλά θα εξοικονομήσω χρήματα σε έτοιμους προγραμματιστές." Και όλα είναι υπέροχα, έρχεσαι ήδη και δουλεύεις εκεί.
Πώς να επιλέξετε μεταξύ Java και C++; Ναι, περίπου το ίδιο συμβαίνει. Νομίζω ότι μέχρι να αποφασίσετε σε ποια γλώσσα θα ξεκινήσετε ένα νέο μεγάλο έργο, θα έχετε αποκτήσει γνώσεις στον επαγγελματικό σας τομέα και θα είστε σε θέση να κάνετε τη σωστή επιλογή. Τώρα δεν χρειάζεται να κάνετε αυτή την επιλογή ακόμα, και γι' αυτό σας συμβουλεύω να κάνετε ό,τι θέλετε.

Τα βασικά, όπως είπα ήδη, τα πολύ, πολύ βασικά του προγραμματισμού (τι είναι συνάρτηση, τι είναι if’ics, for’ics, πίνακες, κάτι άλλο) μπορούν να μάθουν λίγο πολύ σε οποιαδήποτε γλώσσα. Για παράδειγμα, στη C++, καθώς υπάρχουν πολλές ομοιότητες με αυτό, και υπάρχουν οι λιγότερες ιδιαιτερότητες σε αυτό (σε αυτό το επίπεδο), και υπάρχουν τα λιγότερα επιπλέον γράμματα για να γραφτούν. Λοιπόν, όταν μάθετε κάποια περίπλοκα αρχιτεκτονικά πράγματα, θα μάθετε και δεν χρειάζεται να ανησυχείτε πολύ για αυτό. Δηλαδή, το κυριότερο είναι να προσπαθήσεις, να ψάξεις αυτό που σου αρέσει και όταν καταλάβεις ότι είναι ήδη 4 η ώρα το πρωί, και κάθεσαι και γράφεις για πλάκα, γιατί σου αρέσει - μάλλον εκείνη τη στιγμή είναι ξεκάθαρο ότι βρήκες το δικό σου.

Αυτό το άρθρο αφορά την επέκταση και τη σημασία της για συστήματα υπολογιστών. Έτσι, φαίνεται, τι θα μπορούσε να είναι τόσο ιδιαίτερο για την επέκταση ενός αρχείου προγράμματος; Ωστόσο, ελπίζουμε ότι οι αναγνώστες θα μπορέσουν να αποκτήσουν σημαντικές και ενδιαφέρουσες πληροφορίες για τον εαυτό τους. Η ικανότητα κατανόησης των επεκτάσεων θα εξυπηρετήσει έναν καλό σκοπό, όπως θα συζητηθεί παρακάτω.

Τι επέκταση έχει το C plus plus;

Αυτή η γλώσσα προγραμματισμού έχει τη δική της σημείωση αρχείου. Ο συμβολισμός cpp είναι μια ειδική επέκταση που χρησιμοποιείται για αρχεία που περιέχουν κώδικα C++. Περιέχουν κώδικα που δεν είναι ακόμη έτοιμος για χρήση (δεν έχει γίνει μεταγλώττιση), ο οποίος μπορεί να επεξεργαστεί και να γίνουν αλλαγές χωρίς σημαντικό κόστος και διακοπές στη λειτουργία του προγράμματος. Χρησιμοποιώντας αυτήν την επέκταση, μπορείτε να μάθετε ποιο αρχείο περιέχει κείμενο σε C (μια γλώσσα προγραμματισμού που είναι πολύ δημοφιλής τώρα).

Η επέκταση και η σημασία της στον προγραμματισμό

Γιατί χρειάζεστε ακόμη και μια επέκταση ονόματος αρχείου που χρησιμοποιείται από τον υπολογιστή σας; Το γεγονός είναι ότι ένας υπολογιστής μπορεί να επεξεργαστεί πολλούς διαφορετικούς τύπους αρχείων, τόσο εντός του εγκατεστημένου λειτουργικού συστήματος όσο και με τη βοήθεια πρόσθετου λογισμικού. Ένα παράδειγμα τέτοιου λογισμικού θα μπορούσε να είναι πρόσθετα εγκατεστημένα σε προγράμματα περιήγησης ή διερμηνείς διαφόρων γλωσσών προγραμματισμού που μπορούν να επεξεργαστούν προγράμματα που εκτελούνται. Είναι για να αναγνωρίσει ποιος διερμηνέας πρέπει να χρησιμοποιήσει ο υπολογιστής, ποιος κώδικας μηχανής να χρησιμοποιήσει για την αναπαραγωγή του αρχείου και απαιτούνται επεκτάσεις. αναγνωρίζει τον τύπο αρχείου, αυτές οι πληροφορίες θα του παρέχονται από τις διαθέσιμες λεπτομέρειες. Έτσι, η επέκταση cpp είναι ένα αρχείο που περιέχει ένα έγγραφο C++. Μετά την αναγνώριση, ο διερμηνέας θα μπορεί να το ανοίξει και ο χρήστης θα μπορεί να εργαστεί με το έγγραφο.

Τι είναι τελικά η επέκταση ονόματος αρχείου;

Αλλά ας μιλήσουμε για τις επεκτάσεις ονομάτων αρχείων από την άποψη της επιστήμης των υπολογιστών. Ο σκοπός του έχει ήδη καθοριστεί - απαιτείται για τον προσδιορισμό της μορφής ή του τύπου του αρχείου. Η επέκταση διαχωρίζεται από το όνομα του αρχείου χρησιμοποιώντας μια τελεία. Πριν από το 1995, τα Windows είχαν ένα όριο στον αριθμό των χαρακτήρων σε μια επέκταση: δεν θα μπορούσαν να είναι περισσότεροι από τρεις. Στα σύγχρονα συστήματα δεν υπάρχει τέτοιος περιορισμός. Ακόμη περισσότερο, στα σύγχρονα συστήματα αρχείων μπορεί να υπάρχουν αρχεία που έχουν διάφορους τύπους επεκτάσεων. Όλοι ακολουθούν το σημείο. Αυτό, ωστόσο, δεν ισχύει για πράγματα όπως το cpp.

Οι απατεώνες εκμεταλλεύονται συχνά αυτό το δώρο από προγραμματιστές. Οι εγκληματίες συχνά συγκαλύπτουν τα κακόβουλα αρχεία τους που σπρώχνουν στους υπολογιστές των χρηστών ως άλλα προγράμματα και κρύβουν την κύρια επέκταση αρχείου (για ιούς και διάφορους Trojans διαφέρει από τα κανονικά προγράμματα). Μπορεί ακόμη να συμβεί όλα τα πραγματικά αρχεία να κρυφτούν ή να διαγραφούν και στη θέση τους να μπουν εντελώς διαφορετικά. Και αποδεικνύεται ότι το cpp δεν είναι καθόλου cpp, αλλά ένας ιός υπολογιστή. Μια καλή άμυνα έναντι αυτού του τύπου απατεώνων είναι η εντολή εμφάνισης όλων των τύπων επεκτάσεων. Μπορείτε να ενεργοποιήσετε αυτή τη λειτουργία στον «Πίνακα Ελέγχου», απλώς βρείτε το απαιτούμενο στοιχείο. Και τότε μπορείτε να είστε ήρεμοι με τα αρχεία σας C plus plus και να είστε σίγουροι ότι δεν θα εκτελέσετε ένα επιβλαβές πρόγραμμα αντί για αυτά. Αν και εδώ πρέπει πάντα να κοιτάτε την επέκταση των εκτελέσιμων αρχείων.

Ακρίβεια των πληροφοριών που παρέχονται στην επέκταση

Μερικές φορές η επέκταση δεν υποδεικνύει με ακρίβεια τον τύπο αρχείου και δεν επιλύει όλα τα πιθανά προβλήματα που μπορεί να προκύψουν κατά τη χρήση διαφόρων προγραμμάτων. Έτσι, η επέκταση .txt, γνωστή σε πολλούς, δεν παρέχει πληροφορίες στον υπολογιστή σχετικά με την κωδικοποίηση του αρχείου. Επομένως, συχνά όταν ανοίγετε αρχεία κειμένου μπορείτε να δείτε φύλλα με ακατανόητους χαρακτήρες. Είναι ιδιαίτερα λυπηρό να βλέπουμε μια τέτοια κατάσταση ενός εγγράφου εάν χρησιμοποιήθηκε για την εγγραφή κώδικα προγράμματος. Σε τέτοιες περιπτώσεις, οι κωδικοποιήσεις αρχείων θα πρέπει να αλλάζουν έως ότου ο υπολογιστής μπορεί να παρέχει επαρκές κείμενο. Μπορείτε να προσπαθήσετε να υπολογίσετε την απαιτούμενη κωδικοποίηση με βάση λανθασμένους χαρακτήρες, αλλά πρέπει να γνωρίζετε ποια κωδικοποίηση οδηγεί σε τι σε σχέση με ποια. Για τα αρχεία Word, χρησιμοποιείται επίσης η ίδια επέκταση, η οποία δεν καθιστά σαφές με ποιο αρχείο έχει να κάνει κάποιος: κανονικού τύπου ή μορφοποιημένο. Η επέκταση δεν υποδεικνύει επίσης ποια έκδοση χρησιμοποιείται, κάτι που είναι χρήσιμο όταν προσπαθείτε να ανοίξετε εκδόσεις προηγούμενων εγγράφων σε μεταγενέστερα περιβάλλοντα επεξεργασίας, όπως συμβαίνει με το Microsoft Office.

Άλλοι τρόποι και επιλογές για τον καθορισμό της μορφής

Υπάρχουν άλλες επιλογές που μπορείτε να καθορίσετε για το σύστημα αρχείων. Αλλά δεν είναι κοινά, και πιθανότατα δεν έχετε ακούσει ποτέ για αυτά:

  • Αποθήκευση πληροφοριών σχετικά με τη μορφή αρχείου στο ίδιο το λειτουργικό σύστημα. Προκύπτουν ενοχλήσεις όταν θέλετε να μεταβείτε σε άλλον υπολογιστή και να εργαστείτε με το ίδιο αρχείο.
  • Εφαρμογή της λεγόμενης μεθόδου «μαγικού αριθμού». Αυτό συμβαίνει όταν μια συγκεκριμένη ακολουθία byte κρυπτογραφείται στο ίδιο το αρχείο, το οποίο υποδεικνύει όλες τις απαραίτητες πληροφορίες για τη λειτουργία του αρχείου. Έχει ορισμένες δυνατότητες, αλλά απαιτεί συνεργασία μεταξύ κατασκευαστών λογισμικού.
  • Για ορισμένα συστήματα Unix, έχει αναπτυχθεί μια συνάρτηση που αφήνει ειδικά σημάδια στην αρχή του αρχείου, που προορίζεται για τον διερμηνέα.
mob_info