Πώς να προβάλετε και να επεξεργαστείτε τον πηγαίο κώδικα ενός προγράμματος ανοιχτού κώδικα. Πώς να δείτε τον πηγαίο κώδικα μιας εφαρμογής Android

Κάθε μέρα υπάρχουν όλο και περισσότερες εφαρμογές για Android. Εκατομμύρια ενδιαφέροντα παιχνίδια και χρήσιμα προγράμματα μπορείτε να βρείτε στο Play Market. Όλα έχουν φιλική προς το χρήστη διεπαφή και αντιμετωπίζουν την εργασία. Είναι δύσκολο να φανταστεί κανείς τον σύγχρονο κόσμο της πληροφορικής χωρίς αυτά. Αυτό το άρθρο απευθύνεται σε άτομα που όχι μόνο εκτιμούν τη λειτουργικότητα και την εμφάνιση των εφαρμογών, αλλά ενδιαφέρονται επίσης για την εσωτερική τους δομή.

Αν έχετε αναρωτηθεί ποτέ τι είναι το "κάτω από την κουκούλα" της αγαπημένης σας εφαρμογής και γνωρίζετε λίγα πράγματα για τον προγραμματισμό, αυτό το άρθρο είναι για εσάς. Θα σας πούμε πώς να προβάλετε τον πηγαίο κώδικα μιας εφαρμογής Android απευθείας στο gadget σας. Πηγαίνω!

Γενικές πληροφορίες

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

Πώς να μάθετε τον πηγαίο κώδικα των εφαρμογών Android;

Αρχικά, κατεβάστε την εφαρμογή της οποίας ο πηγαίος κώδικας σας ενδιαφέρει. Στη συνέχεια, μεταβείτε στο Play Market και κατεβάστε ένα βοηθητικό πρόγραμμα που ονομάζεται Εμφάνιση Java. Αυτή θα είναι που θα κάνει το decompiling. Εγκατεστημένο; Τέλεια, τώρα ας προχωρήσουμε στο διασκεδαστικό μέρος - εξαγωγή του πηγαίου κώδικα ενός προγράμματος Android. Εκκινήστε το Show Java.

Επιλέξτε την επιθυμητή εφαρμογή από τις εγκατεστημένες ή βρείτε την στην κάρτα SD. Τώρα πρέπει να επιλέξετε έναν απομεταγλωττιστή. Συνήθως επιλέγω CRF. Εάν έχετε προβλήματα, δοκιμάστε το JaDX.

Με την ολοκλήρωση της διαδικασίας, θα λάβετε μια λίστα πακέτων με τις πηγές της εφαρμογής Android. Φυσικά, αυτό δεν είναι 100% αντίγραφο του κώδικα που έγραψαν οι προγραμματιστές αυτής της εφαρμογής. Όμως η βασική λογική παραμένει η ίδια και δεν είναι δύσκολο να κατανοηθεί. Τι να κάνετε με τις πηγές; Οτιδήποτε. Κοιτάξτε, ρίξτε μια ματιά, ίσως θα σας ενδιαφέρουν κάποια "χαρακτηριστικά" ή χαρακτηριστικά της υλοποίησης της λειτουργικότητας του προγράμματος.

Επικεφαλίδα:

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

Πηγαίος κώδικας γραμμένος σε HTML χρησιμοποιώντας JavaScript

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

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

Στόχοι

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

Αδειοδότηση

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

Ποιότητα

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

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

(Οδηγός προγραμματιστή για μικροελεγκτές οικογένειας HCS08)

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

Προηγουμένως, σημειώσαμε ότι η οικογένεια MCU HCS08 δεν επιτρέπει τη διαγραφή και τον προγραμματισμό λειτουργιών μνήμης flash, εκτελώντας το πρόγραμμα για τον έλεγχο αυτών των λειτουργιών και από τη μνήμη flash. Φροντίστε πρώτα να ξαναγράψετε τον κώδικα προγράμματος που είναι υπεύθυνος για τη διαγραφή και τον προγραμματισμό λειτουργιών στη μνήμη RAM και, στη συνέχεια, εκτελέστε αυτόν τον κώδικα για εκτέλεση. Κατά τη διαδικασία διαγραφής και προγραμματισμού, θα εφαρμοστεί αυξημένη τάση στη μονάδα μνήμης flash. Ωστόσο, αυτό δεν θα οδηγήσει σε διακοπή του προγράμματος, αφού σε μια δεδομένη χρονική στιγμή θα εκτελείται από τη μνήμη RAM.

