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

Προγραμματισμος σε C


Liam Lawrence

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

Ξεκίνα με c, αν σου αρέσει έχεις μέλλον στο προγραμματισμό. Ασε τη python που έχει αντικειμενοστρέφεια και είναι δύσκολη αν δε διαβάσεις κανενα βιβλίο σχετικά με αυτο το παράδειγμα -τρόπο προγραμματισμου για όταν θα διδαχτείς java στη σχολή.

Σίγουρα η C είναι αρκετά δύσκολη αλλά έτσι θα καταλάβεις αν σου αρέσει - αν πέσεις απο νωρίς στα βαθειά. Μετα όλες οι γλώσσες θα σου φαίνονται παιχνιδάκι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

Γιατί να του φαίνονται όλες οι γλώσσες παιχνιδάκι; Τι είναι, πόκεμον οι γλώσσες προγραμματισμού και πρέπει να τις μάθει όλες για να γίνει ο Κορυφαίος Προγραμματιστής; Ή μήπως είναι σκοπός του προγραμματιστή να μπορεί να μαθαίνει γρήγορα μία γλώσσα;

 

Όταν έχεις να φέρεις σε πέρας μία δουλειά, πχ με τη γλώσσα προγραμματισμου x, θα ψάξεις να βρεις τα πράγματα που χρειάζεσαι γιατί ξέρεις οτι είναι εκεί, δεν χρειάζεται να ξέρεις τη "x" σαν τη παλάμη σου. Αυτό ισχύει γιατί σχεδόν όλες οι γλώσσες είναι ισοδύναμες σε potential, το effort που χρειάζεται για να φτάσεις στο πέρας σαφώς διαφέρει.

 

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

 

ΥΓ: στη σχολή μη δώσεις ιδιαίτερη βάση σε κάποια γλώσσα, προσπάθησε να βάλεις στο πετσί σου βασικές ιδέες όσον άφορα τον προγραμματισμό. Τι σκατά είναι expression/statement; Τι σκατά είναι class/method/instance/object/(..), boolean algebra, ... κτλ κτλ κτλ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί να του φαίνονται όλες οι γλώσσες παιχνιδάκι; Τι είναι, πόκεμον οι γλώσσες προγραμματισμού και πρέπει να τις μάθει όλες για να γίνει ο Κορυφαίος Προγραμματιστής; Ή μήπως είναι σκοπός του προγραμματιστή να μπορεί να μαθαίνει γρήγορα μία γλώσσα;

 

Όταν έχεις να φέρεις σε πέρας μία δουλειά, πχ με τη γλώσσα προγραμματισμου x, θα ψάξεις να βρεις τα πράγματα που χρειάζεσαι γιατί ξέρεις οτι είναι εκεί, δεν χρειάζεται να ξέρεις τη "x" σαν τη παλάμη σου. Αυτό ισχύει γιατί σχεδόν όλες οι γλώσσες είναι ισοδύναμες σε potential, το effort που χρειάζεται για να φτάσεις στο πέρας σαφώς διαφέρει.

 

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

 

ΥΓ: στη σχολή μη δώσεις ιδιαίτερη βάση σε κάποια γλώσσα, προσπάθησε να βάλεις στο πετσί σου βασικές ιδέες όσον άφορα τον προγραμματισμό. Τι σκατά είναι expression/statement; Τι σκατά είναι class/method/instance/object/(..), boolean algebra, ... κτλ κτλ κτλ

Δεδομενου οτι για να ανοιξεις ενα file pointer στη c  θες να γραψεις ενα κιλο κωδικα να κανεις allocate μνημη κτλ και να την  απελευθερωσεις στο τελος αυτα στη python που γινονται σε λιγες γραμμες θα ειναι για αυτον πανευκολα - απο το ονομα μιας συναρτησης θα καταλαβαινει τι κανει αυτη. Ενα μονο παραδειγμα οτι η τριβη με τη C θα του διευρυνει τους οριζοντες της προγραμματιστικης σκεψης. Σκεψου κ μονο οτι στη C δεν υπαρχει String datatype ειναι array of ...  ενω σε ολες τις αλλες γλωσσες ειναι primitive datatype.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν έχεις να φέρεις σε πέρας μία δουλειά, πχ με τη γλώσσα προγραμματισμου x, θα ψάξεις να βρεις τα πράγματα που χρειάζεσαι γιατί ξέρεις οτι είναι εκεί, δεν χρειάζεται να ξέρεις τη "x" σαν τη παλάμη σου.

 

