Αλλά τι είναι ένας υπολογιστής

...συζητήσεις περί τεχνολογίας για hardware, software, υπηρεσίες, κλπ (για ubuntu ... στο Γενικά)

Συντονιστές: Geochr, ubuderix

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό bullgr » 28 Νοέμ 2008, 13:48

kzlazy έγραψε:Ας συνεισφέρω για όσους ενδιαφέρονται ότι υπάρχει ένα ωραιότατο βιβλίο του Χρίστου Χ.Παπαδημητρίου με τίτλο Tούρινγκ / Μαθήματα αγάπης από τις εκδόσεις Λιβάνη

Υπόψιν ότι τα άρθρα πρέπει να είναι "open source"... Μην αρχίσουν να μας κυνηγάνε οι εκδοτικές εταιρίες... :mrgreen:
Μπορούμε να εμπνευστούμε από κάποιο βιβλίο, να πάρουμε ιδέες, αλλά το άρθρο θα πρέπει να είναι δικό μας, με δικά μας λόγια και όχι αντιγραφή από copyrighted υλικό...
ΕΠΙΤΡΕΠΕΤΑΙ ΝΑ ΠΕΣΕΙΣ, ΕΠΙΒΑΛΛΕΤΑΙ ΝΑ ΣΗΚΩΘΕΙΣ... HASTA SIEMPRE...
Άβαταρ μέλους
bullgr
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 1853
Εγγραφή: 10 Μάιος 2008, 21:45
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό Dimitris » 28 Νοέμ 2008, 14:06

Πάλι offtopic:

To βιβλίο για να είμαι ειλικρινής δεν το χω διαβάσει, θα το τσεκάρω στις διακοπές :D . Αλλά τις πληροφορίες που παραθέτω, μπορεί να τις βρει κανείς στα παράκατω βιβλία (και σε πολλά άλλα που δεν αξίζουν τόσο), οπότε όποιος ενδιαφέρεται θα τα βρει απολαυστικότατα. Ορισμένα ίσως να θέλουν κάποιες τεχνικές γνώσεις.
Feynman, Lectures on Computation (Μετά τα πρώτα κεφάλαια οι τεχνικές προαπαιτήσεις αυξάνονται αρκέτα)
Penrose, The Emperor's New Mind
και φυσικά στη wikipedia.

edit: Σε καμία περίπτωση δεν αντέγραψα κάτι. Όλα είναι δημιουργήματα της φαντασίας μου και υπάγονται στην creative commons licence. :D
Τελευταία επεξεργασία από Dimitris και 08 Δεκ 2008, 22:12, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό kzlazy » 29 Νοέμ 2008, 01:29

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

Πότε έρχεται η συνέχεια?
Now there sits a man with an open mind. You can feel the draft from here...
Groucho (τι θα πει ποιός Groucho) ?

Επίπεδο Γνώσεων: Linux: Μέτριο / Προγραμματισμός: Όχι / Αγγλικά: Καλά
Arch 64b με KDE
Acer Aspire 5680 laptop / Intel core 2 duo / 2 x 2048 Mb / nVidia GeForce Go 7600 / 1280x800
Άβαταρ μέλους
kzlazy
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 626
Εγγραφή: 09 Ιούλ 2008, 15:02
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό Dimitris » 08 Δεκ 2008, 20:25

Στο τελευταίο μέρος αυτού του νήματος είδαμε τι είναι οι δείκτες, θέσεις μνήμης δηλαδή που δείχνουν σε μια άλλη θέση μνήμης--περιέχουν τη διεύθυνση της μνήμης αυτής. Εδώ θα δούμε πως μπορούν να χρησιμοποιηθούν οι δείκτες κατά τον προγραμματισμό, χωρίς να γράψουμε ούτε μία γραμμή κώδικα. Για το λόγο αυτό είναι απαραίτητο να εισηχθούν κάποιες καινούριες έννοιες οι οποίες είναι γνωστές και στα χρηματοοικονομικά, όπως ουρά αναμονής, first in first out (FIFO), last in first out (LIFO) και άλλα.

Πριν απ'όλα πρέπει όμως να εξηγήσουμε τί είναι οι αγωγοί ή δίαυλοι (pipes). Τους χρησιμοποιούμε καθημερινά κι όμως είναι ό,τι καλύτερο έχει συμβεί στην ιστορία του unix και των υπολογιστών γενικότερα. Ας δούμε μια απλή εντολή πιο αναλυτικά:
Κώδικας: Επιλογή όλων
ps aux | grep ps

Η εντολή ps με τα ορισματα aux τυπώνει όλες τις διεργασίες που τρέχουν στον υπολογιστή από όλους τους χρήστες. Η εντολή grep ψάχνει για το συνδυασμό γραμμάτων ps. Το αποτέλεσμα θα είναι όλες εκείνες οι γραμμές της εντολής ps που περιέχουν το συνδυασμό γραμμάτων ps. Αυτό που συμβαίνει είναι το αποτέλεσμα της πρώτης εντολής να διοχετεύεται σαν είσοδος στην πρώτη. Αλλά πως διοχετεύεται; Στην πραγματικότητα δημιουργείται ένα είδος αρχείου--έχει κάποιες διαφορές από τα συνηθισμένα αρχεία--που ονομαζεται pipe. Στο αρχείο αυτό γράφονται τα αποτελέσματα της πρώτης εντολής και διαβάζονται από τη δεύτερη.