Η NXP έχει αναπτύξει ένα σύνολο βοηθητικών προγραμμάτων γλώσσας συναρμολόγησης που διευκολύνουν τη δημιουργία προσαρμοσμένου κώδικα για τον προγραμματισμό της μνήμης flash υπό τον έλεγχο του προγράμματος λειτουργίας της συσκευής. Αυτά τα βοηθητικά προγράμματα βρίσκονται στο αρχείο doonstack.asm. Αυτό το αρχείο θα πρέπει να συμπεριληφθεί στο έργο, όπως φαίνεται στο Σχ. 12.3.

Ρύζι. 12.3. Παράθυρο έργου με περιλαμβανόμενο αρχείο doonstack.asm.

Περιεχόμενα αρχείου doonstack.asmπαρουσιάζεται παρακάτω. Δίνεται το αρχικό κείμενο του κώδικα προγράμματος που χρησιμοποιείται, επομένως τα σχόλια δεν μπορούν να μεταφραστούν.


;* Αυτή η γραφική ύλη προορίζεται να χρησιμεύσει ως πλαίσιο για ένα *
;* εφαρμογή χρήστη. Για ένα πιο ολοκληρωμένο πρόγραμμα που *
;* δείχνει την πιο προηγμένη λειτουργικότητα αυτού του *
;* επεξεργαστής, δείτε τις εφαρμογές επίδειξης *
;* που βρίσκεται στον υποκατάλογο παραδειγμάτων του *
;* Metrowerks Codewarrior για τον κατάλογο προγραμμάτων HC08 *
;**************************************************************
; σύμβολα εξαγωγής
XDEF DoOnStack
XDEF FlashErase
XDEF FlashProg
; χρησιμοποιούμε ως σύμβολο εξαγωγής "Είσοδος". Αυτό μας επιτρέπει
; αναφορά "Είσοδος" είτε στο αρχείο linker .prm
; ή από C/C++ αργότερα

; περιλαμβάνουν μακροεντολές ειδικών παραγώγων
Συμπεριλάβετε το "MC9S08GB60.inc"

Οι επόμενες δύο γραμμές θα πρέπει να μην σχολιαστούν και να αποδοθούν οι επιθυμητές τιμές.

;mPageErase ισοδύναμο 40$
;mByteProg ισοδυναμεί με 20$
mFACCERR ισοδύναμο $10
mFPVIOL ισοδύναμο 20 $
mFCBEF ισοδύναμο 80 $
; μεταβλητή/ενότητα δεδομένων
MY_ZEROPAGE: SECTION SHORT
; Εισαγάγετε εδώ τον ορισμό των δεδομένων σας. Για επίδειξη, χρησιμοποιείται temp_byte.
; temp_byte ds.b 1
; ενότητα κώδικα
MyCode: SECTION
;**************************************************************
; αυτή η ρουτίνα συναρμολόγησης ονομάζεται εφαρμογή C/C++
DoOnStack: pshx
pshh ;αποθήκευση δείκτη στο flash
psha ;εντολή αποθήκευσης στη στοίβα
ldhx #SpSubEnd ;σημαδέψτε στο τελευταίο byte για να μετακινηθείτε στη στοίβα.
SpMoveLoop: lda ,x ;ανάγνωση από flash
psha ;μεταβείτε στη στοίβα
aix #-1 ;επόμενο byte προς μετακίνηση
cphx #SpSub-1 ;προηγούμενο τέλος;
bne SpMoveLoop ;βρόχος μέχρι ολόκληρου υπο στη στοίβα
tsx ;point to sub στη στοίβα
tpa ;μετακινήστε το CCR στο A για δοκιμή
και #$08 ;ελέγξτε τη μάσκα I
bne I_set ;παράλειψη εάν έχω ήδη ορίσει
sei ;μπλοκ διακόπτει ενώ το FLASH είναι απασχολημένο
lda SpSubSize+6,sp ;προφόρτωση δεδομένων για εντολή
cli ;ok για διαγραφή I mask now
σουτιέν I_cont ;συνέχεια στη στοίβα απο-κατανομή
I_set: lda SpSubSize+6,sp ;προφόρτωση δεδομένων για εντολή
jsr ,x ;εκτελέστε το sub στη στοίβα
I_cont: ais #SpSubSize+3 ;deallocate subbody + H:X + εντολή
;H:X δείκτης αναβοσβήνει ΟΚ από το SpSub
lsla ;A=00 & Z=1 εκτός εάν PVIOL ή ACCERR
rts ;για να αναβοσβήνει όπου κλήθηκε το DoOnStack
;**************************************************************
SpSub: ldhx LOW(SpSubSize+4),sp ;λάβετε διεύθυνση flash από τη στοίβα
sta 0,x ;εγγραφή στο flash; πρόσθετο κλειδώματος και δεδομένα
lda SpSubSize+3,sp ;get εντολή flash
sta FCMD ;γράψτε την εντολή flash
lda #mFCBEF ;μάσκα για εκκίνηση εντολής
στα FSTAT ; εντολή εγγραφής
όχι ;[p] θέλει min 4~ από τον κύκλο w στο r
ChkDone: lda FSTAT ; άρα ισχύει το FCCF
lsla ;FCCF τώρα στο MSB
bpl ChkDone ;loop εάν FCCF = 0
SpSubEnd: rts ;επιστρέφει στο DoOnStack σε flash
SpSubSize: ισοδύναμο (*-SpSub)
;**************************************************************
FlashErase: psha ;adjust sp για την καταχώρηση DoOnStack