Για κάποιον ορισμό του "χρειάζεται".  ;)

 

Ενα μονο παραδειγμα οτι η τριβη με τη C θα του διευρυνει τους οριζοντες της προγραμματιστικης σκεψης. Σκεψου κ μονο οτι στη C δεν υπαρχει String datatype ειναι array of ...  ενω σε ολες τις αλλες γλωσσες ειναι primitive datatype.

 

Θεωρητικά ναι, αλλά στην πράξη δεν είναι όλα όμορφα. Η τριβή με τη C σαφώς θα διευρύνει τις γνώσεις όσον αφορά το "it's not magic" αλλά και πάλι δεν ξεφεύγεις από το γεγονός ότι ο "βαθμός διεύρυνσης" είναι τελείως αυθαίρετος. Επίσης, πολύ συχνά είναι χρήσιμο να ξεκινήσεις πρώτα από το high level concept πριν δεις το πώς γίνεται το not magic, αλλά λόγω περιορισμένου feature set της γλώσσας μπορεί να μην το δεις καν.

 

Για παράδειγμα, στη γλώσσα Χ γράφεις string και ουάου, compiler magic ενώ στη C μαθαίνεις πώς γίνεται με το χέρι (να σημειώσω εδώ ότι η ιστορική απόφαση null-terminated string σου μαθαίνει έναν πολύ κακό τρόπο να το κάνεις με το χέρι αλλά αυτό το πουλάκι έχει πετάξει εδώ και δεκαετίες). Αλλά γιατί αυτό είναι τόσο σημαντικό να γίνει με το χέρι ενώ ας πούμε το να βάλεις κάπου μια static local μεταβλητή παραμένει ουάου compiler magic? Ο λόγος που αυτά τα δύο αντιμετωπίζονται διαφορετικά από τη γλώσσα είναι καθαρά πρακτικός (όπως και παντού), αλλά με τα πρακτικά κριτήρια του 1970. Για μένα το null-terminated string είναι καλύτερο ως παράδειγμα προς αποφυγή παρά ως εργαλείο διεύρυνσης σκέψης. Το concept ότι ένα string είναι "μια σειρά από χαρακτήρες" σου το δείχνουν άμεσα όλες οι γλώσσες (class String implements CharSequence κλπ), χωρίς να σε αναγκάζουν να το χρησιμοποιείς τελείως διαφορετικά επειδή σε αντίθεση με όλα τα υπόλοιπα δεν είναι first-class type.

 

 

 

switch (str) {

    case "tragouda": // όσο κι αν προσπαθείς, δεν πρόκειται να μπεις εδώ

}

 

 

 

Όσον αφορά το feature set.

 

Ως παράδειγμα, μπορείς να κάνεις manually το κλασικό virtual dispatch με vptr, όπως επίσης και με άλλες υλοποιήσεις dynamic dispatch. Το πρόβλημα είναι πως αν δεν έχεις δει αυτό το feature σε μια άλλη γλώσσα πρώτα (όπου εκεί υλοποιείται με compiler magic) δεν υπάρχει περίπτωση να σκεφτείς μόνος σου το concept της virtual function και τη χρήση του. Δε θα διαφωνήσει κανείς ότι το καλύτερο είναι να γνωρίζεις και το concept και την υλοποίηση, αλλά αν έπρεπε να εστιάσει κανείς στο ένα από τα δύο ποιό θα ήταν χρησιμότερο; Άλλα παραδείγματα features για τα οποία ισχύει ακριβώς το ίδιο: function overloading, closures. Υπόψιν ότι αυτά τα παραδείγματα είναι τελείως mainstream και όχι σπάνια τελείως απαραίτητα για να μπορείς να προγραμματίσεις στη γλώσσα Χ πέρα από hello world επίπεδο. Με τη C όμως δε θα έχεις κανένα έναυσμα να ψαχτείς επειδή δεν υπάρχουν αρκετά language features.

 

