<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Bjarne Stroustrup. The C++ Programming Language. Pearson Education, Inc.</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Entwurf und Implementierung einer Programmiersprache im studentischen Pro jekt Monty's Coconut</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Marcus Ermler</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Berthold Ho mann</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Christopher Nottrodt</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Carsten Pfe er</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Das studentische Projekt Monty's Coconut</institution>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Fachbereich 3</institution>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>Mathematik und Informatik, Universitat Bremen Postfach 330 440</institution>
          ,
          <addr-line>D-28344 Bremen</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2013</year>
      </pub-date>
      <volume>4</volume>
      <fpage>164</fpage>
      <lpage>170</lpage>
      <abstract>
        <p>Zusammenfassung. Dieser Erfahrungsbericht beschreibt zum einen ein studentisches Projekt an der Universitat Bremen, in dem eine Programmiersprache namens Monty entworfen und implementiert wurde. Des Weiteren wird auch die Sprache selbst anhand einiger Beispiele vorgestellt. Monty soll die Vorteile von klassischen Programmiersprachen wie C++ und Java mit denen von Skriptsprachen wie Ruby und Python kombinieren. Das Informatikstudium an der Universitat Bremen ist schon seit seinen Anfangen in den 1980er Jahren projektorientiert. In den viersemestrigen Projekten des Diplomstudiengangs haben die Studierenden den kompletten Softwareentwicklungskreislauf von Spezi kation der Anforderungen, Entwurf der Architektur uber Implementierung bis hin zu Test und Dokumentation durchlaufen. Diese Projekte sind im jetzigen Bachelor- und Masterstudium aufgeteilt worden in zweisemestrige Bachelorprojekte (mit 18 Credit Points ) und zweisemestrige Masterprojekte (mit 24 Credit Points ), wobei Masterprojekte oft als Fortsetzungen von Bachelorprojekten konzipiert werden. Beim Masterprojekt Monty's Coconut ist besonders, dass es von Studierenden selbst initiiert wurde: Zwei Studenten gewannen Marcus Ermler und Berthold Ho mann als Betreuer fur ihre Projektidee und erarbeiteten gemeinsam einen Projektvorschlag, fur den sie dann zwolf weitere Studierende begeistern konnten. Sonst entstehen die meisten Projektvorschlage aus Forschungsthemen der Arbeitsgruppen, unter denen die Studierenden dann auswahlen. Im Projekt Monty's Coconut sollte mit dem Entwurf der Sprache Monty ein Versuch unternommen werden, die Lucke zwischen klassischen Programmiersprachen und Skriptsprachen zu schlie en. Einen Referenzpunkt stellte die von David Watt (Universitat Glasgow) in [Wat05] vorgeschlagene Sprache dar, die ebenfalls Monty hei t, wobei in dieser Studie jedoch das Zusammenfuhren von dynamischer und statischer Typisierung im Mittelpunkt stand. Vor dem eigentlichen Projektbeginn haben sich die Studierenden inhaltlich im Kurs Ubersetzerbau, im Seminar Skriptsprachen und im Praktikum Ubersetzerwerkzeuge auf das Projekt vorbereitet und projektbegleitend in Kursen der Studierwerkstatt Methoden zum Projektmanagement und zur Kon iktbehandlung angeeignet. Von Oktober 2013 bis September 2014 wurden in wochentlichen vierstundigen Plenumstre en jeweils die Ergebnisse der vergangenen Woche diskutiert und Aufgaben fur die Arbeit von Untergruppen in der nachsten Woche verteilt. Die Arbeit im Projekt lasst sich grob in zwei Phasen untergliedern: (1) Diskussion und Entwicklung von Sprachkonzepten und (2) Erstellung der Sprachde nition mit paralleler Entwicklung des Compilers. Am Ende der ersten Phase wurde die bis dahin entwickelte Konzeption der Sprache auf einem selbst organisierten Workshop mit David Watt diskutiert. In Phase (2) wurde auf dem Projekttag des Fachbereichs Mathematik/Informatik der Zwischenstand des Projekts den Studierenden, Mitarbeiterinnen und Mitarbeitern prasentiert. Zum Abschluss wurden die Ergebnisse dann in einem o entlichen Vortrag auch Interessierten aus anderen Fachbereichen vorgestellt.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Dieses Papier ist einerseits ein Erfahrungsbericht, der den Projektverlauf und die gro ten Herausforderungen