lda #mPageErase ;μοτίβο μάσκας για την εντολή διαγραφής σελίδας
bsr DoOnStack ;εντολή ολοκλήρωσης από υποκατάστατο που βασίζεται σε στοίβα
rts
;**************************************************************
FlashProg: psha ;προσωρινή αποθήκευση δεδομένων εισόδου
lda #(mFPVIOL+mFACCERR) ;μάσκα
sta FSTAT ;ακύρωση οποιασδήποτε εντολής και εκκαθάριση σφαλμάτων
lda #mByteProg ;μοτίβο μάσκας για την εντολή byte prog
bsr DoOnStack ;εκτέλεση κωδικού προγράμματος από τη στοίβα RAM
ais #1 ;κατανομή θέσης δεδομένων από τη στοίβα
rts
;**************************************************************

Επίσης στο κείμενο του κώδικα προγράμματος σε C είναι απαραίτητο να κατευθυνθείτε #περιλαμβάνωαρχείο σύνδεσης doonstack.χ, το κείμενο του οποίου παρουσιάζεται παρακάτω.


/* */
/* Όνομα έργου: doonstack.h */
/* Τελευταία τροποποίηση: 04/11/2004 */
/* Από: r60817 */
/* */
/* */
/**********************************************************************/
/* */
/* Περιγραφή: MC9S08GB60_FLASH_DOONSTACK - επίδειξη */
/* */
/* */
/* Τεκμηρίωση: MC9S08GB60/D Αναθ. 2.2 */
/* HCS08RMv1/D Αναθ. 1(4.8Παραδείγματα εφαρμογής FLASH) */
/* */
/* Αυτό το λογισμικό έχει ταξινομηθεί ως Μηχανικό Δείγμα Λογισμικού. */
/* */
/**********************************************************************/
/* */
/* Οι υπηρεσίες που εκτελούνται από τη FREESCALE σε αυτό το θέμα εκτελούνται ΩΣ ΕΧΟΥΝ */
/* και χωρίς καμία εγγύηση. Ο ΠΕΛΑΤΗΣ διατηρεί την τελική απόφαση */
/* σε σχέση με τον συνολικό σχεδιασμό και τη λειτουργικότητα του τελικού προϊόντος. */
/* FREESCALE ούτε εγγυάται ούτε θα φέρει ευθύνη από τον ΠΕΛΑΤΗ */
/* για την επιτυχία αυτού του έργου. ΑΠΟΠΟΙΗΣΗ ΔΩΡΕΑΝ ΚΛΙΜΑΚΩΝ ΟΛΩΝ */
/* ΕΓΓΥΗΣΕΙΣ, ΡΗΤΕΣ, ΣΙΩΠΗΡΕΣ Ή ΝΟΜΙΚΕΣ ΠΕΡΙΛΑΜΒΑΝΟΝΤΑΣ, ΑΛΛΑ ΟΧΙ */
/* ΠΕΡΙΟΡΙΣΜΕΝΗ ΣΕ ΣΙΩΠΗΡΗ ΕΓΓΥΗΣΗ ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ Ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ */
/* ΣΥΓΚΕΚΡΙΜΕΝΟΣ ΣΚΟΠΟΣ ΓΙΑ ΟΠΟΙΟΔΗΠΟΤΕ ΥΛΙΚΟ, ΛΟΓΙΣΜΙΚΟ Ή ΣΥΜΒΟΥΛΗ ΠΑΡΕΧΟΜΕΝΟ */
/* ΠΡΟΣ ΤΟ ΕΡΓΟ ΑΠΟ ΕΛΕΥΘΕΡΗ ΚΛΙΜΑΚΑ ΚΑΙ Ή ΟΧΙ ΠΡΟΪΟΝ ΠΟΥ ΠΡΟΚΥΠΤΕΙ ΑΠΟ */
/* ΔΩΡΕΑΝ ΥΠΗΡΕΣΙΕΣ . ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ ΔΕΝ ΕΙΝΑΙ ΥΠΕΥΘΥΝΗ Η ΔΩΡΕΑΝ ΚΛΙΜΑΚΑ ΓΙΑ */
/* ΤΥΠΙΤΙΚΕΣ Ή ΣΥΝΕΠΕΙΕΣ ΖΗΜΙΕΣ ΠΟΥ ΠΡΟΚΥΠΤΟΥΝ ΑΠΟ ΤΗΝ ΠΑΡΟΥΣΑ ΣΥΜΦΩΝΙΑ. */
/* */
/* Ο ΠΕΛΑΤΗΣ συμφωνεί να κρατήσει το FREESCALE αβλαβές έναντι οποιουδήποτε και όλων */
/* αξιώνει απαιτήσεις ή ενέργειες από οποιονδήποτε λόγω οποιασδήποτε ζημίας, ή */
/* τραυματισμός, εμπορικός, συμβατικός ή στρεβλός, αυξανόμενος */
/* άμεσα ή έμμεσα ως αποτέλεσμα της συμβουλής ή της βοήθειας */
/* παρεχόμενος ΠΕΛΑΤΗΣ σε σχέση με προϊόν, υπηρεσίες ή αγαθά */
/* παρέχονται βάσει της παρούσας Συμφωνίας. */
/* */
/**********************************************************************/
/*
- αυτό το API αρχείου μεταξύ main.c και doonstack.asm
*/
#ifndef _doonstack
#define_doonstack
#ifdef __cplusplus
εξωτερικό "C" ( /* οι λειτουργίες συναρμολόγησης μας έχουν σύμβαση κλήσης C */
#τέλος εαν
void DoOnStack(void); /* πρωτότυπο για τη ρουτίνα DoOnStack */
void FlashErase(unsigned char *); /* πρωτότυπο για τη ρουτίνα FlashErase */
/* Εντολή Διαγραφή σελίδας */
void FlashProg(unsigned char *, unsigned char); /* πρωτότυπο για τη ρουτίνα FlashProg */
/* Εντολή προγράμματος Byte */
#ifdef __cplusplus
}
#τέλος εαν