Ως αντιπαράδειγμα, όταν κάποια στιγμή η έννοια του closure άρχισε να εμφανίζεται σε πολλές mainstream γλώσσες όπου πριν δεν υπήρχε αλλά μπορούσε εύκολα να υλοποιηθεί manually με μια class (C++, C#, Java, PHP, ...) προσωπικά είχα ήδη όλους τους απαιτούμενους ορίζοντες προγραμματιστικής σκέψης επειδή επι πολύ καιρό υλοποιούσα το ίδιο πράγμα manually. Αυτό όμως το έκανα (σε C++) επειδή ακριβώς η γλώσσα έχει αρκετά features υψηλού επιπέδου για να φτάσεις ευκολότερα στο σημείο όπου καταλαβαίνεις το concept και το υλοποιείς (το ίδιο πράγμα σαφώς μπορεί να γίνει και σε C αλλά μάλλον μόνο από το top 0.1% or less σε επίπεδο εμπειρίας, οι υπόλοιποι είτε θα πάνε σε compiler extension magic/library magic είτε θα παραμείνουν στο επίπεδο voodoo magic).

 

IMO οι περισσότερες γλώσσες θα σου διευρύνουν τους ορίζοντες (για τις υπόλοιπες epigrams on programming #19), αλλά με την άποψη πως για να διευρύνουμε ορίζοντες μια απο τις αποτελεσματικότερες λύσεις είναι να απευθυνθούμε σε 25+ χρονών γλώσσα δε μπορώ να συμφωνήσω.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ πάντως δεν καταλαβαίνω τι το κακό έχουν τα nul-terminated strings (και κατ΄επέκταση τα NULL-terminated arrays). Όπως τα πάντα, έτσι κι αυτά έχουν τα πλεονεκτήματα και τα μειονεκτήματά τους, ανάλογα που και πως τα χρησιμοποιεί κανείς.

 

Επίσης, το ότι μια γλώσσα δεν παρέχει τον τάδε ή τον δείνα τύπο ως first-class citizen, δεν είναι σημάδι γενικής κατωτερότητας της γλώσσας, αφού ως γνωστόν οι γλώσσες δεν προορίζονται όλες για τις ίδιες δουλειές, όση επικάλυψη κι αν έχουν. Όπως τα πάντα, έτσι κι αυτές έχουν τα πλεονεκτήματα και τα μειονεκτήματά τους. Αν δεν απατώμαι η C++ δεν παρέχει classes ως first-class citizens, ενώ η Java παρέχει. Τι σημαίνει αυτό, ότι η C++ είναι γενικώς χειρότερη γλώσσα από τη Java (ή ότι η Java είναι γενικώς καλύτερη γλώσσα από την C++) ;

 

Τέλος, υπάρχουν πολλά (μα πάρα πολλά) πιο στοιχειώδη που χρειάζεται να μάθει κάποιος αρχάριος πριν φτάσει στα closures και στο reflection.

 

Εγώ θα επαναλάβω την άποψή μου πως για έναν αρχάριο είναι πιο στοχειώδες να μάθει τους ορισμούς και τις διαφορές μεταξύ των 3 δημοφιλέστερων programing paradigms (imperative, oop & functional) και να πιάσει μια γλώσσα στο καθένα (π.χ. C, java & lisp, αντίστοιχα) αντί να πιάσει από την αρχή μια multi-paradigm (π.χ. C++ και python).

 

Αυτά αν έχει ορίζοντα να ασχοληθεί σοβαρά/επαγγελματικά. Αν θέλει απλώς να πάρει γεύση για να δει αν και πως θα προχωρήσει, τότε η python είναι μια χαρά πιστεύω (παρόλο που αν δεν βρει καλή πηγή εκμάθησης, κινδυνεύει να χάσει λίγο την μπάλα με την multi-paradigm φύση της γλώσσας).

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ πάντως δεν καταλαβαίνω τι το κακό έχουν τα nul-terminated strings (και κατ΄επέκταση τα NULL-terminated arrays). Όπως τα πάντα, έτσι κι αυτά έχουν τα πλεονεκτήματα και τα μειονεκτήματά τους, ανάλογα που και πως τα χρησιμοποιεί κανείς.

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

 

Παρόλα αυτά, ας τσιμπήσω. Ποια είναι τα πλεονεκτήματα που έχουν ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν δεν απατώμαι η C++ δεν παρέχει classes ως first-class citizens, ενώ η Java παρέχει. Τι σημαίνει αυτό, ότι η C++ είναι γενικώς χειρότερη γλώσσα από τη Java (ή ότι η Java είναι γενικώς καλύτερη γλώσσα από την C++) ;

Όχι, ούτε η Java παρέχει. Για την μέτρια τρολιά "γενικώς χειρότερη γλώσσα" δεν κάνω καν τον κόπο να απαντήσω, αν μη τι άλλο εδώ μιλάμε πολύ ειδικώς και σε περίπτωση που χρειάζεται φρεσκάρισμα το context ξαναδιαβάζουμε το πρώτο post στο thread.

 

Τέλος, υπάρχουν πολλά (μα πάρα πολλά) πιο στοιχειώδη που χρειάζεται να μάθει κάποιος αρχάριος πριν φτάσει στα closures και στο reflection.

 

Πιστεύεις ότι ανάμεσα σ' αυτά τα στοιχειώδη είναι ο χειρισμός των "strings" ως pointers (συν το null term το κατακαημένο) ή/και το manual memory management ακόμα και για τα απλούστερα πράγματα (π.χ. δυναμικός πίνακας);

 

Αν ναι, θα ήταν ενδιαφέρον να ακούσουμε το γιατί.

 

BTW, από το γεγονός ότι χρησιμοποιείς την όχι τόσο συνηθισμένη ορολογία "first-class citizen" (# results στο google σε σχέση με τα άλλα προς επιβεβαίωση), συν ότι αναφέρεις συγκεκριμένα Java, συν reflection (που δεν ανέφερε κανείς πριν απο σένα), συν αυτά που διαβάζω εδώ, βγάζω κάποιο συμπέρασμα που δεν είναι ιδιαίτερα όμορφο. Ο νοών νοείτω.

 

Παρόλα αυτά, ας τσιμπήσω. Ποια είναι τα πλεονεκτήματα που έχουν ?

 

:D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Θεωρητικά ναι, αλλά στην πράξη δεν είναι όλα όμορφα. Η τριβή με τη C σαφώς θα διευρύνει τις γνώσεις όσον αφορά το "it's not magic" αλλά και πάλι δεν ξεφεύγεις από το γεγονός ότι ο "βαθμός διεύρυνσης" είναι τελείως αυθαίρετος. Επίσης, πολύ συχνά είναι χρήσιμο να ξεκινήσεις πρώτα από το high level concept πριν δεις το πώς γίνεται το not magic, αλλά λόγω περιορισμένου feature set της γλώσσας μπορεί να μην το δεις καν.

 

Για παράδειγμα, στη γλώσσα Χ γράφεις string και ουάου, compiler magic ενώ στη C μαθαίνεις πώς γίνεται με το χέρι (να σημειώσω εδώ ότι η ιστορική απόφαση null-terminated string σου μαθαίνει έναν πολύ κακό τρόπο να το κάνεις με το χέρι αλλά αυτό το πουλάκι έχει πετάξει εδώ και δεκαετίες). Αλλά γιατί αυτό είναι τόσο σημαντικό να γίνει με το χέρι ενώ ας πούμε το να βάλεις κάπου μια static local μεταβλητή παραμένει ουάου compiler magic? Ο λόγος που αυτά τα δύο αντιμετωπίζονται διαφορετικά από τη γλώσσα είναι καθαρά πρακτικός (όπως και παντού), αλλά με τα πρακτικά κριτήρια του 1970. Για μένα το null-terminated string είναι καλύτερο ως παράδειγμα προς αποφυγή παρά ως εργαλείο διεύρυνσης σκέψης. Το concept ότι ένα string είναι "μια σειρά από χαρακτήρες" σου το δείχνουν άμεσα όλες οι γλώσσες (class String implements CharSequence κλπ), χωρίς να σε αναγκάζουν να το χρησιμοποιείς τελείως διαφορετικά επειδή σε αντίθεση με όλα τα υπόλοιπα δεν είναι first-class type.

 

 

 

switch (str) {

    case "tragouda": // όσο κι αν προσπαθείς, δεν πρόκειται να μπεις εδώ

}

 

 

 

 

Ναι μεν εχεις δικιο οπως το θετεις αλλα προσεξε τι του ειπα :

Να διαβασει C και αν δει οτι του αρεσει να προχωρησει στο προγραμματισμο. Εχει μεγαλες πιθανοτητες να καταληξει προγραμματιστης αν μπλεχτει με low-level απο νωρις. Δε διαφωνω με τα λεγομενα σου οτι οι αλλες γλωσσες εφεραν βελτιωση σε μια γλωσσα απαρχαιωμενη. Γι αυτο δημιουργηθηκαν αλλωστε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι μεν εχεις δικιο οπως το θετεις αλλα προσεξε τι του ειπα :

Να διαβασει C και αν δει οτι του αρεσει να προχωρησει στο προγραμματισμο. Εχει μεγαλες πιθανοτητες να καταληξει προγραμματιστης αν μπλεχτει με low-level απο νωρις. Δε διαφωνω με τα λεγομενα σου οτι οι αλλες γλωσσες εφεραν βελτιωση σε μια γλωσσα απαρχαιωμενη. Γι αυτο δημιουργηθηκαν αλλωστε.

 

Αρχίζω από το τέλος: δε θεωρώ την ίδια τη C απαρχαιωμένη (ίσως να τη θεωρήσω στο μέλλον ανάλογα πως θα πάει η Rust) μιας και τη δουλειά στην οποία προσανατολίζεται την κάνει πάρα μα πάρα πολύ καλά. Απαρχαιωμένη θεωρώ την αντίληψη πως είναι καλό για εκμάθηση/χομπίστικη χρήση να προτιμήσουμε τις ίδιες λιγοστές επιλογές που είχαμε κάποτε στο παρελθόν (πέρα από C και Pascal το χάος).

 

Πέρα απ' αυτό, και χωρίς να διαφωνώ ούτε καν με το ότι έχεις να μάθεις από τη C (όπως και η bride από τον Pai Mei), το point μου είναι ακριβώς ότι αν μπλεχτεί κανείς με low-level από νωρίς έχει περισσότερες πιθανότητες να μην καταλήξει προγραμματιστής. Γιατί προσοχή, πάνε οι καιροί που όποιος έπιανε πληκτρολόγιο στα χέρια του ήταν nerd από κούνια (εξ ανάγκης τουλάχιστον). Θα έρθει αύριο μεθαύριο κάποιος γνωστός σου άξιος αλλά άσχετος άνθρωπος να σου πει "αποφάσισα να μάθω λίγο προγραμματισμό, για πες" και θα του προτείνεις C?

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Παρόλα αυτά, ας τσιμπήσω. Ποια είναι τα πλεονεκτήματα που έχουν ?

 

Νομίζω πως καλά κανεις και τσιμπάς, διότι το 1ο που μου έρχεται στο μυαλό είναι πως στις περισότερες γλώσσες που τα strings δεν είναι nul-terminated arrays, αλλά managed, είναι immutable. Connect the dots κι ελπίζω να συμφωνήσεις για τα ΚΑΤΑ ΠΕΡΙΠΤΩΣΕΙΣ πλεονεκτήματα που προκύπτουν μονάχα από αυτό υπέρ των null-terminated arrays.

 

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

 

@defacer: Δεν πρόκειται να ασχοληθώ περί τρολλιών και λοιπά όμορφά. Το μόνο που θα σου απαντήσω είναι πως το reflection το έγραψα δίπλα στα closures.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Νομίζω πως καλά κανεις και τσιμπάς, διότι το 1ο που μου έρχεται στο μυαλό είναι πως στις περισότερες γλώσσες που τα strings δεν είναι nul-terminated arrays, αλλά managed, είναι immutable. Connect the dots κι ελπίζω να συμφωνήσεις για τα ΚΑΤΑ ΠΕΡΙΠΤΩΣΕΙΣ πλεονεκτήματα που προκύπτουν μονάχα από αυτό υπέρ των null-terminated arrays.

 

Πέραν του ότι αυτό που λες δεν ισχύει για πολλές δημοφιλείς γλώσσες (c++, ruby και php ανάμεσά τους), αυτές για τις οποίες όντως ισχύει όλες ανεξαιρέτως έχουν τη δυνατότητα να σου δώσουν mutable μνήμη να την κάνεις ο,τι θέλεις. Ειδικά για την περίπτωση που θέλεις να κάνεις τα πιο συνηθισμένα πράγματα συγκεκριμένα σε string και για κάποιο λόγο καίγεσαι από need for speed σου δίνουν έτοιμα εργαλεία για να διευκολύνεσαι (StringBuilder σε C# και Java, bytearray σε Python) ακόμα και για την περίπτωση που θέλεις και αρκετό έλεγχο αλλά και ευκολίες abstraction (c++ stringstream, C# MemoryStream με TextReader αν θέλεις απο πάνω, python StringIO).

 

Αν εννοούσες κάτι πέρα από αυτό με το connect the dots θα ήθελα να το ακούσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πέραν του ότι αυτό που λες δεν ισχύει για πολλές δημοφιλείς γλώσσες (c++, ruby και php ανάμεσά τους),

Ακόμη και να ίσχυε πάλι δεν θα ήταν επιχείρημα. Το ότι όσες γλώσσες υλοποιούν σωστό string επέλεξαν να το κάνουν immutable είναι εντελώς άσχετο με το string αυτό καθεαυτό. Εκτός αυτού, όταν σε καλεί κάποιος να υποστηρίξεις τον ισχυρισμό "τα nul-terminated char arrays έχουν πλεονεκτήματα" νομίζω πως χρειάζεται κάποιο καλύτερο επιχείρημα από το "δεν είναι immutable".

 

Κακώς μπήκα στο χορό και τον ρώτησα και κακώς ασχολείσαι και εσύ. Είναι ο κλασικός τρόπος απάντησης του migf1 όταν ζοριστεί. Βρίσκω ένα στοιχείο που να έχει τόσο δα σχέση με αυτό που μιλάμε και το πλάθω μέχρι να φανεί ότι υποστηρίζει το point μου. Πετάω και μερικές ειρωνείες τύπου "connect the dots" για να παρουσιάσω τον άλλον ότι είναι βλάκας και για αυτό δεν μπορεί να "δει" το τρανταχτό επιχείρημά μου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν, python, .net, java και javascript στις οποίες το string type είναι immutable, αποτελούν ένα πολύ μεγάλο εύρος του όρου "δημοφιλείς γλώσσες".

 

Έπειτα, το αν το manipulation του string type στην php είναι λιγότερης, μεγαλύτερης ή παρόμοιας πολύπλοκότητας από ότι στην C, λέω να το αφήσω στην κρίση των αρχαρίων (ενίοτε και των έμπειρων).

 

Τέλος, σε αυτές τις γλώσσες το πέρα δώθε conversion μεταξύ immutable και mutable strings, εκτός από μεγαλύτερο οverhead εν πολλοίς περιλαμβάνει επίσης το να μάθει ΕΠΙΠΛΕΟΝ ο αρχάρος τα τερίπια και τις μεθόδους διαφορετικών κλάσεων (σε αυτό το σημειο να συμπεριλάβω και την Objective-C στις δημοφιλείς, ελέω iOS/OSX... NSString, NSMutableString, getCString, κλπ).

 

Ομοίως λέω να αφήσω στην κρίση των αρχαρίων το αν τα oop & functional paradigms είναι περισσοτερο ή λιγοτερο βατά για ξεκίνημα από το imperative.

 

ΥΓ. Απλώς υπενθυμίζω πως κι εγώ python πρότεινα στον OP για ξεκίνημα, αλλά αν γουστάρει να ξεκινήσει με  C κανένα κακό δεν θα πάθει. Πολύ απλά θα ακολουθήσει το εκπαιδευτικό μοντέλο που θέλει κάποιον να ξεκινάει να μαθαίνει από τη βάση και να εξελίσσεται προς την κορυφή (και btw, δεν είναι υποχρεωμένος να χρησιμοποιεί μονάχα τις στάνταρ βιβλιοθήκες... μπορεί για παράδειγμα αφού μάθει και κατανοήσει τα cstrings (που δεν είναι δα και πυρηνική επιστήμη), μπορεί κάλλιστα να προχωρήσει σε 3rd-party βιβλιοθήκες, ιδανικά δημοφιλείς όπως π.χ. η beter-string ή η glib).


Ακόμη και να ίσχυε πάλι δεν θα ήταν επιχείρημα. Το ότι όσες γλώσσες υλοποιούν σωστό string επέλεξαν να το κάνουν immutable είναι εντελώς άσχετο με το string αυτό καθεαυτό. Εκτός αυτού, όταν σε καλεί κάποιος να υποστηρίξεις τον ισχυρισμό "τα nul-terminated char arrays έχουν πλεονεκτήματα" νομίζω πως χρειάζεται κάποιο καλύτερο επιχείρημα από το "δεν είναι immutable".

Κακώς μπήκα στο χορό και τον ρώτησα και κακώς ασχολείσαι και εσύ. Είναι ο κλασικός τρόπος απάντησης του migf1 όταν ζοριστεί. Βρίσκω ένα στοιχείο που να έχει τόσο δα σχέση με αυτό που μιλάμε και το πλάθω μέχρι να φανεί ότι υποστηρίζει το point μου. Πετάω και μερικές ειρωνείες τύπου "connect the dots" για να παρουσιάσω τον άλλον ότι είναι βλάκας και για αυτό δεν μπορεί να "δει" το τρανταχτό επιχείρημά μου.

 

Ειλικρινά είσαι "ότι να ναι"!

 

Μπορείς λοιπόν εσύ που δεν ζορίζεσαι να μας πεις ποια είναι η υλοποίηση του ΣΩΣΤΟY string? Το NUL-terminated, αυτό που κρατάει το μήκος στην αρχή, αυτό που κρατάει το μήκος στο τέλος, αυτό που κρατάει to μήκος σε ξεχωριστή μεταβλητή, αυτό που κρατάει το τρέχον μήκος και την χωρηστικότητα σε διαφορετικές μεταβλητές, αυτό που κρατάει το μήκος στην αρχή ή στο τέλος συν έναν ή 2 indexers για την τρέχουσα αρχή και τέλος;

 

Προφανώς αγνοείς τις "άπειρες" υλοποιήσεις που υπάρχουν για strings, αλλά επειδή εσύ δεν ζορίζεσαι έχεις την... άνεση να μας μιλάς από το πουθενά για ΣΩΣΤΟ string.

 

Τελικά όντως, κακώς μπήκες στο χορό.

 

EDIT:

 

Btw, το ότι για παράδειγμα ένα μη NUL-terminated, immutable string δεν μπορεις να το σπάσεις σε tokens απλώς βάζοντας NUL μεταξύ τους  (π.χ. strtok()) είναι προφανώς άσχετο και με το immutability και με το NUL-termnation (ωραίες ζεϊμπεκιές ρίχνεις).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@defacer

Μιλάμε για κάποιον που θα εισαχθει σε σχολή πληροφορικής οχι για κάποιον χομπίστα

 

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

 

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

 

Anyway, επειδή ο ορισμός του χομπίστα (προσωπικά: οποιοσδήποτε δεν τρώει ψωμί γράφοντας προγράμματα) δεν είναι το θέμα μας εδώ, ακόμα και να υποθέσουμε πως περνώντας τη βάση ξαφνικά δεν είσαι "χομπίστας", η θέση μου είναι πως βασικές γνώσεις προγραμματισμού είναι ένα skill που θα γίνει στο μέλλον σαν τις βασικές γνώσεις μαθηματικών -- είτε έχεις, είτε εξαρτάσαι από τρίτους για βασικά πράγματα στη ζωή. Και ακριβώς σαν τις γνώσεις μαθηματικών πρέπει να τις μεταδίδουμε με όσο το δυνατό πιο προσβάσιμο τρόπο για να "πιάνουμε περισσότερα ψάρια". Αυτοί που θα γίνουν στο μέλλον rock stars θα γίνουν έτσι κι αλλιώς, το rockstarιλίκι ποτέ δεν εξαρτάται από το τι σου μάθαινε ο δάσκαλος.

 

 

Καταρχήν, python, .net, java και javascript στις οποίες το string type είναι immutable, αποτελούν ένα πολύ μεγάλο εύρος του όρου "δημοφιλείς γλώσσες".

 

Έπειτα, το αν το manipulation του string type στην php είναι λιγότερης, μεγαλύτερης ή παρόμοιας πολύπλοκότητας από ότι στην C, λέω να το αφήσω στην κρίση των αρχαρίων (ενίοτε και των έμπειρων).

 

Τέλος, σε αυτές τις γλώσσες το πέρα δώθε conversion μεταξύ immutable και mutable strings, εκτός από μεγαλύτερο οverhead εν πολλοίς περιλαμβάνει επίσης το να μάθει ΕΠΙΠΛΕΟΝ ο αρχάρος τα τερίπια και τις μεθόδους διαφορετικών κλάσεων (σε αυτό το σημειο να συμπεριλάβω και την Objective-C στις δημοφιλείς, ελέω iOS/OSX... NSString, NSMutableString, getCString, κλπ).

 

Χαρίζουμε γέλιο κλασικά...

 

Πρώτα απ' όλα μόνος σου μετατοπίζεις το θέμα στο (άσχετο με την κουβέντα) "τα mutable strings είναι πιο γρήγορα". Πράγμα που πρώτον δεν ισχύει γενικά και δεύτερον δεν έχει σχέση με την ερώτηση που σου απεύθυνε ο ημίθεος (άλλο mutable, άλλο null term -- θα μπορούσαν κι αυτά κάλλιστα να είναι immutable). Επίσης δεν έχει να κάνει και με το θέμα του topic (αμα θες απόλυτη ταχύτητα πήγαινε να γράψεις assembly με το χέρι, δε θα φέρουμε αντίρρηση) αλλά τέλος πάντων.

 

Και στη συνέχεια όταν σου απαντάω με αναφορές πως το επιχείρημα της ταχύτητας είναι μπαρούφα γιατί στη σπάνια περίπτωση όπου σ' ενδιαφέρει πάνω απ' όλα η ταχύτητα υπάρχουν άλλα πιο κατάλληλα εργαλεία από το βασικό string, με ένα από τα κλασικά πλέον άλματα μετατοπίζεις πάλι τη συζήτηση στο ποιά είναι η syntax του string στην PHP και στο πόσα πράγματα πρέπει να ξέρει κάποιος για να κάνει master τα string types στην Obective-C.

 

Επειδή το fail είναι τόσο μεγάλο που δεν ξέρω πως να το οργανώσω, θα παραθέσω μερικά πράγματα σε points:

  • Δε μας ενδιαφέρει αν το string είναι mutable ή immutable, ούτε αν αυτός που έγραφε τον κώδικα για την class string φορούσε πράσινο tshirt. Για τα null-terminated strings έχεις να πεις κάτι; Αντιλαμβάνεσαι ότι conceptually μπορούν κι αυτά να είναι immutable, ή οι ορίζοντες της συζήτησης θα πρέπει να περιοριστούν σ' αυτά που εσύ προσωπικά έμαθες από τη C?
  • Έχεις καμιά ιδέα σχετικά με το πώς χρησιμοποιούνται τα strings στην PHP στην πράξη; Double quotes και είναι πρακτικά σαν τη C, με τη "μικρή" διαφορά ότι όσον αφορά το manipulation που λες κι εσύ μπορείς να γράψεις $greeting = "Hello $name, " . $weMissedYou σε μια γραμμή αντί να αρχίσεις τα strlen και malloc για ζέσταμα (και προσοχή μη κάνεις κανα λάθος στο μέτρημα πόσα bytes χρειάζονται έτσι?). Επίσης, τα strings στην PHP ακριβώς επειδή δεν είναι null-term είναι binary safe, κάτι που δεν ισχύει βέβαια στη C (θέλεις binary safe string? βάφτισέ το array και το πώς βρίσκουμε το μήκος πρόβλημά σου). Καλό είναι να μιλάμε για καμιά γλώσσα που ξέρουμε, γιατί με τη γνώση του 10 λεπτά google δε θα πάμε πολύ μακριά.
  • Το "πέρα δώθε conversion μεταξύ mutable και immutable strings" αναφέρεται σε κάποιο πρακτικό σενάριο που έχεις υπόψη (please give example) ή είναι σαν τις υπόλοιπες δηλώσεις σου;
  • Όσον αφορά την Objective-C, έχεις την παραμικρή ιδέα ποιός ο λόγος ύπαρξης του NSString και NSMutableString και ποιό είναι το language feature που δεν έχει η C (η C++ το έχει), ελλείψει του οποίου πάμε στη λύση NS*/NSMutable* (hint: υπάρχει επίσης NSArray/NSMutableArray, NSDictionary/NSMutableDictionary)?
Δεν περιμένω βέβαια σοβαρή απάντηση αλλά επίσης δεν πρόκειται να αφήσω να περνάνε ασχολίαστα τέτοια... πράγματα.

 

Με τα υπόλοιπα που γράφεις απλά επιβεβαιώνεις τον ημίθεο 100% όσον αφορά σ' αυτό που έγραψε παραπάνω: 

 

 

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

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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

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