Χωρίς αποδείξεις, δεν έγινε.
Ο αναλυτής συνήθως «τρώει» τα αποδεικτικά στοιχεία
Κάθε οργανισμός λογισμικού βασίζεται ήδη σε αναλυτές. Οι μεταγλωττιστές αναλύουν. Οι ελεγκτές κώδικα αναλύουν. Οι επεξεργαστές κειμένου αναλύουν. Η στατική ανάλυση αναλύει. Οι μορφοποιητές αναλύουν. Τα συστήματα δόμησης αναλύουν αρχεία διαμόρφωσης, δηλώσεις εξαρτήσεων, αρχεία κλειδώματος και δέντρα πηγαίου κώδικα, μέχρι ο χώρος να μυρίζει ελαφρώς κανονικές εκφράσεις και τύψεις.
Ωστόσο, οι περισσότερες ομάδες αντιμετωπίζουν την ανάλυση ως ένα αναλώσιμο ενδιάμεσο βήμα. Μια διαδικασία διαβάζει ένα αρχείο, κατασκευάζει ένα AST ή ένα δέντρο ανάλυσης στη μνήμη, το χρησιμοποιεί και μετά το αφήνει να εξαφανιστεί. Αν κάποιος ρωτήσει αργότερα αν ένα δυαδικό αρχείο κατασκευάστηκε από εγκεκριμένο πηγαίο κώδικα, αν άλλαξε μια εξάρτηση, αν μια έκδοση περιλάμβανε μια συγκεκριμένη συνάρτηση ή αν μια ανασκόπηση είδε το ίδιο δέντρο με το CI, η απάντηση συχνά γίνεται κοινωνική. Εμπιστεύσου τη δόμηση. Εμπιστεύσου τα αρχεία καταγραφής. Εμπιστεύσου το εργαλείο. Εμπιστεύσου το άτομο που είναι τώρα σε διακοπές.
Αυτό δεν αρκεί για σοβαρές αλυσίδες εφοδιασμού. Ο πηγαίος κώδικας δεν είναι μόνο κείμενο. Είναι αποδεικτικό στοιχείο. Το σχήμα αυτού του κειμένου έχει σημασία. Οι σχέσεις μέσα σε αυτό έχουν σημασία. Ο τρόπος που αναλύθηκε έχει σημασία. Αν αυτή η δομή υπάρχει μόνο μέσα σε μια διαδικασία που εξαφανίστηκε, ο οργανισμός πέταξε το πράγμα που θα χρειαστεί αργότερα για να αποδείξει κάτι.
Το Reed υπάρχει για αυτό το κενό. Η σελίδα του Reed το παρουσιάζει ως έναν αναλυτή ανοιχτού κώδικα και επίπεδο προέλευσης: ανάλυση GLL, δομή SPPF, ταυτότητα δέντρου Merkle, ρίζες πιστοποιητικών BLAKE3, ερωτήματα RQL, χρήση CLI, ενσωμάτωση επεξεργαστή, C ABI, WASM και επιφάνειες Python. Το ζητούμενο δεν είναι απλώς ότι το Reed αναλύει. Το ζητούμενο είναι ότι η ανάλυση αφήνει μια φορητή απόδειξη.
Αυτή είναι μια μικρή αλλαγή στη διατύπωση και μια μεγάλη αλλαγή στη στάση. Ένας αναλυτής που επιστρέφει ένα χρήσιμο δέντρο είναι ένα εργαλείο προγραμματιστή. Ένας αναλυτής που επιστρέφει ένα χρήσιμο δέντρο με σταθερή ρίζα γίνεται υποδομή δόμησης. Τώρα το CI μπορεί να δημοσιεύσει τη ρίζα. Τα εργαλεία SBOM μπορούν να την καταγράψουν. Μια διαδικασία έκδοσης μπορεί να την καρφιτσώσει. Ένας αναθεωρητής μπορεί να τη συγκρίνει. Ένας ελεγκτής μπορεί να κάνει μια ερώτηση χωρίς να απαιτεί από όλους να ξαναχτίσουν το σύμπαν κάτω από θεατρικούς προβολείς.
Η προέλευση της δόμησης ξεκινά πριν από το δυαδικό αρχείο
Η προέλευση της δόμησης συζητείται συχνά στο τέλος της διαδικασίας: υπογεγραμμένο αντικείμενο, SBOM, σημειώσεις έκδοσης, έγκριση ανάπτυξης, ίσως ένας πίνακας ελέγχου που λέει συμμορφούμενο με την αυτοπεποίθηση ενός ανθρώπου που πουλά μόνωση στέγης. Αυτά τα κομμάτια έχουν σημασία, αλλά έρχονται αργά. Μέχρι τότε, ο πηγαίος κώδικας έχει ήδη περάσει από ανάλυση, μεταγλώττιση, μετασχηματισμό, ομαδοποίηση και συσκευασία.
Αν η δομή του πηγαίου κώδικα δεν καταγράφηκε ποτέ, η απόδειξη έκδοσης έχει μια τρύπα στη μέση. Ξέρετε ότι το αντικείμενο υπογράφηκε. Μπορεί να γνωρίζετε το κατακερματισμό του commit. Αλλά μπορείτε να δείξετε το σχήμα του αναλυμένου πηγαίου κώδικα που είδε η ανάλυση; Μπορείτε να αποδείξετε ότι ένα παραγόμενο δυαδικό αρχείο αντιστοιχεί σε ένα δέντρο ανάλυσης με την ίδια ρίζα; Μπορεί ένας καταναλωτής κατάντη να επαληθεύσει ότι μια ενσωματωμένη εξάρτηση δεν άλλαξε σιωπηλά με το ίδιο όνομα αρχείου;
Η χρήσιμη υπόσχεση του Reed είναι να τοποθετήσει ένα ελέγξιμο αντικείμενο στο επίπεδο ανάλυσης. Μια ρίζα BLAKE3 δεν είναι ποιητική διαφήμιση. Είναι μια συμπαγής λαβή για μια αναλυμένη δομή. Το πιστοποιητικό δεν είναι μια ωραία εξήγηση. Είναι κάτι που άλλα εργαλεία μπορούν να μεταφέρουν. Αυτό καθιστά την ανάλυση μέρος της προέλευσης αντί για ένα θολό βήμα μεταξύ git και δυαδικού αρχείου.
Αυτό έχει τη μεγαλύτερη σημασία όταν φτάνουν οι βαρετές ερωτήσεις. Κατασκευάστηκε αυτό το δυαδικό αρχείο από εγκεκριμένο πηγαίο κώδικα; Μοιράστηκαν ο αναθεωρημένος και ο αναπτυγμένος κώδικας την ίδια αναλυμένη δομή; Άλλαξε μια εξάρτηση μετά την έγκριση; Ποιο αρχείο εισήγαγε τον κόμβο που αργότερα έγινε ζήτημα πολιτικής; Αυτές οι ερωτήσεις δεν είναι εξωτικές. Είναι τα βασικά ερωτήματα της λογοδοσίας λογισμικού. Απλώς συνεχίζουμε να προσποιούμαστε ότι είναι σπάνιες επειδή τα εργαλεία τις καθιστούν ενοχλητικές.
Μία επεξεργασία δεν πρέπει να γίνεται τοίχος
Η αναθεώρηση του κώδικα καταρρέει όταν μικρές αλλαγές παράγουν μεγάλα δυσανάγνωστα diffs. Όλοι γνωρίζουμε αυτό το συναίσθημα. Μια αλλαγή μιας γραμμής προκαλεί ανακατάταξη στο παραγόμενο αποτέλεσμα. Ένας μορφοποιητής αλλάζει το περιβάλλον κείμενο. Ένα εργαλείο ανάλυσης ή συντακτικής επεξεργασίας αναφέρει το μισό δέντρο ως νέο. Η αναθεώρηση γίνεται τοίχος, και οι άνθρωποι κάνουν ό,τι κάνουν οι άνθρωποι με τοίχους θορύβου: ρίχνουν μια ματιά, αναστενάζουν και εγκρίνουν περισσότερα από όσα θα έπρεπε.
Η στάση του Reed με διευθύνσεις βάσει περιεχομένου δίνει καλύτερο στόχο. Αν οι αμετάβλητοι κόμβοι διατηρούν την ταυτότητά τους, μια μικρή επεξεργασία μπορεί να παραμείνει μικρή επεξεργασία στη δομή. Το περιβάλλον δέντρο δεν χρειάζεται να γίνει ύποπτο μόνο και μόνο επειδή μετακινήθηκε ένας κλάδος. Αυτό δεν είναι μόνο θέμα απόδοσης. Είναι θέμα αναθεώρησης. Σημαίνει ότι ένα άτομο μπορεί να επικεντρωθεί σε αυτό που άλλαξε αντί να διαπραγματεύεται με ένα εργαλείο που θεωρεί ότι όλα είναι καινούργια κάθε Τρίτη.
Εδώ είναι που η συντακτική ανάλυση γίνεται λειτουργική. Ένας κανονικός αναλυτής μπορεί να είναι σωστός και παρόλα αυτά λειτουργικά αδέξιος. Αν παράγει μια δομή και πετάει τη ρίζα, τα επόμενα εργαλεία πρέπει να αναλύσουν ξανά, να εμπιστευτούν ξανά ή να προετοιμάσουν ξανά το σύνολο. Αν καταγράφει μια σταθερή ρίζα πιστοποιητικού, το σύστημα αποκτά ένα μικρότερο αντικείμενο για σύγκριση. Τα μικρότερα αντικείμενα είναι πιο εύκολο να αυτοματοποιηθούν. Η ευκολότερη αυτοματοποίηση σημαίνει λιγότερες διαδικασίες. Οι λιγότερες διαδικασίες σημαίνουν λιγότερες εγκρίσεις το απόγευμα της Παρασκευής με το ένα μάτι στο τρένο για το σπίτι.
Αυτό δεν είναι εντυπωσιακό. Είναι πολύ χρήσιμο. Η βιομηχανία συχνά προσπαθεί να λύσει την εμπιστοσύνη με πίνακες ελέγχου, όταν θα έπρεπε πρώτα να κάνει το υποκείμενο αντικείμενο αρκετά σταθερό για σύγκριση.
Οι ιδιαιτερότητες της γλώσσας είναι εκεί που οι αναλυτές μαθαίνουν ταπεινότητα
Η συντακτική ανάλυση φαίνεται καθαρή στα διαγράμματα. Μπαίνουν τα tokens. Βγαίνουν τα δέντρα. Μετά έρχεται μια πραγματική γλώσσα και φέρνει εσοχές, raw strings, ένθετα σχόλια, heredocs, nowdocs, regex literals που μοιάζουν με διαίρεση, παρεμβολή, shell quoting, ακραίες περιπτώσεις XML και μορφές διαμόρφωσης που προφανώς σχεδιάστηκαν κατά τη διάρκεια μιας διαφωνίας.
Το υλικό του σαρωτή του Reed είναι ενδιαφέρον επειδή αντιμετωπίζει αυτές τις ιδιαιτερότητες ως ρητές μηχανικές ανησυχίες. Η εσοχή παρακολουθείται. Υπάρχουν περιπτώσεις heredoc και nowdoc. Τα ένθετα μπλοκ σχολίων μοντελοποιούνται. Το regex έναντι της διαίρεσης σε JavaScript και TypeScript εξαρτάται από το πλαίσιο του προηγούμενου token. Τα raw strings και η παρεμβολή έχουν τη δική τους διαχείριση. Αυτό είναι ακριβώς το επίπεδο όπου η προσποίηση γίνεται ακριβή.
Ένα σύστημα τεχνητής νοημοσύνης που εξαρτάται από την κατανόηση κώδικα δεν μπορεί να αντιμετωπίζει τη συντακτική ανάλυση ως άσκηση διάθεσης. Ένας σαρωτής ασφαλείας δεν μπορεί να χάσει ένα μπλοκ επειδή η γλώσσα χρησιμοποίησε μια περίεργη μορφή συμβολοσειράς. Ένα εργαλείο εξαγωγής τεκμηρίωσης δεν μπορεί να καταπιεί ήσυχα ένα heredoc και να θεωρήσει τη δουλειά τελειωμένη. Ένα εργαλείο αναζήτησης κώδικα δεν μπορεί να συμπεριφέρεται διαφορετικά στον επεξεργαστή, στο CI και σε ένα σενάριο Python επειδή κάθε ενσωμάτωση χρησιμοποίησε διαφορετικό αναλυτή με ελαφρώς διαφορετικές ερμηνείες.
Οι ρητοί σαρωτές δεν έχουν να κάνουν μόνο με την ορθότητα. Έχουν να κάνουν με το να γίνεται ο κανόνας αρκετά ορατός ώστε να ελέγχεται. Αν ένας σαρωτής ξέρει γιατί μια κάθετος είναι regex και όχι διαίρεση, αυτό το γεγονός μπορεί να δοκιμαστεί. Αν η στοίχιση δημιουργεί διακριτικά INDENT και DEDENT, αυτή η συμπεριφορά μπορεί να αιτιολογηθεί. Αν τα ένθετα σχόλια υποστηρίζονται σε αυθαίρετο βάθος, υπάρχει κανόνας αντί για ένα ανασήκωμα των ώμων. Το ανασήκωμα των ώμων δεν είναι στρατηγική αναλυτή, αν και πολλές βάσεις κώδικα το έχουν δοκιμάσει.
Μία μηχανή χρειάζεται πολλές πόρτες
Η υποδομή των αναλυτών γίνεται περίεργη όταν κάθε διεπαφή αποκτά τη δική της εκδοχή. Το CLI έχει μία ερμηνεία. Ο επεξεργαστής έχει άλλη. Ένα σενάριο CI καλεί κάτι άλλο. Μια ροή εργασίας Python καλεί ένα δυαδικό αρχείο. Ένα εργαλείο περιηγητή χρησιμοποιεί ξεχωριστή έκδοση WASM. Μετά κάποιος αναρωτιέται γιατί τα διαγνωστικά διαφέρουν μεταξύ τοπικής ανάπτυξης και γραμμής παραγωγής. Η απάντηση είναι συνήθως ένα κοινό έγγραφο που δεν ξέρει κανείς ποιος το συντηρεί.
Η σελίδα του Reed παρουσιάζει ένα πιο συνεκτικό μοντέλο επιφανειών: μια κεντρική μηχανή ανάλυσης, ένα CLI για εργασίες ανάλυσης, ερωτημάτων και πιστοποιητικών, ενσωμάτωση Language Server Protocol για διαγνωστικά και πλοήγηση, σταθερά δεσμεύσεις C για μη-Rust περιβάλλοντα, WASM και Python. Η αξία δεν είναι ότι κάθε επιφάνεια υπάρχει για χάρη της ίδιας. Η αξία είναι ότι μπορούν να επικοινωνούν μέσω του ίδιου συμβολαίου αναλυτή.
Αυτό το συμβόλαιο είναι που κάνει τον Reed να ταιριάζει με την υπόλοιπη στοίβα. Το Spindle μπορεί να διαχειριστεί τη γνώση μόνο αν τα άτομα της πηγής είναι αρκετά σταθερά για να τα εμπιστευτεί κανείς. Το AION και το Trace μπορούν να μεταφέρουν αποδεικτικά στοιχεία μόνο αν τα ανάντη αντικείμενα έχουν ταυτότητες. Το Ledger μπορεί να καταγράψει το γεγονός, αλλά το γεγονός είναι ισχυρότερο όταν δείχνει σε μια ρίζα ανάλυσης αντί σε μια ασαφή διαδρομή αρχείου. Το Fabric μπορεί να δείξει μια απάντηση που βασίζεται στην πηγή, αλλά το «βασίζεται στην πηγή» είναι λιγότερο εντυπωσιακό όταν το δέντρο της πηγής αλλάζει μορφή ανάλογα με το ποιο εργαλείο το κοίταξε.
Ο Reed δεν αντικαθιστά αυτά τα επίπεδα. Τους δίνει ένα καλύτερο αντικείμενο. Αυτός είναι ο σωστός καταμερισμός εργασίας. Τα εργαλεία γίνονται αναξιόπιστα όταν προσπαθούν να είναι ολόκληρος ο πολιτισμός. Ο Reed αναλύει, κατακερματίζει, πιστοποιεί και εκθέτει επιφάνειες. Αυτό είναι αρκετό.
Τα νούμερα επιδόσεων είναι χρήσιμα, όχι η πλοκή
Η σελίδα του Reed περιλαμβάνει συγκεκριμένες κατηγορίες συγκριτικής αξιολόγησης: δομική σάρωση SIMD στην περιοχή πολλών gigabyte ανά δευτερόλεπτο, ανάλυση SLR με πίνακες για μορφές JSON, TOML, XML και Dockerfile, και πιο αργή ανάλυση GLL για Rust με πλήρη υποστήριξη CFG και διφορούμενων περιπτώσεων. Αυτά τα νούμερα είναι χρήσιμα επειδή θέτουν προσδοκίες. Μια δομική σάρωση δεν είναι η ίδια δουλειά με έναν αναλυτή γλώσσας που υποστηρίζει διφορούμενες περιπτώσεις. Αν κάποιος τα συγκρίνει σαν να είναι το ίδιο πράγμα, είτε έχει μπερδευτεί είτε πουλάει κάτι. Μερικές φορές και τα δύο.
Η ισχυρότερη ιστορία δεν είναι ένας μοναδικός ηρωικός αριθμός. Είναι το σχήμα της δουλειάς. Χρησιμοποιήστε γρήγορες δομικές διαδρομές όπου η μορφή το επιτρέπει. Χρησιμοποιήστε βαρύτερη ανάλυση όπου η γλώσσα το απαιτεί. Κρατήστε τη ρίζα του πιστοποιητικού. Κάντε το αποτέλεσμα υποβλητικό σε ερωτήματα. Αφήστε το CI και τα εργαλεία ελέγχου να μεταφέρουν ένα συμπαγές γεγονός αντί για μια ιστορία γύρω από τη φωτιά.
Αυτή είναι επίσης η διαφορά μεταξύ θεάτρου συγκριτικής αξιολόγησης και μηχανικής. Ένα σημείο αναφοράς πρέπει να βοηθά στην επιλογή και τη ρύθμιση του εργαλείου. Δεν πρέπει να γίνεται η ταυτότητα του εργαλείου. Ο Reed είναι ενδιαφέρων επειδή η στάση του για τα αποδεικτικά στοιχεία επιβιώνει ακόμα και όταν αλλάζει ο φόρτος εργασίας. Το JSON και η Rust δεν χρειάζονται την ίδια στρατηγική ανάλυσης. Χρειάζονται όμως την ίδια σοβαρότητα για τις αποδείξεις.
Πού ταιριάζει ο Reed
Ο Reed έρχεται πριν από την ευφυΐα κώδικα, πριν από τα αποδεικτικά στοιχεία κατασκευής, πριν από την τεχνητή νοημοσύνη που βασίζεται στην πηγή για τον κώδικα, και πριν από κάθε έλεγχο που θέλει να κάνει ερωτήσεις για το τι άλλαξε. Βρίσκεται στο σημείο όπου το κείμενο γίνεται δομή. Αυτό το σημείο είναι πιο σημαντικό από όσο φαίνεται, επειδή κάθε μεταγενέστερος ισχυρισμός για τον κώδικα εξαρτάται από αυτό.
Για τις ομάδες μηχανικής, η άμεση αξία είναι πρακτική. Κάνε parse μία φορά με ένα γνωστό συμβόλαιο. Ρώτα τη δομή αντί για σούπα από grep. Δημοσίευσε τα roots στο CI. Πάρε τα πιστοποιητικά στα στοιχεία της έκδοσης. Κράτα τον editor, το CLI και τις επιφάνειες αυτοματισμού ευθυγραμμισμένα. Όταν ένα review ρωτάει τι άλλαξε, απάντησε με μια απόδειξη που κατανοεί τη δομή, όχι με ένα στιγμιότυπο οθόνης ή μια γεμάτη αυτοπεποίθηση παράγραφο σε ένα ticket.
Για τα συστήματα τεχνητής νοημοσύνης, το Reed είναι μια ασπίδα απέναντι σε μια πολύ σύγχρονη μορφή ανοησίας: την κατανόηση κώδικα που δεν μπορεί να αναπαράγει το πώς κατάλαβε τον κώδικα. Αν ένας βοηθός τεχνητής νοημοσύνης εξηγεί μια συνάρτηση, προτείνει ένα refactor ή πιστοποιεί μια ιδιότητα πολιτικής, η δομή της πηγής πίσω από αυτή την απάντηση θα πρέπει να είναι αρκετά σταθερή για να επιθεωρηθεί. Διαφορετικά, ο βοηθός απλώς διαβάζει τα φύλλα του τσαγιού με χρωματισμό σύνταξης.
Το μάθημα
Το μάθημα του Reed είναι απλό: το parsing δεν είναι ένα πρόχειρο προοίμιο. Είναι μέρος της αλυσίδας αποδεικτικών στοιχείων. Αν ο parser πετάξει τη χρήσιμη δομή, τα κατάντη συστήματα κληρονομούν ένα πρόβλημα εμπιστοσύνης και μετά ξοδεύουν μήνες για να το καλύψουν.
Ένα καλό επίπεδο parsing θα πρέπει να αφήνει μια απόδειξη. Θα πρέπει να διαχειρίζεται τις ιδιαιτερότητες της γλώσσας ρητά. Θα πρέπει να διατηρεί σταθερή την ταυτότητα σε μικρές επεξεργασίες. Θα πρέπει να εκθέτει το ίδιο νόημα μέσω CLI, editor, ABI, WASM και scripts. Θα πρέπει να επιτρέπει σε μια ροή εργασίας build, ελέγχου ή τεχνητής νοημοσύνης να δείχνει σε κάτι πιο συγκεκριμένο από το εμπιστευτείτε μας, το δέντρο ήταν εντάξει όταν το κοιτάξαμε.
Αυτό είναι το χρήσιμο σχήμα του Reed: όχι γοητεία parser, όχι τουρισμός σύνταξης, όχι άλλο ένα εργαλείο που παράγει ένα σωρό JSON και το αποκαλεί διορατικότητα. Ένας πυρήνας parser που μετατρέπει την πηγή σε ελέγξιμη δομή, με roots και πιστοποιητικά που μπορούν να μεταφέρουν άλλα συστήματα. Στεγνή δουλειά, ναι. Η σημαντική δουλειά συνήθως είναι. Το γοητευτικό μέρος έρχεται αργότερα, όταν κάτι χαλάσει και μπορείς πραγματικά να αποδείξεις πού.