Συναρτησιακός προγραμματισμός και αλγοριθμική σκέψη

Ξεκίνησε από sstergou, 08 Ιουν 2010, 11:56:37 ΜΜ

« προηγούμενο - επόμενο »

sstergou

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

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

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

Ποια είναι η γνώμη σας;

evry

Ενδιαφέρον θέμα, άλλωστε και η logo ουσιαστικά συναρτησιακή γλώσσα είναι.
Ελπίζω πάντως να μην σε έπεισε ο γροντάς να διαβάσεις αυτό
http://mitpress.mit.edu/sicp/
Στάθη με ποια γλώσσα ασχολήθηκες? γενικά ποια γλώσσα προτείνεις σε κάποιον που θέλει να ξεκινήσει με συναρτησιακό? υποθέτω ότι θα είναι μια εκ των Haskell, Scheme ?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

sstergou

Το μικρόβιο μπήκε πρόπερσι το καλοκαίρι όταν παρακολούθησα ένα σεμινάριο σχετικά με το πως μπορείς να μπλέξεις τον συναρτησιακό με τον αντικειμενοστραφή προγραμματισμό : http://www.ccs.neu.edu/home/vkp/HtDCH/ και όλο αυτό ως μέρος της προπαγάνδας για την διδασκαλία της scheme.

Δεν έχω ασχοληθεί πολύ με συναρτησιακές γλώσσες, έχω γράψει κάποια πράγματα σε scheme, πιο λίγα ακόμη σε haskell αλλά έχω διαβάσει σχετικά με lazy evaluation, continuations, concurrency κτλ. Πιο πολύ έχω εφαρμόσει τις ιδέες του συναρτησιακού σε γλώσσες όπως η javascript και η actionscript που αν και πρωτόγονες σε αυτό το θέμα υποστηρίζουν lambda expressions. Έχω μαζέψει αρκετό υλικό και αραιά και που ασχολούμαι. Προτείνω haskell, ocaml ή scheme σε όσους ενδιαφέρονται.

Επίσης βλέπω ότι η ιδέα του συναρτησιακού επεκτείνεται σιγά σιγά και στην βιομηχανία με πολλές γλώσσες όπως η python, η javascript, η lua και πιο πρόσφατα η c# να ενσωματώνουν τέτοια χαρακτηριστικά. Στην java συζητάνε για το αν θα υποστηρίξουν closures ενώ η microsoft ανέπτυξε ήδη την F# η οποία "δανείζεται" πολλά από την ocaml.

Πάντως το βιβλίο που προτείνει ο Γροντάς είναι κορυφαίο! Έχω δει τις διαλέξεις http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ τις οποίες συστήνω, μιας και που άλλαξαν τον τρόπο σκέψης μου και νομίζω με έκαναν καλύτερο εκπαιδευτικό.


sstergou

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

Αν υποθέσουμε ότι εμείς θέλουμε να διδάξουμε αλγοριθμική σκέψη τότε ποιο μοντέλο μας συμφέρει να ακολουθήσουμε;

Θέλουμε πίνακες, βρόχους, εκχώρηση, και αλλαγή κατάστασης ή λίστες, αναδρομή και αναφορική ακεραιότητα;

pgrontas

Το συγκεκριμένο θέμα με έχει απασχολήσει και μένα τα τελευταία χρόνια.
Έχω ασχοληθεί λίγο με scheme (όσο ήθελε το SICP) αρκετά με haskell (η αγαπημένη μου γλώσσα), ενώ τώρα τελευταία παίζω λίγο με F#.
Κάποια συμπεράσματα που έχω βγάλει είναι τα εξής:
1. Οι συναρτησιακές γλώσσες έχουν πολύ μικρότερο ρεπερτόριο εντολών και καθόλου δομή επανάληψης, οπότε ίσως είναι πολύ πιο εύκολο να ξεκινήσεις. Γενικά οι συναρτησιακές γλώσσες έχουν πολύ πιο απλή σύνταξη και λιγότερη φλυαρία.
2. O συναρτησιακός πρόγραμματισμός είναι ό,τι καλύτερο για να διδαχθεί αναλυτική σκέψη, δηλαδή σπάσιμο ενός προβλήματος σε μικρότερα και βέβαια αυτό να εκφραστεί στο τελικό πρόγραμμα. Η δομή των συγκεκριμένων γλωσσών, σε αποθαρρύνει να γράφεις κατεβατά. Αντίθετα σε ωθεί σε μικρές και σαφείς συναρτήσεις. Το ίδιο ισχύει και με μεταβλητές και δομές-εγγραφές.
3. Χρησιμοποιούν πολύ ωραία τους τύπους των μεταβλητών και των συναρτήσεων. Δηλαδή σε ωθούν σε μια αλγεβρική θεώρηση του προγράμματος, όπου μπορείς να ταιριάξεις τύπους μεταβλητών και συναρτήσεων έτσι ώστε αν ταιριάζουν οι τύποι το πρόγραμμα να είναι σωστό. Επιπλέον οι τύποι σε καθοδηγούν στο να φτιάξεις τις συναρτήσεις και τις δομές.
4. Νομίζω ότι δεν πρέπει να χρησιμοποιηθεί μια pure γλώσσα όπως η Haskell, γιατί δυσκολεύει πολύ τα πράγματα με την αναφορική ακεραιότητα. Αντίθετα μια γλώσσα που υποστηρίζει εκχώρηση όπως την ξέρουμε είναι πιο εύκολη στην εκμάθηση (πχ. OCAML)

Πολύ ενδιαφέρον θέμα!!!
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

sstergou

#5
Πάντως διδάσκουμε επίλυση προβλημάτων και δεν κάνουμε καμία αναφορά για τεχνικές όπως η διάρει και βασίλευε.

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