Friday, 26 June 2009

Maxima

To Maxima είναι ένα σύστημα υπολογιστικής άλγεβρας (computer algebra system) για την επεξεργασία συμβολικών και αριθμητικών εκφράσεων. Συμπεριλαμβάνει παραγώγιση, ολοκλήρωση, σειρές Taylor, μετασχηματισμοί Laplace, κανονικές διαφορικές εξισώσεις, συστήματα γραμμικών εξισώσεων, πολυώνυμα καθώς και σύνολα, διανύσματα, πίνακες και τανυστές.Το Maxima προσφέρει υψηλής ακρίβειας αριθμητικά αποτελέσματα χρησιμοποιώντας ακριβή κλάσματα, μεταβλητής ακρίβειας ακεραίους και μεταβλητής ακρίβειας πραγματικούς αριθμούς. Έχει τη δυνατότητα σχεδιασμού συναρτήσεων και δεδομένων σε δύο και τρεις διαστάσεις.

Το πρόγραμμα Maxima είναι τώρα πλέον ελεύθερο λογισμικό υπό την άδεια GNU GPL ενώ κατάγεται από το Macsyma, το θρυλικό σύστημα υπολογιστικής άλγεβρας που αναπτύχθηκε στα τέλη του 1960 στο πανεπιστήμιο της Μassachussetts.

Οι δυνατότητες του Maxima είναι απεριόριστες και εδώ θα περιοριστούμε στην παρουσίαση μερικών μόνο. Η γραμμή εντολών του χωρίζεται σε inputs και outputs, οπότε γράφοντας 9+7; θα πάρουμε ως αποτέλεσμα 16 (τo ; στο τέλος είναι απαραίτητο κατάλοιπο από τη C). Τίποτε το συνταρακτικό. Αν όμως δώσουμε 2/6; θα μας επιστρέψει 1/3, θα απλοποιήσει δηλαδή το κλάσμα χωρίς να υπολογίσει την προσέγγισή του. Αν θέλουμε ένα ρητό αριθμό ως προσέγγιση τότε θα πρέπει να γράψουμε float(1/3); για να πάρουμε το αποτέλεσμα 0.333333333333. Αλλά ας περάσουμε σε κάτι πιο θεαματικό. Ας υποθέσουμε ότι χρειαζόμαστε να αναπτύξουμε τον αριθμό 30! (30 παραγοντικό είναι 1*2*3*...*28*29*30) σε γινόμενο πρώτων παραγόντων, τότε γράφοντας factor(30!); παίρνουμε ως αποτέλεσμα 2^26*3^14*5^7*7^4*11^2*13^2*17*19*23*29. Φυσικά με τον ίδιο τρόπο μπορούμε να παραγοντοποιήσουμε πολυώνυμα factor(x^2 + x -6); για να δούμε (x-2)(x+3).

H επίλυση εξισώσεων γίνεται το ίδιο εύκολα solve(x^2-4,x); Το δεύτερο όρισμα, x, δηλώνει ως προς ποια μεταβλητή θα πρέπει να λυθεί η εξίσωση. Η παραγώγιση πραγματοποιείται με τη συνάρτηση diff(sin(x), x); Πάλι το δεύτερο όρισμα δηλώνει ως προς ποιά μεταβλητή πρέπει να παραγωγηθεί η δεδομένη συνάρτηση. Παρόμοια λειτουργεί και η αόριστη ολοκλήρωση integrate(1/x,x); και η ορισμένη ολοκλήρωση integrate(x+2/(x-3), x, 0, 1); H ανάπτυξη μιας συνάρτησης σε σειρά Taylor γίνεται με δύο τρόπους: niceindices(powerseries(%e^x, x, 0)); ή taylor(%e^x, x, 0, 5); Το όρισμα 0 δηλώνει σε ποιο σημείο να υπολογισθεί η σειρά ενώ στο δεύτερο τρόπο το όρισμα 5 δηλώνει πόσους όρους να δείξει στο αποτέλεσμα.

Φυσικά ένα τέτοιο πρόγραμμα θα ήταν ελλειπές αν δεν είχε δυνατότητες σχεδιασμού. Χρησιμοποιεί το πρόγραμμα gnuplot για το σχεδιασμό. Οι συναρτήσεις plot2d και plot3d δίνουν αυτή τη δυνατότητα. Tα αποτελέσματα των εντολών plot2d([x^2, x^3, x^4-x+1], [x,-10,10]);


