Προγραμματισμός και γραμμή εντολών

...ασύγχρονα μαθήματα Τερματικού

Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό lucinos » 19 Σεπ 2012, 22:48



Δείτε το παραπάνω βιντεάκι, δεν έχει μόνο ιστορικό ενδιαφέρον.

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

Θέλω όμως να το πάω λίγο μακρύτερα. Είναι γενικότερα καλή ιδέα ακόμα και ένα πρόγραμμα γραφικού περιβάλλοντος να βασίζεται σε εργαλεία που τρέχουν στην γραμμή εντολών.
Ως ένα παράδειγμα να θυμίσω το rsync, αυτό τρέχει σε γραμμή εντολών και φυσικά δεν είναι πρόβλημα ένα εύχρηστο πρόγραμμα τού γραφικού περιβάλλοντος να το χρησιμοποιήσει. Ένα πρόγραμμα που τρέχει σε γραμμή εντολών μπορείς να το τρέξεις χωρίς προβλήματα σε διαφορετικά γραφικά περιβάλλοντα, ακόμα και χωρίς γραφικό περιβάλλον. Η μεταφορά του από ένα σύστημα σε άλλο είναι πολύ μικρότερο πρόβλημα και η χρήση του από άλλα προγράμματα είναι πολύ ευκολότερη.
Ακόμα και αν το πρόγραμμα εξορισμού έχει να κάνει με γραφικό περιβάλλον και πάλι είναι πολύ χρήσιμο οι επιλογές του να υπάρχουν στην γραμμή εντολών. Ως θετικό παράδειγμα δίνω τον vlc. Για να πάρετε μια ιδέα δώστε την εντολή:
Κώδικας: Επιλογή όλων
vlc -H

Οι επιλογές είναι τόσο πολλές που δεν μπορείτε να τις δείτε όλες, για να τις δείτε όλες χρησιμοποιήστε την less,

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

Ένα πολύ ιδιαίτερο χαρακτηριστικό τού unix (που έχει εξαχθεί και στα υπόλοιπα συστήματα) είναι οι σωληνώσεις και οι ανακατευθύνσεις. Μια ιδέα για το πόσο ισχυρό εργαλείο είναι παίρνετε από το βιντεάκι. Πολλές δουλειές που κάποιος προγραμματιστής θα υπέθετε ότι χρειάζονται ιδιαίτερο πρόγραμμα μπορούν να γίνουν με συνδυασμό προγραμμάτων μέσω σωλήνων πολύ απλά και εύκολα. Ένα χαρακτηριστικό που πρέπει να σημειωθεί είναι ότι τα προγράμματα που συνδέονται μέσω σωλήνα, τρέχουν ταυτόχρονα. Δηλαδή στο τερματικό δώστε:
Κώδικας: Επιλογή όλων
ps

Θα δείτε ότι στο τερματικό σας τρέχουν το bash (o φλοιός) και το πρόγραμμα ps.
Τρέχοντας όμως:
Κώδικας: Επιλογή όλων
ps|less

όλως περιέργως θα δείτε και την less. Δηλαδή δεν τρέχει η ps, παράγει μια έξοδο και μετά ξεκινάει η less, που την παίρνει σαν είσοδο, αλλά τρέχουν και οι δύο μαζί και συνδέεται η έξοδος τής μίας στην είσοδο τής άλλης.

Για να το δούμε στην πράξη, φανταστείτε ότι κάποιος έχει γράψει το ακόλουθο πρόγραμμα:

Κώδικας: Επιλογή όλων
#!/usr/bin/python3
#rizes.py
'''Υπολογισμός ριζών δευτεροβάθμιας εξίσωσης'''

import math

print ('Για την εξίσωση α*x^2 + β*x + γ = 0 δώστε:')
a = float (input ('α = ') )
b = float (input ('β = ') )
c = float (input ('γ = ') )

diakrinousa = b**2 - 4*a*c
if diakrinousa < 0:
    print ('Η εξίσωση δεν έχει λύση')
elif diakrinousa == 0:
    print ('βρέθηκε μία λύση:')
    print ('ρ = ', -b / (2.*a) )
else:
    print ('βρέθηκαν δύο λύσεις:')
    print ('ρ1 = ', (-b - math.sqrt(diakrinousa)) / (2.*a) )
    print ('ρ2 = ', (-b + math.sqrt(diakrinousa)) / (2.*a) )