#endif /* _doonstack */
/**********************************************************************/

Στο παράδειγμά μας, ένα μπλοκ 512 byte είναι δεσμευμένο για την εγγραφή μη ασταθών δεδομένων. Αυτό το μέγεθος μπλοκ επιλέχθηκε επειδή είναι η ελάχιστη ποσότητα κελιών μνήμης flash που επιτρέπεται να διαγραφούν στον μικροελεγκτή MC9S08QG8. Το επιλεγμένο μπλοκ θα βρίσκεται στην αρχή του χώρου διευθύνσεων της μόνιμης μνήμης flash του MK: από 0xE000 έως 0xE1FF. Ο κωδικός προγράμματος θα ξεκινά από τη διεύθυνση 0xE200 και μπορεί να καταλάβει χώρο διευθύνσεων έως και 0xFFFF.

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

Στο τυπικό έργο υπήρχε μια καταχώρηση:


ROM = READ_ONLY 0xE000 TO 0xFFAD;

Θα πρέπει να αντικατασταθεί:

SEGMENTS /* Εδώ αναφέρονται όλες οι περιοχές RAM/ROM της συσκευής */
ROM = READ_ONLY 0xE200 TO 0xFFAD;

Στο παράδειγμά μας, χρησιμοποιείται επίσης η λειτουργία προστασίας εγγραφής της περιοχής κώδικα προγράμματος, π.χ. χώρος διευθύνσεων από 0xF200 έως 0xFFFF. Στο Σχ. Το σχήμα 12.4 δείχνει τη διαδικασία δημιουργίας κώδικα για τον καταχωρητή FPROT, ο οποίος προστατεύει τον χώρο διευθύνσεων 0xF200...0xFFFF από τυχαία διαγραφή/εγγραφή. Τα πιο σημαντικά επτά bit της τελευταίας διεύθυνσης 0xF1FF του μη προστατευμένου χώρου διευθύνσεων πρέπει να εγγραφούν στον καταχωρητή FPROT.

Διεύθυνση Α15 Α14 Α13 Α12 Α11 Α10 Α9 Α8 Α7 Α6 Α5 Α4 Α3 Α2 Α'1 Α0
0xE1FF 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1
FPROT FPS7 FPS6 FPS5 FPS4 FPS3 FPS2 FPS1 FPDIS
0xE0 1 1 1 0 0 0 0 0

Ρύζι. 12.4. Δημιουργία καταχώρησης κωδικού ασφαλείας για τον καταχωρητή FPROT.

Παράδειγμα 12.1. Λειτουργίες με μη πτητικά δεδομένα στη μνήμη flash

// Επίδειξη πλακέτας DEMO9S08QG8
// διαγραφή/εγγραφή/ανάγνωση μόνιμης μνήμης flash
#include /* για μακροεντολή EnableInterrupts */
#include "derivative.h" /* περιλαμβάνει περιφερειακές δηλώσεις */
#include "hcs08.h" /* Αυτό είναι το αρχείο δήλωσης! */
#include "doonstack.h"
#define BUSCLK 8000000
#define vFCDIV (BUSCLK/200000-1)
char fdata, λειτουργία;
ανυπόγραφη int faddress?
// Εκχωρήστε μια περιοχή διευθύνσεων με προστασία εγγραφής: 0xE200 έως 0xFFFF
const byte NVPROT_INIT @0x0000FFBD = 0xE0;
// Αρχικοποίηση ΜΚ
void mcu_init(void)
{
SOPT1 = bBKGDPE; // Ενεργοποίηση της λειτουργίας γραμμής εντοπισμού σφαλμάτων BKGD
ICSSC = NV_FTRIM; // Γράψτε την τιμή περικοπής FTRIM
ICSTRM = NV_ICSTRM; // Γράψτε την τιμή περικοπής TRIM
ICSC2 = 0; // ICSOUT = DCOOUT / 1
// BUSCLK = 8 MHz
FCDIV = vFCDIV; // Γράψτε την τιμή του κωδικού διαιρέτη για τη συχνότητα FCLK
// (FCLK = 200 kHz)
}
#pragma inline
// Λειτουργία για την ανάγνωση ενός byte από ένα κελί μνήμης με μια δεδομένη διεύθυνση
char flash_read (ανυπόγραφη διεύθυνση int)
{
ανυπόγραφο char *δείκτης;
δείκτης = (char*) διεύθυνση;
επιστροφή (*δείκτης);
}
// Λειτουργία για την εγγραφή ενός byte σε ένα κελί μνήμης με μια δεδομένη διεύθυνση
char flash_write (ανυπόγραφη διεύθυνση int, ανυπόγραφα δεδομένα χαρακτήρων)
{
ανυπόγραφο char *δείκτης;
δείκτης = (char*) διεύθυνση;
FlashProg (δείκτης, δεδομένα); // Κλήση της συνάρτησης προγραμματισμού φλας
εάν (FSTAT_FACCERR) δεδομένα=1; other data=0;
εάν (FSTAT_FPVIOL) δεδομένα|=2;
επιστροφή(δεδομένα)·
}
// Λειτουργία για τη διαγραφή ενός καθορισμένου μπλοκ στην περιοχή της μνήμης flash
ανυπόγραφο char flash_sector_erase (ανυπόγραφη διεύθυνση int)
{
ανυπόγραφο char *pointer, res;
δείκτης = (char*) διεύθυνση;
FlashErase(δείκτης);
εάν (FSTAT_FACCERR) res=1; else res=0;
if (FSTAT_FPVIOL) res|=2;
επιστροφή(res);
}
κενό κύριο (κενό)
{
mcu_init();
fdata = 0;
faddress = 0xE000;
λειτουργία = 0;
ενώ (1)
{
διακόπτης (λειτουργία)
{
περίπτωση 1: // Διαγραφή μπλοκ
fdata = flash_sector_erase(faddress);
λειτουργία = 0;
Διακοπή;
περίπτωση 2: // Γράψτε ένα byte
fdata = flash_write(faddress,fdata);
λειτουργία = 0;
Διακοπή;
περίπτωση 3: // Ανάγνωση byte
fdata = flash_read(faddress);
λειτουργία = 0;
Διακοπή;
}
}
}

