Κεφάλαιο 1: Εισαγωγή στη Γλώσσα Προγραμματισμού C

Ιστορία, Χαρακτηριστικά και Εφαρμογές

1.1 Ιστορία της Γλώσσας C

Δημιουργία και Εξέλιξη

🕐 Σημαντικές Ημερομηνίες

  • 1972: Πρώτη εμφάνιση της C
  • 1978: Δημοσίευση του βιβλίου "The C Programming Language" (K&R C)
  • 1989: Πρότυπο ANSI C (C89/C90)
  • 1999: Πρότυπο C99
  • 2011: Πρότυπο C11
  • 2018: Πρότυπο C17/C18

Οργανισμοί Προτυποποίησης

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

1. ANSI (American National Standards Institute)

📋 ANSI και η Τυποποίηση της C

  • Το ANSI είναι ένας αμερικανικός οργανισμός που καθορίζει εθελοντικά πρότυπα για διάφορους τομείς, συμπεριλαμβανομένων των γλωσσών προγραμματισμού
  • Είχε σημαντικό ρόλο στην καθιέρωση του προτύπου για τη γλώσσα C με την έκδοση C89 το 1989
  • Μετά από αυτή την έκδοση, η γλώσσα C άρχισε να αναγνωρίζεται με τον όρο ANSI C
  • Το ANSI C αποτέλεσε τη βάση για άλλες εκδόσεις της γλώσσας C και για τη διάδοση της στις ΗΠΑ και διεθνώς

2. ISO (International Organization for Standardization)

🌍 ISO και τα Διεθνή Πρότυπα

  • Η ISO είναι ο διεθνής οργανισμός τυποποίησης, υπεύθυνος για τη δημιουργία και επικύρωση διεθνών προτύπων
  • Έλαβε το πρότυπο ANSI C και το επικύρωσε ως ISO/IEC 9899, το οποίο έγινε το διεθνές πρότυπο για τη γλώσσα C (γνωστό ως C90)
  • Η ISO συνεχίζει να διατηρεί την αναθεώρηση και εξέλιξη της γλώσσας C
  • Τα επόμενα πρότυπα περιλαμβάνουν: C99, C11, C17, και το πιο πρόσφατο C23

3. Άλλοι Οργανισμοί Τυποποίησης

Εκτός από την ANSI και την ISO, υπάρχουν και άλλοι οργανισμοί που καθορίζουν πρότυπα για διάφορες γλώσσες προγραμματισμού και τεχνολογίες:

💡 Γιατί είναι σημαντική η τυποποίηση;

Η τυποποίηση της γλώσσας C μέσω ANSI και ISO διασφάλισε:

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

1.2 Χαρακτηριστικά της Γλώσσας C

Βασικά Χαρακτηριστικά

1. Δομημένη Γλώσσα

🗂️ Τι σημαίνει "Δομημένη Γλώσσα";

Αυτό σημαίνει ότι η C υποστηρίζει τις αρχές του structured programming:

Ακολουθιακή Εκτέλεση

Sequence - Εντολές εκτελούνται διαδοχικά

Επιλογή/Διακλάδωση

Selection - if, switch

Επανάληψη

Iteration - for, while, do...while

Κατακερματισμός προγράμματος

Χωρισμός σε συναρτήσεις (functions)

  • Ο κώδικας οργανώνεται σε σαφώς καθορισμένες δομές ελέγχου αντί για αυθαίρετα άλματα με goto
  • Ο κώδικας "σπάει" σε συναρτήσεις (functions), που είναι ανεξάρτητα κομμάτια λογικής, ώστε να υπάρχει επαναχρησιμοποίηση και ευκολότερη συντήρηση
  • Υποστηρίζεται η έννοια της ιεραρχίας και της αναγνωσιμότητας: μπορείς να σχεδιάσεις ένα πρόγραμμα ως συνδυασμό μικρότερων, πιο κατανοητών δομικών μονάδων
  • Ενισχύεται η σαφήνεια και η αποφυγή spaghetti code, που χαρακτήριζε τις πρώιμες γλώσσες (π.χ. Assembly, BASIC με συνεχόμενα goto)

📌 Με λίγα λόγια: η C θεωρείται δομημένη γλώσσα επειδή προσφέρει όλα τα βασικά εργαλεία της structured programming (sequence – selection – iteration – program decomposition), που βοηθούν να γράφονται προγράμματα πιο καθαρά, ευανάγνωστα και λιγότερο επιρρεπή σε λάθη.

