Εισαγωγή

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Καλώς ήρθατε

Υλικό και Λογισμικό Ι

Τι περιλαμβάνει το μάθημα

  1. Εισαγωγή
  2. Προγραμματισμός σε επίπεδο μηχανής
  3. Αυτόματα
  4. Γραμματικές
  5. Λεκτική ανάλυση
  6. Το μεταεργαλείο lex
  7. Συντακτική ανάλυση
  8. Το μεταεργαλείο yacc
  9. Πίνακες συμβόλων
  10. Διερμηνευτές
  11. Σημασιολογική ανάλυση
  12. Παραγωγή ενδιάμεσου κώδικα
  13. Βελτιστοποίηση κώδικα
  14. Παραγωγή τελικού κώδικα

Οι σημειώσεις

Το χάσμα υλικού και λογισμικού

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

Υλοποίηση γλωσσών προγραμματισμού

Μια γλώσσα προγραμματισμού μπορεί - ανάλογα με τη γλώσσα - να υλοποιηθεί με τους παρακάτω τρόπους: καθώς και με συνδυασμούς τους.

Ο ορισμός ενός μεταγλωττιστή

Ένας μεταγλωττιστής ορίζεται από: Ο συνδυασμός αυτός παριστάνεται από ένα διάγραμμα Τ (T diagram) όπως το παρακάτω:

Ο ίδιος συνδυασμός για ένα μεταγλωττιστή Μ συμβολίζεται και ως MATY.

Τελικός κώδικας

Ο τελικός κώδικας που παράγεται από έναν μεταγλωττιστή μπορεί να είναι:

Παραδείγματα

Τα παρακάτω παραδείγματα έχουν ως είσοδο το πρόγραμμα που τυπώνει "hello, world".

Συμβολική γλώσσα Linux Intel 386

        .file   "hello.c"
        .version        "01.01"
gcc2_compiled.:
.section        .rodata
.LC0:
        .string "helloworld\n"
.text
        .align 4
.globl main
        .type    main,@function
main:
        pushl %ebp
        movl %esp,%ebp
        pushl $.LC0
        call printf
        addl $4,%esp
.L1:
        leave
        ret
.Lfe1:
        .size    main,.Lfe1-main
        .ident  "GCC: (GNUegcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"

Γλώσσα μηχανής από δυαδικό αρχείο Linux Intel 386 σε μορφή δεκαεξαδική και ASCII

hello.o:     file format elf32-i386

Contents of section .text:
 0000 5589e568 00000000 e8fcffff ff83c404  U..h............
 0010 c9c3                                 ..              
Contents of section .data:
Contents of section .note:
 0000 08000000 00000000 01000000 30312e30  ............01.0
 0010 31000000                             1...            
Contents of section .rodata:
 0000 68656c6c 6f2c2077 6f726c64 0a00      hello, world..  
Contents of section .comment:
 0000 00474343 3a202847 4e552920 65676373  .GCC: (GNU) egcs
 0010 2d322e39 312e3636 20313939 39303331  -2.91.66 1999031
 0020 342f4c69 6e757820 28656763 732d312e  4/Linux (egcs-1.
 0030 312e3220 72656c65 61736529 00        1.2 release).   

Συμβολική γλώσσα της ιδεατής μηχανής Java Virtual Machine

Compiled from hello.java
class hello extends java.lang.Object {
    hello();
    public static void main(java.lang.String[]);
}

Method hello()
   0 aload_0
   1 invokespecial #9 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 getstatic #12 <Field java.io.PrintStream out>
   3 ldc #2 <String "Hello ">
   5 invokevirtual #13 <Method void print(java.lang.String)>
   8 getstatic #12 <Field java.io.PrintStream out>
  11 new #7 <Class java.lang.StringBuffer>
  14 dup
  15 aload_0
  16 iconst_0
  17 aaload
  18 invokestatic #16 <Method java.lang.String valueOf(java.lang.Object)>
  21 invokespecial #10 <Method java.lang.StringBuffer(java.lang.String)>
  24 ldc #1 <String " ">
  26 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
  29 aload_0
  30 iconst_1
  31 aaload
  32 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
  35 invokevirtual #15 <Method java.lang.String toString()>
  38 invokevirtual #14 <Method void println(java.lang.String)>
  41 return

Απαιτήσεις

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

Σχεδίαση

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

Βιβλιογραφία

Γενική βιβλιογραφία

Ασκήσεις

Άσκηση 1 (προαιρετική)

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

    Παράδειγμα:

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