αυτή η «διαδραστικότητα» δεν θεωρείται γενικά καλή ιδέα στο unix αλλά ακόμα και αυτό συνεργάζεται με σωληνώσεις και γενικότερα ανακατευθύνσεις:
αν για παράδειγμα έχουμε ένα αρχείο data.dat με περιεχόμενο:
Κώδικας: Επιλογή όλων
1
4
4


Η εντολή:
Κώδικας: Επιλογή όλων
./rizes.py < data.dat

θα δώσει έξοδο:
Κώδικας: Επιλογή όλων
Για την εξίσωση α*x^2 + β*x + γ = 0 δώστε:
α = β = γ = βρέθηκε μία λύση:
ρ =  -2.0

Εδώ παίρνουμε μάλλον μια ιδέα γιατί δεν είναι επιθυμητή αυτή η διαδραστικότητα στο unix. Είναι λίγο πιο δύσκολο να αξιοποιηθεί η έξοδος από άλλο πρόγραμμα. Λειτουργεί όμως!
Επίσης αρχίζουμε να εκτιμούμε και τον τελεστή "<". Δεν έχει καμμία σημασία η γλώσσα που έχει γραφτεί το πρόγραμμα, ούτε πώς έχει γραφτεί το πρόγραμμα. Ο φλοιός το αντιμετωπίζει σαν μαύρο κουτί.

Ας δούμε άλλο ένα πρόγραμμα σε python:
Κώδικας: Επιλογή όλων
#!/usr/bin/python3
#tetragwno.py

while True :
    try :
        x = input()
        x = float(x)
        print(x**2)
    except EOFError:
        break
   

Αυτό παίρνει έναν αριθμό και τον υψώνει στο τετράγωνο, επαναλαμβάνει την διαδικασία μέχρι να συναντήσει το τέλος τού αρχείου. Δοκιμάστε να τρέξετε το πρόγραμμα. Σάς θυμίζει κάτι η συμπεριφορά του (την cat ίσως) ; Έτσι όχι μόνο μπορείτε να δοκιμάζετε το πρόγραμμα εύκολα αλλά έχετε και μια πολύ καλή συνεργασία με τις ανακατευθύνσεις. Εδώ νομίζω πολλοί κάνουν λάθος. Όταν θέλουν να γράψουν ένα πρόγραμμα που διαβάζει ένα αρχείο, επεξεργάζεται τις τιμές (πχ κάνει έναν υπολογισμό) και γράφει το αποτέλεσμα σε ένα άλλο αρχείο, πάνε και ψάχνουν τις σχετικές εντολές για την συγκεκριμένη γλώσσα προγραμματισμού για να τις χρησιμοποιήσουν. Αυτό γενικά είναι κακή πρακτική. Όχι μόνο παιδεύονται περισσότερο για να κάνουν μια δουλειά που άνετα την κάνει ο φλοιός, αλλά κάνουν το πρόγραμμά τους πολύ πιο δύσκαμπτο. Το πρόγραμμα είναι δεσμευμένο να λειτουργεί με τον συγκεκριμένο τρόπο. Αν αντίθετα χρησιμοποιηθεί απλά η κανονική είσοδος και έξοδος έχουμε ένα πολύ πιο ευέλικτο πρόγραμμα να λειτουργήσει ευέλικτα χωρίς να χρειάζεται να το αλλάζουμε ούτε να το μεγαλώσουμε για να αλλάξουμε πράγματα όπως από που εισάγει δεδομένα και πού τα εξάγει.

