Προγραμματισμός Ι (ΗΥ120)

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι (ΗΥ120)

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι (ΗΥ120)

Βασικές Έννοιες. Προγραµµατισµός Ι 1

Προγραμματισμός Ι (ΗΥ120)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Προγραμματισμός Ι (ΗΥ120)

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Η γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Δομημένος Προγραμματισμός (ΤΛ1006)

Περιεχόμενα. Πρόλογος... 21

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ (ΤΛ2007 )

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Εισαγωγή στον Προγραμματισμό

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Ενδεικτική περιγραφή μαθήματος

Διαδικασιακός Προγραμματισμός

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τα επιμέρους τμήματα Η ΟΜΗ TOY ΥΠΟΛΟΓΙΣΤΗ. Αναπαράσταση μεγεθών. Αναλογική αναπαράσταση ΚΕΝΤΡΙΚΗ ΜΝΗΜΗ ΜΟΝΑ Α ΕΛΕΓΧΟΥ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Διαδικασιακός Προγραμματισμός

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Δομημένος Προγραμματισμός

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Υπολογιστές Ι. Άδειες Χρήσης. Εισαγωγή. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Δομημένος Προγραμματισμός

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι (HY120)

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Διαδικασιακός Προγραμματισμός

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Βιβλιοθήκη stdio. Προγραμματισμός II 1

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Διαδικασία Ανάπτυξης Λογισμικού

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 18η: Διαχείρηση Αρχείων

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

ÁÎÉÁ ÅÊÐÁÉÄÅÕÔÉÊÏÓ ÏÌÉËÏÓ

Η γλώσσα προγραμματισμού C

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Κεφάλαιο 1 Εισαγωγή στη C

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Προγραμματισμός Ι (HY120)

Εισαγωγή στον Προγραμματισμό

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (ΗΥ120)

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Προγραμματισμός Η/Υ (ΤΛ2007 )

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Βασικές Έννοιες Προγραμματισμού. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Βασικές Αρχές Προγραμματισμού

Προγραμματισμός Ι (ΗΥ120)

Η γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Προγραμματισμός Ι (ΗΥ120)

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 2: Μνήμη Εισαγωγή στη C

Μνήμη Μια διάταξη από «δωμάτια» κάθε ένα από τα οποία μπορεί να χρησιμοποιηθεί για την αποθήκευση 1 bit (0 / 1). 8 τέτοια δωμάτια οργανώνονται σε μια μονάδα (Byte) Ένα «σπίτι» με διεύθυνση κλπ! Τη μνήμη ο προγραμματιστής τη «βλέπει» σα μια ακολουθία από bytes. Η διεύθυνση κάθε byte είναι η σειρά του στην ακολουθία 2

Πόσο Μεγάλη Μνήμη; 3 Τυπικός Η/Υ: Κύρια μνήμη (RAM) μερικών Gigabyte Σκληρός δίσκο εκατοντάδων Gigabyte. 1 byte (B) = 8 bits 1 KB = 1024 B = 2 10 B 1 MB = 1024 KB = 2 20 B 1 GB = 1024 MB = 2 30 B 1 TΒ = 1024 GΒ = 2 40 B

Πρόσβαση στη Μνήμη Τι πρέπει να καθορίσω; Τη διεύθυνση Τι θέλω να κάνω (ανάγνωση / εγγραφή) Σε πόσα bytes Πόσο μεγάλη γειτονιά 4 «Ανάγνωση»: επιστρέφει τις τιμές των bytes που έχουν αποθηκευτεί στις αντίστοιχες θέσεις. «Εγγραφή»: προσδιορίζει τις τιμές των bytes που θα αποθηκευτούν στις αντίστοιχες θέσεις.

Ανάγνωση από τη Μνήμη διεύθυνση περιεχόμενα 5 adr=3 op=read 0 1 2 0 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 len=1 10101011 μηχανισμός πρόσβασης μνήμης 3 4 5 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... Ν-1 0 0 0 0 0 1 0 1 Ν 1 1 0 1 1 0 0 1

Εγγραφή στη Μνήμη διεύθυνση περιεχόμενα 6 adr=1 len=2 00010101 11101010 op=write μηχανισμός πρόσβασης μνήμης Η/Υ 0 1 2 3 4 5 Ν-1 Ν 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1

