Στο Πολυτεχνείο χρειάστηκε σε μόνιμη βάση να φτιάχνουμε προγράμματα που έκαναν υπολογισμούς με φυσικά μεγέθη. Η μόνη "παραδεκτή" γλώσσα ήταν Fortran 77 (ναι, η 90 δεν είχε βγει ακόμα) και η Αριθμητική Ανάλυση έδινε και έπαιρνε. Δεν ξέρω πόσοι από εσάς, στον επαγγελματικό στίβο πλέον, έχετε τομείς εφαρμογής που έχουν σχέση με φυσικά μεγέθη (υποπτεύομαι λίγοι) αλλά πρόσφατα έτυχε να ασχοληθώ με ένα έργο που έκανε ακριβώς αυτό, και με γύρισε πίσω στο χρόνο.
Αν τα προγράμματά σας αφορούν υπολογισμούς με φυσικά μεγέθη, έχετε παρατηρήσει ότι αφαιρώντας τη φυσική διάσταση και κρατώντας μόνο την αριθμητική τιμή, είναι λίγο σα να περνάς από μιά γλώσσα που κάνει compile-time type checking σε μία που δεν κάνει; Χειρότερο, όταν δεν έχεις compilation με type-checking, τουλάχιστον θα γίνει runtime type checking. Ενώ, όταν αφαιρέσεις τη φυσική διάσταση και καταλήξεις να πολλαπλασιάζεις μήκος με χρόνο και κάνεις ανάθεση σε ηλεκτρική ένταση, δε θα το καταλάβεις παρά μόνο δύσκολα. Είναι κάτι σα να κάνεις type erasure σε generics (βλ.
δημοσίευση Palladin), dimension-erasure.
Κάποια στιγμή λοιπόν σκέφτηκα πώς θα μπορούσε να διορθωθεί αυτό και βγήκε, στην ουσία, ένα μικρό C++ template των λίγων γραμμών που προσθέτει τις φυσικές διαστάσεις σαν αριθμητικά ορίσματα του template, και ορίζει τις πράξεις να γυρίζουν το ίδιο template με τις κατάληλες τιμές για την κάθε διάσταση.
Μόνο που στην C# και στη Java, δεν υπάρχουν αριθμητικά ορίσματα στα Generics (αλλά ούτε και στην C++ του .net υπάρχουν στα template ή στα generics, χρειάζεται standard C++). Έτσι έφτιαξα μία λύση με code generation η οποία έχει το μειονέκτημα ότι περιορίζεις τεχνητά το εύρος των τιμών που υποστηρίζεται για κάθε διάσταση και, βέβαια, οι πράξεις ορίζονται μόνο μέσα σε αυτό το εύρος. Η λύση μου βρίσκεται στο:
http://dimenso.sourceforge.netΠαρόλο που είναι μια απλή ιδέα, μου αρέσει να τη σκέφτομαι σαν ένα μικρό
DSL για αριθμητικούς υπολογισμούς physics-aware, ειδικά αφού τα IDE (VS, IntelliJ) κάνουν type check την ώρα που γράφεις.
--
D. Souflis
"Reality is that which, when you stop believing in it, doesn't go away" P. K. D.