Ας εξετάσουμε τη μεθοδολογία για τη δοκιμή του κώδικα προγράμματος του Παραδείγματος 12.1. Για να το κάνετε αυτό, στο παράθυρο του προγράμματος εντοπισμού σφαλμάτων ΔεδομέναΑς προσθέσουμε τρεις μεταβλητές: προσόψεως, fdata, λειτουργία. Θα ρυθμίσουμε επίσης το παράθυρο σε λειτουργία περιοδικής ενημέρωσης, για παράδειγμα, κάθε 200 ms.

Πριν εκτελέσετε τον κώδικα του προγράμματος, γράψτε τον σε μια μεταβλητή προσόψεωςδιεύθυνση για εγγραφή και σε μια μεταβλητή fdata— byte δεδομένων προς εγγραφή. Δίπλα στη μεταβλητή λειτουργίαγράψτε τον κωδικό 0x02. Μετά την εκτέλεση του παραδείγματος κώδικα, ένα byte δεδομένων θα αρχίσει να γράφεται στο επιλεγμένο κελί μνήμης flash. Λάβετε υπόψη ότι το επιλεγμένο κελί πρέπει να είναι σε κατάσταση διαγραφής, π.χ. θα πρέπει να περιέχει τον κωδικό 0xFF.

Για να διαγράψετε το μπλοκ μνήμης 0xE00...0xE1FF, γράψτε στο προσόψεωςοποιαδήποτε διεύθυνση από το καθορισμένο εύρος και ορίστε τη μεταβλητή λειτουργίαστο 1. Στη συνέχεια, εκτελέστε ξανά τον κώδικα για εκτέλεση.

Η ανάγνωση δεδομένων από τη μνήμη flash είναι επίσης εύκολη. Για να το κάνετε αυτό, γράψτε στη μεταβλητή προσόψεωςκωδικός διεύθυνσης, σε μια μεταβλητή λειτουργία- κωδικός 0x03. Τα περιεχόμενα του επιλεγμένου κελιού μνήμης flash θα εμφανιστούν στη μεταβλητή fdataμετά την εκτέλεση του κώδικα του προγράμματος.

Σημειώστε ότι οι λειτουργίες flash_write()Και flash_sector_erase()επιστρέφει μια μεταβλητή τύπου τσαρέλαμε κωδικό σφάλματος κατά την εκτέλεση της ενέργειας: 0 - δεν υπήρχε σφάλμα, 0x02 - υπήρχε σφάλμα πρόσβασης, 0x04 - έγινε προσπάθεια διαγραφής/εγγραφής του προστατευμένου χώρου διευθύνσεων. Και οι δύο λειτουργίες που αναφέρονται παραπάνω απαιτούν περίπου 35 byte μνήμης στοίβας για να εκτελεστούν. Εάν η πραγματική περιοχή στοίβας είναι μικρότερη, θα προκύψει μοιραίο σφάλμα. Θα είναι δυνατή η επαναφορά της λειτουργικότητας του προγράμματος μόνο με επαναφορά του MK.

Για να δείτε τις αλλαγές flash στο πρόγραμμα εντοπισμού σφαλμάτων, πρέπει να κάνετε ορισμένες αλλαγές στη διαμόρφωση του προγράμματος εντοπισμού σφαλμάτων. Ακολουθώντας τις προεπιλεγμένες ρυθμίσεις, το πρόγραμμα εντοπισμού σφαλμάτων διαβάζει την περιοχή μνήμης flash MCU μόνο μία φορά μετά την έναρξη μιας περιόδου λειτουργίας εντοπισμού σφαλμάτων. Για να αλλάξετε τη διαμόρφωση, επιλέξτε την επιλογή στο κύριο μενού εντοπισμού σφαλμάτων MultilinkCyclonPro > Εντοπισμός σφαλμάτων χάρτη μνήμης. Θα ανοίξει το παράθυρο που φαίνεται στο Σχ. 12.5, α. Επιλέξτε σε αυτό το παράθυρο μπλοκ μνήμης 3και πατήστε το κουμπί Τροποποίηση/Λεπτομέρειες. Στο νέο παράθυρο που φαίνεται στο Σχ. 12.5, β, επιλέξτε την επιλογή που έχει επισημανθεί. Αυτό θα επιτρέψει στον εντοπισμό σφαλμάτων να ενημερώνει περιοδικά το παράθυρο της μνήμης.