2. Γλώσσα Μεσαίου Επιπέδου

3. Φορητότητα (Portability)

4. Αποδοτικότητα

5. Ευελιξία

✅ Πλεονεκτήματα της C

  • Ταχύτητα εκτέλεσης: Πολύ γρήγορη εκτέλεση προγραμμάτων
  • Απλότητα: Σχετικά απλή σύνταξη
  • Ευρεία χρήση: Χρησιμοποιείται παντού
  • Βιβλιοθήκες: Μεγάλη συλλογή έτοιμων βιβλιοθηκών
  • Έλεγχος μνήμης: Πλήρης έλεγχος της διαχείρισης μνήμης

❌ Μειονεκτήματα της C

  • Χειρωνακτική διαχείριση μνήμης: Κίνδυνος για memory leaks
  • Έλλειψη αντικειμενοστραφούς προγραμματισμού (OOP): Δεν υποστηρίζει κλάσεις, αντικείμενα, κληρονομικότητα ή πολυμορφισμό
  • Δυσκολία εντοπισμού λαθών: Λιγότερες προστασίες από λάθη
  • Έλλειψη υψηλού επιπέδου features: Όπως garbage collection

📖 Έλλειψη αντικειμενοστραφούς προγραμματισμού (OOP)

Η γλώσσα C δεν υποστηρίζει αντικειμενοστραφή προγραμματισμό (Object-Oriented Programming). Αυτό σημαίνει ότι δεν υπάρχουν έννοιες όπως:

  • Κλάσεις (classes): Πρότυπα για τη δημιουργία αντικειμένων
  • Αντικείμενα (objects): Στιγμιότυπα των κλάσεων
  • Κληρονομικότητα (inheritance): Δυνατότητα επέκτασης υπαρχουσών κλάσεων
  • Πολυμορφισμός (polymorphism): Ίδια διεπαφή για διαφορετικές υλοποιήσεις

Η C βασίζεται στον δομημένο (procedural) τρόπο προγραμματισμού, όπου το πρόγραμμα χωρίζεται σε συναρτήσεις (functions) και δεδομένα, τα οποία είναι ανεξάρτητα μεταξύ τους.

1.3 Εφαρμογές της Γλώσσας C

Περιοχές Χρήσης

Ορίστε μερικές χαρακτηριστικές περιοχές χρήσης με παραδείγματα:

🖥️ Λειτουργικά Συστήματα

  • UNIX/Linux kernel → σχεδόν εξ ολοκλήρου σε C
  • Windows → μεγάλα μέρη του πυρήνα και API
  • macOS → πολλά κομμάτια του πυρήνα και βιβλιοθηκών

⚡ Embedded Systems

  • Μικροελεγκτές (π.χ. Arduino, STM32)
  • IoT devices (αισθητήρες, έξυπνες συσκευές)
  • Automotive software (ECUs, ABS controllers, infotainment)

🔧 Compilers & Interpreters

  • GCC compiler (GNU Compiler Collection)
  • Python interpreter (CPython) γραμμένος σε C
  • Άλλοι μεταγλωττιστές (π.χ. Lua, Ruby interpreter)

🗄️ Βάσεις Δεδομένων

  • MySQL → γραμμένη κυρίως σε C και C++
  • PostgreSQL → βασικά modules σε C
  • SQLite → ολόκληρη υλοποίηση σε C (σε ένα ενιαίο C αρχείο μπορείς να βρεις ολόκληρο τον κώδικα της SQLite!)

🛠️ Εφαρμογές Συστήματος

  • Device drivers (π.χ. drivers για κάρτες γραφικών, δίσκους, USB)
  • Network protocols (TCP/IP stacks)
  • System utilities (π.χ. ls, grep, cp στα Unix συστήματα)

📌 Η C ως "Γλώσσα των Συστημάτων"

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

1.4 Δομή ενός Προγράμματος C

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

🔹 Βασικό Παράδειγμα

// Σχόλια - εξηγούν τον κώδικα #include <stdio.h> // Προεπεξεργαστής: εισαγωγή βιβλιοθήκης int main() { // Κύρια συνάρτηση: σημείο εκκίνησης // Κώδικας εδώ printf("Γεια σου, Κόσμε!\n"); // Εκτύπωση μηνύματος στην οθόνη return 0; // Επιστροφή τιμής (0 = επιτυχής εκτέλεση) }

🔹 Ανατομία Προγράμματος (Σημειώσεις για μάθημα)