και f(x,y):= sin(x) + cos(y); plot3d(f(x,y), [x,-5,5], [y,-5,5]); δίνουν τα αντίστοιχα διδιάστατα και τριδιάστατα γραφήματα. Στη δεύτερη περίπτωση ορίσαμε προηγουμένως μια νέα συνάρτηση χρησιμοποιώντας τον τελεστή := για να αποφύγουμε μια μακροσκελή εντολή.



To πρόγραμμα είναι γραμμένο σε Common Lisp και περιλαμβάνει μια πλήρη γλώσσα προγραμματισμού και σύνταξη παρόμοια με την ALGOL. Mπορεί να προσπελαστεί προγραμματιστικά και να επεκταθεί καθώς η υποκείμενη Lisp μπορεί να κληθεί μέσα από το Maxima. Μία άλλη πολύ ενδιαφέρουσα δυνατότητα του Maxima είναι η δημιουργία κώδικα για compiled γλώσσες προγραμματισμού όπως η FORTRAN.

Εγκαθίσταται πολύ απλά από τη γραμμή εντολών με sudo apt-get install maxima ή από το μενού Εφαρμογές > Προσθαφαίρεση Προγραμμάτων. Πρόσθετα πακέτα που μπορούν να φανούν χρήσιμα είναι τα maxima-doc, maxima-emacs, kayali (ένα GUI γραμμένο σε Qt), xmaxima (ένα GUI γραμμένο σε tcl/tk). Περισσότερες λεπτομέρειες μπορούν να βρεθούν στην ιστοσελίδα http://maxima.sourceforge.net/

Thursday, 25 June 2009

Η τέχνη του προγραμματισμού

Σε καμιά περίπτωση δεν κατέχω την υψηλή αυτή τέχνη, απλώς προσπαθώ να μοιραστώ λίγη από τη γεύση της και θα χαρώ να διαβάσω τις δικές σας εμπειρίες.

Γιατί τέχνη και γιατί προγραμματισμός; Προγραμματισμός γιατί όλες οι εφαρμογές στον υπολογιστή απαιτούν προγραμματισμό στη μία ή στην άλλη γλώσσα. Τέχνη γιατί δεν αρκεί να μάθει κανείς πως αναμιγνύονται τα χρώματα για να γίνει ζωγράφος, ούτε να μάθει να διαβάζει το πεντάγραμμο για να γίνει μουσικός. Φυσικά είναι απαραίτητες προϋποθέσεις αλλά δεν είναι οι μοναδικές. Έτσι και στον προγραμματισμό δε αρκεί να μάθει κανείς τη σύνταξη μιας γλώσσας για να πει ότι είναι προγραμματιστής.

Η τέχνες δε μαθαίνονται στα πανεπιστήμια (μεγάλη κουβέντα αυτή, αλλά από προσωπική εμπειρία και βλέποντας φίλους αυτό συμπεράνω). Η τέχνη είναι κάτι που το ασκείς και εξασκείς μόνος σου. Κανείς δε μπορεί να σε βοηθήσει να γίνεις καλύτερος αν δεν προσπαθήσεις μόνος σου.

Τα απαραίτητα χαρακτηριστικά ενός προγραμματιστή είναι να μπορεί να προγραμματίσει οτιδήποτε σε οποιαδήποτε γλώσσα. Αυτό δε σημαίνει ότι ξέρει όλες τις γλώσσες αλλά στην ανάγκη μπορεί να μάθει τη σύνταξη. Αυτό που απαιτείται είναι να μπορεί να χρησιμοποιεί χαρακτηριστικά της μιας γλώσσας σε άλλη. Αυτό που θέλω να πω είναι ότι η σύνταξη δεν πρέπει να είναι περιορισμός για την ανάγνωση ή τη συγγραφή ενός προγράμματος.

H τέχνη του προγραμματισμού δεν περιλαμβάνει μόνο το γράψιμο κώδικα, αλλά κυρίως την αποσφαλμάτωσή του (debugging). Το πρώτο βήμα είναι η ορθή ανάγνωση του σφάλματος, το οποίο περιέχει αρκετές πληροφορίες για να βρούμε τη λύση του προβλήματος. Στην περίπτωση που το σφάλμα είναι bus error ή segmentation fault τότε αρχίζει η πραγματική τέχνη. Στη διαδικασία της αποσφαλμάτωσης ενά απλό printf διάσπαρτο σε διάφορα σημεία του κώδικα μπορεί να αντικαταστήσει και τον καλύτερο εργαλείο αποσφαλμάτωσης.