Αλλά πώς γράφονται και πώς διαβάζονται; Με ποιά σειρά; Κι εδώ ακριβώς μπαίνει στο παιχνίδι η ρευστομηχανική, τα χρηματοοικονομικά και η ακαταστασία σε κάθε γραφείο. Μιά στίβα από χαρτιά σε ένα γραφείο λειτουργεί ως εξής: βάζεις το πρώτο χαρτί, και έπειτα το επόμενο χαρτί το ακουμπάς πάνω στο προηγούμενο. Όταν θες να πάρεις κάτι παίρνεις το πάνω πάνω. (Υπάρχει και η αναζήτηση, αλλά την αφήνουμε για το μέλλον, είναι πιο πολύπλοκη.) Επειτα έχουμε ένα λάστιχο με νερό. Αν βάλουμε νερό στη μία ακρη τότε θα βγει από την άλλη, κι αν ρίξουμε κι άλλο νερό τότε θα βγεί από την άλλη άκρη μόνο αν το αρχικό νερό που βάλαμε έχει αδειάσει. Τέλος πάμε στη ΔΕΗ ή στον ΟΤΕ να πληρώσουμε τα χρέη μας και πληρώνουμε με τις ώρες στην ουρά. Όσο πιο νωρίς πάμε τόσο νωρίτερα θα εξυπηρετηθούμε, εκτός φυσικά κι αν κάποιος κλέψει. Όλα τα παραπάνω είναι παραδείγματα από ουρές που παρατηρούνται και εφαρμόζονται ακόμη και στους υπολογιστές. Το παράδειγμα του αγωγού που χρησιμοποιήσαμε παραπάνω είναι ένα κλασικό παράδειγμα FIFO, ό,τι δηλαδή μπαίνει πρώτο βγαίνει και πρώτο. Αντίθετα η στίβα πάνω στο γραφείο μας είναι ένα παράδειγμα LIFO, last in first out, γιατί ό,τι μπαίνει τελευταίο βγαίνει πρώτο.

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

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

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

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

Για να κάνουμε τα πράματα ακόμη πιο ενδιαφέροντα μπορούμε να έχουμε μία κυκλική δομή όπου το τελευταίο στοιχείο δείχνει στο πρώτο ή ακόμη πιο πολύπλοκες δομές όπου ένα παρακλάδι ενός δέντρου δείχνει σε ένα κλαδί σε κάποιο άλλο σημείο του δέντρου ή (η φαντασία σας μπορεί να οργιάσει) δύο δέντρα όπου ένα κλαδί του πρώτου δέντρου δείχνει σε ένα παρακλάδι του δευτερου (μήπως αυτό δε συμβαίνει σε οργανισμού όπως κισσός, δεν είμαι και βιολόγος αλλά έψαχνα να βρώ ένα φυσικό ανάλογο.)
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό ilpara » 08 Δεκ 2008, 21:06

:D :D :D ταλέντο στο να γράφεις ή να διδάσκεις :!: απολαυστικό το κείμενο :D :D :D
*Oδηγίες προς Nεοεισερχόμενους*ΟδηγοίLive chat (IRC)
⇛ Linux: Μέτριο ┃ Προγραμματισμός: Όχι ┃ Αγγλικά: Καλά
⇛ Ubuntu 12.04 32bit
⇛ Dell M4300: T7500 (2.2GHZ 4MB) ┃ 2GB ┃ NVIDIA Quadro FX 360M (256MB) ┃ Intel 4965 ┃ 15.4" WUXGA
Άβαταρ μέλους
ilpara
powerTUX
powerTUX
 
Δημοσιεύσεις: 2250
Εγγραφή: 11 Μάιος 2008, 11:43
Τοποθεσία: Αθήνα-Βύρωνας
IRC: ilpara
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό giormatsis » 08 Δεκ 2008, 21:26

Μεγάλο ΜΠΡΑΒΟ!!! και απο εμένα
"Any society that would give up a little liberty to gain a little security will deserve neither and lose both."
Επίπεδο Γνώσεων: Linux: /Μέτριο / Προγραμματισμός: Όχι/ Αγγλικά: Καλά/
Compaq nc6120 512 Ram Ubuntu 10.4
Άβαταρ μέλους
giormatsis
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 438
Εγγραφή: 12 Μάιος 2008, 07:55
Τοποθεσία: Λουτράκι
IRC: giormatsis
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό Dimitris » 24 Σεπ 2013, 01:29

Η απάντηση είναι: "ένα κουτί". Η ερώτηση ήταν: "Αλλά τι είναι ένας υπολογιστής".

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