Οι σωληνώσεις και οι ανακατευθύνσεις φυσικά δεν είναι πανάκεια. Τα παραπάνω προγράμματα υποθέτουν ότι τούς δίνουμε καλούς αριθμούς. Τι γίνεται όμως αν για παράδειγμα δώσουμε κάτι που δεν είναι αριθμός; Η python θα πετάξει σφάλμα (συγκεκριμένα ValueError). Αν αυτό δεν είναι επιθυμητό μια λύση είναι να χρησιμοποιήσουμε ένα πρόγραμμα που θα φιλτράρει τα δεδομένα ώστε η έξοδος να μην έχει πρόβλημα. Αυτό το πρόγραμμα μπορεί να συνδεθεί με σωλήνα. Όμως αυτή η λύση μπορεί να μην είναι η επιθυμητή αλλά να θέλουμε έναν πιο ευαίσθητο χειρισμό. Εδώ φαίνονται τα όρια τών σωληνώσεων. Οι σωληνώσεις μπορεί μεν να προσφέρουν λύσεις σε φαινομενικά πολύπλοκα προβλήματα αλλά στην τελική το μόνο που κάνουν είναι να συνδέουν την είσοδο και την έξοδο, έχουν μόνο μια κατεύθυνση στον τρόπου που λειτουργούν. Στις άλλες περιπτώσεις δεν εφαρμόζονται. Διαφορετικά θα μπορούσαμε να έχουμε αποκλειστικά μικρά απλά προγράμματα που συνδέονται με σωλήνες και τα μεγάλα προγράμματα θα θεωρούνταν κακή προγραμματιστική πρακτική. Δεν συμβαίνει όμως αυτό. Το ίδιο και με τις ανακατευθύνσεις προς και από αρχεία. Το γεγονός ότι μπορούμε να γράφουμε εύκολα την έξοδο σε αρχεία και να εισάγουμε εύκολα δεδομένα από αρχεία μέσω τών ανακατευθύνσεων δεν σημαίνει ότι αν θέλουμε να κάνουμε κάτι περισσότερο περίπλοκο δεν χρειαζόμαστε τις εντολές για διάβασμα και γράψιμο σε αρχεία. Από την άλλη όμως αποφύγετε να κάνετε την δουλειά έτσι αν πραγματικά δεν είναι αναγκαίο και ακόμα και αν είναι αναγκαίο υπολογίστε την δυνατότητα να χρησιμοποιηθούν οι κανονική έξοδος και είσοδος με ανακατευθύνσεις και σωληνώσεις.

Δείτε το ακόλουθο πρόγραμμα:
Κώδικας: Επιλογή όλων
#! /usr/bin/python3
# dyn.py

import sys

def dynamis(x, n, N):
    try:
        return repr( round (float(x) ** float(n), N) )
    except ValueError:
        return 'NAN'
    except ZeroDivisionError:
        return 'INF'

def main():
    n = float(sys.argv[1])
    try:
        N = int(sys.argv[2])
    except IndexError:
        N = 6
       
    while True:       
        try:
            print( dynamis( input(), n, N ) )
        except EOFError:
            break
       
if __name__ == '__main__':
    main()   


Γενικά είναι καλή ιδέα να αρθρώνετε έτσι τα προγράμματά σας ώστε να διαχωρίζεται η βασική λειτουργία (εδώ η συνάρτηση dynamis) από την διεπαφή (εδώ η συνάρτηση main) έτσι μπορείτε και να αλλάξετε εύκολα την συνάρτησή σας ώστε να την προσαρμόσετε σε νέες ανάγκες (ή για αποσφαλμάτωση) αλλά και να την χρησιμοποιήσετε από άλλα προγράμματα (εδώ μέσω τής python με την import) οπότε έχετε μια πολύ πιο ισχυρή διεπαφή (και όχι μόνο την γραμμή εντολών). Στο παραπάνω πρόγραμμα επίσης βλέπουμε και την χρήση επιλογών από την γραμμή εντολών (ο πίνακας sys.argv). Τρέχει με εντολές όπως:
Κώδικας: Επιλογή όλων
./dyn.py -1.2 10

οπότε υψώνει στην -1.2 με 10 δεκαδικά ψηφία ακρίβεια.

Ο φλοιός (όπως το bash) μπορεί να χρησιμοποιηθεί και ο ίδιος σαν γλώσσα προγραμματισμού και θεωρητικά έχει τα αναγκαία στοιχεία όπως βρόχους και ελέγχους ροής, αλλά ως γλώσσα προγραμματισμού είναι ιδιαιτέρως ακατάλληλος. Θα έλεγα φρίκη. Έτσι χρειαζόμαστε τις άλλες γλώσσες προγραμματισμού για τις προγραμματιστικές μας ανάγκες. Δεν προτείνεται ούτε για να μάθει κάποιος προγραμματισμό. Κατά την γνώμη μου κάποιος είναι πολύ καλό να μάθει όσο γίνεται γρηγορότερα τα βασικά στην γραμμή εντολών (αυτά πρακτικά που έχω βάλει στην κυρίως σειρά μαθημάτων) ώστε να κατανοήσει καλύτερα το σύστημα αλλά μετά να μην συνεχίσει απευθείας σε περισσότερο φλοιό μαθαίνοντας για τα σενάρια. Για κάτι τέτοιο είναι πιο ακατάλληλος για να μάθει κάποιος προγραμματισμό από βασικές γλώσσες όπως η C ή η FORTRAN. Το καλύτερο είναι να μάθει τα βασικά σε μια γλώσσα που θέματα όπως η χρήση συναρτήσεων, η χρήση μεταβλητών, οι βρόχοι και ο έλεγχος ροής είναι ιδιαιτέρως εύκολα και η ιδανική γλώσσα είναι μάλλον η Python. Μετά από αυτό έχει τα βασικά εφόδια ώστε να πάρει όποια κατεύθυνση θέλει. Μπορεί να ασχοληθεί με οποιαδήποτε γλώσσα όπως η C, η FORTRAN, η Java, η Python, η Perl, η Ruby, η Bash κλπ.