Κωδικοποίηση Δεδομένων Τα πάντα είναι 0 και 1! Κωδικοποίηση: η μετατροπή δεδομένων από ένα σύστημα σε ένα άλλο (π.χ. Δεκαδικό -> δυαδικό, χαρακτήρες -> δυαδικό). Πόσα bits για κάθε είδος δεδομένων; Περισσότερα bits/bytes: Όσο μεγαλύτερο το πεδίο τιμών Όσο μεγαλύτερη η επιθυμητή ακρίβεια Με Ν bits κωδικοποιούμε 2 Ν διαφορετικές τιμές: Π.χ. καλύπτουμε το πεδίο φυσικών [0...2 Ν -1] Ή το πεδίο ακεραίων [-2 Ν-1...2 Ν-1-1]. 7

Δεδομένα Προγράμματος και Μνήμη 8 Για κάθε δεδομένο πρέπει να καθοριστεί (από τον προγραμματιστή): Η θέση μνήμης για την αποθήκευση του Ο αριθμός των bytes που χρειάζονται για την αποθήκευση των τιμών που μπορεί να λάβει Η κωδικοποίηση που χρησιμοποιείται για κάθε τιμή στο δυαδικό σύστημα Απάνθρωπο; Χρειάζεται κατάλληλη υποστήριξη από τις γλώσσες προγραμματισμού...

Τύποι Δεδομένων 9 Κάθε γλώσσα ορίζει ένα σύνολο από βασικούς τύπους δεδομένων. Κάθε βασικός τύπος έχει: Προκαθορισμένο μέγεθος (σε bytes) Συγκεκριμένη δυαδική κωδικοποίηση και αντίστοιχο πεδίο τιμών. Ο προγραμματιστής ορίζει κάθε δεδομένο του προγράμματος ως αντικείμενο ενός τύπου Καθορίζει έμμεσα το μέγεθος και την κωδικοποίηση του (την σημασία των bits). Η μνήμη αποθηκεύει τις τιμές των bits/bytes χωρίς να γνωρίζει το πως αυτές ερμηνεύονται από το πρόγραμμα.

Ονομασία Θέσεων Δεδομένων 10 Σε κάθε αντικείμενο δεδομένων δίνεται και ένα μνημονικό όνομα. Το όνομα μπορεί να χρησιμοποιείται, αντί της διεύθυνσης, στις πράξεις ανάγνωσης και αλλαγής των τιμών του. Η πρόσβαση στην μνήμη εξακολουθεί να γίνεται με βάση την θέση μνήμης και τον αριθμό bytes προς ανάγνωση/αποθήκευση Η αντιστοίχιση γίνεται (αυτόματα) από την εκάστοτε γλώσσα προγραμματισμού.

Μεταβλητές Προγράμματος Μεταβλητή: αντικείμενο δεδομένων του προγράμματος με Όνομα και Τύπο «Διαβάζουμε» μεταβλητή: Διαβάζουμε την τιμή που έχει αποθηκευτεί στην αντίστοιχη θέση της μνήμης. «Αναθέτουμε» τιμή σε μεταβλητή: Γράφουμε αυτή την τιμή στην αντίστοιχη θέση της μνήμης. «Δέσμευση» μεταβλητής: Δέσμευση αντίστοιχου χώρου στην μνήμη «Ζωή» μεταβλητής: Διάστημα κατά το οποίο αυτός ο χώρος παραμένει δεσμευμένος. 11

Παράδειγμα int var; θεση/διεύθυνση: 1 τύπος: int διεύθυνση περιεχόμενα 12 τύπος int 0 4 5 Ν-1 Ν 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 μέγεθος: 4 bytes 2 0 0 0 0 0 0 0 0 ερμηνεία: ακέραιος κωδικοποίηση: 2 s complement 3 0 0 0 0 0 0 0 0 τι τιμή έχει η μεταβλητή var; διάβασε από τη διεύθυνση της var όσα bytes ορίζει ο τύπος της T (π.χ. int), και ερμήνευσέ τα σύμφωνα με τη σύμβαση κωδικοποίησης του T 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 αποτέλεσμα