Ρύζι. 12.5. Αλλάξτε τη διαμόρφωση του προγράμματος εντοπισμού σφαλμάτων για να ενημερώνετε περιοδικά τα περιεχόμενα του παραθύρου της μνήμης.

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

Εγκυκλοπαιδικό YouTube

    1 / 3

    Επίδειξη επιστήμης. Τεύχος 33. Επιστημονικά φιλμ bloopers 2

    Βασικές αρχές προγραμματισμού: Πηγαίος κώδικας

    Απαντήσεις στις ερωτήσεις 1: Πηγαίος κώδικας

    Υπότιτλοι

Σκοπός

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

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

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

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

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

Οργάνωση

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

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

Για να διευκολυνθεί η εργασία με τον πηγαίο κώδικα και να επιτραπεί σε μια ομάδα προγραμματιστών να συνεργαστεί στον κώδικα, χρησιμοποιούνται συστήματα ελέγχου έκδοσης.

Ποιότητα

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

  • αναγνωσιμότητα κώδικα (συμπεριλαμβανομένης της παρουσίας

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

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

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

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

Κοιτάζοντας το πρόγραμμα

Μόλις δημιουργήσετε έναν λογαριασμό, μπορείτε να ξεκινήσετε αμέσως τον έλεγχο εφαρμογών ανοιχτού κώδικα. Εδώ μπορείτε να δείτε σελίδες εφαρμογών, συμπεριλαμβανομένων φακέλων και αρχείων ειδικά για την εφαρμογή, γράφημα δικτύου, λίστα αιτημάτων, προβληματικές περιοχές, σελίδα wiki και άλλα γραφήματα. Προφανώς, εάν πρέπει να δείτε τον κώδικα από τα αρχεία, κάντε κλικ σε αυτά και ο πλήρης πηγαίος κώδικας θα εμφανιστεί μπροστά σας. Ανάλογα με τον κώδικα που παρουσιάζεται, μπορεί να χρειαστείτε βασική γνώση διαφόρων γλωσσών προγραμματισμού, μία από τις οποίες το πρόγραμμα μπορεί να είναι γραμμένο σε Java, C++, Python ή κάτι άλλο. Εάν κάτι δεν σας είναι ακόμα ξεκάθαρο, ρίξτε μια ματιά στο παρακάτω στιγμιότυπο οθόνης:

Διακλάδωση του έργου

Η επεξεργασία του κώδικα απαιτεί πολλά πρόσθετα βήματα. Εάν θέλετε να αντιγράψετε τον κώδικα χωρίς να τον διαχωρίσετε επίσημα στο GitHub, κάντε λήψη των αρχείων και στη συνέχεια επεξεργαστείτε τα τοπικά. Ωστόσο, εάν θέλετε να πάρετε τον διαθέσιμο κώδικα και να δημιουργήσετε το δικό σας έργο με βάση αυτόν, θα πρέπει να τον διαχωρίσετε. Το forking μπορεί να γίνει μέσω ενός εγγεγραμμένου λογαριασμού - κάντε κλικ στο "Fork" στη σελίδα, όπως φαίνεται στο στιγμιότυπο οθόνης. Οι παρακάτω οδηγίες προορίζονται για χρήστες Linux που πρέπει να εγκαταστήσουν ένα πακέτο Git για περαιτέρω διανομή.

Εάν θέλετε να λαμβάνετε αρχεία από το αποθετήριο του υπολογιστή σας, πρέπει να εκτελέσετε την εντολή git clone, αντικαθιστώντας το όνομα χρήστη με τα στοιχεία σύνδεσής σας στο GitHub και το project_name με το όνομα της εφαρμογής από την οποία πραγματοποιείτε διακλάδωση. Εκτελέστε αυτήν την εντολή σε έναν φάκελο που θα πρέπει να περιέχει όλα τα έργα, καθώς κάθε εντολή κλώνου git δημιουργεί έναν νέο φάκελο μέσα σε αυτόν με τον οποίο εργάζεστε. Αυτός είναι ένας άλλος τρόπος λήψης αρχείων καθώς δεν απαιτεί σύνδεση. Τώρα μπορείτε να αλλάξετε τα αρχεία όπως θέλετε χρησιμοποιώντας οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου ή IDE. Για χρήστες Linux, θα συνιστούσα το Eclipse ή το Geany καθώς είναι εξαιρετικοί επεξεργαστές για προγραμματισμό - το Eclipse είναι πιο γεμάτο με δυνατότητες και το Geany είναι πιο φιλικό προς τον χρήστη. Οι χρήστες των Windows μπορούν επίσης να χρησιμοποιήσουν τον εγγενή πελάτη GitHub.

Μεταφόρτωση αλλαγών

Μόλις ολοκληρώσετε τις επεξεργασίες, μπορείτε να σπρώξετε τα ενημερωμένα αρχεία πίσω στο Github χρησιμοποιώντας την εντολή git push origin master από το εσωτερικό του φακέλου της εφαρμογής σας. Αυτό θα ωθήσει τις αλλαγές στην "πηγή" (από την οποία κάνετε την ιδιωτική) και στον κύριο κλάδο (την τυπική θέση πηγαίου κώδικα).

Ακολουθούμε τη ροή

Εάν θέλετε να συνεχίσετε να παρακολουθείτε την ανάπτυξη του έργου από το οποίο χρησιμοποιήσατε τη βάση, τότε πρέπει να προσθέσετε κάτι που συνήθως ονομάζεται πρόσθετο τηλεχειριστήριο. Αυτό είναι απλώς ένα άλλο κλειδί που μπορείτε να χρησιμοποιήσετε ενώ βρίσκεστε στο φάκελο της εφαρμογής. Για να δημιουργήσετε ένα νέο απομακρυσμένο έργο, εκτελέστε την εντολή git remote add upstream, όπου το όνομα χρήστη πρέπει να αντικατασταθεί με τη σύνδεση από την πηγή και το project_name πρέπει να αντικατασταθεί με το όνομα του έργου του.

Εάν παρατηρήσετε ότι το κύριο έργο ενημερώνεται και θέλετε να αποδεχτείτε αυτές τις αλλαγές, τότε πρέπει να εκτελέσετε την εντολή git pull upstream μετά τη δημιουργία του πρόσθετου απομακρυσμένου και το GitHub θα πραγματοποιήσει λήψη και εφαρμογή των αλλαγών από το main ένα στα αρχεία σας. Εάν όλα λειτουργούν μετά την εκκίνηση, μπορείτε να εκτελέσετε αμέσως την κύρια εντολή git push origin για να αντλήσετε ενημερώσεις για το δικό σας έργο.

Προτείνουμε την επεξεργασία

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

Συμπερασματικά

Το GitHub είναι ένα απίστευτο εργαλείο με μεγάλο όγκο έργων ανοιχτού κώδικα που χρησιμοποιούν ήδη πολλοί προγραμματιστές. Ενώ η υπηρεσία χρησιμοποιεί ένα βοηθητικό πρόγραμμα Git που ο καθένας μπορεί να εγκαταστήσει στους δικούς του διακομιστές, η υπηρεσία περιλαμβάνει επίσης μια μεγάλη κοινότητα προγραμματιστών - αναπόσπαστο και σημαντικό μέρος του ανοιχτού κώδικα. Αυτή η εισαγωγή θα σας βοηθήσει να εξοικειωθείτε με τα βασικά. Εάν θέλετε να μάθετε περισσότερα σχετικά με την ίδια τη διαδικασία ανάπτυξης κώδικα, μπορείτε να ρίξετε μια ματιά σε αυτό το άρθρο που περιγράφει τους καλύτερους ιστότοπους που θα σας βοηθήσουν να μάθετε την C++.

Έχετε χρησιμοποιήσει ποτέ αυτήν την υπηρεσία; Ποιο χαρακτηριστικό πιστεύετε ότι πρέπει να μιλήσουν πρώτα οι άνθρωποι στους ανθρώπους; Παρακαλούμε πείτε μας στα σχόλια!