1. Σχόλια (// ... ή /* ... */)

Τα σχόλια είναι κείμενο που γράφουμε για να εξηγήσουμε τον κώδικα. Υπάρχουν δύο τύποι σχολίων στη C:

🔹 1. Μονογραμμικό σχόλιο (single-line comment)

Χρησιμοποιεί // και αγνοείται μέχρι το τέλος της γραμμής.

// Αυτό είναι ένα σχόλιο μίας γραμμής printf("Hello!\n"); // Εκτυπώνει μήνυμα στην οθόνη

🔹 2. Πολυγραμμικό σχόλιο (multi-line comment)

Ξεκινά με /* και τελειώνει με */. Μπορεί να εκτείνεται σε πολλές γραμμές.

/* Αυτό είναι ένα σχόλιο που εκτείνεται σε πολλές γραμμές */ printf("Hello world!\n");

2. Προεπεξεργαστής (#include <stdio.h>)

📌 Τι είναι βιβλιοθήκη στη C;

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

3. Κύρια συνάρτηση int main()

📌 Γιατί το main() έχει κενές παρενθέσεις;

  • Οι παρενθέσεις δηλώνουν ότι η main είναι συνάρτηση
  • Αν είναι κενές → η συνάρτηση δεν δέχεται καθόλου ορίσματα (arguments)
  • Υπάρχει και παραλλαγή:
int main(int argc, char *argv[])

που χρησιμοποιείται όταν θέλουμε να περάσουμε ορίσματα από τη γραμμή εντολών.

4. Εντολή printf(...)

printf("Ο αριθμός είναι: %d\n", 5); // εκτυπώνει: Ο αριθμός είναι: 5

📌 Τι είναι συνάρτηση;

Μια συνάρτηση στη C είναι ένα ανεξάρτητο κομμάτι κώδικα που:

  • έχει όνομα (π.χ. printf)
  • δέχεται δεδομένα ως παραμέτρους (π.χ. "Γεια σου, Κόσμε!\n")
  • εκτελεί μια εργασία (π.χ. εκτύπωση στην οθόνη)
  • μπορεί να επιστρέψει αποτέλεσμα

5. return 0;

📌 Συμπέρασμα για μάθημα:

Η βασική δομή ενός προγράμματος C είναι:

  • Σχόλια → επεξηγούν τον κώδικα
  • Προεπεξεργαστής #include → εισάγει βιβλιοθήκες με έτοιμες συναρτήσεις
  • Κύρια συνάρτηση main() → σημείο εκκίνησης
  • printf → συνάρτηση για εμφάνιση μηνυμάτων στην οθόνη
  • return → επιστρέφει ακέραιο αποτέλεσμα στο λειτουργικό

1.5 Compilation Process (Διαδικασία Μεταγλώττισης)

Στη C, πριν τρέξει το πρόγραμμά μας, πρέπει να περάσει από μεταγλώττιση. Αυτό σημαίνει ότι ο κώδικας που γράψαμε (σε C source code) μετατρέπεται σε εκτελέσιμο πρόγραμμα (machine code).

🔹 Δημοφιλή προγράμματα για συγγραφή source code

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

Είδος Όνομα Περιγραφή
IDE
(Integrated Development Environment)
Code::Blocks Πολύ δημοφιλές για C/C++, ειδικά για αρχάριους. Περιλαμβάνει compiler και debugger.
Dev-C++ Κλασικό και απλό IDE για C/C++. Εύκολο στη χρήση.
Visual Studio Ισχυρό περιβάλλον από τη Microsoft· υποστηρίζει C, C++, C#, Python κ.ά.
CLion (JetBrains) Επαγγελματικό IDE για C/C++ με έξυπνη ανάλυση κώδικα και debugging.
Eclipse CDT Παραλλαγή του Eclipse για ανάπτυξη σε C/C++.
Text Editors
(ελαφριά προγράμματα)
Visual Studio Code (VS Code) Πολύ δημοφιλές. Με επεκτάσεις μπορεί να κάνει compile και debug C/C++.
Sublime Text Γρήγορος και καθαρός editor με υποστήριξη για πολλές γλώσσες.
Atom Επεκτάσιμο εργαλείο από το GitHub για συγγραφή κώδικα.
Notepad++ Ελαφρύ και απλό, ιδανικό για αρχάριους ή γρήγορες δοκιμές.

💡 Ποιο να διαλέξω;

  • Για αρχάριους: Code::Blocks ή Dev-C++ (έχουν όλα όσα χρειάζεστε ενσωματωμένα)
  • Για γρήγορη συγγραφή: VS Code ή Sublime Text (ελαφριά και γρήγορα)
  • Για επαγγελματική ανάπτυξη: CLion ή Visual Studio (πλήρη χαρακτηριστικά)

🔹 Στάδια Μεταγλώττισης

Η διαδικασία έχει 4 βασικά στάδια:

📄 Διαδικασία Μεταγλώττισης

  1. Preprocessing (Προεπεξεργασία)
    • Εκτελεί εντολές που ξεκινούν με # (π.χ. #include, #define)
    • Εισάγει βιβλιοθήκες και αντικαθιστά μακροεντολές
  2. Compilation (Μεταγλώττιση)
    • Ο κώδικας C μετατρέπεται σε assembly code (χαμηλού επιπέδου)
  3. Assembly (Συναρμολόγηση)
    • Ο κώδικας assembly μετατρέπεται σε object code (.o αρχεία)
  4. Linking (Σύνδεση)
    • Συνδέει το object code με τις βιβλιοθήκες (π.χ. stdio)
    • Παράγει το τελικό εκτελέσιμο πρόγραμμα
Source Code (.c) → Preprocessor → Compiler → Assembler → Linker → Executable

🔹 Παράδειγμα Προγράμματος (hello.c)

#include <stdio.h> int main() { printf("Γεια σου, Κόσμε!\n"); return 0; }

🖥️ Compilation σε Linux

  1. Ανοίγουμε το Terminal
  2. Χρησιμοποιούμε τον compiler gcc (συνήθως προεγκατεστημένος):
gcc hello.c -o hello
  1. Τρέχουμε το πρόγραμμα:
./hello
  1. Αποτέλεσμα:
Γεια σου, Κόσμε!

📌 Αν ο gcc λείπει → εγκατάσταση με package manager:

  • Debian/Ubuntu: sudo apt install build-essential
  • Fedora: sudo dnf groupinstall "Development Tools"

🍎 Compilation σε MacOS

  1. Ανοίγουμε το Terminal
  2. Χρησιμοποιούμε τον compiler clang (προεπιλογή στο Mac):
clang hello.c -o hello
  1. Τρέχουμε το πρόγραμμα:
./hello
  1. Αποτέλεσμα:
Γεια σου, Κόσμε!

📌 Σημείωση για το Mac

  • Αν δεν υπάρχει clang/gcc, χρειάζεται εγκατάσταση των Command Line Tools:
xcode-select --install
  • Εναλλακτικά, μπορούμε να εγκαταστήσουμε gcc μέσω Homebrew:
brew install gcc

✅ Συμπέρασμα:

  • Η διαδικασία μεταγλώττισης είναι ίδια σε Linux και MacOS
  • Και στις δυο περιπτώσεις χρησιμοποιούμε gcc (Linux) ή clang/gcc (Mac)
  • Η λογική είναι κοινή:
source code → compiler → executable → run

💻 Πρακτικό Παράδειγμα Terminal Session

gmpardis@Giorgoss-MacBook-Pro-2 Desktop % cd c gmpardis@Giorgoss-MacBook-Pro-2 c % ls -la total 80 drwxr-xr-x@ 4 gmpardis staff 128 28 Σεπ 16:42 . drwx------@ 141 gmpardis staff 4512 28 Σεπ 16:40 .. -rwxr-xr-x 1 gmpardis staff 33432 28 Σεπ 16:42 hello -rw-r--r--@ 1 gmpardis staff 470 28 Σεπ 16:41 helloworld.c gmpardis@Giorgoss-MacBook-Pro-2 c % ./hello Γεια σου, Κόσμε! gmpardis@Giorgoss-MacBook-Pro-2 c %

🔹 Δικαιώματα Αρχείων & Ειδικές Εγγραφές ( . και .. )

Όταν δίνουμε την εντολή:

ls -la

παίρνουμε μια αναλυτική λίστα αρχείων. Παράδειγμα:

drwxr-xr-x@ 4 gmpardis staff 128 28 Σεπ 16:42 . drwx------@ 141 gmpardis staff 4512 28 Σεπ 16:40 .. -rwxr-xr-x 1 gmpardis staff 33432 28 Σεπ 16:42 hello -rw-r--r--@ 1 gmpardis staff 470 28 Σεπ 16:41 helloworld.c

📌 Ανάλυση Δικαιωμάτων (permissions)

Το πρώτο πεδίο, π.χ. -rwxr-xr-x, δείχνει τα δικαιώματα του αρχείου:

  1. Πρώτος χαρακτήρας → Τύπος αρχείου
    • - = κανονικό αρχείο
    • d = directory (φάκελος)
    • l = symbolic link
  2. Επόμενοι 9 χαρακτήρες χωρίζονται σε 3 τριάδες:
rwx | r-x | r-x
  1. Συνοπτικά:
    • Ο ιδιοκτήτης (user) → πλήρη δικαιώματα
    • Η ομάδα → μπορεί να διαβάσει και να εκτελέσει
    • Οι άλλοι → μπορούν να διαβάσουν και να εκτελέσουν

👉 Σε αριθμητική μορφή (chmod): αυτό είναι 755.

🔹 Τα δικαιώματα (permissions)

Κάθε αρχείο ή φάκελος έχει τρεις ομάδες δικαιωμάτων:

Ομάδα Ποιον αφορά
1️⃣ rwx Owner (ιδιοκτήτης του αρχείου)
2️⃣ r-x Group (ομάδα χρηστών)
3️⃣ r-x Others (όλοι οι υπόλοιποι)

🔹 Τι σημαίνουν τα γράμματα

Σύμβολο Λέξη Αξία
r read 4
w write 2
x execute 1
- κανένα δικαίωμα 0

🔹 Ανάλυση του rwx | r-x | r-x

Ομάδα Συνδυασμός Υπολογισμός Αριθμητική τιμή
Owner rwx 4 + 2 + 1 7
Group r-x 4 + 0 + 1 5
Others r-x 4 + 0 + 1 5

💡 Παραδείγματα αριθμητικών δικαιωμάτων

  • 755: Owner έχει πλήρη δικαιώματα (rwx), Group και Others μπορούν να διαβάσουν και να εκτελέσουν (r-x)
  • 644: Owner μπορεί να διαβάσει και να γράψει (rw-), Group και Others μόνο να διαβάσουν (r--)
  • 777: Όλοι έχουν πλήρη δικαιώματα (rwx) - Επικίνδυνο! Αποφύγετέ το
  • 600: Μόνο ο Owner μπορεί να διαβάσει και να γράψει (rw-), κανείς άλλος δεν έχει πρόσβαση

📌 Τι είναι τα . και ..

Αυτά υπάρχουν σε κάθε directory και είναι μηχανισμός πλοήγησης στο filesystem.

1.6 Σύγκριση με Άλλες Γλώσσες

📊 Σύγκριση Χαρακτηριστικών

Χαρακτηριστικό C C++ Java Python
Ταχύτητα Πολύ γρήγορη Πολύ γρήγορη Μέτρια Αργή
Δυσκολία Μέτρια Δύσκολη Μέτρια Εύκολη
OOP Όχι Ναι Ναι Ναι
Memory Management Χειρωνακτική Χειρωνακτική Αυτόματη Αυτόματη
Portability Υψηλή Υψηλή Πολύ υψηλή Πολύ υψηλή

1.7 Γιατί να Μάθουμε C;

Εκπαιδευτική Αξία

Επαγγελματική Αξία

1.8 Μελλοντικές Εξελίξεις

C23 Standard (Επερχόμενο)

Εναλλακτικές Γλώσσες

📋 Σύνοψη Κεφαλαίου

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

🎯 Η εκμάθησή της παρέχει:

  • Βαθιά κατανόηση των υπολογιστικών συστημάτων
  • Βάση για την εκμάθηση άλλων γλωσσών
  • Δεξιότητες για system programming
  • Ικανότητα ανάπτυξης αποδοτικών εφαρμογών

Στο επόμενο κεφάλαιο θα μάθουμε πώς να εγκαταστήσουμε το περιβάλλον ανάπτυξης και να γράψουμε το πρώτο μας πρόγραμμα!

🔥 Ασκήσεις για Εμπέδωση

  1. Αναφέρετε τρία πλεονεκτήματα της γλώσσας C
  2. Σε ποιες περιοχές χρησιμοποιείται κυρίως η C;
  3. Ποια είναι τα στάδια της διαδικασίας μεταγλώττισης;
  4. Συγκρίνετε τη C με μια άλλη γλώσσα που γνωρίζετε
  5. Εξηγήστε γιατί η C θεωρείται γλώσσα "μεσαίου επιπέδου"