char a; short b; float c; διεύθυνση 0 1 2 3 4 5 6 7 8 περιεχόμενα 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0... 13

Τι είναι η C; 15 Είναι μια γλώσσα «προστακτικού» (imperative) προγραμματισμού με σχετικά λίγες εντολές. Είναι ιδιαίτερα διαδεδομένη, σε επίπεδο υλοποίησης λειτουργικών συστημάτων αλλά και εφαρμογών. Η ελάχιστη μονάδα υποπρογράμματος (δόμησης κώδικα) είναι η συνάρτηση (function). Ένα πρόγραμμα C μεταφράζεται και μετά εκτελείται. Υποστηρίζεται ξεχωριστή μετάφραση διαφορετικών υποπρογραμμάτων με στατική ή δυναμική σύνδεση. Οι γλώσσες C++ και Java είναι «απόγονοι» της C.

Μορφοποίηση Κώδικα στη C Σχεδόν κάθε εντολή τερματίζεται με ';'. Μπορούμε να γράφουμε πολλές διαδοχικές εντολές στην ίδια γραμμή του κειμένου. Χρησιμοποιούμε τον όρο «σώμα» ή «μπλοκ» για να αναφερθούμε σε μια ή περισσότερες εντολές που δίνονται ανάμεσα σε '{' και '} και συμπεριφέρονται σαν «ομάδα». Σχόλια (κείμενο που δεν λαμβάνει υπ όψη του ο μεταφραστής) δίνονται ανάμεσα σε ' /*' και ' */'. Κενοί χαρακτήρες και γραμμές που βρίσκονται ανάμεσα σε εντολές δεν λαμβάνονται υπ όψη από τον μεταφραστή Χρησιμεύουν, όπως και τα σχόλια, για την αναγνωσιμότητα του κώδικα. 16

Παίζοντας με τη Μορφοποίηση ;-) /*,*/ #include #include/* <time.h> _,o*/ <stdlib.h> #define c(c)/* -. */return ( C); /* 2004*/ #include <stdio.h>/*. Moekan "' `\b-' */ typedef/* */char p;p* u,w [9 ][128],*v;typedef int _;_ R,i,N,I,A,m,o,e [9], a[256],k [9], n[ 256];FILE*f ;_ x (_ K,_ r,_ q){; for(; r< q ; K =(( 0xffffff) &(K>>8))^ n[255 & ( K ^u[0 + r ++ ] )]);c (K )} _ E (p*r, p*q ){ c( f = fopen (r,q))}_ B(_ q){c( fseek (f, 0,q))}_ D(){c( fclose(f ))}_ C( p *q){c( 0- puts(q ) )}_/* / */main(_ t,p**z){if(t<4)c( C("<in" "file>" "\40<l" "a" "yout> " /*b9213272*/"<outfile>" ) )u=0;i=i=(e(z[1],"rb"))?b(2)?0 : (((o =ftell (f))>=8)?(u =(p*)malloc(o))?b(0)?0:!fread(u,o,1,f):0:0)?0: D():0 ;if(!u)c(c(" bad\40input "));if(e(z[2],"rb" )){for(n=-1;256> i;n[i++] =-1 )a[ i]=0; for(i=i=0; i<o&&(r =fgetc( f))>-1;i++)++a[r]?(r==n)?( ++I>7)?(n[ N]+1 )?0:(n [N ]=i-7):0: (N=R) (I=1):0;A =-1;N=o+1;for(i=33;i<127;i++ )( n[i ]+ 1&&N>a[i])? N= a [A=i] :0;B(i=I=0);if(A+1)for(N=n[A]; I< 8&& (R =fgetc(f ))> -1&& i <o ;i++)(i<n i>n+7)?(r==a)?((*w[i ] =u [i])?1:(*w[i]= 46))?(a [I++]=i):0:0:0;D();}if(I<1)c(C( " bad\40la" "yout "))for(i =0;256>(R= i);n[i++]=r)for(a=8; A >0;A --) R = ( (R&1)==0)?(unsigned int)r>>(01):((unsigned /*kero Q',KSS */)R>> 1)^ 0xedb88320;m=a[I-1];a[I ]=(m <N)?(m= N+8): ++ m;for(i=00;i<i;e[i++]=0){ v=w [i]+1;for(r =33;127 >R;R++)if(R-47&&R-92 && R-(_)* w[i])*( v++)= (p)r;*v=0;}for(sprintf /*'_ G*/ (*w+1, "%0" "8x",x(R=time(i=0),m,o)^~ 0) ;i< 8;++ i)u [N+ i]=*(*w+i+1);for(*k=x(~ 0,i=0,*a);i>- 1; ){for (A=i;A<I;A++){u[+a [ A] ]=w[a ][e[a]] ; k [A+1]=x (k[a],a[a],a[a+1] );}if (R==k[I]) c( (E(z[3 ],"wb+"))?fwrite( /* */ u,o,1,f)?d () C(" \n OK."):0 :C( " \n WriteError" )) for (i =+I- 1 ;i >-1?!w[i][++ e[+ i]]:0; ) for( A=+i--; A<I;e[A++] =0); (i <I-4 )?putchar ((_ ) 46) fflush /*',*/ ( stdout ): 0& 0;}c(C (" \n fail") ) /* dp' / dp pd ' ' zc */ } Από το Obfuscated C Contest http://www.ioccc.org/ 17