im Sprachentwurf zusammenfassen soll. Daruber hinaus wird auch die Sprache Monty selbst vorgestellt und
anhand von Beispielen erlautert.</p>
      <p>Die restlichen Abschnitte sind daher folgenderma en gegliedert: In Abschnitt 2 wird auf den Entwurf von
Monty eingegangen, d.h. die Zielsetzung beim Sprachentwurf und die darin umgesetzten Konzepte. Abschnitt 3
stellt den implementierten Compiler vor. In Abschnitt 4 ziehen wir ein Fazit des Projekts und wagen uns an eine
vorlau ge Bewertung von Monty.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Der Entwurf der Programmiersprache Monty</title>
      <p>Klassische Programmiersprachen wie C++ [Str13] und Java [GJS+14] haben ein statisches Typsystem und
werden mit Compilern implementiert. Ihre Programme sind vielleicht etwas aufwandig zu schreiben, konnen dafur
aber auf Typfehler uberpruft und e zient ausgefuhrt werden. Dagegen werden Skriptsprachen wie Ruby [FM08]
und Python [vRD11] meist interpretiert. Mit ihrer knappen Syntax und ihrer dynamischen Typisierung sind
sie auf schnelles und bequemes Schreiben ausgerichtet, wobei Geschwindigkeitseinbu en bei der Ausfuhrung in
Kauf genommen werden. Die Sprache Monty wurde mit dem Ziel entwickelt, die Lucke zwischen
Programmiersprachen und Skriptsprachen zu uberbrucken (siehe Abbildung 1). Eine einfach zu erlernende Syntax und eine
vorwiegend statische, aber exible Typisierung soll weiterhin vergleichsweise hohen Entwicklungskomfort bieten,
ohne Abstriche bei der E zienz machen zu mussen, denn die Sprache wird kompiliert. Die Objektorientierung ist
klassenbasiert, wobei { im Gegensatz zu Java und C++ { in Monty alle Werte Objekte sind, auch Wahrheitswerte
und Zahlen.</p>
      <p>+
C+
a
v
a
J</p>
      <p>Monty</p>
      <p>y
Rub
n
o
h
t
y
P
klassische Programmiersprachen
Skriptsprachen
Abbildung 1: Die Sprache Monty soll die Lucke zwischen Programmier- und Skriptsprachen uberbrucken
Schon im Semester vor dem eigentlichen Projektbeginn wurden im Seminar Skriptsprachen viele altere und
neuere Sprachen in Hinblick auf die von ihnen unterstutzten Konzepte und die Qualitat ihres Entwurfs analysiert.
In der ersten Phase des Projekts wurde dann intensiv diskutiert, welche Konzepte in Monty unterstutzt werden
sollen. Bei der Vererbung standen beispielsweise die Einfachvererbung mit Interfaces wie in Java, mit traits wie
in Scala [OSV10] und allgemeine Mehrfachvererbung wie in C++ zur Debatte. So wurde die Grundlage fur
einen detaillierten Anforderungskatalog an Konzepten und Eigenschaften der Sprache gelegt. Im Rahmen eines
zweitagigen Workshops wurden diese Uberlegungen einem externen Berater vorgestellt und mit ihm diskutiert:
David Watt von der Universitat Glasgow hatte zuvor ebenfalls eine Sprache mit dem Namen Monty konzipiert
[Wat05], die ahnliche Ziele verfolgte und eine wichtige Inspiration fur die hier vorgestellte Sprache war. (Auf die
Unterschiede zwischen David Watts Monty und unserer Sprache gehen wir am Ende dieses Abschnitts ein.)</p>
      <p>Syntaktisch erinnert Monty stark an Python, was vor allem dadurch deutlich wird, dass Blocke nicht durch
geschweifte Klammern oder Schlusselworter begrenzt, sondern eingeruckt werden. Beispiel 1 zeigt ein einfaches
Monty-Programm. Anweisungen konnen wie in einer Skriptsprache als Sequenz aneinandergereiht werden, ohne
dass zusatzliche Konstrukte wie main-Funktionen oder Klassen eingefuhrt werden mussen.
Array&lt;Int&gt; numbers := [45, -13, 18, -5, -9, 0, 16]
Bool positive(Int x):</p>
      <p>return x &gt; 0
print(numbers.filter(positive)) // [45, 18, 16]</p>
      <sec id="sec-2-1">
        <title>Beispiel 1: Ein einfaches Monty-Programm (Filtern von Sequenzen)</title>
        <p>Das Beispiel de niert ein Array von Int -Objekten und eine Funktion, die auf die Elemente des Arrays
angewendet werden kann. Die Klasse Array ist generisch: sie kann fur beliebige andere Elementtypen instantiiert werden.
Daruber hinaus ist sie eine Implementierung der abstrakten Klasse Sequence, von der auch Typen wie List und
String erben. Die Zuweisung wird in Monty im Gegensatz zu den anderen oben genannten Sprachen durch ein
\:=" ausgedruckt, da diese Schreibweise mathematisch plausibler ist. Somit kann das einfache Gleichheitszeichen
\=" fur das Gleichheitspradikat benutzt werden.</p>
        <p>In der letzten Zeile des Beispiels wird die Methode lter aufgerufen, die ebenfalls auf Sequence de niert ist. Sie
erhalt als Parameter die Funktion positive, die als Pradikat fur das Filtern verwendet wird. Dies ist moglich, da
Funktionen und Prozeduren ebenfalls Objekte sind und somit als Parameter oder Ruckgabewerte fur Funktionen
verwendet werden konnen.</p>
        <p>Beispiel 2 zeigt die De nition einer Klasse Vector2 fur Vektoren im Vektorraum R2. Die Klasse besitzt zwei
Attribute vom Typ Float. Die Sichtbarkeit von Attributen und Methoden wird mit Symbolen ausgedruckt, wie
sie auch in UML-Klassendiagrammen [RJB04] verwendet werden. Dabei steht + fur public, # fur protected, - fur
private und ~ fur package. Die Methode initializer wird bei der Instantiierung aufgerufen.</p>
        <p>Die Klasse Vector2 implementiert au erdem drei spezielle Methoden, die Operatoren uberladen: Die Addition
mit einem anderen Vektor, die Multiplikation mit einem Skalar und das Skalarprodukt. Bei einem Aufruf der
Form a + b wird die Methode operator + auf dem Objekt a aufgerufen und b als Parameter ubergeben. Dies
erlaubt eine intuitive Notation von Operationen auf Vektoren, was in den letzten Zeilen des Code-Beispiels
deutlich wird.
class Vector2:
# Float x
# Float y
+ initializer(Float x, Float y):
self.x := x
self.y := y
+ Vector2 operator +(Vector2 other): // vector addition</p>
        <p>return Vector2(self.x + other.x, self.y + other.y)
+ Vector2 operator *(Float other): // multiplication with a scalar</p>
        <p>return Vector2(self.x * other, self.y * other)
+ Float operator *(Vector2 other): // scalar product</p>
        <p>return self.x * other.x + self.y * other.y
Vector2 p := Vector2(2.5, 3.75)
Vector2 q := Vector2(1.75, 6.89)
Vector2 r := (p*2.0)+q // Vector2(6.75, 14.39)
Float f := p*q // 30.2125</p>
        <p>Beispiel 2: De nition und Benutzung von Klassen in Monty (2D-Vektoren)</p>
        <p>Monty besitzt ein statisches Typsystem, um eine schnelle Ausfuhrung der Programme zu ermoglichen. Um
dem Komfort von Skriptsprachen naher zu kommen, erlaubt das Typsystem die dynamische Erweiterung von
Objekten. Dies wird in Beispiel 3 benutzt, um fur ein Objekt zusatzliche Attribute zu de nieren.
Angenommen, es gabe eine Funktion normalize, die einen Vektor als Parameter erwartet und den normalisierten Vektor
zuruckliefert (d.h. einen Vektor, der in die gleiche Richtung zeigt, aber die Lange 1 hat). Die Klasse Vector2
besitzt kein Attribut, das angibt, ob ein Vektor normalisiert ist oder nicht. Mit dem Operator \-&gt;" kann fur das
Vector2-Objekt q ein dynamisches Attribut isNormalized vom Typ Object de niert werden. In der Bedingung
\q-&gt;isNormalized as Bool" wird darauf dynamisch zugegri en. Dabei muss zur Laufzeit uberpruft werden, ob
das Attribut vorhanden ist und den richtigen Typ hat. Das Schlusselwort \as" stellt einen Typcast dar. Ein
Ausdruck der Form exp as type wandelt den Wert des Ausdrucks exp in den Typ type um, sofern dies nach den
Regeln des Typsystems moglich ist. Zugunsten des Entwicklungskomforts kann also explizit auf die Typsicherheit
und Performanz statischer Typisierung verzichtet werden, um eine Art Duck Typing zu erreichen [CRJ12].
Vector2 p := Vector2(2.5, 3.75)
Vector2 q := normalize(Vector2(1.75, 6.89))
q-&gt;isNormalized := true // introducing a dynamic attribute
if q-&gt;isNormalized as Bool: // accessing a dynamic attribute
print("The vector is normalized!")</p>
      </sec>
      <sec id="sec-2-2">
        <title>Beispiel 3: Einfuhren und benutzen dynamischer Attribute in Monty</title>
        <p>Attribute, die nicht dynamisch zu einer Klasse hinzugefugt werden, mussen zum Zeitpunkt der Instantiierung
initialisiert sein, da es in Monty keine Null-Referenzen gibt. Dies kann entweder bei der Deklaration der Attribute
oder in der Initialisierungsmethode geschehen. Beispiel 4 illustriert, wie ohne Null-Referenzen ein Binarbaum
implementiert werden kann. Fur den trivialen Fall (in diesem Fall die Blatter des Baumes) muss explizit ein Typ
eingefuhrt werden. Dies stellt zwar auf der einen Seite einen geringen Overhead dar, auf der anderen Seite bietet
es aber den Vorteil, dass stets Gewissheit uber den Typen eines Knoten besteht.
class Branch&lt;T&gt; inherits BinaryTree:</p>
        <p>BinaryTree&lt;T&gt; left
T value
BinaryTree&lt;T&gt; right
+ initializer(BinaryTree&lt;T&gt; left, T value, BinaryTree&lt;T&gt; right):
self.left = left
self.value = value
self.right = right
+ height():</p>
        <p>return 1+max(self.left.height(), self.right.height)
class Leaf&lt;T&gt; inherits BinaryTree:
+ height():
return 0</p>
      </sec>
      <sec id="sec-2-3">
        <title>Beispiel 4: Ein Binarbaum ohne Null-Referenzen</title>
        <p>Die vollstandige De nition der Sprache [Mon14b] enthalt noch einige weitere Konzepte, die in diesem Papier
aus Platzmangel nicht beschrieben werden konnen. Dazu zahlen eine nahere Beschreibung abstrakter Klassen,
allgemeiner Mehrfachvererbung, von Modulen und Paketen. Daruber hinaus sind weitere Konzepte in der
gegenwartigen Fassung der Sprache noch nicht enthalten: lokale Typinferenz, Lambda-Funktionen, eingeschrankt
generische Parameter und die explizite Verwendung von Mutability und Immutability. Solche zukunftigen
Erweiterungen von Monty sind im Bericht [Mon14a] beschrieben.</p>
        <p>Auch die von David Watt in [Wat05] vorgeschlagene Sprache Monty (die nie implementiert wurde) hat sich
syntaktisch an Python orientiert und dynamische Typisierung erlaubt. Der Schwerpunkt dieser Studie liegt in
Uberlegungen zur Unterscheidung von Klassen mit und ohne veranderlichen Attributen (mutable und
immutable) und zur Varianz bei den Typparametern generischer Klassen. Syntaktisch und auch in Hinblick auf die
Objektorientierung (Werte als Objekte, allgemeine Mehrfachvererbung) orientiert sich unser Monty aber eher an
Python als an Java.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Die Implementierung eines Compilers fur Monty</title>
      <p>Der Compiler fur Monty wurde in Java implementiert. Damit wurde schon wahrend der Arbeit an der
Sprachde nition begonnen. Im Folgenden soll ein Einblick in die Architektur und Funktionsweise des Compilers
gegeben werden (vgl. Abbildung 2).</p>
      <sec id="sec-3-1">
        <title>MontySyntax MontyProgramm</title>
        <p>Syntaxanalyse
Monty-Compiler
Kontextanalyse
Codegenerierung</p>
      </sec>
      <sec id="sec-3-2">
        <title>LLVMCode</title>
        <sec id="sec-3-2-1">
          <title>Abbildung 2: Struktur des Monty -Compilers</title>
          <p>LLVM
Compiler
nativer
Code</p>
          <p>Interpreter
Prozessor</p>
          <p>Wird der Compiler ausgefuhrt, so erwartet er eine Datei mit Monty -Code. Eine mit dem ANTLR-Framework
[Par14a] generierte und in den Compiler eingebundene Syntaxanalyse generiert aus der eingelesenen Datei einen
Ableitungsbaum. In den folgenden Schritten werden einige Entwurfsmuster (Design Patterns ) eingesetzt1.
Hervorzuheben ist hier das External Tree Visitor-Pattern 2. Auf Grundlage des Ableitungsbaumes wird zuerst ein
abstrakter Syntaxbaum (AST) erstellt, auf dessen Basis alle weiteren Operationen ausgefuhrt werden. Mehrere
Visitors laufen dabei uber den AST, wobei verschiedene Aktionen auf den besuchten Knoten ausgelost werden.
Die Visitors ubernehmen dabei Aufgaben wie:</p>
          <p>Identi kation: Welche Deklaration ist in dem aktuellen Kontext diesem Bezeichner zugeordnet?
Typuberprufung : Passen die Typen zueinander, etwa in Zuweisungen oder bei Funktionsaufrufen, oder ist mit
Fehlern zu rechnen?
Kontroll ussvalidierungen : Kommen break- und skip-Befehle nur in Schleifenrumpfen vor? Wird der
returnBefehl nur innerhalb von Funktionsrumpfen verwendet und dort auf allen Verzweigungen erreicht?
Der letzte Visitor, der uber den AST lauft, generiert LLVM -Code. LLVM [LA04] ist eine Architektur und
Sammlung von Werkzeugen fur die Codeoptimierung und Codeerzeugung in Compilern. Der generierte Code liegt
dabei in einer speziellen Zwischenreprasentationssprache vor, die Bestandteil dieser LLVM -Werkzeugsammlung
ist. Das Ergebnis des Monty -Compilers ist also ein in LLVM -Code ubersetztes Monty -Programm. Dieses kann
anschlie end dank der LLVM -Architektur sowohl direkt interpretiert als auch erst kompiliert und dann ausgefuhrt
werden. Die Verwendung von LLVM ermoglicht es ebenso, Monty -Programme zu optimieren und fur eine Vielzahl
von Plattformen zu ubersetzen.
4</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Fazit</title>
      <p>Im Projekt Monty's Coconut wurde die Programmiersprache Monty entworfen, de niert und ein Compiler
fur einen Gro teil der Sprache implementiert. Wir wollen hier zunachst zusammenfassen, welche Erfahrungen
wahrend des Projekts gewonnen wurden, sowie anschlie end die Sprache und den Compiler bewerten.
Der Entwurf einer Programmiersprache ist zeitaufwandig. Es dauerte drei Monate, um einen Katalog von
Konzepten fur Monty zu erstellen. In langen wochentlichen Plenumssitzungen, deren Themen in jeweils wechselnden
Kleingruppen vorbereitet wurden, haben die Teilnehmerinnen und Teilnehmer sehr engagiert den Entwurf der
Sprache diskutiert. Wegen unterschiedlicher Vorkenntnisse und verschiedener Lieblingssprachen waren die
Diskussionen oft kontrovers und langwierig. Gelegentlich entstand so der Eindruck, man kame kaum voran oder
drehe sich sogar im Kreis. Gleichzeitig wuchs die Besorgnis, Zeit zu vergeuden, und der Wunsch, endlich
konkreter an sichtbaren \Produkten" zu arbeiten. Diesen Prozess hatte man potenziell rationalisieren konnen, ware
schon gleich zu Projektbeginn ein Interpreter fur eine elementare objektorientierte Sprache implementiert worden.
Anhand dieser Implementierung hatte man vermutlich zielgerichteter diskutieren konnen, welche Auswirkungen
bestimmte Erweiterungswunsche auf De nition und Implementierung der Sprache haben. Zur Strukturierung
der Diskussion ware es auch nutzlich gewesen, Teilnehmerinnen und Teilnehmer zu \Fachleuten" fur Sprachen
wie Python und Ruby oder fur Konzepte wie Mehrfachvererbung und Typinferenz zu ernennen, damit sie ihr
Detailwissen jederzeit in die Diskussion einbringen konnen.</p>
      <p>Die De nition einer Programmiersprache ist schwierig. Manche Probleme mit Konzepten { und speziell mit
deren Kombination { haben sich erst gezeigt, als man die Sprache in sich schlussig, prazise und gleichzeitig
1Terence Parr, der Entwickler von ANTLR, schlagt diese Patterns in Kombination mit ANTLR vor [Par14b].
2Bei dem External Tree Visitor handelt es sich um eine Variante des Visitors von Gamma et al. [GHJV95].
verstandlich beschreiben musste. Hilfreich ware wohl gewesen, zunachst nur eine elementare Kernsprache zu
de nieren, um sie dann schrittweise zu erweitern. Ein weiteres, organisatorisches Problem lag darin, dass die
Arbeit an der De nition nur wenig Vorsprung vor der Implementierung hatte, so dass die Reihenfolge, in der
Konzepte de niert werden mussten, aufwandig mit der Compilergruppe synchronisiert werden musste. Auch
hier hatte womoglich der Entwurf einer erweiterbaren Kernsprache die Abhangigkeiten zwischen den Gruppen
reduzieren konnen, um so den Fokus von der Organisation auf die Konzepte zu verlagern.
Die Entwicklung eines Compilers ist sehr anspruchsvoll. Das kann in einem Jahr kaum bewaltigt werden.
Glucklicherweise standen Werkzeuge zur Verfugung: ANTLR fur die Syntaxanalyse, und LLVM fur die
Codererzeugung. Durch Aufteilung in mehrere Visitors, die voneinander unabhangige Teilaufgaben ubernehmen,
konnte der Compiler gut im Team entwickelt und die Arbeit parallelisiert werden, so dass wahrend der
Implementierung nur selten Engpasse entstanden. Testgetriebene Entwicklung trug zur Qualitatssicherung bei, und
ein diszipliniertes Vorgehensmodell { umgesetzt mit Hilfe von Git { sorgte dafur, dass es immer eine stabile
Fassung des Compilers gab.</p>
      <p>Monty ist ein erster Schritt in die richtige Richtung. Im Rahmen des Projekts konnten nicht alle Ideen umgesetzt
werden. So wurden einige Aspekte wie die Typinferenz oder Lambda-Funktionen in der Spezi kation und folglich
im Compiler gar nicht berucksichtigt und haben nur uber das Enhancement Proposal [Mon14a] ihren Weg in die
Sprache gefunden. Daher kann wohl nicht davon gesprochen werden, dass die Lucke zwischen den gegenwartigen
Sprachkonzepten tatsachlich geschlossen wurde, da noch viel Verbesserungspotential besteht. Grundsatzlich sind
wir unserem Ziel aber schon nahe gekommen, da Monty sich zumindest innerhalb dieser Lucke positioniert. In
Monty konnten eine leichtgewichtige Syntax und ein einheitliches Objektsystem mit einem statischen Typsystem
in einer kompilierten Sprache vereint werden. Daruber hinaus enthalt Monty den SDA, der { wenngleich mit
Einschrankungen { dynamische Typisierung in direkter Kombination mit statischer Typisierung ermoglicht.
Der Compiler ist nur ein Prototyp. Er ubersetzt eine Teilsprache von Monty, produziert aber noch keinen
guten Code. Optimierungen zu implementieren erscheint uns erst sinnvoll, wenn die Implementierung ansonsten
vollstandig und stabil ist. Eine Standardbibliothek wurde auch noch nicht bereitgestellt, denn dies erfordert viel
Routinearbeit, die spater nachgeholt werden kann.</p>
      <p>Auch wenn die Arbeit an der Sprache und am Compiler bis zum Projektende nicht ganz abgeschlossen werden
konnte, haben die Studierenden sehr viel gelernt uber Programmiersprachen und ihre Ubersetzer, auch uber die
Schwierigkeiten der selbststandigen Arbeit in einem gro eren Team.</p>
      <p>Im Ubrigen geht die Arbeit auch nach o ziellem Projektende weiter: Die Sprachde nition ist fertig, und am
Compiler wird weiter gearbeitet. Umfangreichere Erweiterungen der Sprache und Verbesserung des Compilers
sind Gegenstand von mehreren Abschlussarbeiten zu Themen wie beschrankten generischen Typparametern,
automatischer Speicherbereinigung (garbage collection) und lokaler Typinferenz. Der aktuelle Stand des Projekts
Monty's Coconut kann auf der Webseite http://www.informatik.uni-bremen.de/monty/ eingesehen werden.
Danksagung. Die Autoren mochten sich bei David Watt dafur bedanken, dass sie den Namen Monty fur ihre
Sprache verwenden durfen. Des Weiteren gilt unser Dank allen Teilnehmerinnen und Teilnehmern des Projekts
Monty's Coconut fur ihre aktive Mitwirkung an der Entwicklung der Sprachspezi kation und des Compilers.</p>
    </sec>
    <sec id="sec-5">
      <title>Literatur</title>
      <p>[CRJ12] Ravi Chugh, Patrick M. Rondon und Ranjit Jhala. Nested Re nements: A Logic for Duck Typing. In
Proceedings of the 39th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming
Languages, POPL '12, Seiten 231{244, New York, NY, USA, 2012. ACM.</p>
      <p>David Flanagan und Yukihiro Matsumoto. The Ruby Programming Language. O'Reilly, 2008.
[GHJV95] Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides. Design Patterns: Elements of
Reusable Object-oriented Software. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA,
1995.
[GJS+14] James Gosling, Bill Joy, Guy Steele, Gilad Bracha und Alex Buckley. The Java Language Speci cation.</p>
      <p>Addison-Wesley, 2014. 8. Au age.
[OSV10] Martin Odersky, Lex Spoo und Bill Venners. Programming in Scala. Artima developer, 2010. 2.</p>
      <p>Au age.
[Par14b] Terrence Parr. Language Implementation Patterns. The Pragmatic Programmers, LLC, September
2014. Version 5.0.
[Str13]
[vRD11] Guido van Rossum und Fred L. Drake. Python Language Reference Manual. Network Theory Ltd,</p>
      <p>Boston, March 2011. Release 3.2.
[Wat05]</p>
      <p>David A. Watt. The Design of Monty: a Programming/Scripting Language. Electronic Notes in
Theoretical Computer Science, 141(4):5{28, 2005.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <article-title>Chris Lattner und Vikram Adve</article-title>
          .
          <source>CGO '04: Proceedings of the International Symposium on Code Generation</source>
          and
          <article-title>Optimization: Feedback-directed and Runtime Optimization</article-title>
          .
          <source>In Proceedings of the 2004 International Symposium on Code Generation and Optimization (CGO'04)</source>
          , Washington, DC, USA,
          <year>Mar 2004</year>
          . IEEE Computer Society. 520043.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [Mon14a]
          <article-title>Monty's Coconut. Enhancements and Extensions Proposed for the Programming Language Monty</article-title>
          .
          <source>Projektbericht, Fachbereich</source>
          <volume>3</volume>
          { Mathematik und Informatik, Universitat Bremen,
          <year>September 2014</year>
          . http://www.informatik.uni-bremen.de/monty/spec/Montys_Coconut_-_
          <string-name>
            <surname>Enhancement</surname>
          </string-name>
          _ and_Extension_Proposal.pdf.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>