Κι επειδή στη φιλοσοφία δεν είμαι καλός, ας πω έξω από τα δόντια την πικρή αλήθεια. Ποια η σχέση του προβλήματος P vs NP, του δεύτερου θερμοδυναμικού αξιώματος και της μη αντιστρεψιμότητας, της κατάρρευσης της κυματοσυνάρτησης στην κβαντομηχανική και της κβαντικής βαρύτητας, και φυσικά της ανθρώπινης νόησης; Δε ξέρω.

Ας δούμε όμως μια μικρή και ασήμαντη ιδέα που μου κέντρισε το ενδιαφέρον. Code transformation. Έχουμε ένα κομμάτι κώδικα, οτιδήποτε. Έχετε σκεφτεί ποτέ ότι θα μπορούσε να ήταν δεδομένα αντί για κώδικας; Ίσως να ήταν δεδομένα εισόδου για κάποιον άλλο κώδικα; Ας δούμε τα goto της fortran ως code transformation (έχω ένα κόλλημα με τα goto). Το παρακάτω παράδειγμα είναι σε python:
Κώδικας: Επιλογή όλων
goto100 = "a=1; exec(goto400)"
goto200 = "a=2; exec(goto400)"
goto300 = "a=3; exec(goto400)"
goto400 = "b=1"

x=0

if x<0:
exec(goto100)
elif x==0:
exec(goto200)
else:
exec(goto300)

print a, b

Πώς σας φαίνεται; δεν είναι φανταστικό; (μη προγραμματισετε ποτε με αυτόν τον τρόπο)

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

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

Αν τα συνδυάσουμε όλα αυτά θα πάρουμε την εξής φανταστική ιδέα: memoized approximate source-transformed function. Πώς να το πω τώρα στα ελληνικά αυτό; Μήπως τα όρια της γλώσσας είναι όντως τα όρια της σκέψης; Ας προσπαθήσω. Έχουμε μια χρονοβόρα συνάρτηση, τη δειγματοληπτούμε και αποθηκευουμε σε dict τις τιμές, ταυτόχρονα τα σημεία που είναι πιο αργή τα αντικαθιστούμε με μια συνάρτηση παρεμβολής (πχ νευρωνικό δικτυό). Δεν είναι mind-blowing experience;

Η ιδέα του algorithmic differentiation, δηλαδή δημιουργία ενός νέου κώδικα από υπάρχοντα ο οποίος είναι η παράγωγος του πρώτου ως προς κάποια μεταβλητή δεν είναι καινούρια. Ούτε και η ιδέα ενός συστήματος ενός συστήματος αυτόματης μεταφρασης, πχ από ελληνικά σε αγγλικά, που μαθαίνει, βλ. google translate. Θα ήταν σενάριο επιστημονικής φαντασίας ένα μαθαίνον σύστημα αυτόματης μετάφρασης μεταξύ γλωσσών προγραμματισμού; Ή να πάω ένα βήμα παραπέρα, ένα μαθαίνον σύστημα που να προγραμματιζει αυτόματα, πχ σε python, μαθαίνοντας από υπάρχοντες κώδικες που επιλύουν επιστημονικά προβλήματα. Για παραδειγμα ένα νευρωνικό δίκτυο που αντί για δεδομένα εισόδου αριθμούς να έχει μαθηματικά προβλήματα και ως δεδομένα εξόδου κώδικα. Να εκπαιδευτει με λυμένα προβληματα, και να δοκιμαστεί με άλυτα προβλήματα για να δούμε τι κώδικα παράγει...
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό evolgen » 24 Σεπ 2013, 01:42

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

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: Αλλά τι είναι ένας υπολογιστής

Δημοσίευσηαπό Dimitris » 24 Σεπ 2013, 11:53

Και οι προκλήσεις συνεχίζονται!
Διαβάστε αυτό το άρθρο: http://stackoverflow.com/questions/1988 ... -in-python
και αυτό το άρθρο: http://en.wikipedia.org/wiki/Broyden%27s_method
και προσπαθήστε να γράψετε μια memoized παραλλαγή της μεθόδου Broyden για την επίλυση μη γραμμικών συστημάτων.

Ένα παιδαριώδες παράδειγμα:
Κώδικας: Επιλογή όλων
import time

def df(x):
return 2*x

class Mymemoize:
def __init__(self, f):
self.f = f
self.memo = {}
self.memo[(0,)] = self.f(0)
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.memo[(0,)] + df(0)*args[0]
return self.memo[args]

@Mymemoize
def f(x):
time.sleep(2)
print x, 'you called me'
return x**2+5

for i in range(10):
print f(i)


Οδεύοντας προς ένα λογισμικό που μαθαίνει να προγραμματίζει
Ένα πρώτο βήμα είναι να ορίσουμε μια απόσταση για κείμενα. Ίσως να αρμόζει η http://en.wikipedia.org/wiki/Levenshtein_distance
Βέβαια θα πρέπει να ορίσουμε και κάποιες αναλοίωτες, όπως ότι χ+3 = 1 είναι το ίδιο με το y+3 = 1, αλλά ελπίζω να φτάσουμε κι εκεί.

Αυτά για σήμερα, πίσω στη δουλειά!
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Προηγούμενη

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Περί Τεχνολογίας