από vasster » 30 Ιουν 2011, 19:57
Μία γραμμή δεδομένων ή διεύθυνσης μπορεί (σε κατάσταση εξόδου) να είναι σε υψηλή ή χαμηλή κατάσταση (π.χ. σε 1 ή 0). Μια δεύτερη γραμμή το ίδιο, αλλά αν συνδυαστούν αυτές οι δύο γραμμές μεταξύ τους, τότε μπορούν να σχηματίσουν τέσσερις (2^2) διαφορετικές καταστάσεις δηλαδή : 00 01 10 11
Αν προστεθεί μία γραμμή ακόμα (δηλαδή θα είναι συνολικά τρεις γραμμές) τότε οι πιθανοί συνδυασμοί είναι 2^3 ή 8, δηλαδή : 000 001 010 011 100 101 110 111
Οπως πιθανόν να καταλάβες, εμφανίζεται το δυαδικό μέτρημα.
Για να γίνω λίγο πιο κατανοητός θα σου δώσω ένα παράδειγμα ενός απλοϊκού υπολογιστή που θέλει να διαβάσει μία λέξη 32 μπιτ από τη μνήμη:
Για να προσπελάσει η CPU μια διεύθυνση μνήμης, πρέπει να ενεργοποιήσει (πχ να τις κάνει 1) στον δίαυλο τις αντίστοιχες γραμμές που σχηματίζουν την διεύθυνση της μνήμης που θέλει να διαβάσει και στη συνέχεια να ενεργοποιήσει κάποιες άλλες γραμμές που ειδοποιούν τον δίαυλο ότι επάνω στις γραμμές του υπάρχει μια διεύθυνση.
Στην συνέχεια να διαβάσει μία γραμμή κατάστασης που δείχνει ότι στον δίαυλο (τον ίδιο ή άλλο) υπάρχουν δεδομένα από τη μνήμη. Τότε θα διαβάσει από τις γραμμές του διαύλου, την λέξη που έγραψε η μνήμη και πιθανόν να τοποθετήσει αυτή την τιμή σε κάποιο εσωτερικό καταχωρητή.
Αυτή η εργασία που περιέγραψα αντιστοιχεί σε ένα κομμάτι μιας εντολής MOV ή LD (MOVe ή LoaD) η οποία μεταφέρει μία τιμή σε ένα καταχωρητή στην CPU. Για να προγραμματίσεις λοιπόν κάτι απλό όπως είναι ένα σειριακό πρωτόκολλο για την επικοινωνία δύο περιφερειακών, πρέπει να μάθεις την γλώσσα και τις εντολές τους γιατί αλλοιώς δεν γίνεται να τα καταφέρεις. Εκεί βρίσκεται λοιπόν η assembly.
Η πραγματική γλώσσα μηχανής είναι αριθμοί. Η assembly είναι η γλώσσα που αντιστοιχεί στους αριθμούς αλλά με μνημονικές εντολές που είναι ευκολότερες να κατανοεί και να γράφει ένας άνθρωπος. Μπορείς πραγματικά να γράψεις ένα πρόγραμμα σε γλώσσα μηχανής, δηλαδή αριθμούς, (και πραγματικά κάποτε ήταν πολύ συνηθισμένο) αλλά είναι κατά πολύ ευκολότερο να κάνεις το ίδιο σε assembly. Βέβαια πρέπει να γνωρίζεις πως δουλεύει ο επεξεργαστής σου και τι εντολές υποστηρίζει, π.χ. υλοποιεί για παράδειγμα κάποια εντολή για πολλαπλασιασμό 32 bit τιμών ή πρέπει να γράψεις την ρουτίνα που κάνει τον πολλαπλασιασμό 2 32 μπιτων τιμών και επιστρέφει το 64 μπιτ αποτέλεσμα ως ένα συνδυασμό για παράδειγμα δύο τιμών. Πως υλοποιεί πράξεις με προσημασμένους αριθμούς; Εχει εντολές που είναι εγγυημένα ατομικές; Πως υλοποιεί για παράδειγμα mutexes και semaphores;
Η πολυπλοκότητα από ένα σημείο και μετά είναι μεγάλη. Βέβαια οι πιο πολλές εργασίες έχουν να κάνουν με κοινή και επαναλαμβανόμενη δουλειά γι' αυτό δημιουργήθηκε μία γλώσσα που ήταν λίγο παραπάνω από την assembly και έκανε ευκολότερη τη χαμαλοδουλειά. Ανεβαίνοντας λοιπόν ένα επίπεδο παραπάνω, συναντάμε την C. Η οποία με ανώτερες δομές όπως η for η if κλπ απλούστευσε την συγγραφή προγραμμάτων.
Οι γλώσσες υψηλότερου επιπέδου, γράφθηκαν για να μην ανακαλύπτεις συνέχεια τον τροχό, δηλαδή πως γίνεται μια διαίρεση ή πως να χωρέσεις ένα μεγάλο αριθμό σε ένα ή περισσότερους καταχωρητές.
Ο compiler GCC της C, μεταφράζει το πρόγραμμα σε assembly (μπορείς να δεις αυτό το βήμα αν καλέσεις το gcc με switch -S πχ gcc -S hello.c -o hello.s) την οποία στη συνέχεια αναλαμβάνει να μεταγλωττίσει σε γλώσσα μηχανής.
Η γνώση λοιπόν της assembly δεν είναι στην αρχή απαραίτητη αλλά χωρίς αυτή δεν πρόκειται να πας πολύ μακριά. Αν ο σκοπός κάποιου είναι να γράφει μικρά προγράμματα σε κάποια script γλώσσα, απλές ή πολύπλοκες εφαρμογές για το Ιντερνέτ, εμπορικές εφαρμογές κλπ πιθανόν να μη χρειασθεί ποτέ παραπάνω γνώσεις. Αν θέλεις όμως να εμβαθύνεις και να γράψεις εφαρμογές που θα μιλούν για παράδειγμα με ένα περιφερειακό, ή ένα device driver ή τέλος πάντων να κάνεις κάτι που δεν έχει γράψει κάποιος άλλος για σένα μια βιβλιοθήκη, θα χρειασθεί να μάθεις πιο πολλά.
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter