Talen en automaten/2011-12/producten/Java
Java
Marloes Venema
Talen en automaten 2011-12
14:20 B |
Beschrijving
De programmeertaal Java is een die qua syntax veel op de programmeertaal C en C++ lijkt. Echter is Java veel objectgeoriënteerder dan C/C++ en beschikt Java over een uitgebreidere klassenbibliotheek. Dat is een bibliotheek met sjablonen voor objecten. Klassen zijn gemaakt om de toestandsruimte en interface van een verzameling objecten vast te leggen. Ook is de abstractie van Java veel minder dan die van C/C++. De taal Java is veel leesbaarder, terwijl de taal C/C++ vrij dicht bij de taal van computers zelf blijft. In eerste instantie is de taal Java geschreven voor afstandsbedieningen, televisies en koelkasten, maar in de tijd dat Java werd geschreven, werd internet steeds populairder en bedacht het bedrijf achter Java, Sun Microsystems, dat hun taal goed gebruikt kon worden in een webomgeving. Later werd de taal ook gebruikt in chip- en simkaarten.
Nog een verschil tussen C++ en Java is dat Java wordt gecompileerd naar een bytecode voor een virtuele machine, terwijl in C++ de broncode direct gecompileerd wordt naar de machinetaal. Bij Java gebeurt dit pas op het allerlaatste moment. Hierdoor kan het gebeuren dat een programma meer dan één keer gecompileerd wordt en dat het programma in Java langzamer is dan een programma dat wel meteen gecompileerd wordt naar de machinetaal.
“Hello World” kan er zo uit zien in Java:
<source lang="java"> // Dit is de Java code voor “Hello World!”. public class HelloWorld {
public static void main(String[] args) { System.out.printIn(“Hello World!”); }
} </source>
In C/C++ ziet het er zo uit: <source lang="c"> // Dit is de C++-code voor “Hello World!”. void Hello_World () {
cout << “Hello World!”;
} </source>
Zoals je ziet, zijn er overeenkomsten in de talen, maar ook verschillen. De opbouw van de talen zijn ongeveer hetzelfde. Eerst de aanroep van de functie, dan de accolades, dan de functie en dan weer accolades. Echter zijn de statements wel anders. Waar C++ gebruikt maakt van <source lang="c"> cout << “string” </source> gebruikt Java <source lang="java">System.out.printIng(“string”)</source>
Nog een verschil is dat Java geen gebruik maakt van pointermanipulatie en C++ wel. Dit houdt in dat er een variabele is, die een geheugenadres bevat. Java maakt in plaats hiervan gebruik van referenties. Het verschil hiertussen is dat een referentie naar een bestaand object verwijst en een pointer naar een willekeurig geheugenadres. Het handige aan een pointer is wel, dat er berekeningen uitgevoerd kunnen worden, waarmee andere geheugenadressen te bepalen zijn en met referenties kan dit niet. Wat dat betreft heeft Java een handicap ten opzichte van C++, maar met pointermanipulatie kan ook veel misgaan in een programma, waar Java dus weer geen last van heeft.
De syntax van Java is hier te vinden: [1]
Regulier?
Java is niet regulier. Om dit te bewijzen, wordt er gebruik gemaakt van het pomplemma. Om te bewijzen dat Java niet regulier is, stellen we dat Java wél een reguliere taal is. Te bewijzen: Java is niet regulier. Bewijs: Stel nu dat Java regulier is en geaccepteerd wordt door een automaat met k states. We gaan nu het pomplemma uitvoeren over de volgende code:
<source lang="java"> public class HelloWorld {
public static void main(String[] args) { System.out.printIn(“Hello World!”); }
} </source>
Stel nu dat dit “woord” groter is dan k. Omdat dit zo is, moet er minstens een state twee keer voorkomen. Er is dus een cykel in dit “woord”. Dit betekent dat de taal pompbaar is over dit stuk. De taal is van de vorm w = xyz, met w ∈ Java zodat y de cykel voorstelt, oftewel het pompbare deel. We schrijven het pompen op deze manier: w’ = xykz. y kan dus meerdere keren voorkomen. Als Java regulier is, moet w’ ook geaccepteerd worden door de automaat, of in dit geval voorkomen in de taal. Stel nu dat y = { System.out.printIn(“Hello.World!”);. Als je dit gaat pompen, komt de taal er zo uit te zien:
<source lang="java"> public class HelloWorld {
public static void main(String[] args) { System.out.printIn(“Hello World!”); { System.out.printIn(“Hello World!”); }
} </source>
Echter zijn er nu niet genoeg sluitende accolades, dus wordt het “woord” niet meer geaccepteerd door de automaat. Hieruit kunnen we concluderen dat de taal dus niet pompbaar en niet regulier is.
Contextvrij?
Java is een contextvrije taal, omdat deze een contextvrije grammatica omvat. Een contextvrije grammatica is een vier-tupel: Java = (V,∑,R,S), waarbij: V de verzameling van niet-terminale symbolen is. Een voorbeeld in Java is bijvoorbeeld: <source lang="java"> if ParExpression Statement [else Statement] </source> waarbij het deel tussen de aanhalingstekens de non-terminale symbolen voorstellen. Dit zijn non-terminals, omdat in dit geval “ParExpression Statement” niet in de code zal voorkomen, maar een ParExpression Statement, oftewel een if-statement. ∑ is de verzameling van terminale symbolen. Een voorbeeld in Java is bijvoorbeeld: <source lang="java"> if ParExpression Statement [else Statement] </source> waarbij het deel niet tussen de aanhalingstekens de terminals voorstellen. Deze komen wel letterlijk voor in de codes, in tegenstelling tot de non-terminals. Hierbij geldt dat V ∩ ∑ = Ø. Dit klopt in de taal, want er zijn geen non-terminals die ook terminals zijn. R is de verzameling van productieregels, die non-terminals omzetten in terminals, van de vorm A → w, waarbij A element van V en w element van V U ∑*. Deze staat niet expliciet in de syntax vermeld, maar bestaat wel. Bij if-statements kun je bijvoorbeeld booleans gebruiken. Dus impliciet voldoet Java aan deze eis. S is het startsymbool. Dit is een element uit de verzameling V. Java heeft deze ook, want je moet een functie openen met een functieaanroep. In het geval van “Hello World” is dit dus:
<source lang="java"> public class HelloWorld { </source>
We kunnen dus concluderen dat Java een contextvrije taal is met een contextvrije grammatica.