Πρόταση για βιβλίο: The Art of Unix Programming
Τελευταία επεξεργασία από lucinos και 23 Σεπ 2012, 11:17, έχει επεξεργασθεί 3 φορά/ες συνολικά
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό eliasps » 20 Σεπ 2012, 00:59

Πιστεύω ότι η καταλληλότερη γλώσσα για να κάνει κάποιος τα πρώτα του βήματα στον κόσμο του προγραμματισμού, είναι η C. Έχει πολλές ιδιαιτερότητες και δυσκολίες σε σχέση με άλλες γλώσσες υψηλότερου επιπέδου, αλλά θεωρώ πως είναι ιδανική για την κατανόηση διαφόρων αρχών του προγραμματισμού και για να αποκτήσει κάποιος εμπειρία. Μετά, η μετάβαση σε οποιαδήποτε άλλη γλώσσα θα είναι πιο εύκολη. Και ακόμα ευκολότερη θα είναι η μετάβαση σε bash programming. Η γραμμή εντολών, θα είναι περισσότερο οικεία γενικότερα.

Οι μόνες γλώσσες που έχω διδαχθεί και γνωρίζω, είναι η C και η FORTRAN. Και ήδη έχω δημιουργήσει μία εφαρμογή γραμμένη σε Java και obj-C και γράφω άλλες δύο σε Python, χωρίς να έχω αντιμετωπίσει κάποια μεγάλη δυσκολία ή να έχω συναντήσει κάποιο πρόβλημα. Και δεν μου αρέσει ιδιαίτερα ο προγραμματισμός.

@lucinos
Έχω διαβάσει το Advanced Programming in the Unix Environment, την δεύτερη έκδοση (κάπου αναφέρεται στο link του βιβλίου που προτείνεις). Είναι αρκετά αναλυτικό και έχει πολλά να προσφέρει, αν και είναι σχετικά outdated, οι βάσεις που θέτει είναι πολύ χρήσιμες και για τα λειτουργικά της εποχής. Oπότε το προτείνω σε όποιον ενδιαφέρεται για προγραμματισμό και λειτουργικά της οικογένειας Unix.
Θα ακολουθήσω την πρότασή σου και θα διαβάσω το The Art of Unix Programming, γιατί από μία γρήγορη ματιά που έριξα στα περιεχόμενα, φαίνεται πολύ ενδιαφέρον.
Άβαταρ μέλους
eliasps
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4017
Εγγραφή: 16 Δεκ 2011, 22:25
Τοποθεσία: Αθήνα, Αττική
Launchpad: eliasps
IRC: eliasps
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό lucinos » 20 Σεπ 2012, 20:24

@eliasps
το Advanced Programming in the Unix Environment στην έκδοση που είδα επίσης αναφέρει το The Art of Unix Programming. Είναι δηλαδή αμοιβαία η αναφορά! Τα δύο βιβλία όμως έχουν εντελώς διαφορετικούς σκοπούς.

Διαφωνώ μαζί σου ως προς τα πρώτα βήματα. Η C, η FORTRAN και η LISP είναι γλώσσες κλασσικές και προφανώς κάπως σημαντικότερες από τις άλλες, Σίγουρα κάποιος που θέλει λίγο βαθύτερη γνώση πρέπει να περάσει για λίγο από την C. Προφανώς δεν υπάρχει μόνο ιστορικό ενδιαφέρον σε αυτές. Από την άλλη όταν εγώ λέω πρώτα βήματα εννοώ κάτι πολύ διαφορετικό.

