Δημιουργήστε τη δική σας γλώσσα προγραμματισμού (I)

Η εξέλιξη των γλωσσών προγραμματισμού

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

Αναρωτιέστε πιθανώς: «Μια εικονική μηχανή; Αλλά δεν είναι τόσο δύσκολο και επιβραδύνει επίσης τα προγράμματα; " Αντίθετα, μια απλή εικονική μηχανή είναι πολύ απλή και σχετικά γρήγορη. επέλεξα Σκωρία ως γλώσσα για την εικονική μηχανή. Αλλά τι είναι Σκωρία?

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

Σκωρία εγκαθίσταται στο Linux Με απλό τρόπο. Ωστόσο, δεν υπάρχει επίσημο δέμα. Χρήστες του Ubuntu μπορείτε να προσθέσετε αυτά τα δύο ΟΛΠ: ppa: hansjorg / σκουριά  y ppa: cmrx64 / φορτίο, χρήστες του αψίδα μπορεί να χρησιμοποιηθεί AUR (cargo-git είναι το πακέτο που εγκαθιστά τα πάντα). Τα υπόλοιπα μπορούν να χρησιμοποιήσουν:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Πώς λειτουργεί μια εικονική μηχανή;

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

εκτύπωση 2 + 3

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

PUSH 2 PUSH 3 ΠΡΟΣΘΗΚΗ ΕΚΤΥΠΩΣΗΣ

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

Πρέπει πρώτα να ορίσουμε μια γλώσσα για το Bytecode, θα μπορούσαμε να χρησιμοποιήσουμε ένα υπάρχον όπως αυτό Java ή η CLR του .NET / Mono, αλλά πρόκειται να δημιουργήσουμε ένα πιο βασικό.

https://gist.github.com/a01de8904fd39a442c20

Χρησιμοποιούμε δεκαεξαδική σημειογραφία για κάθε εντολή. Στο ψηλό έχουμε βάλει # [παράγοντας (FromPrimitive)], είναι μια ιδιαιτερότητα του Σκωρία και θα μας βοηθήσει αργότερα να μπορούμε να συγκρίνουμε την απαρίθμηση με τα byte απευθείας.

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

https://gist.github.com/8950ce212a2de2f397f9

Κάνουμε αυτό για να διαβάσουμε κάθε byte ξεχωριστά και να τα εκτελέσουμε:

https://gist.github.com/12e24a1f0dd65e4cd65d

Όπως μπορείτε να δείτε, διαφοροποιούμε εάν μας δόθηκε η εντολή PUSH (η εντολή INTEGER) πριν, το επόμενο byte θα μεταφερθεί πλήρως στη στοίβα. Εκεί χρησιμοποιούμε δύο λειτουργίες που δεν σας έχω διδάξει, self.pop () y self.push (), οι οποίοι είναι προφανώς υπεύθυνοι για το χειρισμό της στοίβας.

https://gist.github.com/54147f853a8a2b8c01d9

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

https://gist.github.com/99b1ab461318b3a644d0

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

Perin v0.1 Perin VM εκτελεί FlopFlip bytecode Εκκίνηση παρουσίας PerinVM PerinVM v0.1.0 Τιμή ακέραιου 5

Όλος ο κωδικός είναι διαθέσιμος στη διεύθυνση GitHub υπό την Άδεια Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Για την κατάρτιση πρέπει να έχουν Φορτίο εγκατεστημένο και βάλτε:

χρέωση build && ./target/main

Στο επόμενο κεφάλαιο θα δούμε περισσότερα για τη γλώσσα προγραμματισμού μας.


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   οδικός dijo

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

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

    Όσο για τη φωτογραφία, δεν θα θεωρούσα το Java Evolution XD.

    1.    οδικός dijo

      Και από το fortran, δεν το χρησιμοποίησα ποτέ, αλλά δεν το έχω ακούσει πολύ καλά ...

      1.    Φώριες dijo

        Το κάνω, και είναι ιδιαίτερα χρήσιμο στη μηχανική παρόλο που η Python κερδίζει έδαφος.

      2.    Γιάννης dijo

        Το Fortran είναι ίσως η άλλη υπέροχη γλώσσα μαζί με τον C. Ακόμα και σήμερα σε πραγματικά κρίσιμα ερωτήματα θα είναι το ένα ή το άλλο.

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

        Αν και οι τελικές θέσεις είναι συζητήσιμες από κάποια άποψη.

    2.    Φρανσίσκο dijo

      +1 προς Java

  2.   Πορτάρο dijo

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

  3.   usergnulinux dijo

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

  4.   Ναι dijo

    Φίλε, τι συνέβη με τη συνέχιση του "δικού σας λειτουργικού συστήματος"; Μην το αφήσετε εκεί παρακαλώ, συνεχίστε το.

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

    Ξέρω ότι πολλοί από εμάς σκέφτονται το ίδιο και περιμένουμε τις συνέπειες και τα συμπεράσματα αυτών των πολύ ενδιαφέρων θεμάτων.

  5.   Κρίστιαν Ντέιβιντ dijo

    Πολύ ενδιαφέρον, ευχαριστώ πολύ. 🙂

  6.   Φράνκο dijo

    Δεν θεωρώ java γλώσσα προγραμματισμού, αλλά διερμηνέα εντολών, καθώς δεν είναι μεταγλώττιση

    1.    Mario dijo

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

      Για το λόγο αυτό, η Java είναι μια γλώσσα προγραμματισμού. Ακόμη και η γλώσσα Bash (γλώσσα κέλυφος linux) είναι από μόνη της μια γλώσσα προγραμματισμού.

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

      Οι διερμηνείς είναι πολύ χρήσιμοι όταν πρόκειται για πολλαπλές πλατφόρμες και δεν έχουν καταστροφική απόδοση για αυτό. Java, VB.NET, C ++ .NET, F #, C # είναι όλες μικτές γλώσσες. Η γλώσσα bash, το ρόπαλο, το PHP, το Javascript και πολλά άλλα είναι γλώσσες που ερμηνεύονται.

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

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

      Γιατί αποτελεσματικά, ΟΛΕΣ οι γλώσσες δεν είναι τίποτα περισσότερο από ένα σύνολο εντολών που ερμηνεύονται από έναν επεξεργαστή.

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

    2.    Mario dijo

      😐 Ελπίζω να μην φαινόμουν πολύ αγενής

      1.    Μαρία Αντονιέτα ντε μανουέλα Καρντένας dijo

        όχι ησυχία εσείς καταστρέφετε μόνο τις ζωές μας

      2.    Mario dijo

        χαχαχαχαχα, perdoooon. δεν ήταν η πρόθεσή μου xD

    3.    carlos dijo

      Το java είναι μια γλώσσα προγραμματισμού. Επειδή μπορείτε να αναπτύξετε μια εφαρμογή και όταν μεταγλωττίζετε δημιουργείτε ένα .jar που ερμηνεύεται από το JVM. Στη συνέχεια, σύμφωνα με τη λογική σας python, δεν ερμηνεύεται ούτε, αλλά μεταγλωττίζεται σε διαφορετικά εκτελέσιμα ...

  7.   Ηλίας Μογγέλος dijo

    Πολύ καλές πληροφορίες

  8.   Κάρλος Αρτούρο dijo

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