Η συνάρτηση στη C 18 Συνάρτηση: Η κύρια μονάδα υποπρογράμματος Μπορεί να βασίζεται σε άλλες συναρτήσεις, που με τη σειρά τους μπορεί να βασίζονται σε άλλες συναρτήσεις κλπ. Η συνάρτηση main (κυρίως συνάρτηση) καλείται από το περιβάλλον εκτέλεσης (λειτουργικό) για να αρχίσει η εκτέλεση του προγράμματος Ανεξάρτητα από το αν το πρόγραμμα έχει και άλλες συναρτήσεις. Αρχικά θα εστιάσουμε σε προγράμματα που αποτελούνται μόνο από την main.

Η συνάρτηση main() 19 Σχόλια /* Αρχείο hello.c. Εμφανίζει στην οθόνη το μήνυμα hello world */ #include <stdio.h> int main(int argc, char* argv[]) { Συμπερίληψη δηλώσεων εξωτερικών συναρτήσεων Ορίσματα συνάρτησης Επικεφαλίδα συνάρτησης } printf("hello world\n"); return(0); Σώμα (εντολές)

Μετάφραση / μεταγλώτιση (compilation) Πώς «καταλαβαίνει» ο υπολογιστής τη γλώσσα 20 υψηλού επιπέδου; Πρέπει οι εντολές να μετατραπούν σε εντολές γλώσσας μηχανής. Αυτό ονομάζεται μεταγλώττιση Γίνεται από ειδικά προγράμματα, τους μεταγλωττιστές (compilers). Συνήθως μια εντολή γλώσσας υψηλού επιπέδου αντιστοιχεί σε μια σειρά εντολών γλώσσας μηχανής Η μεταγλώττιση γίνεται (συνήθως) ως ξεχωριστή διαδικασία, πολύ πριν αρχίσει η εκτέλεση του κώδικα. Υπάρχουν περιπτώσεις όπου η μετάφραση γίνεται ακριβώς πριν την εκτέλεση (just in time compilation).

21 C compiler C -> 01001010 Γλώσσα Μηχανής για CPU y CPU y

Μεταγλώττιση / Εκτέλεση στο Linux το όνομα του προγράμματος μεταγλώτισης (compiler) Δείξε και τις προειδοποιήσεις (όχι μόνο τα σφάλματα) Πρόσθεσε πληροφορίες για τον αποσφαλματωτή το όνομα του αρχείου με τον κώδικα C το όνομα του αρχείου όπου θα αποθηκευτεί ο κώδικας μηχανής 22 >gcc Wall g myprog.c o myprog<enter> > >./myprog<enter> hello world > ακολουθεί το όνομα του αρχείου όπου πρέπει να αποθηκευτεί το αποτέλεσμα (κώδικας μηχανής), μόνο αν η μετάφραση είναι επιτυχής

Ένα Ακόμα Παράδειγμα #include <stdio.h> int main(int argc, char* argv[]) { } putchar('h'); putchar('e'); putchar('l'); putchar('l'); putchar('o'); putchar(' '); putchar('w'); putchar('o'); putchar('r'); putchar('l'); putchar('d'); putchar('\n'); return(0); >./myprog<enter> hello world > 25

