Θα ξεκινήσω την απάντηση ανάποδα.
Το ότι η πρώτη υλοποίηση του Pet shop δεν χρησιμοποιούσε stored procedures είναι πρόβλημα της υλοποίησης αν και δεν ήταν το μόνο. Την εποχή που δημιουργήθηκε υπήρχε η αντίληψη ότι είναι προτιμέτερη η "φορητότητα" του κώδικα σε SQL σε σχέση με την απόδοση, ότι τα entity Java Beans ήταν καλή ιδέα, το μέλλον είναι τα distributed objects, όλες οι εφαρμογές μπορούν να τρέξουν σαν ASP/JSP/CGI web εφαρμογές και πολλά άλλα ευχάριστα. Τα ίδια προβλήματα υπήρχαν (και υπάρχουν) ακόμα σε υλοποιήσεις είτε είναι COM+, Enterprise Services ή EJB. Είναι προβλήματα της
υλοποίησης και όχι της πλατφόρμας. Η επόμενη υλοποίηση του Pet shop διόρθωσε τα λάθη αυτά και πέτυχε αντίστοιχη απόδοση με το Pet Shop.Net.
Αντίθετα, οι πιο αποτελεσματικές υλοποιήσεις χρησιμοποιούν λέξεις όπως stateless, message-passing, queued. Τα distributed objects δείνουν τη θέση τους στα web services και το ελαφρώς procedural μοντέλο τους. Η χρήση dynamic SQL και οι cursors θεωρούνται η ρίζα του κακού από όποιον ξέρει τη διαφορά της με τα stored procedures (όχι, τα stored procedures ΔΕΝ είναι χρήσιμα επειδή περιέχουν 3 κιλοτόνους κώδικα, είτε είναι Java είτε Τ-SQL!).
Είναι
θανάσιμη πλάνη να ρίχνει κανείς το φταίξιμο στην πλατφόρμα, γιατί έτσι δεν πρόκειται ποτέ να διορθώσει τα λάθη της υλοποίησής του.
Διάλειμα: Ακούσατε ποτέ να λένε ότι ένα report στην Oracle κάνει μέρες ενώ σε SQL (οτιδήποτε) κάνει δευτερόλεπτα? Αυτά συμβαίνουν πραγματικά, όταν γίνεται κακή σχεδίαση με παλιές εκδόσεις του form designer, που παράγουν κιλά dynamic sql και cursors.
Σύνταξη: Κι εγώ που νόμιζα ότι και οι δύο γλώσσες αντιγράψανε τη C++! Ακόμα και στον τρόπο που
συντάσσονται τα templates! Αλλά ...
τί με νοιάζει?
Μεγαλύτερη σημασία έχουν οι σημαντικές διαφορές του memory model από C++ σε Java σε C# παρά ανούσιες αναφορές στη σύνταξη! (Δείτε και τη
συζύτηση για το singleton). Ομοίως οι σημαντικές διαφορές μεταξύ templates και generics.
Generics: Εγώ τα ξέρω σαν templates από την C++, τώρα τί μου λέτε εσείς όλοι για generics! Εγώ θέλω να φτιάξω policies όπως τα περιγράφει ο Alexandrescu, να έχω template specialization και όλα τα καλά της C++!
Παρότι τα generics και στις δύο γλώσσες φαίνονται όμοια με την C++, έχουν αρκετές διαφορές με αποτέλεσμα και οι δύο γλώσσες να ξεκινάνε ουσιαστικά από την αρχή σε αυτό τον τομέα. Αν βάλει κανείς και τις διαφορές στο memory model, τον τρόπο δημιουργίας των αντικειμένων και άλλες σημαντικές αλλά αφανείς διαφορές, το αν το runtime καταλαβαίνει από generics είναι μάλλον δευτερεύον.
Ή μήπως όχι? Μου φαίνεται ότι ο τρόπος που δουλεύουν τόσο τα generics όσο και τα attributes θα παίξουν μεγάλο ρόλο σε σημεία που δεν το περιμέναμε. Τα aspects είναι το απλό και τετριμμένο παράδειγμα.
Απλά απορώ που πήρε ΤΟΣΟ καιρό στη Java να αποκτήσει generics, όταν τα templates στη C++ υπάρχουν ... αιώνες!
Τέλος τα περί πλατφόρμας: Αν ίσχυε ότι το .NET είναι γρήγορο επειδή η Microsoft ξέρει κάποια κρυφά μυστικά, γιατί δεν είναι και η Java το ίδιο γρήγορη στο Solaris?
Ή μήπως φταίει το ότι η Sun επίτηδες δεν έδωσε σημασία στο VM για Windows? Και όχι μόνο? Αυτός δεν είναι και ο λόγος που πριν από χρόνια η IBM ξεκίνησε να φτιάχνει δικό της VM?
Όσο για το R&D, η Microsoft αναπτύσσει το .NET εδώ και 6-7 χρόνια. Το ότι η σύνταξη της C# μοιάζει με τη Java δε σημαίνει ότι και τα VM είναι τα ίδια.
Όπως και να έχει, όταν προσπαθείς να κάνεις κάτι που τρέχει σε πολλά λειτουργικά, αυτό αναγκαστικά θα έχει συμβιβασμούς. Είτε θα πιο αργό και λιγότερο ευέλικτο από μια υλοποίηση ειδικά για το λειτουργικό, είτε θα περιέχει υλοποιήσεις για όλα τα γνωστά λειτουργικά. Μόνο γνωστή φωτεινή εξαίρεση, η Standard Template Library της C++, η οποία κατάφερε να τρέχει παντού και να είναι και γρήγορη. Αλλά δεν είναι thread-safe γιατί ΟΛΑ τα λειτουργικά διαφέρουν μεταξύ τους στο πως συμπεριφέρονται τα threads, ακόμα και από έκδοση σε έκδοση (Windows ΝT σε 2000, HP-UX 10 σε 11 και άπειροι άλλοι συνδιασμοί).
Τελικά, επιλέγεις το συμβιβασμό σου ανάλογα με το τί σύστημα φτιάχνεις. Χρειάζεσαι συμβατότητα με όλες τις πλατφόρμες? C++. Ευκολία προγραμματισμού σε πολλές πλατφόρμες? Η Java είναι μια λύση. Δουλεύεις με Windows? .ΝΕΤ.
Υ.Γ. Σε όλο το post έμπλεξα την Java-πλατφόρμα με τη Java-γλώσσα, όπως και με τη C#/.ΝΕΤ. Το σφάλμα είναι τραγικό και οδηγεί σε άπειρες παρανοήσεις. Αλλά αν προσπαθούσα να κρατήσω τα πράγματα καθαρά, το post θα είχε μέγεθος κάτι MB!
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos