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


Ποιες είναι οι προτάσεις σας; Τι είμαι λείπει σε μη εκμάθηση Συνέλευση και δείκτες / διαχείριση μνήμης σε γενικές γραμμές;

 
Ποια είναι τα πρακτικά πλεονεκτήματα της εκμάθησης Συνέλευσης;
==============================================================



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


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


Ένας προγραμματιστής ειδικός μπορεί να γράψει το ίδιο βρόχο και να σκεφτεί, «Αυτός ο κωδικός επαναλαμβάνεται σε μια σειρά ακεραίων, και έχει να κουτί κάθε στοιχείο για να καλέσετε τη μέθοδο toString και toString πρέπει να διαμορφώσετε το κορδόνι στη βάση 10, η οποία είναι κάπως μη τετριμμένη, και τότε τόσο το κουτί ακέραιο και η διαμορφωμένη κλωστή θα είναι σύντομα επιλέξιμες για τη συλλογή των απορριμμάτων, καθώς δεν αναφορές θα παραμείνει, και η πρώτη φορά που αυτή η μέθοδος λειτουργεί, θα πρέπει να JIT'ed ...»και ούτω καθεξής.


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

 

Αυτές τις μέρες πολλές γλώσσες συγκρότημα είναι στην πραγματικότητα αρκετά υψηλό επίπεδο.


Και αυτό είναι πάντα αλήθεια ότι αν μάθουν «C», που είναι αρκετά κοντά για να συνέλευση για να πάρει τα περισσότερα από τα οφέλη της μάθησης.


*edit: να σκεφτόμαστε αυτό το λίγο περισσότερο, στα βιβλία Knuth που περιγράφει μια ιδεατή γλώσσα. Δεν θα πάει πολύ στραβά έμαθε ότι, και την ανάγνωση αυτών των βιβλίων.*

 

Δείκτες / διαχείριση μνήμης είναι πιο γενική από συμβολική γλώσσα. Θα πρέπει να τους καταλάβουν για C και C ++, καθώς, το οποίο μπορεί να χρειαστεί, αν έχετε να διατηρήσει κώδικα γραμμένο σε C.


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

 

Αυτό είναι το είδος του ένα από αυτά τα ερωτήματα που θα είναι πάντα ρώτησε: «Γιατί πρέπει να γνωρίζω τίποτα» κλπ Λοιπόν, ίσως θα μπορούσατε να πάρετε μια δουλειά να κάνει κάτι πέρα ​​από τη δημιουργία της επόμενης γενικής εφαρμογής σάλτσες ή κάτι τέτοιο. Αν θέλετε να κάνετε οποιοδήποτε είδος της ανάπτυξης του συστήματος, έχουν ένα εργασιακό γνώση του συγκροτήματος είναι πολύ χρήσιμο, αν όχι ζωτικής σημασίας. Όσον αφορά αυτό που «λείπει» ίσως σας λείπει σε πραγματικά γνωρίζουν πώς λειτουργούν οι υπολογιστές. Μερικοί άνθρωποι πιστεύουν ότι αυτό είναι επιθυμητό. Μερικοί άνθρωποι δεν το κάνουν. Κάποιοι θέλουν να δημιουργήσουν επεξεργαστές. Μερικοί άνθρωποι σκάβουν τάφρους. Είναι όλα ένα θέμα προσωπικής προτίμησης :)

 

Νομίζω ότι είναι μεγάλη για να μάθουν νέες γλώσσες. Ανοίγει το μυαλό μου. Μερικές γλώσσες είναι περισσότερο μυαλό-άνοιγμα από τους άλλους. Θα έλεγα συναρμολόγησης είναι ένα από αυτά. Θα σας αναγκάζει να σκεφτούμε τα πράγματα, όπως η στοίβα κλήσεων και δείκτη διδασκαλίας. Και αυτό θα σας κάνει να εκτιμήσετε υψηλότερο γλώσσες επίπεδο ακόμη περισσότερο. Μια άλλη διασκέδαση γλώσσα για να μάθουν είναι PostScript.

 


> 
> Αλλά αυτό που ψάχνω είναι μερικές πρακτικές συμβουλές που θα κάνουν την προσπάθεια της μάθησης Συνέλευσης να αξίζει τον κόπο.
> 
> 
> 


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


Αλλά, μην κάνετε τον κόπο να μάθετε πώς να γράψετε τη συναρμολόγηση: αντ 'αυτού, να μάθουν να γράφουν C ή C ++ είναι κατά πάσα πιθανότητα «χαμηλά» αρκετά για τους περισσότερους πρακτικούς σκοπούς.

 

Δεν νομίζω ότι θα *πρέπει* να μάθουν συναρμολόγησης για οτιδήποτε *πρακτικό.*  Ωστόσο, αυτό θα εξασφαλίσει ότι έχετε κατανοήσει τις πραγματικές ρίζες του τι κάνετε ως προγραμματιστής. Στην ουσία, ο προγραμματισμός συνέλευση είναι μια πειθαρχία για την εκμάθηση της λογικής τσιπ και την αρχιτεκτονική. Δεν έχω προγραμματιστεί συνέλευση σε πάνω από δύο δεκαετίες, αλλά εξακολουθεί να ενημερώνει τα είδη των επιλογών που κάνουν όταν προγραμματίζετε C #.

 

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

 

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


Μια εφαρμογή όπως win32Dasm μπορεί να μετατρέψει τα εκτελέσιμα σε κώδικα συγκρότημα που μπορεί αργότερα να τροποποιηθούν με ένα πρόγραμμα επεξεργασίας Hex όπως Hiew. Μπορείτε να μάθετε πολλά για τη ροή του προγράμματος.

 

Λοιπόν, σε πρακτικό επίπεδο, έκανα μια τάξη στο 6502 συναρμολόγησης, όταν για πρώτη φορά να μάθουν να κωδικοποιήσει τις αρχές της δεκαετίας του '80. Έκανα επίσης κάποια assembler 8088. Ήταν από περιστασιακή χρήση των χρόνια από τότε, αλλά δεν μπορώ να πω ότι είναι ποτέ *πραγματικά* βγήκε μου από μια τρύπα σε περισσότερες από μία ή δύο φορές σε 25 χρόνια. Groking C σε ένα όμορφο θεμελιώδες επίπεδο είναι πολύ πιο χρήσης. YMMV και είναι σίγουρα χρήσιμο ως φόντο, αλλά ως άμεσο πρακτικό όφελος; Οριακή πραγματικά.


Παραδόξως όμως ένα πράγμα που έχει αποδειχθεί χρήσιμο είναι σε ακόμη χαμηλότερο επίπεδο. Έκανα μια τάξη στο σχεδιασμό των chip (πύλες NAND και τα παρόμοια) και ως μέρος της ότι διδάχθηκε επίσημη Boolean λογική σε κάποιο βάθος. Αυτό ήταν μαζικά χρήσιμες από τότε - Είναι εκπληκτικό τον αριθμό των προγραμματιστών που δεν γνωρίζουν τι κάνουν με ands, ΕΑΠ και έχοντες :-)

 

Δείκτες και διαχείριση μνήμης είναι πραγματικά ένα διαφορετικό ζήτημα από το συγκρότημα. Αν θέλετε να κάνετε C / C ++, τότε θα πρέπει να μάθουν δείκτες και τη διαχείριση της μνήμης, επειδή αυτά είναι μέρος της γλώσσας. Αλλά, ακόμη και αν σκοπεύετε να χρησιμοποιήσετε το τίποτα, αλλά (ας πούμε) Java όλη σου τη ζωή, θα πρέπει να μάθετε κάτι για τη διαχείριση της μνήμης για να κρατήσει από το γράψιμο μια διαρροή μνήμης, παρά το GC, και οι δείκτες είναι μόνο η διαφορά μεταξύ των ατομικών τύπων και αντιρρήσεις αναφορές. Χρειάζεται τις έννοιες ή θα γράψετε τα προγράμματα που δεν λειτουργούν!


Πρακτικούς λόγους για τη συναρμολόγηση μάθησης: τον εντοπισμό σφαλμάτων και βελτιστοποίηση. Ακόμα κι αν δεν γράφουν κάθε συγκρότημα, μία από αυτές τις ημέρες μπορεί να χρειαστεί να βελτιστοποιήσουν C / C ++ κώδικα για τις επιδόσεις. Σε αυτή την περίπτωση, θα πρέπει να είναι σε θέση να *διαβάσει* το συγκρότημα για το εσωτερικό βρόχο σας, ακόμα κι αν ποτέ δεν πρέπει να γράψει μια άλλη γραμμή του.


Τελικά, νομίζω ότι η διάκριση μεταξύ σας «γνωρίζοντας τις βασικές λειτουργίες του υπολογιστή σας» και «πρακτικές προτάσεις που θα κάνει την προσπάθεια της μάθησης συναρμολόγησης αξίζει τον κόπο» είναι εσφαλμένη. Η άγνοια δεν πληρώνει. Μαθαίνοντας πώς λειτουργεί ο υπολογιστής σας *είναι* μια πρακτική πρόταση που αξίζει τον κόπο!


Έχω μια προφητεία: κάποια μέρα σύντομα, το πρόγραμμά σας θα τρέξει πάρα πολύ αργά για να είναι πρακτικό και να διακοπεί κατά διαστήματα με εξαίρεση out-of-memory. Εκείνη την ημέρα, η καθαρή κραυγή άγχος της μη γνωρίζοντας τι στο διάολο συμβαίνει ή πού να αρχίσετε να ψάχνετε για να το φτιάξω, θα επιστρέψει το χρέος κάρμα σας, με το ενδιαφέρον ...

 

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


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


Επίσης, διαφορετικές αρχιτεκτονικές έχουν τις ιδιορρυθμίες τους. Κάποιος μίλησε για ένα τέχνασμα συνέλευση να ανταλλάξουν 2 μητρώα στη θέση του, με τη συμμετοχή xor του. Λειτουργεί, και θα τρέξει μεγάλη στην παραγγελία πυρήνα εκτέλεσης (πιο πρόσφατο παράδειγμα θα ήταν η Intel Atom, και η Via C7 σε netbooks), αλλά όχι τόσο μεγάλη σε πυρήνες out-of-order.


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

 

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


[Συνέλευση και την τέχνη του εντοπισμού σφαλμάτων](http://mohit.io/blog/assembly-and-the-art-of-debugging/)


[Debugging - Τροποποίηση κώδικα κατά το χρόνο εκτέλεσης](http://mohit.io/blog/debugging-modifying-code-at-runtime/)

 

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

 