Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

30
Compilazione Separata 1 Compilazione Separata Seminario di Implementazione Leone – Magri - Pater

Transcript of Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Page 1: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 1

Compilazione Separata

Seminario di Implementazione

Leone – Magri - Pater

Page 2: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 2

Compilazione Separata

1. Definizione di compilazione separata

2. Modula-2

3. Differenze con altri linguaggi

4. La compilazione separata in Java

5. C# Vs Java

6. Conclusioni

Page 3: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 3

Introduzione

Concetto fondamentale : il compilatore controlla l’uso consistente degli oggetti attraverso i moduli a compile time

Un programma non e` piu` considerato come un singolo e indivisibile blocco, ma come un grafo orientato.

I nodi del grafo sono dipendenti intermodularmente.

Page 4: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 4

Introduzione (2)

Tipicamente la compilazione comprende la descrizione delle diverse interfacce dei moduli.

La compilazione separata puo` essere realizzata secondo diversi metodi con diverse interfacce.

Tali tecniche compilano le interfacce in codici efficienti di rappresentazione (symbol file).

Page 5: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 5

I linguaggi che attualmente implementano la compilazione separata derivano sostanzialmente da Modula-2 (1985)

Altri linguaggi come: Oberon (‘92), Ada (’83), Ocaml, Mesa hanno sviluppato la compilazione separata in modo parallelo e in parte differente.

Introduzione (3)

Page 6: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 6

Modula-2 Modula-2 (Wirth 1985) e` un linguaggio di

programmazione modulare progettato per superare Pascal.

Le sue caratteristiche principali sono il concetto di modulo e la compilazione separata con typecheck completo.

I moduli sono unita` di compilazione individualmente compatibili, modificabili e rimpiazzabili.

Le dipendenze dei moduli sono stabilite attraverso meccanismi di import-export.

Page 7: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 7

Modula-2 (2) I moduli si suddividono in: definition module e

implementation module. Un cambiamento in un definition module influenza

tutti i moduli dipendenti direttamente o indirettamente.

Un definition module costruisce uno scheletro stabile mentre implementation module costituisce la parte dei programmi locali.

Non ci sono conseguenze quando un implementation module viene cambiato.

Occorre stabilire una gerarchia tra i moduli.

Page 8: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 8

Modula-2 (3)

1. In Modula-2 il termine compilazione separata indica che la consistenza con i moduli importati e` eseguita a compile time.

2. Durante la compilazione viene generato un symbol file

Page 9: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 9

Implementazione

Symbol file = descrizione astratta dell’interfaccia.

Prima Classificazione: I symbol file comprendono le descrizioni degli

oggetti. Si assegna ad un symbol file la classe A se le

descrizioni sono ristrette ai propri oggetti dichiarati in corrispondenza del definition module.

Si assegna ad un symbol file la classe B se e` self-consistent nel senso che assume informazioni sui propri oggetti come su quelli importati direttamente e indirettamente.

Page 10: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 10

Implementazione (2)

Seconda classificazione: prevede di codificare le informazioni ortogonalmente alla loro quantita`.

Classe e` l’ uso di una sintassi identica o simile a quella originale in Modula-2.

Classe e` l’ uso di metodi che piu` o meno codificano la symbol table del compilatore.

La symbol table e` una struttura a compile-time che unisce record descriventi tutti gli oggetti dichiarati.

Page 11: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 11

Implementazione (3)

La classe e` piu` difficile da implementare tramite algoritmi.

La classe e` piu` facile da implementare tramite algoritmi (avvalendosi della symbol table).

Il metodo B e` migliore perche` genera symbol file piu` corti ed e’ stato utilizzato da Wirth per Modula-2.

Page 12: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 12

Implementazione (4) Unita` di oggetti componenti e strutture sono

registrati nel symbol file nella forma di blocchi descrittori.

Sia gli oggetti che le strutture possono riferirsi ad ulteriori strutture attraverso reference number.

