Μπορεί,
Σε αυτό το άρθρο, το οποίο είναι επισκόπησης στη φύση, θα προσπαθήσουμε να δούμε μερικά από τα βασικά της αρχιτεκτονικής Eclipse ως πλατφόρμα για την κατασκευή ολοκληρωμένων εργαλείων ανάπτυξης και να δώσουμε μια αρχική ιδέα των στοιχείων Eclipse που αποτελούν τη βάση της τεχνολογίας πλατφόρμα για το "νέο Configurator" 1C: Enterprise.
Εισαγωγή στην Αρχιτεκτονική Eclipse
Ας δούμε πρώτα μερικές γενικές πτυχές της αρχιτεκτονικής Eclipse χρησιμοποιώντας το παράδειγμα
Πρώτα απ 'όλα, θα πρέπει να σημειωθεί ότι το Eclipse χαρακτηρίζεται από ένα αρκετά σαφές αρχιτεκτονικό layering, με τον διαχωρισμό της λειτουργικότητας ανεξάρτητης γλώσσας από τη λειτουργικότητα που έχει σχεδιαστεί για την υποστήριξη συγκεκριμένων γλωσσών προγραμματισμού και τον διαχωρισμό των ανεξάρτητων από το UI στοιχείων "πυρήνα" από στοιχεία που σχετίζονται με υποστηρικτικό περιβάλλον χρήστη.
Έτσι, η πλατφόρμα Eclipse ορίζει μια κοινή, ανεξάρτητη από τη γλώσσα υποδομή και τα εργαλεία ανάπτυξης Java προσθέτουν ένα Java IDE με πλήρη χαρακτηριστικά στο Eclipse. Τόσο η πλατφόρμα Eclipse όσο και το JDT αποτελούνται από πολλά στοιχεία, καθένα από τα οποία ανήκει είτε σε έναν "πυρήνα" ανεξάρτητο από το περιβάλλον χρήστη ή σε ένα επίπεδο διεπαφής χρήστη (Εικόνα 1).
Ρύζι. 1. Eclipse Platform και JDT
Ας παραθέσουμε τα κύρια στοιχεία της πλατφόρμας Eclipse:
- Διάρκεια — Καθορίζει την υποδομή των πρόσθετων. Το Eclipse χαρακτηρίζεται από μια αρθρωτή αρχιτεκτονική. Ουσιαστικά, το Eclipse είναι μια συλλογή από «σημεία επέκτασης» και «επεκτάσεις».
- Χώρος εργασίας — Διαχειρίζεται ένα ή περισσότερα έργα. Ένα έργο αποτελείται από φακέλους και αρχεία που αντιστοιχίζονται απευθείας στο σύστημα αρχείων.
- Standard Widget Toolkit (SWT) - Παρέχει βασικά στοιχεία διεπαφής χρήστη ενσωματωμένα στο λειτουργικό σύστημα.
- JFace — Παρέχει έναν αριθμό πλαισίων διεπαφής χρήστη που έχουν δημιουργηθεί πάνω από το SWT.
- Πάγκος εργασίας — Καθορίζει το παράδειγμα διεπαφής χρήστη Eclipse: επεξεργαστές, απόψεις, προοπτικές.
Πρέπει να πούμε ότι η πλατφόρμα Eclipse παρέχει επίσης πολλά άλλα χρήσιμα στοιχεία για τη δημιουργία ολοκληρωμένων εργαλείων ανάπτυξης, συμπεριλαμβανομένων των Debug, Compare, Search και Team. Ιδιαίτερη αναφορά πρέπει να γίνει στο JFace Text - τη βάση για τη δημιουργία «έξυπνων συντακτών» του πηγαίου κώδικα. Δυστυχώς, ακόμη και μια πρόχειρη εξέταση αυτών των στοιχείων, καθώς και των στοιχείων του επιπέδου διεπαφής χρήστη, δεν είναι δυνατή εντός του πεδίου εφαρμογής αυτού του άρθρου, επομένως στο υπόλοιπο αυτής της ενότητας θα περιοριστούμε σε μια επισκόπηση των κύριων στοιχείων "πυρήνα" του την πλατφόρμα Eclipse και το JDT.
Core Runtime
Η υποδομή του πρόσθετου Eclipse βασίζεται σε
Βασικός Χώρος Εργασίας
Σχεδόν κάθε ολοκληρωμένο περιβάλλον ανάπτυξης που έχει δημιουργηθεί πάνω από την πλατφόρμα Eclipse λειτουργεί με το χώρο εργασίας Eclipse. Είναι ο χώρος εργασίας που συνήθως περιέχει τον πηγαίο κώδικα της εφαρμογής που έχει αναπτυχθεί στο IDE. Ο χώρος εργασίας αντιστοιχίζεται απευθείας στο σύστημα αρχείων και αποτελείται από έργα που περιέχουν φακέλους και αρχεία. Αυτά τα έργα, οι φάκελοι και τα αρχεία ονομάζονται πόροι χώρο εργασίας. Η υλοποίηση του χώρου εργασίας στο Eclipse χρησιμεύει ως προσωρινή μνήμη σε σχέση με το σύστημα αρχείων, γεγονός που καθιστά δυνατή τη σημαντική επιτάχυνση της διέλευσης του δέντρου πόρων. Επιπλέον, ο χώρος εργασίας παρέχει μια σειρά από πρόσθετες υπηρεσίες, μεταξύ των οποίων
Το στοιχείο Core Resources (προσθήκη org.eclipse.core.resources) είναι υπεύθυνο για την υποστήριξη του χώρου εργασίας και των πόρων του. Συγκεκριμένα, αυτό το στοιχείο παρέχει πρόσβαση μέσω προγραμματισμού στον χώρο εργασίας στη φόρμα μοντέλα πόρων. Για να δουλέψουν αποτελεσματικά με αυτό το μοντέλο, οι πελάτες χρειάζονται έναν απλό τρόπο για να παρουσιάσουν έναν σύνδεσμο προς έναν πόρο. Σε αυτήν την περίπτωση, θα ήταν επιθυμητό να αποκρύψετε το αντικείμενο που αποθηκεύει απευθείας την κατάσταση του πόρου στο μοντέλο από την πρόσβαση πελάτη. Διαφορετικά, στην περίπτωση, για παράδειγμα, διαγραφής ενός αρχείου, ο πελάτης θα μπορούσε να συνεχίσει να κρατά ένα αντικείμενο που δεν είναι πλέον στο μοντέλο, με τα προβλήματα που προκύπτουν. Το Eclipse λύνει αυτό το πρόβλημα χρησιμοποιώντας κάτι που ονομάζεται λαβή πόρος. Το Handle λειτουργεί ως κλειδί (γνωρίζει μόνο τη διαδρομή προς τον πόρο στον χώρο εργασίας) και ελέγχει πλήρως την πρόσβαση στο εσωτερικό αντικείμενο μοντέλου, το οποίο αποθηκεύει απευθείας πληροφορίες σχετικά με την κατάσταση του πόρου. Αυτό το σχέδιο είναι μια παραλλαγή του μοτίβου
Ρύζι. Το σχήμα 2 απεικονίζει το ιδίωμα Handle/Body όπως εφαρμόζεται στο μοντέλο πόρων. Η διεπαφή IResource αντιπροσωπεύει τη λαβή ενός πόρου και είναι ένα API, σε αντίθεση με την κλάση Resource, που υλοποιεί αυτήν τη διεπαφή, και την κλάση ResourceInfo, η οποία αντιπροσωπεύει το σώμα, που δεν είναι API. Τονίζουμε ότι η λαβή γνωρίζει μόνο τη διαδρομή προς τον πόρο σε σχέση με τη ρίζα του χώρου εργασίας και δεν περιέχει σύνδεσμο προς πληροφορίες πόρων. Τα αντικείμενα πληροφοριών πόρων σχηματίζουν ένα λεγόμενο «δέντρο στοιχείων». Αυτή η δομή δεδομένων υλοποιείται πλήρως στη μνήμη. Για να βρεθεί η παρουσία πληροφοριών πόρων που αντιστοιχεί σε μια λαβή, το δέντρο του στοιχείου διασχίζεται σύμφωνα με τη διαδρομή που είναι αποθηκευμένη σε αυτήν τη λαβή.
Ρύζι. 2. IRResource και ResourceInfo
Όπως θα δούμε αργότερα, ο βασικός σχεδιασμός του μοντέλου πόρων (θα μπορούσαμε να το ονομάσουμε βασισμένο σε λαβή) χρησιμοποιείται στο Eclipse και για άλλα μοντέλα. Προς το παρόν, ας απαριθμήσουμε μερικές από τις χαρακτηριστικές ιδιότητες αυτού του σχεδίου:
- Η λαβή είναι ένα αντικείμενο αξίας. Τα αντικείμενα αξίας είναι αμετάβλητα αντικείμενα των οποίων η ισότητα δεν βασίζεται στην ταυτότητα. Τέτοια αντικείμενα μπορούν να χρησιμοποιηθούν με ασφάλεια ως κλειδί σε κατακερματισμένα δοχεία. Πολλαπλές περιπτώσεις χειρισμού μπορούν να αναφέρονται στον ίδιο πόρο. Για να τα συγκρίνετε, πρέπει να χρησιμοποιήσετε τη μέθοδο ίσον (Αντικείμενο).
- Το Handle ορίζει τη συμπεριφορά ενός πόρου, αλλά δεν περιέχει πληροφορίες σχετικά με την κατάσταση του πόρου (τα μόνα δεδομένα που αποθηκεύει είναι το "κλειδί", η διαδρομή προς τον πόρο).
- Το Handle μπορεί να αναφέρεται σε έναν πόρο που δεν υπάρχει (είτε έναν πόρο που δεν έχει ακόμη δημιουργηθεί είτε έναν πόρο που έχει ήδη διαγραφεί). Η ύπαρξη ενός πόρου μπορεί να ελεγχθεί χρησιμοποιώντας τη μέθοδο IResource.exists().
- Ορισμένες λειτουργίες μπορούν να υλοποιηθούν με βάση μόνο τις πληροφορίες που είναι αποθηκευμένες στην ίδια τη λαβή (οι λεγόμενες λειτουργίες μόνο χειρισμού). Παραδείγματα είναι τα IResource.getParent(), getFullPath(), κ.λπ. Ο πόρος δεν χρειάζεται να υπάρχει για να πετύχει μια τέτοια λειτουργία. Λειτουργίες που απαιτούν να υπάρχει ένας πόρος για να πετύχουν ρίχνουν ένα CoreException εάν ο πόρος δεν υπάρχει.
Το Eclipse παρέχει έναν αποτελεσματικό μηχανισμό για την ειδοποίηση αλλαγών πόρων στο χώρο εργασίας (Εικόνα 3). Οι πόροι μπορούν να αλλάξουν είτε ως αποτέλεσμα ενεργειών που εκτελούνται στο ίδιο το Eclipse IDE είτε ως αποτέλεσμα συγχρονισμού με το σύστημα αρχείων. Και στις δύο περιπτώσεις, στους πελάτες που εγγράφονται σε ειδοποιήσεις παρέχονται λεπτομερείς πληροφορίες σχετικά με τις αλλαγές με τη μορφή «δέλτα πόρων». Ένα δέλτα περιγράφει αλλαγές μεταξύ δύο καταστάσεων ενός (υπο)δέντρου πόρου χώρου εργασίας και είναι το ίδιο ένα δέντρο, κάθε κόμβος του οποίου περιγράφει μια αλλαγή σε έναν πόρο και περιέχει μια λίστα δέλτα στο επόμενο επίπεδο που περιγράφουν αλλαγές σε θυγατρικούς πόρους.
Ρύζι. 3. IResourceChangeEvent και IResourceDelta
Ο μηχανισμός ειδοποίησης που βασίζεται σε δέλτα πόρων έχει τα ακόλουθα χαρακτηριστικά:
- Μια μεμονωμένη αλλαγή και πολλές αλλαγές περιγράφονται χρησιμοποιώντας την ίδια δομή, αφού το δέλτα είναι χτισμένο χρησιμοποιώντας την αρχή της αναδρομικής σύνθεσης. Οι πελάτες συνδρομητών μπορούν να επεξεργαστούν ειδοποιήσεις αλλαγής πόρων χρησιμοποιώντας αναδρομική κάθοδο μέσω ενός δέντρου δέλτα.
- Το δέλτα περιέχει πλήρεις πληροφορίες σχετικά με αλλαγές στον πόρο, συμπεριλαμβανομένης της μετακίνησής του ή/και των αλλαγών στους «δείκτες» που σχετίζονται με αυτόν (για παράδειγμα, τα σφάλματα μεταγλώττισης αντιπροσωπεύονται ως δείκτες).
- Δεδομένου ότι οι αναφορές πόρων γίνονται μέσω της λαβής, η delta μπορεί φυσικά να αναφέρει έναν απομακρυσμένο πόρο.
Όπως θα δούμε σύντομα, τα κύρια στοιχεία του σχεδιασμού του μηχανισμού ειδοποίησης αλλαγής μοντέλου πόρων είναι επίσης σχετικά με άλλα μοντέλα που βασίζονται σε χειρολαβή.
JDT Core
Το μοντέλο πόρων χώρου εργασίας Eclipse είναι ένα θεμελιώδες μοντέλο αγνωστικοποίησης της γλώσσας. Το στοιχείο JDT Core (πρόσθετο org.eclipse.jdt.core) παρέχει ένα API για την πλοήγηση και την ανάλυση της δομής του χώρου εργασίας από την οπτική γωνία της Java, το λεγόμενο «μοντέλο Java» (Μοντέλο Java). Αυτό το API ορίζεται ως προς τα στοιχεία Java, σε αντίθεση με το API του υποκείμενου μοντέλου πόρων, το οποίο ορίζεται ως προς τους φακέλους και τα αρχεία. Οι κύριες διεπαφές του δέντρου στοιχείων Java φαίνονται στην Εικ. 4.
Ρύζι. 4. Java Model Elements
Το μοντέλο Java χρησιμοποιεί το ίδιο ιδίωμα χειρισμού/σώματος με το μοντέλο πόρων (Εικόνα 5). Το IJavaElement είναι η λαβή και το JavaElementInfo παίζει το ρόλο του σώματος. Η διεπαφή IJavaElement ορίζει ένα πρωτόκολλο κοινό για όλα τα στοιχεία Java. Ορισμένες από τις μεθόδους του είναι μόνο χειρισμού: getElementName(), getParent(), κ.λπ. Το αντικείμενο JavaElementInfo αποθηκεύει την κατάσταση του αντίστοιχου στοιχείου: τη δομή και τα χαρακτηριστικά του.
Ρύζι. 5. IJavaElement και JavaElementInfo
Το μοντέλο Java έχει κάποιες διαφορές στην υλοποίηση του βασικού σχεδιασμού λαβής/σώματος σε σύγκριση με το μοντέλο πόρων. Όπως σημειώθηκε παραπάνω, στο μοντέλο πόρων, το δέντρο στοιχείων, του οποίου οι κόμβοι είναι αντικείμενα πληροφοριών πόρων, περιέχεται εξ ολοκλήρου στη μνήμη. Αλλά το μοντέλο Java μπορεί να έχει σημαντικά μεγαλύτερο αριθμό στοιχείων από το δέντρο πόρων, επειδή αντιπροσωπεύει επίσης την εσωτερική δομή των αρχείων .java και .class: τύπους, πεδία και μεθόδους.
Για να αποφευχθεί η πλήρης υλοποίηση ολόκληρου του δέντρου στοιχείων στη μνήμη, η υλοποίηση του μοντέλου Java χρησιμοποιεί μια προσωρινή μνήμη LRU περιορισμένου μεγέθους πληροφοριών στοιχείων, όπου το κλειδί είναι η λαβή IJavaElement. Τα αντικείμενα πληροφοριών στοιχείων δημιουργούνται κατόπιν ζήτησης καθώς γίνεται πλοήγηση στο δέντρο στοιχείων. Σε αυτήν την περίπτωση, τα στοιχεία που χρησιμοποιούνται λιγότερο συχνά εξαιρούνται από τη μνήμη cache και η κατανάλωση μνήμης του μοντέλου παραμένει περιορισμένη στο καθορισμένο μέγεθος της κρυφής μνήμης. Αυτό είναι ένα άλλο πλεονέκτημα του σχεδιασμού που βασίζεται σε λαβή, το οποίο αποκρύπτει εντελώς τέτοιες λεπτομέρειες υλοποίησης από τον κώδικα πελάτη.
Ο μηχανισμός για την ειδοποίηση αλλαγών σε στοιχεία Java είναι γενικά παρόμοιος με τον μηχανισμό παρακολούθησης αλλαγών στους πόρους του χώρου εργασίας που συζητήθηκε παραπάνω. Ένας πελάτης που επιθυμεί να παρακολουθήσει τις αλλαγές στο μοντέλο Java εγγράφεται σε ειδοποιήσεις, οι οποίες αντιπροσωπεύονται ως αντικείμενο ElementChangedEvent που περιέχει ένα IJavaElementDelta (Εικόνα 6).
Ρύζι. 6. ElementChangedEvent και IJavaElementDelta
Το μοντέλο Java δεν περιέχει πληροφορίες σχετικά με τα σώματα μεθόδων ή την ανάλυση ονομάτων, επομένως για λεπτομερή ανάλυση κώδικα γραμμένου σε Java, το JDT Core παρέχει ένα πρόσθετο (μη βασισμένο σε λαβή) μοντέλο:
Επειδή τα δέντρα σύνταξης μπορούν να καταναλώσουν σημαντική ποσότητα μνήμης, το JDT αποθηκεύει προσωρινά μόνο ένα AST για τον ενεργό επεξεργαστή. Σε αντίθεση με το μοντέλο Java, το AST συνήθως θεωρείται ως ένα "ενδιάμεσο", "προσωρινό" μοντέλο του οποίου τα μέλη δεν θα πρέπει να αναφέρονται από πελάτες εκτός του πλαισίου της λειτουργίας που οδήγησε στη δημιουργία του AST.
Τα αναφερόμενα τρία μοντέλα (μοντέλο Java, AST, δεσμεύσεις) μαζί αποτελούν τη βάση για τη δημιουργία «έξυπνων εργαλείων ανάπτυξης» στο JDT, συμπεριλαμβανομένου ενός ισχυρού επεξεργαστή Java με διάφορους «βοηθούς», διάφορες ενέργειες για την επεξεργασία πηγαίου κώδικα (συμπεριλαμβανομένης της οργάνωσης λίστας εισαγωγής ονόματα και μορφοποίηση σύμφωνα με το προσαρμοσμένο στυλ), εργαλεία αναζήτησης και ανακατασκευής. Σε αυτήν την περίπτωση, το μοντέλο Java διαδραματίζει ιδιαίτερο ρόλο, καθώς είναι αυτό που χρησιμοποιείται ως βάση για μια οπτική αναπαράσταση της δομής της εφαρμογής που αναπτύσσεται (για παράδειγμα, στην Εξερεύνηση πακέτων, Περίγραμμα, Αναζήτηση, Ιεραρχία κλήσεων και Τύπος Ιεραρχία).
Στοιχεία Eclipse που χρησιμοποιούνται στο 1C:Enterprise Developments Tools
Στο Σχ. Το σχήμα 7 δείχνει τα στοιχεία του Eclipse που αποτελούν τη βάση της τεχνολογικής πλατφόρμας για τα Εργαλεία Ανάπτυξης Επιχειρήσεων 1C:Enterprise.
Ρύζι. 7. Το Eclipse ως πλατφόρμα για το 1C:Enterprise Development Tools
Eclipse Platform παρέχει βασικές υποδομές. Εξετάσαμε ορισμένες πτυχές αυτής της υποδομής στην προηγούμενη ενότητα.
Όπως κάθε πραγματικά γενικής χρήσης εργαλείο, το EMF είναι κατάλληλο για την επίλυση ενός ευρέος φάσματος προβλημάτων μοντελοποίησης, αλλά ορισμένες κατηγορίες μοντέλων (για παράδειγμα, τα μοντέλα που βασίζονται σε λαβή που συζητήθηκαν παραπάνω) μπορεί να απαιτούν πιο εξειδικευμένα εργαλεία μοντελοποίησης. Το να μιλάς για το EMF είναι μια άχαρη εργασία, ειδικά εντός των περιορισμένων ορίων ενός άρθρου, καθώς αυτό είναι το θέμα ενός ξεχωριστού βιβλίου και ενός μάλλον παχύ. Ας σημειώσουμε μόνο ότι το υψηλής ποιότητας σύστημα γενικεύσεων που διέπει το EMF επέτρεψε τη γέννηση μιας ολόκληρης σειράς έργων αφιερωμένων στη μοντελοποίηση, τα οποία περιλαμβάνονται στο έργο ανώτατου επιπέδου
1C: Τα Εργαλεία Ανάπτυξης Επιχειρήσεων χρησιμοποιούν ενεργά τόσο το ίδιο το EMF όσο και μια σειρά από άλλα έργα Eclipse Modeling. Συγκεκριμένα, το Xtext είναι ένα από τα θεμέλια των εργαλείων ανάπτυξης για τέτοιες γλώσσες 1C:Enterprise όπως η ενσωματωμένη γλώσσα προγραμματισμού και η γλώσσα ερωτημάτων. Μια άλλη βάση για αυτά τα εργαλεία ανάπτυξης είναι το έργο Eclipse Handly, το οποίο θα συζητήσουμε με περισσότερες λεπτομέρειες (από τα συστατικά του Eclipse που παρατίθενται, εξακολουθεί να είναι το λιγότερο γνωστό).
Οι βασικές αρχιτεκτονικές αρχές των μοντέλων που βασίζονται σε λαβή, όπως το ιδίωμα λαβής/σώματος, συζητήθηκαν παραπάνω χρησιμοποιώντας το μοντέλο πόρων και το μοντέλο Java ως παραδείγματα. Σημείωσε επίσης ότι τόσο το μοντέλο πόρων όσο και το μοντέλο Java αποτελούν σημαντικά θεμέλια για τα εργαλεία ανάπτυξης Java Eclipse (JDT). Και δεδομένου ότι σχεδόν όλα τα έργα *DT Eclipse έχουν αρχιτεκτονική παρόμοια με το JDT, δεν θα ήταν μεγάλη υπερβολή να πούμε ότι τα μοντέλα που βασίζονται σε χειρολαβές αποτελούν τη βάση πολλών, αν όχι όλων των IDE που είναι κατασκευασμένα πάνω από την πλατφόρμα Eclipse. Για παράδειγμα, το Eclipse C/C++ Development Tooling (CDT) έχει ένα μοντέλο C/C++ που βασίζεται σε λαβή που παίζει τον ίδιο ρόλο στην αρχιτεκτονική CDT με το μοντέλο Java στο JDT.
Πριν από το Handly, το Eclipse δεν πρόσφερε εξειδικευμένες βιβλιοθήκες για τη δημιουργία μοντέλων γλώσσας που βασίζονται σε χειρολαβές. Τα μοντέλα που υπάρχουν αυτή τη στιγμή δημιουργήθηκαν κυρίως με την άμεση προσαρμογή του κώδικα μοντέλου Java (γνωστός και ως αντιγραφή/επικόλληση), στις περιπτώσεις που το επιτρέπει Eclipse Public License (EPL). (Προφανώς, αυτό δεν είναι συνήθως ένα νομικό ζήτημα για, ας πούμε, το ίδιο το έργο Eclipse, αλλά όχι για προϊόντα κλειστού κώδικα.) Εκτός από την εγγενή τυχαιότητα, αυτή η τεχνική εισάγει γνωστά προβλήματα: αντιγραφή κώδικα που εισάγεται κατά την προσαρμογή σε σφάλματα, και τα λοιπά. Το χειρότερο είναι ότι τα μοντέλα που προκύπτουν παραμένουν «πράγματα από μόνα τους» και δεν εκμεταλλεύονται τη δυνατότητα ενοποίησης. Αλλά η απομόνωση κοινών εννοιών και πρωτοκόλλων για μοντέλα γλώσσας που βασίζονται σε λαβή θα μπορούσε να οδηγήσει στη δημιουργία επαναχρησιμοποιήσιμων στοιχείων για εργασία με αυτά, παρόμοια με αυτό που συνέβη στην περίπτωση του EMF.
Δεν είναι ότι ο Eclipse δεν κατάλαβε αυτά τα θέματα. Πίσω στο 2005
Υπό μια ορισμένη έννοια, το έργο Handly έχει σχεδιαστεί για να λύνει περίπου τα ίδια προβλήματα με το EMF, αλλά για μοντέλα που βασίζονται σε χειρολαβές, και κυρίως για γλωσσικά (δηλαδή, αντιπροσωπεύουν στοιχεία της δομής κάποιας γλώσσας προγραμματισμού). Οι κύριοι στόχοι που τέθηκαν κατά το σχεδιασμό του Handly παρατίθενται παρακάτω:
- Προσδιορισμός των βασικών αφαιρέσεων της θεματικής περιοχής.
- Μείωση της προσπάθειας και βελτίωση της ποιότητας υλοποίησης μοντέλων γλώσσας που βασίζονται σε λαβές μέσω επαναχρησιμοποίησης κώδικα.
- Παρέχοντας ένα ενοποιημένο API μετα-επίπεδου στα μοντέλα που προκύπτουν, καθιστώντας δυνατή τη δημιουργία κοινών στοιχείων IDE που λειτουργούν με μοντέλα που βασίζονται σε χειρισμό γλώσσας.
- Ευελιξία και επεκτασιμότητα.
- Ενσωμάτωση με Xtext (σε ξεχωριστό επίπεδο).
Για να επισημανθούν κοινές έννοιες και πρωτόκολλα, αναλύθηκαν υπάρχουσες υλοποιήσεις μοντέλων που βασίζονται σε χειρισμό γλώσσας. Οι κύριες διεπαφές και οι βασικές υλοποιήσεις που παρέχονται από το Handly φαίνονται στο Σχ. 8.
Ρύζι. 8. Κοινές διεπαφές και βασικές υλοποιήσεις στοιχείων Handly
Η διεπαφή IElement αντιπροσωπεύει τη λαβή ενός στοιχείου και είναι κοινή σε στοιχεία όλων των μοντέλων που βασίζονται στο Handly. Η αφηρημένη κλάση Element υλοποιεί τον γενικευμένο μηχανισμό λαβής/σώματος (Εικ. 9).
Ρύζι. 9. IElement και γενική εφαρμογή λαβής/σώματος
Επιπλέον, το Handly παρέχει έναν γενικευμένο μηχανισμό για ειδοποίηση για αλλαγές στα στοιχεία του μοντέλου (Εικ. 10). Όπως μπορείτε να δείτε, είναι γενικά παρόμοιος με τους μηχανισμούς ειδοποίησης που εφαρμόζονται στο μοντέλο πόρων και στο μοντέλο Java και χρησιμοποιεί το IElementDelta για να παρέχει μια ενοποιημένη αναπαράσταση των πληροφοριών αλλαγής στοιχείων.
Ρύζι. 10. Γενικές διεπαφές και βασικές υλοποιήσεις του μηχανισμού ειδοποίησης Handly
Το τμήμα Handly που συζητήθηκε παραπάνω (Εικ. 9 και 10) μπορεί να χρησιμοποιηθεί για να αναπαραστήσει σχεδόν οποιοδήποτε μοντέλο με λαβή. Για τη δημιουργία γλωσσικός μοντέλα, το έργο προσφέρει πρόσθετη λειτουργικότητα - ειδικότερα, κοινές διεπαφές και βασικές υλοποιήσεις για στοιχεία της δομής κειμένου προέλευσης, τα λεγόμενα στοιχεία πηγής (Εικ. 8). Η διεπαφή ISourceFile αντιπροσωπεύει ένα αρχείο προέλευσης και το ISourceConstruct αντιπροσωπεύει ένα στοιχείο μέσα στο αρχείο προέλευσης. Οι αφηρημένες κλάσεις SourceFile και SourceConstruct εφαρμόζουν γενικευμένους μηχανισμούς για την υποστήριξη της εργασίας με αρχεία προέλευσης και τα στοιχεία τους, για παράδειγμα, εργασία με buffers κειμένου, σύνδεση με τις συντεταγμένες ενός στοιχείου στο κείμενο προέλευσης, συμφωνία μοντέλων με το τρέχον περιεχόμενο μιας λειτουργικής προσωρινής μνήμης αντιγραφής , και τα λοιπά. Η εφαρμογή αυτών των μηχανισμών είναι συνήθως μια μεγάλη πρόκληση και το Handly μπορεί να μειώσει σημαντικά την προσπάθεια ανάπτυξης μοντέλων γλώσσας που βασίζονται σε χειρολαβές παρέχοντας υλοποιήσεις βάσης υψηλής ποιότητας.
Εκτός από τους βασικούς μηχανισμούς που αναφέρονται παραπάνω, το Handly παρέχει μια υποδομή για προσωρινά αποθηκευτικά αρχεία κειμένου και στιγμιότυπα, υποστήριξη για ενσωμάτωση με επεξεργαστές πηγαίου κώδικα (συμπεριλαμβανομένης της ενσωμάτωσης out-of-the-box με τον επεξεργαστή Xtext), καθώς και ορισμένα κοινά στοιχεία διεπαφής χρήστη που Εργαστείτε με επεξεργαστές πηγαίου κώδικα. Χειροποίητα μοντέλα όπως το πλαίσιο περιγράμματος. Για να καταδείξει τις δυνατότητές του, το έργο παρέχει πολλά παραδείγματα, συμπεριλαμβανομένης μιας υλοποίησης του μοντέλου Java στο Handly. (Σε σύγκριση με την πλήρη εφαρμογή του μοντέλου Java στο JDT, αυτό το μοντέλο είναι σκόπιμα κάπως απλοποιημένο για μεγαλύτερη σαφήνεια.)
Όπως αναφέρθηκε προηγουμένως, μια σημαντική εστίαση κατά την αρχική σχεδίαση και την επακόλουθη ανάπτυξη του Handly ήταν και συνεχίζει να είναι η επεκτασιμότητα και η ευελιξία.
Κατ 'αρχήν, τα μοντέλα που βασίζονται σε λαβή κλιμακώνονται αρκετά καλά "από τη σχεδίαση". Για παράδειγμα, το ιδίωμα λαβής/σώμα σάς επιτρέπει να περιορίσετε την ποσότητα της μνήμης που καταναλώνεται από ένα μοντέλο. Υπάρχουν όμως και αποχρώσεις. Έτσι, κατά τη δοκιμή του Handly για επεκτασιμότητα, ανακαλύφθηκε ένα πρόβλημα στην εφαρμογή του μηχανισμού ειδοποίησης - όταν άλλαξαν μεγάλος αριθμός στοιχείων, η κατασκευή δέλτα χρειάστηκε πάρα πολύ χρόνο. Αποδείχθηκε ότι το ίδιο πρόβλημα υπήρχε και στο μοντέλο JDT Java, από το οποίο προσαρμόστηκε κάποτε ο αντίστοιχος κώδικας. Διορθώσαμε το σφάλμα στο Handly και ετοιμάσαμε μια παρόμοια ενημέρωση κώδικα για το JDT, το οποίο ελήφθη με ευγνωμοσύνη. Αυτό είναι μόνο ένα παράδειγμα όπου η εισαγωγή του Handly σε υπάρχουσες υλοποιήσεις μοντέλων θα μπορούσε να είναι δυνητικά χρήσιμη, επειδή σε αυτήν την περίπτωση ένα τέτοιο σφάλμα θα μπορούσε να διορθωθεί σε ένα μόνο μέρος.
Για να καταστεί τεχνικά εφικτή η εφαρμογή του Handly σε υπάρχουσες υλοποιήσεις μοντέλων, η βιβλιοθήκη πρέπει να έχει σημαντική ευελιξία. Το κύριο πρόβλημα είναι η διατήρηση της συμβατότητας προς τα πίσω στο μοντέλο API. Αυτό το πρόβλημα λύθηκε σε
Η ευελιξία έχει και άλλες πτυχές. Για παράδειγμα, το Handly δεν επιβάλλει σχεδόν κανέναν περιορισμό στη δομή του μοντέλου και μπορεί να χρησιμοποιηθεί για τη μοντελοποίηση γλωσσών γενικής χρήσης και ειδικών για τον τομέα. Κατά την κατασκευή της δομής του αρχείου προέλευσης, ο Handly δεν ορίζει κάποια συγκεκριμένη μορφή αναπαράστασης AST και, κατ' αρχήν, δεν απαιτεί καν την παρουσία του ίδιου του AST, διασφαλίζοντας έτσι τη συμβατότητα με σχεδόν οποιονδήποτε μηχανισμό ανάλυσης. Τέλος, το Handly υποστηρίζει την πλήρη ενσωμάτωση με τον χώρο εργασίας Eclipse, αλλά μπορεί επίσης να εργαστεί απευθείας με συστήματα αρχείων χάρη στην ενσωμάτωσή του με
Τρέχουσα έκδοση
Όπως σημειώθηκε παραπάνω, ένα από αυτά τα προϊόντα είναι το 1C:Enterprise Development Tools, όπου το Handly χρησιμοποιείται από την αρχή για να μοντελοποιήσει στοιχεία της δομής υψηλού επιπέδου τέτοιων γλωσσών 1C:Enterprise, όπως η ενσωματωμένη γλώσσα προγραμματισμού και η γλώσσα ερωτημάτων . Ένα άλλο προϊόν είναι λιγότερο γνωστό στο ευρύ κοινό. Αυτό
Ελπίζουμε ότι μετά την κυκλοφορία της έκδοσης 1.0 με εγγύηση σταθερότητας API και την έξοδο του έργου από την κατάσταση επώασης, η Handly θα έχει νέους χρήστες. Στο μεταξύ, το έργο συνεχίζει να δοκιμάζει και να βελτιώνει περαιτέρω το API, κυκλοφορώντας δύο «κυριότερες» εκδόσεις ετησίως - τον Ιούνιο (την ίδια ημερομηνία με την ταυτόχρονη κυκλοφορία του Eclipse) και τον Δεκέμβριο, παρέχοντας ένα προβλέψιμο χρονοδιάγραμμα στο οποίο μπορούν να βασιστούν οι χρήστες. Μπορούμε επίσης να προσθέσουμε ότι το «ποσοστό σφαλμάτων» του έργου παραμένει σε σταθερά χαμηλό επίπεδο και η Handly εργάζεται αξιόπιστα στα προϊόντα των πρώτων χρηστών από τις πρώτες κιόλας εκδόσεις. Για να εξερευνήσετε περαιτέρω το Eclipse Handly, μπορείτε να χρησιμοποιήσετε
Πηγή: www.habr.com