Τι άλλαξε τον Αύγουστο του 2026
Πριν από αυτή τη δουλειά, είχα κάνει πολλή χειροκίνητη αντίστροφη μηχανική. Εξέταζα μια συνάρτηση μέχρι να έχω μια εξήγηση και έπειτα δοκίμαζα αυτή την εξήγηση σε σχέση με το πρόγραμμα. Για να προχωρήσω, έπρεπε να αφιερώσω περισσότερο δικό μου χρόνο στην επόμενη συνάρτηση. Έπρεπε επίσης να κρατάω μια ολοένα μεγαλύτερη συνολική εικόνα στο μυαλό μου.
Το μεγαλύτερο μέρος της δουλειάς μου στην αντίστροφη μηχανική αφορά παιχνίδια. Τα ανακατασκευάζω ώστε να μπορεί να γίνει κατανοητή η συμπεριφορά τους και τελικά να μεταφερθεί σε άλλη πλατφόρμα ή σε μια τροποποίηση. Αυτή είναι η εμπειρία πίσω από το άρθρο. Η μέθοδος μπορεί να είναι χρήσιμη και αλλού, αλλά κάθε πεδίο πρέπει να προσδιορίσει τι μπορεί να ελέγξει με βάση μια αξιόπιστη αναφορά.
Τον Αύγουστο του 2026 άρχισα να εξερευνώ σοβαρά την αντίστροφη μηχανική με βοηθούς προγραμματισμού. Ήθελα να δω πόσο μακριά θα μπορούσε να φτάσει ένας βοηθός με πρόσβαση στο πρόγραμμα και στα συνηθισμένα εργαλεία ανάπτυξης. Η ανακατασκευή του Touhou μού έδωσε ένα σημαντικό έργο για να το διαπιστώσω.
Η αρχική πρόοδος ήταν εντυπωσιακή. Μια διερεύνηση μπορούσε να συνεχίζεται χωρίς να επιλέγω εγώ κάθε επιμέρους βήμα. Μια αποτυχημένη σύγκριση μπορούσε να οδηγήσει τον βοηθό σε μια άλλη συνάρτηση που καλούσε την υπό εξέταση συνάρτηση. Μπορούσε να γράψει ένα μικρό διαγνωστικό πρόγραμμα και να χρησιμοποιήσει το αποτέλεσμα για να αποφασίσει τι θα δοκιμάσει στη συνέχεια. Αυτή η ελευθερία έκανε διαφορά: μπορούσα να αφιερώσω περισσότερη προσοχή στην κατεύθυνση του έργου και στο αν οι έλεγχοι ήταν αξιόπιστοι.
Ο ρυθμός ήταν αυτός που πρώτα τράβηξε την προσοχή μου. Έπειτα άρχισα να αναρωτιέμαι τι θα διατηρούνταν πέρα από το τρέχον έργο. Θα ωφελούνταν το επόμενο παιχνίδι από όλα όσα είχαμε μόλις μάθει;
TH08: χτίζοντας πάνω στην ανθρώπινη δουλειά
Το TH08, Imperishable Night, ξεκίνησε ως συνέχεια της ανακατασκευής του GensokyoClub. Ο δημόσιος πηγαίος κώδικάς τους μού έδωσε μια σημαντική βάση. Συνοδευόταν από γνώση για τη δημιουργία του προγράμματος και από ένα ιστορικό συνεισφορών που διατήρησα στη συνέχεια του έργου.
Το εισαγμένο ιστορικό τελειώνει στο δημόσιο σημείο καταγραφής προόδου της 10ης Αυγούστου. Η δική μου ανεξάρτητη συνέχεια ξεκίνησε στις 13 Αυγούστου. Μέχρι τις 19 Αυγούστου, το μητρώο κατέγραφε πηγαίο κώδικα για όλες τις 1,107 αναγνωρισμένες συναρτήσεις του παιχνιδιού.
Μια λειτουργική μεταφορά της ανακατασκευής στο Linux καταχωρίστηκε σε commit στις 24 Αυγούστου, περίπου έντεκα ημέρες μετά την έναρξη της συνέχειας. Ακολούθησε μια έκδοση Web. Η εγγενής έκδοση Linux 64-bit κυκλοφόρησε στις 30 Αυγούστου.
Αυτό που μου έκανε εντύπωση ήταν ότι η δουλειά είχε φτάσει σε ένα πρόγραμμα που μπορούσε ο κόσμος να εκτελέσει. Για να φτάσουμε εκεί, έπρεπε να ακολουθήσουμε προβλήματα πέρα από μια μεμονωμένη συνάρτηση. Ακόμη και όταν δύο συναρτήσεις φαίνονταν σωστές μεμονωμένα, μπορούσαν κατά λάθος να χρησιμοποιούν ξεχωριστά αντίγραφα κατάστασης που θα έπρεπε να είναι κοινή.
Αυτό έκανε τους ελέγχους αναφοράς κεντρικό μέρος της δουλειάς. Τους αποκαλώ αναφορές ελέγχου (oracle). Μια σύγκριση κώδικα μπορεί να μας πει αν μια ανακατασκευασμένη συνάρτηση αναπαράγει τις αρχικές εντολές. Ένας έλεγχος κατά την εκτέλεση μπορεί να μας πει αν μια διαδρομή που δοκιμάστηκε φτάνει στην αναμενόμενη κατάσταση. Ο βοηθός προτείνει μια εξήγηση και τη δοκιμάζει· μια απόκλιση του δίνει κάτι συγκεκριμένο να διερευνήσει.
Ακριβής ταύτιση με λάθος σταθερά
Η αναφορά ελέγχου είναι λογισμικό που έγραψε κάποιος. Το TH08 μού θύμισε ξεκάθαρα πόσα μπορεί να εξαρτώνται από αυτό το λογισμικό.
Τον Σεπτέμβριο, ένα σφάλμα που αναφέρθηκε από μια μεταγενέστερη μεταφορά στο Switch μάς οδήγησε στην αυτόματη συλλογή αντικειμένων. Ο ανακατασκευασμένος πηγαίος κώδικας έλεγχε την ισχύ του παίκτη σε σχέση με το 0.0. Το πρωτότυπο χρησιμοποιούσε το 128.0, το όριο μέγιστης ισχύος.
Η ισχύς υπό κανονικές συνθήκες είναι μη αρνητική, οπότε ο έλεγχος ισχύος της ανακατασκευής ουσιαστικά ικανοποιούνταν πάντα. Πάνω από τη γραμμή συλλογής, το παιχνίδι μπορούσε να προσελκύει αντικείμενα χωρίς να απαιτεί μέγιστη ισχύ. Οι άλλες εξαιρέσεις στη συνθήκη ήταν σωστές. Αυτή η μία σταθερά άλλαζε τη συμπεριφορά.
Κι όμως, η συνάρτηση είχε ήδη περάσει την ακριβή σύγκριση.
Μια επαναδημιουργία του προγράμματος μπορεί να τοποθετήσει μια σταθερά σε διαφορετική διεύθυνση. Το εργαλείο σύγκρισης το λάμβανε υπόψη προσαρμόζοντας τις διευθύνσεις στις μεταγλωττισμένες εντολές πριν τις συγκρίνει με τις αρχικές. Όμως δεν έλεγχε ποτέ την τιμή κινητής υποδιαστολής που ήταν αποθηκευμένη στη διεύθυνση της αναφοράς.
Αυτό άφηνε ένα κενό στον έλεγχο. Μπορούσε να στρέψει την ανακατασκευασμένη εντολή στο 128.0 του πρωτοτύπου, ενώ ο πηγαίος κώδικας εξακολουθούσε να γράφει 0.0. Τα bytes των εντολών ταυτίζονταν. Ο πηγαίος κώδικας σήμαινε κάτι διαφορετικό.
Η διόρθωση της 2ας Σεπτεμβρίου διόρθωσε τον πηγαίο κώδικα και έκανε τη σύγκριση να ελέγχει τα πραγματικά bytes της σταθεράς στην οποία γινόταν η αναφορά. Ένας ευρύτερος έλεγχος εξέτασε στη συνέχεια 1,548 αναφορές σε κυριολεκτικές τιμές κινητής υποδιαστολής. Εντόπισε άλλες δώδεκα λανθασμένες αναφορές σε πέντε συναρτήσεις που είχαν γίνει αποδεκτές.
Η σύγκριση ελέγχει πλέον κάθε τέτοια κυριολεκτική τιμή κινητής υποδιαστολής. Οι δοκιμές της περιλαμβάνουν σκόπιμα λανθασμένες τιμές, ώστε να διασφαλίζεται ότι απορρίπτονται. Έπρεπε επίσης να επανεξετάσουμε αποτελέσματα που είχαν περάσει τον πιο αδύναμο έλεγχο.
Και η αναφορά ελέγχου χρειαζόταν ανακατασκευή. Η επιδιόρθωσή της ήταν μέρος της επιδιόρθωσης του παιχνιδιού.
Αυτό έχει σημασία όταν η ομάδα είναι κυρίως ένα άτομο που δουλεύει με βοηθούς. Δεν μπορώ να εξετάσω προσωπικά κάθε γραμμή που παράγουν, οπότε μεγάλο μέρος της εμπιστοσύνης μου στηρίζεται στους ελέγχους τους. Ένα τυφλό σημείο σε μια κοινή αναφορά ελέγχου μπορεί να επηρεάσει πολλές διερευνήσεις πριν το προσέξω. Πρέπει να καταλαβαίνω τι επαληθεύει πραγματικά ο ελεγκτής και να τον δοκιμάζω με περιπτώσεις που θα έπρεπε να αποτυγχάνουν.
Καθώς συνεχιζόταν η δουλειά, αυτοί οι έλεγχοι έγιναν μέρος του αποθετηρίου. Το ίδιο συνέβη με τους λόγους των αλλαγών στον πηγαίο κώδικα και με τις σημειώσεις που επέτρεπαν σε μια μεταγενέστερη συνεδρία να συνεχίσει από εκεί όπου είχε σταματήσει μια προηγούμενη. Το αποθετήριο γινόταν η μνήμη εργασίας του έργου.
Μια επιτυχημένη δέσμη εργασιών μάς έδινε και ανακτημένο κώδικα και καλύτερο περιβάλλον για την επόμενη δέσμη.
Δύο διαφορετικές αντιλήψεις για την ανακατασκευή
Το δημόσιο README του GensokyoClub εκφράζει ρητά τη διαφωνία του με αυτό το είδος δουλειάς. Η ανακοίνωση αναφέρει ότι η περαιτέρω ανάπτυξη θα γίνεται ιδιωτικά μέχρι την ολοκλήρωση. Ένα απόσπασμα γράφει:
Η άνοδος απατεώνων (απομεταγλωττίσεις και μεταφορές σε άλλες πλατφόρμες με τεχνητή νοημοσύνη) σε αυτόν τον χώρο, που παίρνουν υλικό από τη δουλειά μας, δημιουργεί κακή εικόνα για τις μελλοντικές προσπάθειες απομεταγλώττισης…
Η ανακοίνωση περιγράφει επίσης την ψυχολογική επιβάρυνση των υπευθύνων συντήρησης. Η πολιτική συνεισφορών τους αποκλείει pull requests που έχουν παραχθεί κυρίως με τεχνητή νοημοσύνη. Έχουν αφιερώσει τον ελεύθερο χρόνο τους σε δύσκολη δουλειά και αυτή η δουλειά βοήθησε να γίνει δυνατή η δική μου συνέχεια. Σέβομαι την προσπάθεια πίσω από αυτή. Η διαφωνία που θέλω να συζητήσω αφορά το πώς πρέπει να προχωρά η ανακατασκευή και πώς πρέπει να κρίνεται μια συνεισφορά.
Στη χειροκίνητη ροή εργασίας που γνώριζα, η κατανόηση μιας συνάρτησης και η ανακατασκευή της συνήθως ανατίθενταν στο ίδιο άτομο. Ένα έργο στηριζόταν σε μεγάλο βαθμό στην τεχνογνωσία αυτού του ατόμου. Η εμπιστοσύνη στον συνεισφέροντα είχε σημασία, επειδή τόσο μεγάλο μέρος του συλλογισμού γινόταν όσο εργαζόταν.
Τα υπάρχοντα έργα διατηρούν ήδη γνώση στον πηγαίο κώδικα και στα εργαλεία δημιουργίας τους. Αυτό που άλλαξε για μένα ήταν ότι ένας βοηθός μπορούσε να χρησιμοποιήσει αυτή τη γνώση για να συνεχίσει μόνος του την επόμενη διερεύνηση.
Στη δική μου συνέχεια, εγώ αποφασίζω τον στόχο και το πρότυπο αποδοχής ενός αποτελέσματος. Ο βοηθός έχει μεγάλη ελευθερία να διερευνήσει. Η ανακατασκευή που προτείνει πρέπει στη συνέχεια να αντέξει στους σχετικούς ελέγχους. Θέλω ένας άλλος άνθρωπος να μπορεί να εξετάσει γιατί επιλέξαμε μια υλοποίηση, ακόμη κι αν ο βοηθός έκανε το μεγαλύτερο μέρος της δουλειάς.
Αυτή η μετάβαση μπορεί να είναι δύσκολη. Χρόνια προσεκτικής δουλειάς μπορεί να γίνουν το θεμέλιο για μια συνέχεια που προχωρά πολύ γρηγορότερα. Αυτό εγείρει ουσιαστικά ερωτήματα σχετικά με την αναγνώριση της συνεισφοράς. Αλλάζει επίσης όσα πρέπει να γνωρίζουν οι υπεύθυνοι συντήρησης πριν αποδεχτούν μια συνεισφορά.
Η βιομηχανική αναλογία με βοηθά να το σκεφτώ. Σε μια τέχνη, μεγάλο μέρος της διαδικασίας εξαρτάται από την ικανότητα του ανθρώπου που την εκτελεί. Οι μηχανές αλλάζουν το πού χρειάζεται αυτή η ικανότητα. Κάποιος πρέπει ακόμη να σχεδιάζει τη διαδικασία και να αναγνωρίζει πότε η έξοδός της είναι λανθασμένη. Διαφορετικές κοινότητες μπορούν να επιλέξουν πόσο από αυτή την αλλαγή θέλουν να υιοθετήσουν.
Η δική μου επιλογή είναι να συνεχίσω ανοιχτά, αναγνωρίζοντας την κληρονομημένη δουλειά και διατηρώντας το ιστορικό της. Θέλω η νέα δουλειά να μπορεί να εξεταστεί. Αυτό μας δίνει έναν τρόπο να αναρωτηθούμε πόσο μακριά μπορεί να φτάσει αυτή η προσέγγιση και να μάθουμε από όσα πάνε στραβά στη διαδρομή.
Πηγή: η ανακοίνωση στο README του GensokyoClub, που ελέγχθηκε στις 10 Οκτωβρίου 2026, και η πολιτική συνεισφορών του. Η παράθεση είναι συντομευμένο απόσπασμα. Οι αναφορές συντελεστών και προέλευσης του TH08 καταγράφουν το όριο από το οποίο ξεκινά η συνέχεια.
TH095: η εμπειρία αρχίζει να συσσωρεύεται
Το TH095, Shoot the Bullet, έκανε την αξία αυτής της εμπειρίας πολύ πιο εύκολα ορατή. Το αποθετήριό του ξεκίνησε στις 29 Αυγούστου με μηδέν επιβεβαιωμένες συναρτήσεις του παιχνιδιού στο μητρώο. Έπρεπε ακόμη να μάθουμε το παιχνίδι. Γνωρίζαμε όμως ήδη πολύ περισσότερα για το πώς να ξεκινήσουμε μια ανακατασκευή και πώς να τη συνεχίσουμε.
Μέχρι τις 7 Σεπτεμβρίου, και οι 697 αναγνωρισμένες συναρτήσεις του παιχνιδιού είχαν πηγαίο κώδικα. Μέχρι τις 8 Σεπτεμβρίου, 696 είχαν γίνει αποδεκτές ως ακριβείς συγκρίσεις. Ολόκληρο το πρόγραμμα συνδέθηκε στις 9 Σεπτεμβρίου. Η ανακατασκευή για Windows i386 καταγράφηκε ως λειτουργική για παιχνίδι στις 10 Σεπτεμβρίου, περίπου δώδεκα ημέρες μετά την αρχικοποίηση.
Αυτό το βρήκα πιο συναρπαστικό από την ταχύτητα του πρώτου έργου. Ένας καινούριος στόχος μπορούσε να ωφεληθεί από τη δουλειά που είχε γίνει σε άλλο παιχνίδι. Η εμπειρία ήταν ήδη παρούσα στα εργαλεία και στον τρόπο οργάνωσης του έργου.
Για παράδειγμα, το TH08 μάς είχε μάθει να δίνουμε από νωρίς προσοχή στο συναρμολογημένο πρόγραμμα. Αν αρκετές ανακτημένες συναρτήσεις εξαρτώνται από την ίδια κατάσταση, οι μεμονωμένες συγκρίσεις τους αφήνουν ένα σημαντικό ερώτημα ανοιχτό. Πρέπει να τις δούμε να λειτουργούν μαζί. Αυτό το μάθημα βοήθησε να διαμορφωθεί η προσέγγισή μας για τη δημιουργία ολόκληρου του προγράμματος TH095.
Ένα μάθημα που μένει στο μυαλό μου είναι χρήσιμο όσο βρίσκομαι εκεί. Μόλις γίνει ένας έλεγχος που μπορεί να εκτελέσει μια άλλη συνεδρία, μπορεί να συνεχίσει να βοηθά αφού εγώ προχωρήσω σε κάτι άλλο. Ο επόμενος βοηθός μπορεί να χρησιμοποιήσει το αποτέλεσμα χωρίς να επαναλάβει τη διερεύνηση που οδήγησε σε αυτό.
Το σφάλμα με τις κυριολεκτικές τιμές κινητής υποδιαστολής ανήκει επίσης σε αυτή τη μνήμη. Εξηγεί γιατί ο έλεγχος μιας αναφοράς απαιτεί και έλεγχο των δεδομένων πίσω από αυτή. Η διατήρηση αυτής της διόρθωσης μαζί με τον κώδικα βοηθά τα μεταγενέστερα έργα να μην κληρονομήσουν το τυφλό σημείο του παλιού ελέγχου.
Η μέθοδος γίνεται μέρος του αρχικού υλικού για το επόμενο παιχνίδι. Μπορούμε να αφιερώσουμε περισσότερο από τον κόπο του επόμενου έργου σε ό,τι είναι πραγματικά νέο στον στόχο του.
Το ίδιο όφελος είναι διαθέσιμο σε ανθρώπους που συμμετέχουν αργότερα. Μπορούν να εξετάσουν μια απόφαση και να εκτελέσουν ξανά τον έλεγχό της πριν συνεχίσουν τη δουλειά. Δεν χρειάζεται να ανασυνθέσουν ολόκληρο το ιστορικό του έργου για να μάθουν γιατί ο πηγαίος κώδικας έχει τη μορφή που έχει.
TH04: η ροή εργασίας αντέχει σε μια διαφορετική αρχιτεκτονική
Το TH04, Lotus Land Story, μετέφερε αυτή τη δουλειά στην εποχή του DOS για PC-98. Ο στόχος ήταν πλέον ένα περιβάλλον 16-bit με τέσσερα προγράμματα που συνεργάζονταν. Η κατανόηση της συμπεριφοράς του υλικού του απαιτούσε διαφορετικά στοιχεία από εκείνα των παιχνιδιών Windows. Η υπάρχουσα δουλειά του ReC98 μάς έδωσε και εδώ πολύτιμη γνώση και πηγαίο υλικό.
Η ανακατασκευή για DOS λειτουργεί πλέον. Στις χειροκίνητες δοκιμές μου, έπαιξα ολόκληρες διαδρομές Normal μέχρι το τέλος τους και έλεγξα τις αποθηκεύσεις. Η τρέχουσα δουλειά είναι μια εγγενής μεταφορά σε 64-bit. Η δημιουργία μιας λειτουργικής έκδοσης DOS πρώτα δίνει σε αυτή τη μεταφορά μια αναφορά.
Η αρχιτεκτονική άλλαξε όσα χρειαζόταν να διερευνήσουμε. Άλλαξε επίσης τον μεταγλωττιστή και το περιβάλλον εκτέλεσης με τα οποία ελέγχαμε τη δουλειά μας. Όμως ο βοηθός μπορούσε ακόμη να ακολουθεί ένα ερώτημα μέχρι να φτάσει σε αποτέλεσμα και να αφήνει αυτό το αποτέλεσμα να καθοδηγεί το επόμενο πείραμα.
Ας δούμε τη μετάβαση από το παιχνίδι σε ένα τέλος. Πρέπει να γνωρίζουμε ποια κατάσταση περνά αυτό το όριο και ποιο πρόγραμμα είναι υπεύθυνο γι' αυτή. Αυτό είναι κάτι που μπορούμε να διερευνήσουμε σε σχέση με το προϊόν για DOS. Μόλις υπάρχουν τα στοιχεία και οι έλεγχοι, ένας βοηθός μπορεί να επεξεργαστεί το ερώτημα όπως έκανε σε έναν τίτλο για Windows.
Γι' αυτό το TH04 έχει σημασία για το επιχείρημα. Μια σημαντική αλλαγή πλατφόρμας δεν μας ανάγκασε να ξεκινήσουμε από την αρχή με έναν νέο τρόπο δουλειάς. Η αρχιτεκτονική όριζε το πρόβλημα· η ροή εργασίας εξακολουθούσε να μας δίνει έναν τρόπο να το λύσουμε.
Για τη μεταφορά σε 64-bit, μπορούμε πλέον να εξετάζουμε τη νέα υλοποίηση σε σχέση με τη συμπεριφορά που έχει ήδη ανακτηθεί στο DOS. Η γνώση από την ανακατασκευή δίνει στη μεταφορά μια βάση για να χτιστεί πάνω της.
Κατάσταση του έργου στις 10 Οκτωβρίου 2026: ανακατασκευή για DOS και χειροκίνητες δοκιμές · μεταφορά σε 64-bit. Η μεταφορά παραμένει υπό ανάπτυξη.
Από τον ακριβή κώδικα στον αναγνώσιμο κώδικα
Μόλις μια ανακατασκευή λειτουργεί, θέλω να μπορεί να την καταλάβει και κάποιος άλλος.
Για μένα, η assembly και οι ακατέργαστες μετατοπίσεις μνήμης μπορεί να μοιάζουν με παλιούς φίλους. Καταλαβαίνω ότι αυτός είναι ένας κάπως ασυνήθιστος ορισμός του «αναγνώσιμου». Οι περισσότεροι θα προτιμούσαν να ακολουθούν τη λογική του παιχνιδιού χωρίς να κρατούν στο μυαλό τους τη διάταξη μνήμης του εκτελέσιμου.
Εδώ έρχεται η σημασιολογική ανακατασκευή. Ένα ανακτημένο πεδίο μπορεί ακόμη να είναι γνωστό κυρίως από τη μετατόπισή του. Παρακολουθούμε πώς το χρησιμοποιεί το παιχνίδι μέχρι να μπορούμε να εξηγήσουμε τον ρόλο του. Έπειτα μπορούμε να του δώσουμε ένα ουσιαστικό όνομα και έναν τύπο που ταιριάζει στα στοιχεία. Κρατάμε το σκεπτικό μαζί με τον πηγαίο κώδικα, ώστε ο επόμενος άνθρωπος να μπορεί να δει από πού προήλθε αυτή η ερμηνεία.
Αυτό γίνεται ιδιαίτερα σημαντικό για μια μεταφορά σε άλλη πλατφόρμα. Μια απόλυτη διεύθυνση μου λέει πού βρισκόταν κάτι στο παλιό εκτελέσιμο. Βοηθά ελάχιστα μια υλοποίηση 64-bit να αποφασίσει ποιο αντικείμενο πρέπει να έχει την ευθύνη αυτής της κατάστασης. Για να μεταφέρουμε τη συμπεριφορά με ασφάλεια, πρέπει να ανακτήσουμε τη σχέση πίσω από την παλιά πρόσβαση στη μνήμη.
Η σειρά που χρησιμοποιώ πλέον είναι:
- Ανακτήστε μια ακριβή βάση αναφοράς. Μεταγλωττίστε τα ανακατασκευασμένα μέρη με τον ιστορικό μεταγλωττιστή. Συγκρίνετε τον σχετικό κώδικα και τα δεδομένα με το αρχικό εκτελέσιμο. Καταγράψτε τις διαφορές που δεν έχουν επιλυθεί, ώστε η επόμενη φάση να έχει σαφές σημείο εκκίνησης.
- Δημιουργήστε το πρόγραμμα και παίξτε το στην αρχική πλατφόρμα. Συνδέστε αυτά τα μέρη στο πραγματικό πρόγραμμα χρησιμοποιώντας την αρχική αρχιτεκτονική και τον αρχικό μεταγλωττιστή. Δοκιμάστε σημαντικές διαδρομές του παιχνιδιού. Εδώ μπορούμε να βρούμε προβλήματα κοινής κατάστασης ή αρχικοποίησης που διέφυγαν από μια μεμονωμένη σύγκριση συνάρτησης.
- Ανακατασκευάστε τη σημασιολογία με βάση και τις δύο αναφορές. Πάρτε ένα συνεκτικό μέρος του παιχνιδιού κάθε φορά και προσδιορίστε τι σημαίνει ο ανακτημένος πηγαίος κώδικάς του. Βελτιώστε την αναπαράστασή του, διατηρώντας τις ακριβείς συγκρίσεις και τη λειτουργική ιστορική έκδοση του παιχνιδιού.
- Κάντε τη σύγχρονη μεταφορά σε άλλη πλατφόρμα. Μεταφέρετε την τεκμηριωμένη συμπεριφορά στο νέο περιβάλλον, όπως σε μια εγγενή έκδοση 64-bit. Το ανακατασκευασμένο παιχνίδι της αρχικής πλατφόρμας παραμένει αναφορά για τη σύγκριση της συμπεριφοράς της μεταφοράς.
Η λειτουργική έκδοση του παιχνιδιού από το δεύτερο στάδιο γίνεται μια δεύτερη αναφορά ελέγχου κατά το τρίτο. Η πρώτη αναφορά ελέγχου εξετάζει αν ο αλλαγμένος πηγαίος κώδικάς μας εξακολουθεί να αναπαράγει τον σχετικό αρχικό κώδικα και τα δεδομένα. Η δεύτερη ελέγχει ότι το ανακατασκευασμένο πρόγραμμα εξακολουθεί να δημιουργείται και να συμπεριφέρεται σωστά στις διαδρομές που δοκιμάζουμε.
Εντοπίζουν διαφορετικά λάθη. Μια αλλαγή τύπου μπορεί να αλλάξει τις παραγόμενες εντολές. Μια αλλαγή στην ευθύνη διαχείρισης της κατάστασης μπορεί να αφήσει δύο μέρη του παιχνιδιού να χρησιμοποιούν διαφορετικά αντίγραφά της. Διατηρώντας διαθέσιμους και τους δύο ελέγχους, δίνουμε στον βοηθό μια συγκεκριμένη αστοχία να διερευνήσει πριν προχωρήσει περισσότερο σε μια αναδιάρθρωση.
Ένα όνομα χρειάζεται δικά του στοιχεία. Μια ακριβής σύγκριση δεν μπορεί να μας πει αν ένα πεδίο σημαίνει πράγματι «διάρκεια ατρωσίας». Πρέπει να το προσδιορίσουμε από τον τρόπο με τον οποίο το παιχνίδι το γράφει και το χρησιμοποιεί. Αν η σημασία παραμένει αβέβαιη, ένα ουδέτερο όνομα βοηθά τον επόμενο αναγνώστη περισσότερο από μια εικασία διατυπωμένη με σιγουριά.
Μάθαμε αυτή τη σειρά μέσα από τα έργα. Το TH08 είχε ήδη λειτουργικές μεταφορές σε άλλες πλατφόρμες πριν από ορισμένους μεταγενέστερους ελέγχους του στην ιστορική πλατφόρμα. Αυτό έκανε κάποια ελαττώματα πιο δύσκολα ορατά. Η τρέχουσα ροή εργασίας του Factory βάζει πρώτα τη δημιουργία του προγράμματος στην αρχική πλατφόρμα, ώστε η σημασιολογική εργασία να μπορεί να τη χρησιμοποιεί ως αναφορά πριν αρχίσει η μεταφορά.
Η ακριβής ανακατασκευή μάς δίνει μια αναφορά. Η σημασιολογική ανακατασκευή κάνει την ανακτημένη γνώση αξιοποιήσιμη. Μια μεταφορά σε άλλη πλατφόρμα μπορεί έπειτα να βασιστεί και στις δύο.
Τι κάνει αυτή την αλλαγή βιομηχανική
Αυτά τα έργα άλλαξαν το πού αφιέρωνα την προσοχή μου. Μόλις οι βοηθοί μπορούσαν να προχωρούν μεγάλο μέρος μιας διερεύνησης, η βελτίωση του περιβάλλοντος εργασίας τους έγινε ένα από τα πιο χρήσιμα πράγματα που μπορούσα να κάνω. Ένα καλύτερο εργαλείο μπορούσε να βοηθήσει σε κάθε μεταγενέστερη συνάρτηση που το χρειαζόταν.
Η αυτονομία έχει σημασία εδώ. Το χρήσιμο επόμενο βήμα γίνεται συχνά σαφές μόνο μετά από ένα αποτυχημένο πείραμα. Ένας βοηθός χρειάζεται αρκετή ελευθερία για να ακολουθήσει αυτό το αποτέλεσμα προς μια απροσδόκητη κατεύθυνση. Αν πρέπει να περιμένει να του ορίσω κάθε βήμα, μεγάλο μέρος της δουλειάς παραμένει δεμένο με τη δική μου προσοχή.
Περιμένω ότι ο βοηθός θα κάνει λανθασμένες υποθέσεις. Αυτό που έχει σημασία είναι αν μπορούμε να τις δοκιμάσουμε και να μάθουμε από το αποτέλεσμα. Ένας αποτυχημένος έλεγχος θα πρέπει να τον βοηθά να καταλάβει το λάθος αρκετά καλά ώστε να προσπαθήσει ξανά. Εγώ εξακολουθώ να πρέπει να αποφασίζω αν τα συσσωρευμένα στοιχεία στηρίζουν ένα ορόσημο του έργου.
Το REA δίνει στον βοηθό πρόσβαση σε εργαλεία ανάλυσης. Ένα ερώτημα για το ποια συνάρτηση καλεί μια άλλη μπορεί να οδηγήσει απευθείας στην εξέταση της συνάρτησης που την καλεί. Το έργο ανακατασκευής παρέχει τον μεταγλωττιστή και τους δικούς του ελέγχους αναφοράς. Ο βοηθός μπορεί να τους χρησιμοποιήσει για να δοκιμάσει τον πηγαίο κώδικα που προτείνει και να δει πού αντέχει η εξήγησή του.
Το σφάλμα του TH08 δείχνει γιατί αυτοί οι έλεγχοι αξίζουν ξεχωριστή προσοχή κατά την ανάπτυξή τους. Όταν η ίδια σύγκριση χρησιμοποιείται σε εκατοντάδες συναρτήσεις, ένα κενό της μπορεί να εξαπλωθεί πολύ περισσότερο από ένα λάθος σε μία υλοποίηση. Η δοκιμή του ελεγκτή βελτιώνει την ανατροφοδότηση που είναι διαθέσιμη σε όλη αυτή τη μεταγενέστερη δουλειά.
Η βιομηχανική αναλογία έχει εδώ ένα χρήσιμο ιστορικό παράδειγμα. Οι Boulton και Watt εισήγαγαν έναν ενδείκτη ατμομηχανής το 1796 για να βοηθήσουν στη ρύθμιση των βαλβίδων της μηχανής. Μια καταγραφική έκδοση αποτύπωνε την πίεση κατά τη διαδρομή του εμβόλου. Έκανε την εσωτερική συμπεριφορά της μηχανής διαθέσιμη για εξέταση. Τα εργαλεία σύγκρισής μας υπηρετούν παρόμοιο σκοπό: μας επιτρέπουν να εξετάζουμε τι κάνουν οι μηχανισμοί όσο τους βελτιώνουμε.
Βρισκόμαστε στα πρώτα στάδια αυτής της βιομηχανικής αλλαγής. Μεγάλο μέρος της υποδομής είναι ακόμη ανώριμο. Οι βοηθοί μπορούν να κινούνται γρηγορότερα από όσο σχεδιάστηκαν να υποστηρίζουν οι έλεγχοί μας, οπότε η διαδικασία πρέπει να εξελίσσεται μαζί τους. Όταν βρίσκουμε ένα ελάττωμα σε κοινό εργαλείο, πρέπει να το διορθώνουμε και να επανεξετάζουμε τα αποτελέσματα που επηρέασε. Το επόμενο έργο μπορεί τότε να κληρονομήσει ένα ισχυρότερο εργαλείο.
Υπάρχει επίσης ένα πρακτικό όριο σε κάθε συζήτηση. Θα τελειώσει πριν ολοκληρωθεί μια μεγάλη ανακατασκευή. Το αποθετήριο πρέπει να επιτρέπει σε μια άλλη συνεδρία να συνεχίσει χωρίς να χαθεί ο λόγος της τελευταίας απόφασης.
Το Touhou Reconstruction Factory προέκυψε από αυτή την ανάγκη. Δίνει στα έργα έναν κοινό τρόπο να μεταφέρουν τους ελέγχους και τα μαθήματά τους παρακάτω. Η δουλειά σε ένα παιχνίδι μπορεί να βελτιώσει τις αρχικές συνθήκες για ένα άλλο.
Αυτό δίνει νόημα στη βιομηχανική αναλογία για μένα. Η εμπειρία αρχίζει να γίνεται μέρος εργαλείων που μπορούν να χρησιμοποιήσουν άλλοι. Η βελτίωση αυτών των εργαλείων αλλάζει το πόσα μπορεί να κάνει ο επόμενος άνθρωπος — ή ο επόμενος βοηθός.
Τα έργα που μπορούμε πλέον να εξετάσουμε
Ο ρυθμός έχει σημασία επειδή αλλάζει την απόφαση να ξεκινήσω. Η αντίστροφη μηχανική ενός παιχνιδιού μπορεί να ήταν συναρπαστική και, παρ' όλα αυτά, να απαιτούσε περισσότερη δική μου προσοχή από όση μπορούσα ρεαλιστικά να του δώσω. Πολλά έργα θα έμεναν ιδέες.
Τώρα μπορώ να δω έναν τρόπο να συνεχίζεται ένα τέτοιο έργο μέσα από επαναλαμβανόμενες διερευνήσεις. Μια λειτουργική ανακατασκευή κάνει πιο πρακτική τη μεταφορά σε άλλη πλατφόρμα. Η ανάκτηση αναγνώσιμης σημασιολογίας διευκολύνει κάποιον άλλο να εξερευνήσει μια τροποποίηση. Ο κόπος που αφιερώθηκε στην κατανόηση του παιχνιδιού μπορεί να συνεχίσει να αποδίδει αφού εκτελεστεί η πρώτη έκδοση.
Πλέον κοιτάζω ένα άγνωστο πρόγραμμα και ρωτώ: ποια πρόσβαση, ανατροφοδότηση και συσσωρευμένη γνώση θα επέτρεπαν σε έναν βοηθό να δουλέψει αξιόπιστα πάνω σε αυτό;
Αυτό το ερώτημα με κάνει να εξετάζω έργα που παλιότερα θα άφηνα στην άκρη. Το καθένα μπορεί να βελτιώσει τον τρόπο με τον οποίο προσεγγίζουμε το επόμενο. Θέλω να συνεχίσω να εξερευνώ πόσο μακριά μπορεί να μας πάει αυτό.
Ορόσημα έργων και πηγές
Οι ημερομηνίες περιγράφουν καταγεγραμμένα σημεία προόδου των έργων, τα οποία ελέγχθηκαν σε σχέση με το δημόσιο ιστορικό του GitHub στις 10 Οκτωβρίου 2026. Ο χρόνος που πέρασε είναι ημερολογιακός χρόνος μεταξύ commits. Η παρουσία πηγαίου κώδικα, οι ακριβείς συγκρίσεις, η δημιουργία ενός προγράμματος και ένα αποτέλεσμα εκτέλεσης δηλώνουν διαφορετικό ορόσημο το καθένα.
- TH08: συνέχεια της 13ης Αυγούστου, μητρώο πηγαίου κώδικα της 19ης Αυγούστου, μεταφορά στο Linux της 24ης Αυγούστου, έκδοση Web της 26ης Αυγούστου και κυκλοφορία Linux 64-bit της 30ής Αυγούστου.
- TH095: αρχικό μητρώο της 29ης Αυγούστου, μητρώο πηγαίου κώδικα της 7ης Σεπτεμβρίου, συγκρίσεις της 8ης Σεπτεμβρίου, σύνδεση της 9ης Σεπτεμβρίου και καταγραφή λειτουργικής έκδοσης παιχνιδιού της 10ης Σεπτεμβρίου.
- TH04: η παράδοση της 10ης Οκτωβρίου καταγράφει τη λειτουργική ανακατασκευή για DOS, τις πλήρεις δοκιμές διαδρομών Normal από τον υπεύθυνο συντήρησης και την τρέχουσα φάση 64-bit.
- Διόρθωση της αναφοράς ελέγχου του TH08: το αναφερθέν σφάλμα αυτόματης συλλογής, η διόρθωση πηγαίου κώδικα και σύγκρισης και ο πλήρης έλεγχος κυριολεκτικών τιμών κινητής υποδιαστολής.
- Σημασιολογική ανακατασκευή: ο οδηγός αναγνωσιμότητας του TH08 και η σειρά φάσεων και οι δύο διαδρομές επικύρωσης του Factory.
- Βιομηχανική ιστορία: η καταγραφή του ενδείκτη ατμομηχανής από το Science Museum Group περιγράφει την εισαγωγή του το 1796 και τον μηχανισμό καταγραφής πίεσης.
- Μέθοδος: τα έγγραφα του Factory για την αυτονομία των βοηθών και τη γνώση που μεταφέρεται μεταξύ παιχνιδιών διατηρούν τις αρχές εργασίας και τα μαθήματα.