Συγκεκριμένα πιστεύω ότι πρέπει κάποιος πρώτα να εξοικειωθεί με τον να παίζει με τούς διαφόρους τύπους (ιδιαιτέρως με νήματα, ακεραίους και αριθμούς κινητής υποδιαστολής και τύπους αληθείας), να χρησιμοποιεί μεταβλητές και να κάνει πράξεις αριθμητικές και λογικές (πιστεύω επίσης ότι είναι καλή ιδέα να δει ένα παράδειγμα υπερφόρτωσης τελεστών όπως η πρόσθεση νημάτων στην Python) να χρησιμοποιεί επίσης συναρτήσεις (το def στην Python), έλεγχο ροής (if στην Python), και βρόχους (for και while). Σε αυτό το σημείο είναι σε θέση να λύνει απλά αριθμητικά προβλήματα και να φτιάχνει απλά παιχνιδάκια (τύπου http://inventwithpython.com/ ).

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

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

Φυσικά κάποιος ο οποίος αποφασίζει ότι θέλει να μάθει την χ γλώσσα για τον ψ λόγο είναι πολύ λογικό να πάει κατευθείαν εκεί και να μην κάνει την «παράκαμψη» τής Python (εξάλλου η Python δεν υπήρχε από πάντα). Αν η χ γλώσσα είναι η C και ο ψ λόγος είναι η κατανόηση τού unix τότε μαζί σου, συμφωνώ να κάνει τα πρώτα βήματα με C, αρκεί να είναι βέβαιος ότι αυτό θέλει. Αν κάποιος ο οποίος δεν έχει ασχοληθεί ποτέ με προγραμματισμό πει ότι θέλει να ασχοληθεί με σενάρια bash η αντίδρασή μου θα ήταν ότι δεν θα πίστευα ότι ξέρει τι θέλει, βέβαια το τι πιστεύω εγώ για αυτόν δεν έχει σημασία, ίσως αρκεί να το πιστεύει αυτός για τον εαυτό του.

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

Δεν αμφιβάλλω ότι δεν θα είχαν όλα τα παιδιά το ίδιο ενδιαφέρον και την ίδια όρεξη για να προχωρήσουν με την ίδια ταχύτητα (και δεν πιστεύω επίσης ότι πρέπει να ισοπεδώνονται σε μία συγκεκριμένη πορεία) αλλά πιστεύω ότι όλα τα παιδιά θα μπορούσαν να έχουν μια ικανοποιητική εξοικείωση χωρίς δυσκολία μέχρι το τέλος τού γυμνασίου (δεν εννοώ να έχουν γίνει προγραμματιστές, εννοώ τα λίγα απλά που είπα παραπάνω). Δεν πιστεύω ούτε ότι πρέπει να γίνουν όλα τα παιδιά (ούτε καν ένα σημαντικό ποσοστό) προγραμματιστές. Οι άνθρωποι εξειδικεύονται και αυτό πρέπει να το θεωρούμε φυσικό, αλλά όπως πιστεύω ότι όλα τα παιδιά πρέπει να έχουν επαφή με την αριθμητική και την γεωμετρία (χωρίς να σημαίνει ότι θα γίνουν μαθηματικοί) έτσι όλα τα παιδιά θα πρέπει να έχουν επαφή με τον προγραμματισμό.
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό eliasps » 20 Σεπ 2012, 21:47

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

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

Μίλησα συγκεκριμένα για την C, επειδή μπορεί να βοηθήσει στην κατανόηση των λειτουργικών συστημάτων σε υπερπολλαπλάσιο βαθμό από αυτόν της Python. Οπότε ναι, την προτείνω για την κατανόηση των Unix λειτουργικών και όχι μόνο.

Το κλειδί είναι αυτό που έγραψες. Αν κάποιος έχει τους y λόγους για να μάθει προγραμματισμό, θα πρέπει βάσει αυτών, να επιλέξει την x γλώσσα.
-Άμα κάποιος θέλει να ασχοληθεί με τον προγραμματισμό, για την δημιουργία εφαρμογών στο Ubuntu, η Python συνιστάται και προτιμάται από την πλειοψηφία των Ubuntu developers.
-Άμα κάποιος θέλει να ασχοληθεί με τον προγραμματισμό, για την κατανόηση των λειτουργικών συστημάτων Unix (-like), ποιά γλώσσα είναι πιο κατάλληλη από την native των Unix, την C;
Αλλά όπως έγραψα παραπάνω, πιστεύω καλύτερο είναι να μάθει κάποιος τον λογισμό του προγραμματισμού πρώτα, και μετά να ασχοληθεί με μία γλώσσα.

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

Φαντάζομαι έχεις διαβάσει το γνωστό ρητό που συναντάται σχεδόν πάντα σε τέτοιου είδους συζητήσεις:
Άμα έχεις μεγάλη εμπειρία στον προγραμματισμό, για να μάθεις μία νέα γλώσσα, θα χρειαστείς μία γαβάθα καφέ για το διάβασμα.
Άμα έχεις κάποια σχετική εμπειρία, θα χρειαστείς ένα φορτηγό καφέ.
Αμα δεν έχεις εμπειρία, θα χρειαστείς τον καφέ από τα βουνά της Κολομβίας.


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

Αυτά ήταν τα δικά μου πρώτα βήματα στον προγραμματισμό, η πρώτη γλώσσα που έμαθα ήταν η C, αφού προηγουμένως είχα πάρει κάποια βάση από ψευδογλώσσα. Kαι όσες ακολούθησαν στην συνέχεια μου φάνηκαν ευκολότερες. Bέβαια η λεπτομέρεια που όπως είπα, κάνει την διαφορά σε εμένα, σχετικά με άλλους προγραμματιστές, είναι εγώ δεν διδάχθηκα την γλώσσα μόνος μου, όπως κάνουν πολλοί προγραμματιστές, αλλά μου την έμαθαν.
Άβαταρ μέλους
eliasps
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4017
Εγγραφή: 16 Δεκ 2011, 22:25
Τοποθεσία: Αθήνα, Αττική
Launchpad: eliasps
IRC: eliasps
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό lucinos » 03 Οκτ 2012, 08:55

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

Διαφωνώ με την λογική τής «προετοιμασίας» μέσω ψευδογλώσσας. Επίσης διαφωνώ ότι πρέπει πρώτα να πάμε στις «μετα-έννοιες». Για τον ίδιο λόγο που δεν πας να εξηγήσεις τι είναι το ρήμα και τι είναι το αντικείμενο, τι είναι η γενική κλίση κλπ σε ένα μωρό που δεν ξέρει να μιλάει. Πρώτα θα μάθει να μιλάει και αυτό θα γίνει ακολουθώντας το παράδειγμα τών άλλων.

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

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

Σχετικά με την σύγκριση τής Python με ψευδογλώσσα, όπως είπα για μια πρώτη γεύση προγραμματισμού όχι μόνο άνετα μπορεί να διδαχθεί κάποιος την αλγοριθμική λογική τού προγραμματισμού κατευθείαν σε Python, αλλά πιστεύω ότι είναι και ο ενδεδειγμένος τρόπος. Επιπλέον η Python είναι μια «κανονική» γλώσσα προγραμματισμού που μπορεί να τρέξει άμεσα και πολύ ισχυρότερη από την ΓΛΩΣΣΑ για παράδειγμα (επίσης ίσως είναι προσωπικό γούστο αλλά την βρίσκω και πιο «φυσική» από την ΓΛΩΣΣΑ) και η προσωπική μου εμπειρία είναι ότι δεν υπάρχει ανάγκη γνώσης τής Αγγλικής γλώσσας (αλλά μονάχα εξοικείωσης με το λατινικό αλφάβητο).

Δυστυχώς η γνώμη μου είναι ότι το σχολείο θεωρητικολογεί υπερβολικά, ρίξε μια ματιά στα βιβλία Το μάθημα τής πληροφορικής ξεκινάει να εξηγήσει «τι είναι πληροφορία» και συνεχίζει έτσι και χειρότερα μέχρι το τέλος τού γυμνασίου. (δημοτικό δεν βλέπω να έχει υπολογιστές). Αυτήν την «σχολική» λογική την έχω σιχαθεί και δεν καταλαβαίνω γιατί τυραννάμε τα παιδιά με αυτόν τον τρόπο.
Τελευταία επεξεργασία από lucinos και 03 Οκτ 2012, 09:40, έχει επεξεργασθεί 1 φορά/ες συνολικά
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό ChrisMiNT » 03 Οκτ 2012, 15:17

Αναρωτιέμαι τι συνέβη στην παλιά καλή BASIC.. Δεν έχω κάνει προγραμματισμό σε Python αλλά η C θεωρώ ότι είναι ακατάλληλη για διδασκαλία προγραμματισμού. Ο σκοπός είναι να μάθεις το πως θα εφαρμόσεις ένα αλγόριθμο και όχι ποιο (,{, %, & ή * να βάλεις που. Επίσης θεωρώ λάθος τα παραδείγματα που χρησιμοποιούνται (δεν ξέρω βέβαια τι κάνουν πλέον αλλά απ' όσο θυμάμαι) κανένας δεν ασχολήθηκε με προγραμματισμό σε αυτή την ηλικία επειδή ήθελε να υπολογίσει μια διακρίνουσα αλλά γιατί ήθελε να φτιάξει κάτι ενδιαφέρον, πιο συγκεκριμένα παιχνίδια, και σίγουρα όχι text adventure. Οπότε θέλουμε να διδάξουμε μια γλώσσα που να έχει τα βασικά: arrays, matrices, pointers etc, αλλά και πολύ εύκολη πρόσβαση στα γραφικά. Η C δεν το κάνει αυτό...
Και για να ελαφρύνουμε λίγο:
http://www.ariel.com.au/jokes/The_Evolu ... ammer.html
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.04 raring 3.8.0-29-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 AMD Athlon II X4 635 Processor ‖ RAM 2505 MiB ‖ ASUS INC. M2N-SLI DELUXE
4 nVidia GT218 [GeForce 210] [10de:0a65] {nvidia}
5 eth0: nVidia MCP55 Ethernet [10de:0373] (rev a2) ⋮ eth1: nVidia MCP55 Ethernet [10de:0373] (rev a2)
ChrisMiNT
babeTUX
babeTUX
 
Δημοσιεύσεις: 148
Εγγραφή: 03 Φεβ 2012, 15:27
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό lucinos » 03 Οκτ 2012, 17:19

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

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

ChrisMiNT έγραψε:Αναρωτιέμαι τι συνέβη στην παλιά καλή BASIC.. Δεν έχω κάνει προγραμματισμό σε Python αλλά η C θεωρώ ότι είναι ακατάλληλη για διδασκαλία προγραμματισμού. Ο σκοπός είναι να μάθεις το πως θα εφαρμόσεις ένα αλγόριθμο και όχι ποιο (,{, %, & ή * να βάλεις που.

Συμφωνώ μαζί σου για την C, αν και δεν την θεωρώ και τόσο κακή από κάποιες απόψεις, κάποιος που ασχολείται αρκετά με το unix δεν βλέπω πώς μπορεί να την αποφύγει. Η BASIC είναι η αγαπημένη μου γλώσσα, από εκεί ξεκίνησα. Δυστυχώς μάς άφησε χρόνους. Την σκότωσε η κυριαρχία τής microsoft (βλέπε Visual Basic). Η μεγαλύτερη ελπίδα αναβίωσης είναι ίσως η Gambas, αλλά δεν μπορώ να την προτείνω γιατί ακόμα δεν έχει ικανοποιητική τεκμηρίωση, και επιπλέον ακόμα και αν αποκτήσει, πάλι πιστεύω την Python σαν καταλληλότερη για τα πρώτα βήματα. Έριξα μια ματιά και στην Ruby, ούτε αυτή με έκανε να αλλάξω γνώμη για την θέση τής Python σαν καλύτερης γλώσσας για πρωτάριδες.

ChrisMiNT έγραψε:πιο συγκεκριμένα παιχνίδια, και σίγουρα όχι text adventure. Οπότε θέλουμε να διδάξουμε μια γλώσσα που να έχει τα βασικά: arrays, matrices, pointers etc, αλλά και πολύ εύκολη πρόσβαση στα γραφικά. Η C δεν το κάνει αυτό...

Η Python είναι πολύ καλή γλώσσα και για αυτό αλλά διαφωνώ μαζί σου στο «όχι text adventure». Απλά παιχνίδια κειμένου όπως είναι τα text adventure είναι από τις πλέον λογικές ιδέες (μερικές ακόμα μπορείς να δεις στο http://inventwithpython.com/ ). Και το να αφήσουμε τα παιδιά να παίξουν με αριθμητικούς υπολογισμούς είναι καλή ιδέα, η οποία πιστεύω μπορεί να συνδυαστεί με μάθημα μαθηματικών ίσως περισσότερο από μάθημα υπολογιστών. Πιστεύω σαν πολύ καλή ιδέα να μάθουμε τα παιδιά να κάνουν πράξεις σε μια γλώσσα προγραμματισμού και να χρησιμοποιούν μεταβλητές.
Από την άλλη διαφωνώ ότι είναι οπωσδήποτε καλή ιδέα να προχωρήσουμε σε κανονικά γραφικά παιχνίδια. Ο λόγος που διαφωνώ είναι ότι πάει μακρυά η βαλίτσα. Χρειάζεται πολύ ενδιαφέρον από τα παιδιά για να προχωρήσουν σε κάτι τόσο προχωρημένο. Δεν είναι αδύνατο όπως δεν είναι αδύνατο να προπονήσεις ένα παιδί να παίζει καλό σκάκι, αλλά χρειάζεται μια κάποια αφοσίωση που κάποια παιδιά θα την δείξουν (και πρέπει να έχουν την ευκαιρία να εκφράσουν την δημιουργικότητά τους) αλλά εγώ δεν την περιμένω από όλα τα παιδιά.
Φυσικά υπάρχουν και κάποιες εύκολες περιπτώσεις για να μην μείνουμε κολλημένοι στο απλό κείμενο. Η μία είναι τα γνωστά γραφικά χελώνας (η Python έχει την turtle κανονική βιβλιοθήκη). Αλλά μπορούν να υπάρξουν και άλλες ιδέες. Ένα ωραία διδακτικό παράδειγμα είναι το laby: https://wiki.ubuntu.com/Edubuntu/AppGuides/laby Άφησα ένα ανιψάκι μου να παίξει, με ελάχιστη βοήθεια (την περισσότερη ώρα απλά το άφηνα μόνο του στον υπολογιστή) και σε λίγες ώρες τα κατάφερνε πολύ καλά. Για να συνοψίσω την άποψή μου, το κείμενο είναι απαραίτητο στάδιο τού προγραμματισμού, υπάρχουν κάποιες εύκολες περιπτώσεις παιχνιδιών με γραφικά (μάλιστα μερικές μπορεί να είναι ευκολότερες από το απλό κείμενο), αλλά η δημιουργία παιχνιδιών με γραφικά πάει αρκετά μακρυά και δεν πιστεύω ότι όλα τα παιδιά θα είχαν την διάθεση να προχωρήσουν τόσο.
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Προγραμματισμός και γραμμή εντολών

Δημοσίευσηαπό ChrisMiNT » 04 Οκτ 2012, 14:51

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

Προφανώς δεν αναφερόμουν σε 3d graphics κτλ, άλλωστε και εγώ που έχω περάσει γραμμικές άλγεβρες, αναλυτικές γεωμετρίες και δεν συμμαζεύεται τα βρίσκω τρομερά δύσκολα. Εκείνο που λέω είναι να δώσουμε την δυνατότητα να δημιουργήσεις απλά πράγματα, γρήγορα, τα οποία να δίνουν γρήγορη ικανοποίηση. Για παράδειγμα στο εγχειρίδιο της BASIC του Atari 130XE που είχα, είχε μερικά πολύ απλά παραδείγματα στα οποία μπορούσες να χτίσεις και να κάνεις ωραία πράγματα. Προφανώς και το text mode είναι απαραίτητο αλλά ας έχουμε και τη δυνατότητα να κάνουμε απλά γραφικά.

Η GAMBAS μου φάνηκε πάντως πολύ περίπλοκη...

Υ.Γ. Ποτέ δεν κατάλαβα με ποια λογική η MS ονόμασε την VB, BASIC
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.04 raring 3.8.0-29-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 AMD Athlon II X4 635 Processor ‖ RAM 2505 MiB ‖ ASUS INC. M2N-SLI DELUXE
4 nVidia GT218 [GeForce 210] [10de:0a65] {nvidia}
5 eth0: nVidia MCP55 Ethernet [10de:0373] (rev a2) ⋮ eth1: nVidia MCP55 Ethernet [10de:0373] (rev a2)
ChrisMiNT
babeTUX
babeTUX
 
Δημοσιεύσεις: 148
Εγγραφή: 03 Φεβ 2012, 15:27
Εκτύπωση


Επιστροφή στο Μαθήματα Τερματικού