Κι Άλλο Παράδειγμα #include <stdio.h> int main(int argc, char* argv[]) { } putchar('5'); putchar(' '); putchar('+'); putchar(' '); putchar('2'); putchar(' '); putchar('='); putchar('='); putchar(' '); putchar('9'); putchar('\n'); return(0); >./myprog<enter> 5 + 2 == 9 > 26

Αποσφαλμάτωση Συντακτικό επίπεδο (εύκολο) Ο κώδικας δεν αντιστοιχεί σε επιτρεπτή πρόταση σύμφωνα με τους κανόνες σύνταξης της γλώσσας Σημασιολογικό επίπεδο (δύσκολο) Ο κώδικας είναι συντακτικά σωστός αλλά εμείς δεν χρησιμοποιούμε σωστά κάποια εντολή Άλλο θέλουμε να κάνουμε και άλλο ζητάμε από τον υπολογιστή να κάνει Παράγεται λάθος αποτέλεσμα Λογικό επίπεδο (πιο δύσκολο) Ο κώδικας είναι συντακτικά σωστός και όλες οι εντολές χρησιμοποιούνται σωστά Υπάρχει λάθος σε επίπεδο αλγορίθμου (σκέψης) 27

Ορθότητα προγραμμάτων Αν στη μετάφραση εντοπιστεί συντακτικό λάθος, 28 αυτή τερματίζεται (εκτυπώνεται μήνυμα λάθους), διαφορετικά παράγεται κώδικας μηχανής. Το πρόγραμμα μεταφράστηκε επιτυχώς: Είναι σίγουρα σωστό; Κανείς δεν εγγυάται ότι η εκτέλεση του θα έχει και το επιθυμητό / αναμενόμενο αποτέλεσμα. Η εκτέλεση ενός (μεταγλωττισμένου) προγράμματος γίνεται πάντα σωστά, δηλαδή όπως ορίζεται από την σημασιολογία της γλώσσας προγραμματισμού. Δε φταίει το «καταραμένο το μηχάνημα» Μπορεί να υπάρχουν σημασιολογικά ή/και λογικά λάθη. Το πρόγραμμα δεν κάνει αυτό που θέλουμε

Υπολογισμός x=1+2+...+n 29 Στην καθομιλουμένη γλώσσα: Θέσε το x ίσο με 0. Πρόσθεσε στο x την τιμή 1. Πρόσθεσε στο x την τιμή 2. Πρόσθεσε στο x την τιμή 3.... Πρόσθεσε στο x την τιμή n-1. Πρόσθεσε στο x την τιμή n. Στη γλώσσα προγραμματισμού C: x = 0; x = x+1; x = x+2 x = x+3;... x = x+n-1; x = x+n; εντοπίζεται από τον μεταφραστή συντακτικό λάθος δεν έχουμε βάλει ; εκεί που θα έπρεπε

Υπολογισμός x=1+2+...+n 30 Στην καθομιλουμένη γλώσσα: Θέσε το x ίσο με 0. Πρόσθεσε στο x την τιμή 1. Πρόσθεσε στο x την τιμή 2. Πρόσθεσε στο x την τιμή 3.... Πρόσθεσε στο x την τιμή n-1. Πρόσθεσε στο x την τιμή n. Στη γλώσσα προγραμματισμού C: x = 0; x = x+1; x == x+2; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον μεταφραστή σημασιολογικό λάθος δεν έχουμε καταλάβει τι κάνει ο τελεστής ==

Υπολογισμός x=1+2+...+n 31 Στην καθομιλουμένη γλώσσα: Θέσε το x ίσο με 0. Πρόσθεσε στο x την τιμή 1. Πρόσθεσε στο x την τιμή 3. Πρόσθεσε στο x την τιμή 3.... Πρόσθεσε στο x την τιμή n-1. Πρόσθεσε στο x την τιμή n. Στη γλώσσα προγραμματισμού C: x = 0; x = x+1; x = x+3; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον μεταφραστή λογικό λάθος έχουμε υλοποιήσει λάθος αλγόριθμο