Alle strutture standard sono assegnati i numeri piu` bassi che non sono registrati nel symbol file.

Secondo la definizione di classe B, il symbol file dovrebbe contenere tutti i propri oggetti e quelli importati direttamente e indirettamente.

Page 13: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 13

Implementazione (5)

Importazione di un modulo : IMPORT Documents, Texts, etc. ( gli oggetti devono

essere qualificati tipo documento.modo,etc). FROM Texts IMPORT Mode, Text, buffer, etc (gli

oggetti qui possono non essere qualificati).

Page 14: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 14

Implementazione (6) La base del meccanismo di compilazione separata

in Modula-2 e` quello di creare un symbol file da una symbol table e viceversa.

Possono essere inseriti nuovi tipi di oggetti senza invalidare i symbol file gia` costruiti.

I symbol file non sono specifici di un determinato linguaggio di programmazione, ma servono per dare un interfaccia a tutti i linguaggi.

Da un punto di vista dell’ ingegneria del software, questo modo di operare e` sicuro ed efficente.

I symbol file vengono caricati come un unico blocco.

Page 15: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 15

Differenze con altri linguaggi

In C il controllo di consistenza non viene eseguito a compile time (secondo Gutknecht).

Il metodo degli include non e’ molto distante dall’ uso dei moduli in Modula-2 (IMPORT,FROM IMPORT).

Un modulo e’ compilato tramite il definition module, che in Oberon e’ unito all’implementation module.

In un definition module non e’ ammissibile una parte privata al contrario del package in Ada.

Page 16: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 16

Differenze con altri linguaggi (2)

La rigorosa corrispondenza di valore univoco fra i definition e implementation module non si trova in MESA, dove parecchi moduli possono contribuire all'implementazione di un singolo modulo di interfaccia.

Per questa caratteristica, in Modula-2 e’ quasi possibile ricostruire da un symbol file il codice sorgente originale.

Page 17: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 17

Java e la compilazione separata

Typecheck separato del frammento di sorgente che include la generazione di codice binario (ad es. il bytecode di Java).

Un frammento non puo' essere compilato da solo, ma puo' essere compilato in un ambiente dove l'informazione sul tipo adeguato di frammento mancante è disponibile.

Page 18: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 18

Java e la compilazione separata(2)

Questa tecnica viene praticata con:

1. interfacce ad-hoc scritte dal programmatore (Modula-2, Ada)

2. estraendo o ottenendo informazioni dal frammento di codice posto a typecheck e/o da altri frammenti

Questo ultimo processo è anche chiamato intra-checking, per sottolineare che solo i controlli relativi alla coerenza interna del singolo frammento sono eseguiti, secondo le ipotesi sugli altri.

Page 19: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 19

Un singolo frammento di codice ottenuto dalla compilazione separata è generalmente incompleto e non puo' essere eseguito da solo.Al fine di ottenere una collezione di frammenti sufficienti per venire linkati insieme, un interchecking deve essere eseguito.Interchecking : strumento che effettua il controllo che farebbe un linker statico ma senza assembly del codice.Nei linguaggi fortemente tipati che supportano il linking statico, l'interchecking è effettivamente svolto dal linker, e include anche la generazione di un programma eseguibile a partire dai singoli frammenti di codice.

Java e la compilazione separata(3)

Page 20: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 20

L’ interchecking dovrebbe garantire che il programma finale non sollevi mai errori di collegamento a run-time.

Nei linguaggi che supportano il link dinamico ( Java ) non c’è questo assembly di codice binario prima dell'esecuzione.

L’ interchecking è svolto, garantendo così un’ esecuzione sicura.

Java e la compilazione separata(4)

Page 21: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 21

Es: Consideriamo frammenti di codice (.java) contenenti esattamente una dichiarazione di classe o interfaccia.Chiamiamo il compilatore su una sola classe, diciamo C.

1. Le classi C1,...Cn sulle quali C dipende devono essere rappresentate al meno in forma binaria

