Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Ανοίγω αυτό το thread, για να γνωρίσουμε και να συζητήσουμε τα περί του συναρτησιακού προγραμματισμού.

 

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

 

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

 

Μία μεγάλη διαφορά που μπορούμε να βρούμε στον συναρτησιακό προγραμματισμό, είναι η απουσία μεταβλητών! Δεν υπάρχει, δηλαδή, μία "κατάσταση" στην οποία βρίσκεται το πρόγραμμα που μπορεί να αλλάξει αργότερα. Υπάρχουν μόνο οι συναρτήσεις, που με την είσοδο των ίδιων παραμέτρων θα πρέπει πάντα να επιστρέφουνε το ίδιο αποτέλεσμα, όσες φορές και να εκτελεστούνε και δεν τροποποιούν τίποτα (οι λεγόμενες "pure" συναρτήσεις). Μπορούμε να δηλώσουμε και σταθερές, όπου στην ουσία έχουμε μια συνάρτηση που δεν δέχεται παραμέτρους και επιστρέφει πάντα την ίδια συγκεκριμένη τιμή.

 

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

 

Είναι σύνηθες φαινόμενο στον συναρτησιακό προγραμματισμό, οι συναρτήσεις να δέχονται ως παραμέτρους όχι μόνο συγκεκριμένες τιμές, αλλά και συναρτήσεις! Τέτοιου είδους συναρτήσεις ονομάζονται high order functions. Σε άλλες περιπτώσεις, μπορεί μια συνάρτηση να επιστρέψει μια άλλη συνάρτηση, όπου βλέπουμε το φαινόμενο του partial application.

 

Τι προτερήματα μπορούμε να λάβουμε από αυτό το είδος προγραμματισμού?

 

α) Αφού δεν μπορούμε να αλλάξουμε κάποια κατάσταση, σημαίνει ότι το προγραμμά μας δεν έχει "παρενέργειες" (side-effects). Αυτό μας εγγυά λιγότερα σφάλματα στον κώδικα.

 

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

 

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

...

 

Να κάνω μερικές, αφελείς ίσως, ερωτήσεις;

 

1. Ποιά η διαφορά ανάμεσα σε αμιγώς συναρτησιακές γλώσσες (όπως είναι η Haskell) και γλώσσες όπως είναι οι (οικογένειες) Lisp και Prolog;

 

2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang;

  • Απαντ. 85
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ.

Και δύο λινκς για κάθε ενδιαφερόμενο:

 

Εισαγωγή στο "functional programming" με τη Scala από τον δημιουργό της.

https://www.coursera.org/course/progfun

 

Programming Languages. Το πρώτο τμήμα του μαθήματος ασχολείται με SML και το δεύτερο με Racket (LISP dialect)

https://www.coursera.org/course/proglang

 

Τα εχω παρακολουθήσει και τα 2, αξίζουν τον κοπο και τα 2, είτε θα χρησιμοποιήσει καποιος τις γλώσσες είτε όχι.

Να κάνω μερικές, αφελείς ίσως, ερωτήσεις;

 

1. Ποιά η διαφορά ανάμεσα σε αμιγώς συναρτησιακές γλώσσες (όπως είναι η Haskell) και γλώσσες όπως είναι οι (οικογένειες) Lisp και Prolog;

 

2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang;

Για το πρώτο ερώτημα πρέπει να γράψω έκθεση :) . Για το δεύτερο, έχοντας δει μονο τις Haskell & OCaML, η πρώτη ειναι lazy και pure by default, με οποιοδήποτε side-effect "γράφεται" με συγκεκριμένο τρόπο (βλέπε monads κλπ). H δεύτερη επιτρέπει (ευκολα) και άλλα στυλ προγραμματισμου (πχ imperative) και επίσης δεν ειναι lazy by default.

 

Καλό Σ/Κ.

Δημοσ.

 

 

 

Τα εχω παρακολουθήσει και τα 2, αξίζουν τον κοπο και τα 2, είτε θα χρησιμοποιήσει καποιος τις γλώσσες είτε όχι.

Για το πρώτο ερώτημα πρέπει να γράψω έκθεση :) .

 

Κρίμα ... ήλπιζα σε μια συνοπτική περιγραφή :) 

 

Για το δεύτερο, έχοντας δει μονο τις Haskell & OCaML, η πρώτη ειναι lazy και pure by default, με οποιοδήποτε side-effect "γράφεται" με συγκεκριμένο τρόπο (βλέπε monads κλπ). H δεύτερη επιτρέπει (ευκολα) και άλλα στυλ προγραμματισμου (πχ imperative) και επίσης δεν ειναι lazy by default.

 

Αυτά είναι, λίγο-πολύ, γνωστά. 

Ευχαριστώ πάντως.

 

Καλό Σ/Κ.

  • 3 εβδομάδες αργότερα...
  • 2 εβδομάδες αργότερα...
Δημοσ.

Ξεκίνησα να διαβάζω το Learn You a Haskell for Great Good πριν περίπου ένα χρόνο αλλά life happened και ποτέ δεν το τελείωσα μέχρι σήμερα. Πολύ καλό βιβλίο όσο διάβασα και πολύ χιούμορ ο συγγραφέας, το προτείνω. Επίσης το edX έχει εισαγωγικό e-course πάνω στη γλώσσα που ξεκινάει το ερχόμενο φθινόπωρο για όποιον ενδιαφέρεται.

 

