Compilazione Separata1 Seminario di Implementazione Leone – Magri - Pater
Compilazione Separata2 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
Compilazione Separata3 Introduzione Concetto fondamentale : il compilatore controlla luso 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.
Compilazione Separata4 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).
Compilazione Separata5 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)
Compilazione Separata6 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.
Compilazione Separata7 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.
Compilazione Separata8 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
Compilazione Separata9 Implementazione Symbol file = descrizione astratta dellinterfaccia. 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.
Compilazione Separata10 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.
Compilazione Separata11 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.
Compilazione Separata12 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.
Compilazione Separata13 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).
Compilazione Separata14 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.
Compilazione Separata15 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 allimplementation module. In un definition module non e ammissibile una parte privata al contrario del package in Ada.
Compilazione Separata16 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.
Compilazione Separata17 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.
Compilazione Separata18 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.
Compilazione Separata19 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)
Compilazione Separata20 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)
Compilazione Separata21 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 nellintra-checking di C. Java e la compilazione separata(5)
Compilazione Separata22 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)
Compilazione Separata23 C# vs Java C# è un ibrido tra C e C++ e fa parte dell'iniziativa.NET di Microsoft Definito 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+.
Compilazione Separata24 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
Compilazione Separata25 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.
Compilazione Separata26 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ì, listruzione 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
Compilazione Separata27 C# vs Java: oggetti Tutte le classi in C# derivano dalla classe System.Object In 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 {}
Compilazione Separata28 C# vs Java: access modifier C# possiede cinque modificatori di accesso Public Protected Internal Protected internal Private
Compilazione Separata29 Conclusioni I 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 allestremo tale concetto tanto da essere definito component e non object oriented
Compilazione Separata30 Bibliografia GUTKNECHT, J 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)