2. Se qualcuna delle C1,...Cn sono solo disponibili in forma di sorgente,allora il compilatore Java fa anche rispettare la loro compilazione. Quindi il comportamento di un compilatore Java standard quando viene invocato su C non consiste semplicemente nell’intra-checking di C.

Java e la compilazione separata(5)

Page 22: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 22

Un compilatore standard Java puo' giocare il doppio ruolo di meccanismo di compilazione separata e di interchecking

Perché Java non supporta la vera Compilazione Separata?

1. Compilazione Separata e interchecking sono fusi insieme

2. Le interfacce di frammenti non sono definite nella definizione della classe.

Java e la compilazione separata(6)

Page 23: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 23

C# vs Java

C# è un ibrido tra C e C++ e fa parte dell'iniziativa .NET di MicrosoftDefinito come il “primo linguaggio component-oriented” nella famiglia C/C++C# vanta type-safety, garbage collection, dichiarazioni di tipo semplificate, e altre caratteristiche che dovrebbero facilitare lo sviluppo del software.Particolarmente orientato ai servizi Web e COM+.

Page 24: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 24

Java ha pochi tipi di dato primitivi: byte, char, int, long, float, double.

Tali primitive sono le più piccola "unità" di Java.

Mentre tutti gli oggetti in Java si estendono da java.lang.Object, le primitive non si estendono da niente.

qualunque classe che opera su oggetti non funzionerà con le primitive.

C# vs Java: tipi di dato

Page 25: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 25

C# vs Java: tipi di dato

Le primitive devono essere mappate nel modello dell'oggetto per essere utilizzate.

C# usa il sistema object/type di .NET in modo che i programmi C# possano comunicare con altri linguaggi di .NET senza avere confusione sui tipi.

Per esempio, il tipo int è un alias per System.Int32 che a sua volta estende System.Object. Ciò significa che ogni primitiva funziona come qualunque altro oggetto.

Page 26: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 26

La differenza fra le parole chiavi 'import' in Java e 'using' in C# è che Java ha un concetto dei package, mentre la C# usa i namespace come quelli di C++.La keyword 'using' rende tutti i nomi nel dato namespace accessibili ad un modulo. Così, l’istruzione ‘using System’ lascia accedere al .NET runtime namespace System.Tale namespace contiene il metodo globale statico System.Console.WriteLine(), che è accessibile come Console.WriteLine() senza specificare il namespace System. In Java, System è una classe definita in java.lang, che è importato implicitamente in ogni file sorgente di Java.

C# vs Java: statement

Page 27: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 27

C# vs Java: oggettiTutte le classi in C# derivano dalla classe System.ObjectIn Java derivano dalla classe java.lang.Object. In C# si scrive a differenza della keyword extends di Java class A : B{ }Le interfacce si implementano nello stesso modo (usando i due punti ).Per creare una classe che ne estende una e implementa altre interfacce il compilatore richiede solo che la classe da estendere sia la prima della lista dopo i due punti.class D : B, C {}

Page 28: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 28

C# vs Java: access modifierC# possiede cinque modificatori di accesso

Public

Protected

Internal

Protected internal

Private

Page 29: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 29

ConclusioniI nuovi linguaggi di programmazione( Java, C#) hanno importato tecniche gia’ presenti in altri linguaggi (Modula-2, Ada).

Tutti implementano il paradigma ad oggetti direttamente e indirettamente.

La compilazione separata ha introdotto un miglioramento nello sviluppo del codice e nella portabilita’.

C# porta all’estremo tale concetto tanto da essere definito component e non object oriented

Page 30: Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater.

Compilazione Separata 30

BibliografiaGUTKNECHT, J. 1986. Separate compilation in Modula-2: An approach to efficient symbol files. IEEE Software. True Separate Compilation of Java Classes (D. Ancona G. Lagorio E.Zucca)

http://www.networkmagazineindia.com/200111/workshop1.htm

http://cgibin.erols.com/ziring/cgi-bin/cep/cep.pl

http://www.claudio.ch/Notebook/pl.html

http://www.modulaware.com/