Parte 1




              Strumenti per la
          generazione di eseguibili




Linguaggi dinamici – A.A. 2009/2010
                                      1
Compilatori ed interpreti
„   Esistono diversi strumenti per la generazione
    di codice eseguibile
„   Tali strumenti sono classificabili in due
    categorie distinte:
      „   Compilatori
      „   Interpreti
„   I due strumenti non si escludono
    necessariamente!
      „   Alcuni linguaggi sono compilati
                    g gg             p
      „   Alcuni linguaggi sono interpretati
      „   Alcuni linguaggi sono compilati ed interpretati
Linguaggi dinamici – A.A. 2009/2010
                                                            2
Compilatore
„   Un compilatore è un software che traduce
    testo scritto in un linguaggio di
    programmazione (codice sorgente) in un altro
    linguaggio di programmazione (codice
       guagg o d p og a       a o e (cod ce
    oggetto), solitamente a più basso livello
      „   Classico esempio: C Æ codice macchina
„   Le operazioni di traduzione sono svolte in una
    sequenza di task ben precisa




Linguaggi dinamici – A.A. 2009/2010
                                                     3
Compilatore
„   Operazioni svolte da un compilatore
      „   Preprocessing: il testo del codice sorgente
          viene trasformato prima della compilazione
      „   Analisi l
          A li i lessicale: il testo del codice sorgente
                      i l      t t d l di             t
          viene diviso in porzioni con senso sintattico
          (token); viene generata una “rappresentazione
                                         rappresentazione
          intermedia” del codice
      „   Generazione del codice: la rappresentazione
          intermedia viene tradotta nel formato finale
      „   Ottimizzazione del codice: il codice risultante
          viene ottimizzato secondo un qualche criterio

Linguaggi dinamici – A.A. 2009/2010
                                                            4
Compilatore: analisi sintattica
„   Obiettivo: produrre una tabella di token con il
    loro significato
„   Token: è un blocco di testo categorizzato
    (ossia,
    (ossia avente un significato ben preciso nella
    sintassi del linguaggio)
„   Esempio: la seguente operazione (sum=3+2),
    E       i l         t        i     (     3 2)
    produce la seguente tabella
                           Token         Categoria
                            sum         IDENTIFIER
                             =          ASSIGN_OP
                                        ASSIGN OP
                             3           NUMBER
                             +        ADD_OPERATOR
                                          _
                             2           NUMBER
Linguaggi dinamici – A.A. 2009/2010
                                                      5
Compilatore: analisi sintattica
„   L'analisi sintattica avviene tramite i processi di
    scanning e di tokenization
„   Scanner: macchina a stati finiti che riconosce
    possibili token
      „   Es.: un intero è un (possibile) carattere +/-
          seguito da una sequenza di digit
               it d                    di it
„   Tokenizer: classificazione dei singoli blocchi
    individuati tramite lo scanner




Linguaggi dinamici – A.A. 2009/2010
                                                          6
Compilatore: generazione del codice
„   La generazione del codice si preoccupa di
    trasformare il formato intermedio in quello
    finale, che può essere eseguito direttamente
    da ca co ato e
    dal calcolatore
„   L'input al modulo di generazione di codice è la
    rappresentazione intermedia:
      „   Parse tree
      „   Abstract S t T
          Ab t    t Syntax Tree
„   Tale rappresentazione viene convertita in una
    sequenza di istruzioni (che può ancora essere
    intermedia)

Linguaggi dinamici – A.A. 2009/2010
                                                      7
Compilatore: generazione del codice
„   La generazione del codice avviene attraverso I
    processi di instruction selection, instruction
                               selection
    scheduling e register allocation
„   Instruction selection: vengono scelte le
    istruzioni da utilizzare per la conversione
„   Instruction scheduling: si sceglie la sequenza
    I t     ti       h d li      i     li l
    in cui tali istruzioni vengono piazzate
    (ottimizzazione per l CPU in pipeline)
    ( tti i      i         le      i i li )
„   Register allocation: si decide come allocare le
    variabili ai registri della CPU


Linguaggi dinamici – A.A. 2009/2010
                                                      8
Compilazione Just In Time
„   La generazione del codice può avvenire in due
    fasi distinte:
      „   a tempo di compilazione (compilation time)
      „   attempo di esecuzione (run time)
                           i    (    ti )
„   In quest'ultimo caso, si parla di Compilazione
    Just In Time (JIT)
      „   Viene anche chiamata dynamic translation
      „   Utilizzata da JAVA




Linguaggi dinamici – A.A. 2009/2010
                                                       9
Interprete
„   Un interprete è un software che prende
    porzioni ben definite (statement) di un testo
    scritto in un linguaggio di programmazione
    (cod ce sorgente), e traduce u a t o
    (codice so ge te), le t aduce in un altro
    linguaggio di programmazione (codice
    oggetto) e le esegue
      gg     )        g
„   Non viene prodotto un programma eseguibile;
    il programma scritto rimane nel codice
    sorgente del linguaggio interpretato




Linguaggi dinamici – A.A. 2009/2010
                                                    10
Linguaggi interpretati vs. compilati
„   Vantaggi di un linguaggio interpretato:
      „   È molto più semplice da correggere, dal
                                  correggere
          momento che l'esecuzione avviene uno
          statement alla volta
      „   Maggiore portabilità
„   Svantaggi di un linguaggio interpretato:
    S   t   i       li      i i t      t t
      „   È molto più lento nell'esecuzione
          (traduzione a run time di uno statement alla
          volta)
      „   Richiede la presenza del software interprete sul
          calcolatore

Linguaggi dinamici – A.A. 2009/2010
                                                             11
Parte 1




                   Architettura di un
                 linguaggio dinamico




Linguaggi dinamici – A.A. 2009/2010
                                        12
Modelli di riferimento
„   La totalità dei linguaggi dinamici moderni mira
    alla portabilità; a tal scopo adotta un formato
                            scopo,
    di rappresentazione del codice indipendente
    da a a c tettu a
    dalla architettura
„   A seconda del tipo di formato, si distinguono
    due diversi modelli di esecuzione:
      „   Modello “Bytecode”
      „   Modello “Ab t
          M d ll “Abstract S t T
                          t Syntax Tree”
                                       ”




Linguaggi dinamici – A.A. 2009/2010
                                                      13
Modello “Bytecode”
„   Il modello bytecode prevede l'utilizzo di
    distinti moduli software: un compilatore un
                                 compilatore,
    interprete ed una macchina virtuale
„   Compilatore:
      „   Traduce il codice sorgente in una
          rappresentazione a più basso livello portabile
                                        livello,
          ed ottimizzabile (bytecode)
      „   Parecchi linguaggi hanno la possibilità di
          operare una compilazione Just-In-Time




Linguaggi dinamici – A.A. 2009/2010
                                                           14
Modello “Bytecode”
„   Il modello bytecode prevede l'utilizzo di
    distinti moduli software: un compilatore un
                                 compilatore,
    interprete ed una macchina virtuale
„   Interprete:
      „   Prende singole sequenze di bytecode e le
          traduce in operazioni da eseguire sul
          calcolatore
      „   Queste sequenze possono essere interpretate o
          compilate in codice macchina (JIT)




Linguaggi dinamici – A.A. 2009/2010
                                                          15
Modello “Bytecode”
„   Il modello bytecode prevede l'utilizzo di
    distinti moduli software: un compilatore un
                                 compilatore,
    interprete ed una macchina virtuale
„   Macchina virtuale:
      „   Fornisce una astrazione di un sistema operativo
      „   Traduce le richieste di sistema (scritte in un
          T d      l i hi           i      (   i   i
          linguaggio portabile) nelle richieste concrete al
          vero sistema operativo
      „   Le funzionalità di base della macchina virtuale
          sono contenute nella libreria di funzioni detta
                    t   t     ll lib i      f    i i d tt
          runtime library
      „   Runtime library + MV = Runtime Environment
          R ti     lib             R ti      E i          t
Linguaggi dinamici – A.A. 2009/2010
                                                              16
Modello “Abstract Syntax Tree”
„   Il modello abstract syntax tree prevede
    l utilizzo
    l'utilizzo di un compilatore e di un interprete
„   Compilatore:
      „   Traduce il codice sorgente in una
          T d           di         t i
          rappresentazione ad albero sintattico (Abstract
          Syntax Tree)
      „   Durante la fase di compilazione può essere
          inserita una fase di compilazione ed
          interpretazione di codice (inizializzazione)
           „ Bl
             Blocchi BEGIN/END
                   hi


Linguaggi dinamici – A.A. 2009/2010
                                                            17
Modello “Abstract Syntax Tree”
„   Il modello abstract syntax tree prevede
    l utilizzo
    l'utilizzo di un compilatore e di un interprete
„   Interprete:
      „   Esegue uno statement di codice (tramite
          E              t t      t      di (t       it
          algoritmi di visita sull'albero sintattico)
      „   Può
          P ò essere inserita una fase di compilazione
                       i     i       f             il i
          durante l'interpretazione
           „ Comando eval()




Linguaggi dinamici – A.A. 2009/2010
                                                          18

T2 architettura

  • 1.
    Parte 1 Strumenti per la generazione di eseguibili Linguaggi dinamici – A.A. 2009/2010 1
  • 2.
    Compilatori ed interpreti „ Esistono diversi strumenti per la generazione di codice eseguibile „ Tali strumenti sono classificabili in due categorie distinte: „ Compilatori „ Interpreti „ I due strumenti non si escludono necessariamente! „ Alcuni linguaggi sono compilati g gg p „ Alcuni linguaggi sono interpretati „ Alcuni linguaggi sono compilati ed interpretati Linguaggi dinamici – A.A. 2009/2010 2
  • 3.
    Compilatore „ Un compilatore è un software che traduce testo scritto in un linguaggio di programmazione (codice sorgente) in un altro linguaggio di programmazione (codice guagg o d p og a a o e (cod ce oggetto), solitamente a più basso livello „ Classico esempio: C Æ codice macchina „ Le operazioni di traduzione sono svolte in una sequenza di task ben precisa Linguaggi dinamici – A.A. 2009/2010 3
  • 4.
    Compilatore „ Operazioni svolte da un compilatore „ Preprocessing: il testo del codice sorgente viene trasformato prima della compilazione „ Analisi l A li i lessicale: il testo del codice sorgente i l t t d l di t viene diviso in porzioni con senso sintattico (token); viene generata una “rappresentazione rappresentazione intermedia” del codice „ Generazione del codice: la rappresentazione intermedia viene tradotta nel formato finale „ Ottimizzazione del codice: il codice risultante viene ottimizzato secondo un qualche criterio Linguaggi dinamici – A.A. 2009/2010 4
  • 5.
    Compilatore: analisi sintattica „ Obiettivo: produrre una tabella di token con il loro significato „ Token: è un blocco di testo categorizzato (ossia, (ossia avente un significato ben preciso nella sintassi del linguaggio) „ Esempio: la seguente operazione (sum=3+2), E i l t i ( 3 2) produce la seguente tabella Token Categoria sum IDENTIFIER = ASSIGN_OP ASSIGN OP 3 NUMBER + ADD_OPERATOR _ 2 NUMBER Linguaggi dinamici – A.A. 2009/2010 5
  • 6.
    Compilatore: analisi sintattica „ L'analisi sintattica avviene tramite i processi di scanning e di tokenization „ Scanner: macchina a stati finiti che riconosce possibili token „ Es.: un intero è un (possibile) carattere +/- seguito da una sequenza di digit it d di it „ Tokenizer: classificazione dei singoli blocchi individuati tramite lo scanner Linguaggi dinamici – A.A. 2009/2010 6
  • 7.
    Compilatore: generazione delcodice „ La generazione del codice si preoccupa di trasformare il formato intermedio in quello finale, che può essere eseguito direttamente da ca co ato e dal calcolatore „ L'input al modulo di generazione di codice è la rappresentazione intermedia: „ Parse tree „ Abstract S t T Ab t t Syntax Tree „ Tale rappresentazione viene convertita in una sequenza di istruzioni (che può ancora essere intermedia) Linguaggi dinamici – A.A. 2009/2010 7
  • 8.
    Compilatore: generazione delcodice „ La generazione del codice avviene attraverso I processi di instruction selection, instruction selection scheduling e register allocation „ Instruction selection: vengono scelte le istruzioni da utilizzare per la conversione „ Instruction scheduling: si sceglie la sequenza I t ti h d li i li l in cui tali istruzioni vengono piazzate (ottimizzazione per l CPU in pipeline) ( tti i i le i i li ) „ Register allocation: si decide come allocare le variabili ai registri della CPU Linguaggi dinamici – A.A. 2009/2010 8
  • 9.
    Compilazione Just InTime „ La generazione del codice può avvenire in due fasi distinte: „ a tempo di compilazione (compilation time) „ attempo di esecuzione (run time) i ( ti ) „ In quest'ultimo caso, si parla di Compilazione Just In Time (JIT) „ Viene anche chiamata dynamic translation „ Utilizzata da JAVA Linguaggi dinamici – A.A. 2009/2010 9
  • 10.
    Interprete „ Un interprete è un software che prende porzioni ben definite (statement) di un testo scritto in un linguaggio di programmazione (cod ce sorgente), e traduce u a t o (codice so ge te), le t aduce in un altro linguaggio di programmazione (codice oggetto) e le esegue gg ) g „ Non viene prodotto un programma eseguibile; il programma scritto rimane nel codice sorgente del linguaggio interpretato Linguaggi dinamici – A.A. 2009/2010 10
  • 11.
    Linguaggi interpretati vs.compilati „ Vantaggi di un linguaggio interpretato: „ È molto più semplice da correggere, dal correggere momento che l'esecuzione avviene uno statement alla volta „ Maggiore portabilità „ Svantaggi di un linguaggio interpretato: S t i li i i t t t „ È molto più lento nell'esecuzione (traduzione a run time di uno statement alla volta) „ Richiede la presenza del software interprete sul calcolatore Linguaggi dinamici – A.A. 2009/2010 11
  • 12.
    Parte 1 Architettura di un linguaggio dinamico Linguaggi dinamici – A.A. 2009/2010 12
  • 13.
    Modelli di riferimento „ La totalità dei linguaggi dinamici moderni mira alla portabilità; a tal scopo adotta un formato scopo, di rappresentazione del codice indipendente da a a c tettu a dalla architettura „ A seconda del tipo di formato, si distinguono due diversi modelli di esecuzione: „ Modello “Bytecode” „ Modello “Ab t M d ll “Abstract S t T t Syntax Tree” ” Linguaggi dinamici – A.A. 2009/2010 13
  • 14.
    Modello “Bytecode” „ Il modello bytecode prevede l'utilizzo di distinti moduli software: un compilatore un compilatore, interprete ed una macchina virtuale „ Compilatore: „ Traduce il codice sorgente in una rappresentazione a più basso livello portabile livello, ed ottimizzabile (bytecode) „ Parecchi linguaggi hanno la possibilità di operare una compilazione Just-In-Time Linguaggi dinamici – A.A. 2009/2010 14
  • 15.
    Modello “Bytecode” „ Il modello bytecode prevede l'utilizzo di distinti moduli software: un compilatore un compilatore, interprete ed una macchina virtuale „ Interprete: „ Prende singole sequenze di bytecode e le traduce in operazioni da eseguire sul calcolatore „ Queste sequenze possono essere interpretate o compilate in codice macchina (JIT) Linguaggi dinamici – A.A. 2009/2010 15
  • 16.
    Modello “Bytecode” „ Il modello bytecode prevede l'utilizzo di distinti moduli software: un compilatore un compilatore, interprete ed una macchina virtuale „ Macchina virtuale: „ Fornisce una astrazione di un sistema operativo „ Traduce le richieste di sistema (scritte in un T d l i hi i ( i i linguaggio portabile) nelle richieste concrete al vero sistema operativo „ Le funzionalità di base della macchina virtuale sono contenute nella libreria di funzioni detta t t ll lib i f i i d tt runtime library „ Runtime library + MV = Runtime Environment R ti lib R ti E i t Linguaggi dinamici – A.A. 2009/2010 16
  • 17.
    Modello “Abstract SyntaxTree” „ Il modello abstract syntax tree prevede l utilizzo l'utilizzo di un compilatore e di un interprete „ Compilatore: „ Traduce il codice sorgente in una T d di t i rappresentazione ad albero sintattico (Abstract Syntax Tree) „ Durante la fase di compilazione può essere inserita una fase di compilazione ed interpretazione di codice (inizializzazione) „ Bl Blocchi BEGIN/END hi Linguaggi dinamici – A.A. 2009/2010 17
  • 18.
    Modello “Abstract SyntaxTree” „ Il modello abstract syntax tree prevede l utilizzo l'utilizzo di un compilatore e di un interprete „ Interprete: „ Esegue uno statement di codice (tramite E t t t di (t it algoritmi di visita sull'albero sintattico) „ Può P ò essere inserita una fase di compilazione i i f il i durante l'interpretazione „ Comando eval() Linguaggi dinamici – A.A. 2009/2010 18