Προεπεξεργαστής

Στην πληροφορική ο **προεπεξεργαστής** είναι ένα πρόγραμμα υπολογιστή το οποίο επεξεργάζεται τα δεδομένα που του δίνονται και παράγει πηγαίο κώδικα για επεξεργασία από κάποιο άλλο πρόγραμμα (ή άλλον προεπεξεργαστή). Το πόσα και ποια δεδομένα επεξεργάζεται εξαρτάται από το είδος του προεπεξεργαστή.

## Γενικά
Η ανάγκη χρήσης προεπεξεργαστών προέκυψε από την ανάγκη επαναχρησιμοποίησης τμημάτων πηγαίου κώδικα χωρίς να ξαναγράφονται από την αρχή αλλά με τη χρήση λέξεων κλειδιών. Αυτή η διαδικασία δεν είναι απαραίτητο να ενσωματώνεται στον μεταγλωττιστή καθώς δυσκολεύει και την αποσφαλμάτωση (debugging).

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

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

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

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

```c
#ifdef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others.
```

μετατρέπεται σε:

```c
#ifdef _WIN32
```

* η ενοποίηση γραμμών κώδικα που, παρόλο που αποτελούν μία γραμμή, έχουν διαχωριστεί (για λόγους ευκολίας ανάγνωσης) με ειδικούς χαρακτήρες. 
* η ενσωμάτωση μέσα στον κώδικα άλλου πηγαίου κώδικα από αρχείο:
Η εντολή 
```c
#include <stdio.h>
```

επιβάλλει στον προεπεξεργαστή να ενσωματώσει το αρχείο "*stdio.h*" μέσα στο κείμενο του πηγαίου κώδικα.
* η μεταγλώττιση υπό όρους
Η εντολή:
```c
#ifdef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others.
 #include <windows.h>
 #else
 #include <unistd.h>
 #endif
```

επιβάλλει στον προεπεξεργαστή να ενσωματώσει το αρχείο "*windows.h*" μέσα στο κείμενο του πηγαίου κώδικα εάν προηγούμενα έχει οριστεί κάπου η μεταβλητή _WIN32 (έστω και αν αυτή η μεταβλητή, αργότερα, πάψει να είναι ορισμένη από κάποια εντολή undef), διαφορετικά επιβάλλει στον προεπεξεργαστή να ενσωματώσει το αρχείο "*unistd.h*  .

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

## Προεπεξεργαστές γενικής χρήσης
Οι περισσότεροι προεπεξεργαστές είναι εξειδικευμένοι στην προ-επεξεργασία κάποιων συγκεκριμένων δεδομένων όπως ο προεπεξεργαστής της C.
### m4
Ο m4 είναι βασικά επεξεργαστής μακροεντολών αλλά χρησιμοποιείται και σαν προεπεξεργαστής. Είναι ένας πολύ γενικού τύπου προεπεξεργαστής με "ισχυρά" χαρακτηριστικά. Στις περισσότερες γλώσσες προγραμματισμού η εντολές είναι κυρίως εντολές γραμμής (αν και μπορούν να επεκταθούν σε πολλαπλές γραμμές όμως μόνο με τη χρήση ειδικών χαρακτήρων στο τέλος της γραμμής που οι προεπεξεργαστές αναλαμβάνουν να τις ενοποιήσουν). Ο m4 παρέχει τη δυνατότητα να χρησιμοποιηθεί και σε περιπτώσεις που ούτε το πηγαίο κείμενο ούτε το αποτέλεσμα της προ-επεξεργασίας να χρειάζονται "εντολές σε μία γραμμή".

Δείτε επίσης: m4 (γλώσσα προγραμματισμού)

## php
Η php είναι και προεπεξεργαστής που χρησιμοποιείται για να επεξεργάζεται (μερικώς) αρχεία html. Η php ελέγχει αν το πηγαίο αρχείο περιέχει ειδικές εντολές για την ίδια (γραμμές που ξεκικούν με το 
```php
<?php
```
 ή 
```html
<script language=php>
```
 και κλείνουν τελικά με 
```php
?>
```
 ή 
```html
</script>
```
) και επεξεργάζεται το ενδιάμεσο κείμενο ενσωματώνοντας στο αρχείο html το αποτέλεσμα. Παράδειγμα απλής χρήσης της php ως προεπεξεργαστή για αρχεία html είναι:

```html
<html>
<head>
<title>Η σελίδα μου</title>
</head>
<body>
<b>
<?php
echo("Σελίδα υπό κατασκευή!"); 
?>
</b> </ br>
<?php
echo("Περάστε αργότερα."); 
?>
</body>
</html>
```

το οποίο μετατρέπει το κείμενο της σελίδας σε

```html
<html>
<head>
<title>Η σελίδα μου</title>
</head>
<body>
<b>
Σελίδα υπό κατασκευή!
</b></ br>
Περάστε αργότερα. 
</body>
</html>
```

και το αποστέλλει στον αναγνώστη της σελίδας. (αυτό με τη σειρά του μπορεί να περάσει σε άλλον προεπεξεργαστή όπως οι προεπεξεργαστές αρχείων asp. Η ίδια η php έχει πλέον τη δυνατότητα να μεταβιβάζει το αρχείο σε προεπεξεργαστή αρχείων asp πριν τα επιστρέψει στον εξυπηρετητή για περαιτέρω επεξεργασία ή αποστολή στον επισκέπτη της ιστοσελίδας).

Το προηγούμενο παράδειγμα θα εμφανίσει στη σελίδα το:
 **Σελίδα υπό κατασκευή!**
 Περάστε αργότερα.

## Υποσημειώσεις


Κατηγορία:Μηχανική λογισμικού