Η τέχνη του προγραμματισμού περιλαμβάνει την κατανόηση του πως λειτουργεί, στοιχειωδώς τουλάχιστον, ο μεταγλωττιστής (compiler) ή ο ερμηνευτής (interpreter) της γλώσσας που χρησιμοποιούμε. Μόνο έτσι θα μπορεί να βελτιστοποιήσει κανείς ένα πρόγραμμα ή να βρει ένα δύσκολο λάθος σε άλλο. Tαυτόχρονα να κατανοεί πως λειτουργεί ο υπολογιστής και το λειτουργικό σύστημα, για να κατανοήσει τι σημαίνει θέση μνήμης και δείκτης.

Η τέχνη του προγραμματισμού περιλαμβάνει τη γνώση των απαραίτητων εργαλείων που κάνουν τη ζωή του προγραμματιστή πιο εύκολη, αλλά ίσως και όχι. Τι θέλω να πω; Ο προγραμματιστής οφείλει να μπορεί να διαβάσει το Makefile ή το configure script ενός προγράμματος, να μπορεί να χρησιμοποιήσει debuggers και ταυτόχρονα όλα αυτά από τη γραμμή εντολών. Παρόλ'αυτά αν βρεθεί σε ένα καινούριο περιβάλλον να μπορεί να εξοικειωθεί γρήγορα με τα νέα εργαλεία του.

Ο προγραμματιστής οφείλει, αν δεν έχει στη διάθεσή του τα απαραίτητα εργαλεία, να μπορεί να τα κατασκευάσει μόνος του. Δικαιολογίες όπως "δε βρίσκω αυτό το πρόγραμμα για να κάνω τη δουλειά μου" δε γίνονται δεκτές.

Προγραμματισμός σημαίνει να βρίσκεται η βέλτιστη λύση σε κάθε πρόβλημα. Το κριτήριο όμως της βελτιστότητας κάθε φορά διαφέρει. Άλλες φορές είναι η ταχύτητα εκτέλεσης και άλλες φορές η ταχύτητα συγγραφής. Πολλές φορές η μέθοδος "brute force" είναι αποδεκτή όταν ένας πολύπλοκος αλγόριθμος θα χαλάσει την απλότητα του προγράμματος, χωρίς αυτό να σημαίνει ότι απλότητα είναι πάντα και ωραία.

Η τέχνη του προγραμματισμού έγγειται στο να αφήνουμε τον υπολογιστή να κάνει επαναλαμβανόμενες και άρα ανιαρές εργασίες. Αυτό σημαίνει όταν έχουμε να γράψουμε κώδικα είναι καλύτερο να γράφουμε προγράμματα που γράφουνε κώδικα. Έτσι μειώνονται οι πιθανότητες για ανθρώπινο λάθος.

Ο καλύτερος τρόπος να αποκτήσει κανείς εμπειρία με τον προγραμματισμό είναι να αρχίσει να προγραμματίζει. Στον κόσμο του ελεύθερου λογισμικού όπου ο κώδικας είναι ελεύθερος οι δυνατότητες για μάθηση είναι απεριόριστες. Η μελέτη κώδικα που έχουν γράψει άλλοι προγραμματιστές και η βήμα-βήμα επέκτασή του είναι ενδεδειγμένη τεχνική στην απόκτηση εμπειρίας και γνώσεων. Είναι αλήθεια ότι στην αρχή όλα φαίνονται δυσνόητα και απρόσιτα αλλά με την πάροδο του χρόνου ο κώδικας αρχίζει και γίνεται κατανοητός.

Ο προγραμματισμός πρέπει να είναι στάση ζωής. Αυτό σημαίνει να βρίσκουμε αλγόριθμους για επίλυση προβλημάτων στην καθημερινή μας ζωή, όπως ποιός είναι ο συντομότερος δρόμος για τη δουλειά ή ποια είναι η βέλτιστη τακτική στο risk.

Τέλος, σημασία έχει να διασκεδάζουμε με αυτό κάνουμε, διαφορετικά όλα είναι μάταια (όχι ότι δεν είναι ούτως ή άλλως, αλλά ας πούμε ότι δεν είναι).