Συγγραφή Κώδικα: Γραμματικές Γλωσσών Προγραμματισμού

29 January 2022
Αθανάσιος Ανδρούτσος

5' read


 

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

Γραμματική της γλώσσας / Γράμματα και Keywords

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

Στην περίπτωση των γλωσσών προγραμματισμού, τα γράμματα είναι οι χαρακτήρες ASCII (βλ. Coded Character Set -- 7-Bit American Standard Code for Information Interchange, ANSI X3.4-1986). Πρόκειται για 128 λατινικούς χαρακτήρες (a-zA-Z), αριθμούς (0-9) και ειδικούς χαρακτήρες (!, *, ?, κλπ).

Με βάση αυτό το 'Αλφάβητο' κάθε γλώσσα ορίζει και κάποιες λέξεις, που ονομάζονται reserved keywords. Η Java για παράδειγμα μας παρέχει 51 συνδυασμούς χαρακτηρων (λέξεις), 35 από τις οποίες είναι δεσμευμένες (Reserved Keywords) και 16 μπορεί να είναι reserved ή όχι ανάλογα με το σημείο του κώδικα μέσα στο οποίο βρίσκονται (Contextual Keywords).

 

 

 

 

 

 

 

Λεκτικός Αναλυτής

Ο μεταγλωττιστής της Java και συγκεκριμένα ο Λεκτικός Αναλυτής που αποτελεί μέρος όλων των σύγχρονων μεταγλωττιστών μπορεί και 'αναγνωρίζει' τα reserved keywords αρκεί αμέσως πριν και αμέσως μετά από ένα keyword να υπάρχει white space! Δηλαδή κενό, tab ή αλλαγή γραμμής. Αν δεν υπάρχει κάτι τέτοιο, και εισάγουμε στο πρόγραμμά μας δύο keywords χωρίς κενό, π.χ. publicstatic, τότε η λέξη αυτή δεν θεωρείται δεσμευμένη (μιας και οι μεταγλωττιστές πάντα αναγνωρίζουν το longest match) και θεωρείται από τον μεταγλωττιστή ότι είναι ένας identifier, δηλαδή ένα όνομα που οι προγραμματιστές δίνουν σε μεταβλητές, σταθερές, κλπ.

 

Συντακτικός Αναλυτής

Όπως και στις κανονικές γλώσσες, όταν μιλάμε χρησιμοποιούμε κανόνες σύνταξης για να παράγουμε προτάσεις με νόημα, έτσι και στις γλώσσες προγραμματισμού υπάρχουν συντακτικοί κανόνες με βάση τους οποίους συντάσσουμε τα προγράμματά μας για να 'βγάζουν νόημα', να είναι δηλαδή ορθά. Οι συντακτικοί αυτοί κανόνες ονομάζοται κανόνες παραγωγής και είναι μέρος της Γραμματικής μιας γλώσσας. Τυπικά οι Γραμματικές αυτές ονομάζονται CFG (Context-Free Grammars) και οι κανόνες παραγωγής ορίζονται με βάση το σύστημα BNF (Backus Normal Form - μία συμβολική τεχνική ορισμού). Για παράδειγμα ένας κανόνας παραγωγής θα μπορούσε να είναι Keyword: ReservedKeyword | ContextualKeyword δηλαδή ένας κανόνας που αναπαριστά αυτό που αναλύσαμε πριν σε σχέση τα reserved keywords (το σύμβολο | σημαίνει το διαζευκτικό Ή).

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

 

Κανονικές γλώσσες vs Γλώσσες Προγραμματισμού 

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


Συμπερασματικά,


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