Opgave 2: Codegeneratie

Lees deze pagina regelmatig in verband met updates!
Deze opgave hebben we wederom opgesplitst in verschillende onderdelen.

Inleiding

In deze opgave moet een codegenerator worden geschreven die Java code vertaalt in C code. Voor een gedeelte zal deze vertaling vrij eenvoudig zijn, aangezien de syntax en semantiek van bepaalde expressies en statements uit Java direct zijn overgenomen uit C.

Java is echter een object-geörienteerde programmeertaal, en C is dat niet. Dit betekent dat de codegenerator code moet genereren waarin geen OO constructies meer voorkomen.

Voor een voorbeeld, zie de file sample.java, waarin classes A en B gedefinieerd worden. Deze classes worden vertaald naar C header files en source files:

Voor de main method uit de class Main wordt de volgende code gegenereerd: Main.c

Merk op dat dit slechts een voorbeeld is. Het is bijvoorbeeld niet verplicht om verschillende files te genereren.


Eenvoudige vertaling naar C

Dit onderdeel van deze opgave bestaat uit het vertalen van eenvoudige taalconstructies uit Java naar de corresponderende constructies uit C. We zullen ons beperken tot de niet-object geörienteerde aspecten van Java.

Wat je wel moet doen:

Wat je (nog) niet hoeft te doen:

Enige wenken en opmerkingen met betrekking tot deze opgave:

Om je wat werk te besparen, hebben we een en ander alvast voor je in een file gezet:

De abstracte syntax voor C is nog vrij minimaal. Het kan zijn dat je nog enkele uitbreidingen hierop moet maken. Ook de pretty-printer zal dan moeten worden aangepast. Dat zou echter geen probleem moeten zijn (zie het praktikum voor Grammatica's en Ontleden van vorig jaar).

Standaarduitwerking opgave 1

Mocht het niet gelukt zijn om de semantische analyse uit de eerste opgave te implementeren, dan kun je gebruik maken van een standaard uitwerking:

Inleveren

Het eerste onderdeel van deze opgave moet worden ingeleverd op vrijdag 1 november.

Inleveren met:

submit ipt 4 files
waarbij files de implementatie van de codegenerator bevatten.

Vertaling van classes, method calls, inheritance

In dit laatse onderdeel moeten de object geörienteerde aspecten van Java worden geïmplementeerd. Dit betekent dat in ieder geval de volgende zaken moeten worden toegevoegd: Je mag aannemen dat in constructors geen aanroepen voorkomen van constructors uit superclasses.

Destructors hoeven niet gegenereerd te worden, en je hoeft dus ook geen garbage collection te implementeren.

Verder is het belangrijk dat er een main() functie wordt gegenereerd. Deze zal overeenkomen met een methode met signatuur

    public static void main(String[] args)
uit de Java source. Je mag aannemen dat er slechts één method met de naam main in de sources voorkomt, zodat je altijd weet wat de main() functie in de gegenereerde C code moet worden.

Merk overigens op dat het handig is om arrays te parsen, zodat je source code ook kunt testen met bestaande Java compilers zoals javac, maar dat je daarvoor geen code hoeft te genereren.

Een voorbeeld Java programma dat met de uitwerking van deze opgave vertaalt moet kunnen worden vindt je in de file reken.java.

Inleveren

Dit onderdeel van deze opgave moet worden ingeleverd op vrijdag 6 december.

Inleveren met:

submit ipt 5 files
waarbij files de implementatie van de codegenerator bevatten.

De inzendingen zullen dit keer weer automatisch worden getest. De ingeleverde files moeten dus weer aan een aantal eisen voldoen (zie ook de instructies bij opgave 1):

Let er aub op dat je je aan deze eisen houdt, anders kunnen de oplossingen niet automatisch getest worden, en zal het nakijken aanzienlijk vertraagd worden.
Last updated on Wednesday, 6 November 1996 by Joost van Dijk