Mια άλλη συναρτησιακή γλώσσα στην οποία ρίχνω κλεφτές ματιές τους τελευταίους μήνες είναι η Link.png Site: Elm . Κατάλληλη για web developement και με time-travel debugger επηρεασμένο από την δουλειά του Bret Victor όταν ήταν στην Apple. Δείτε την παρακάτω παρουσίαση του δημιουργού της συγκεκριμένης γλώσσας όπωσδηποτε.

http://www.infoq.com/presentations/elm-reactive-programming

 

Θέλω κάποια στιγμή επίσης στο μέλλον να ασχοληθώ με Erlang. Πολλές γλώσσες για να μάθουμε, λίγος διαθέσιμος χρόνος...:/


 

2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang;

 

Από τα ελάχιστα που ξέρω και φαντάζομαι ίσως γνωρίζεις και εσύ:

Eκτός από αυτά που είπε ο jstark, η Haskell είναι native γλώσσα ενώ η OCalm τρέχει πάνω σε VM.

Επίσης η Erlang είναι fault-tolerant και οι μηχανισμοί της για συγχρονισμό παίζουν μπάλα σε άλλο επίπεδο.

Ασχολείσαι με Go; Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang;

  • Like 1
Δημοσ.

 

 

 

Ασχολείσαι με Go; Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang;

Η Go δεν έχει καμία σχέση με την Erlang (που είναι άλλη ιστορία). Είναι αμιγώς system language -οιονεί "διάδοχος" της C. Μαλίστα, με λίγο αυθαίρετο τρόπο θα μπορούσε να πει κάποιος:

Go   <--> C

Rust <--> C++

Στο Internet θα βρεις πληθώρα από άρθρα, blogs για την παραπάνω αντιστοιχία και όχι μόνο.

Δημοσ. (επεξεργασμένο)

Η Go δεν έχει καμία σχέση με την Erlang (που είναι άλλη ιστορία). Είναι αμιγώς system language -οιονεί "διάδοχος" της C. Μαλίστα, με λίγο αυθαίρετο τρόπο θα μπορούσε να πει κάποιος:

Go   <--> C

Rust <--> C++

Στο Internet θα βρεις πληθώρα από άρθρα, blogs για την παραπάνω αντιστοιχία και όχι μόνο.

Η ερώτηση μου ήταν:

Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang;

Το ότι τα μοντέλα συγχρονισμού τους σηκώνουν σύγκριση, δεν έχει καμία σχέση με το αν έχουν σχέση οι γλώσσες αυτές καθαυτές. Για να στο κάνω πιο λιανά, ρώτησα αν γνωρίζεις τις διαφορές ανάμεσα στο CSP μοντέλο που χρησιμοποιεί η Go για συγχρονισμό με το Actor μοντέλο που χρησιμοποιεί η Erlang.

 

Kαι ο λόγος που σου κάνω αυτή την ερώτηση, ανοίγει συζήτηση συγκεκριμένα για το μοντέλο συγχρονισμού της Erlang. Μιας και παραπάνω ήθελες να μάθεις περισσότερα για τις διαφορές της με όσες άλλες ανέφερες.

 

Πάντως υπάρχει ένα μικρό overlap ανάμεσα στους τομείς χρήσης που στοχεύει η κάθε μια, αλλά αυτό ξεφεύγει από το παρόν θέμα. Όπως ξεφεύγουν και οι αντιστοιχίες που έκανες, που σηκώνουν ολόκληρη διαφορετική συζήτηση. Αν θέλεις να συζητήσουμε περί αυτών, μπορείς να ανοίξεις διαφορετικο θέμα. ;)

Επεξ/σία από brute-force
Δημοσ.

Η ερώτηση μου ήταν:

Το ότι τα μοντέλα συγχρονισμού τους σηκώνουν σύγκριση, δεν έχει καμία σχέση με το αν έχουν σχέση οι γλώσσες αυτές καθαυτές. Για να στο κάνω πιο λιανά, ρώτησα αν γνωρίζεις τις διαφορές ανάμεσα στο CSP μοντέλο που χρησιμοποιεί η Go για συγχρονισμό με το Actor μοντέλο που χρησιμοποιεί η Erlang.

 

Kαι ο λόγος που σου κάνω αυτή την ερώτηση, ανοίγει συζήτηση συγκεκριμένα για το μοντέλο συγχρονισμού της Erlang. Μιας και παραπάνω ήθελες να μάθεις περισσότερα για τις διαφορές της με όσες άλλες ανέφερες.

 

Πάντως υπάρχει ένα μικρό overlap ανάμεσα στους τομείς χρήσης που στοχεύει η κάθε μια, αλλά αυτό ξεφεύγει από το παρόν θέμα. Όπως ξεφεύγουν και οι αντιστοιχίες που έκανες, που σηκώνουν ολόκληρη διαφορετική συζήτηση. Αν θέλεις να συζητήσουμε περί αυτών, μπορείς να ανοίξεις διαφορετικο θέμα. ;)

Έχεις δίκαιο -με συγχωρείς για την άστοχη παρέμβασή μου.

  • 2 μήνες μετά...
Δημοσ.

Σήμερα ξεκινάει το μάθημα Programming Languages στο Coursera όπου θα χρηιμοποιηθούν Standard ML, Racket και Ruby ώστε να δειχθούν κάποια προγραμματιστικά concepts. Στα 2/3 του μαθήματος (βάσει και των γλωσσών) θα δωθεί έμφαση στον συναρτησιακό προγραμματισμό και κάτι ενδιαφέρον για το μάθημα, είναι βασισμένο σε αντίστοιχο μάθημα 2ου-3ου έτους του πανεπιστημίου.

 

https://www.coursera.org/course/proglang

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...