Einführung


Die derzeitige Programmiertechnik weist eine Reihe von Problemen auf, die mittels Natürlichsprachlicher Programmierung im Allgemeinen und Pegasus im Besonderen behoben werden könnten:


Wesentliche Probleme derzeitiger Programmiertechniken und -sprachen

1. Das geistige Problem Ein Entwickler seine Gedanken verlustreich umstrukturieren muss, damit sie dem Weltmodell einer spezifischen Programmiersprache entsprechen, statt diese direkt ausdrücken zu können, so etwa das kreativitätsmindernde fixe Vorabdenken in Klassen, Attributen und Methoden bei der Erstellung eines C#-Programms.


2. Das Programmiersprachenproblem Die selben Algorithmen müssen in immer wieder neuen Programmiersprachen implementiert werden, obwohl sich ihre eigentliche Idee nie ändert: So bleibt etwa „Bubblesort“ ehemals in Assembler, jetzt in Java und bald in wieder einer neuen Sprache, immer der gleiche Algorithmus.


3. Das Dokumentationsproblem Um den erstellten Programmcode verständlich zu machen, müssen Entwickler Kommentare und Dokumentationen schreiben, denn der Code ist nicht selbsterklärend, vermutlich nicht einmal für die Programmierer, die am gleichen Projekt arbeiten. Hinzu kommt, dass die Kommentare oft nicht in der Muttersprache der Programmierer verfasst sind, was eine zusätzliche Quelle für Missverständnisse, Fehler und Ineffizienzen darstellt, etwa weil das Dokumentieren ganz unterlassen wird oder falsche Ausdrücke verwendet werden.


4. Das technische Problem Entwickler verlieren viel Zeit mit technischen Ungereimtheiten, wie etwa der Auswahl des korrekten Zeichensatzes, des Netzwerkprotokolls oder Datenbankformates, statt sich mit den eigentlich kreativen Problemen der Programmidee auseinanderzusetzen.


Lösungen und Hypothesen

Das natürlichsprachliche Programmieren mit Pegasus könnte die genannten Probleme lösen: 1. Die Programmideen der Entwickler könnten ohne eine verlustreiche Umstrukturierung direkt in natürlicher Sprache ausgedrückt werden. 2. Da die natürliche Sprache gewöhnlich über lange Zeiträume unverändert bleibt, bleiben auch die mit ihr verfassten Programme gleichbedeutend: Es wären nicht die Programme neu zu verfassen, um sie dem aktuellen Stand der Technik anzupassen, sondern die Compiler für die natürlichsprachliche Programmierung würden sich weiterentwickeln, ohne das die Entwickler es merken müssten. 3. Entwickler könnten Kommentare und Dokumentation in ihrer Muttersprache schreiben und andere Entwickler könnten auf Grund automatischer Übersetzung in ihrer Muttersprache damit weiterarbeiten. Der Kommentierungsbedarf selbst würde verringert werden, da die Programme schon in natürlicher Sprache verfasst sind. 4. Pegasus lässt nur Standardformate wie etwa Unicode zu.


Auf Grund der obigen Überlegungen legen wir unserer Arbeit folgende Hypothesen zu Grunde, deren Bestätigung wir uns durch die Realisierung des Programmiersystems „Pegasus“ und der Implementierung zahlreicher Anwendungsbeispiele erhoffen.


1. Mit natürlichsprachlichen Programmiersprachen lassen sich im Allgemeinen Anwendungen effizienter entwickeln als mit nicht-natürlichsprachlichen Programmiersprachen, insbesondere unter Verwendung von Kontextabhängigkeit, Referenzierungsmechanismen und Kompressionsmechanismen der natürlichen Sprache.


2. In natürlichsprachlichen Programmiersprachen verfasste Programme lassen sich schneller verstehen als in nicht-natürlichsprachlichen Programmiersprachen verfasste Programme.


3. Natürlichsprachliche Programmiersprachen lassen sich leichter erlernen als nicht-natürlichsprachliche Programmiersprachen.


Die Ideensprache

Die natürliche Sprache, bzw. das menschliche Denken, muss für ihre Verwendung in Pegasus in irgendeiner Form modelliert werden. Zu diesem Zwecke wurde die Ideennotation entworfen. Mit ihrer Hilfe lassen sich atomare Ideen, Ideen, die direkt unseren Sinnen entspringen, wie etwa „rot“ oder „laut“, zu komplexen Ideen, wie etwa „Holz“ oder „Tisch“, kombinieren, jene wiederum zu zusammengesetzten Ideen, mit denen man Gedanken wie „Der Tisch ist braun.“ (Tisch, braun) abbilden kann. Die Ideen an sich stehen über den spezifischen natürlichen Sprachen, da sie in verschiedenen natürlichen Sprachen ausgedrückt werden können. Obwohl alle diese Ideen für jeden einzelnen Menschen individuell sind, sind sie doch unter den Menschen ähnlich. Hierdurch ist Kommunikation überhaupt erst möglich, und dies ist auch die Basis für ein Computersystem mit allgemeinem Wissen.


Eigenarten der natürlichen Sprache

Die natürliche Sprache unterscheidet sich unter anderem in folgenden drei Punkten, die alle darauf abzielen, den Informationsaustausch so effizient wie möglich zu gestalten, von derzeitigen Programmiersprachen: 1. Häufige Anwendung impliziter Referenzierung, bspw. durch Pronomen wie „er“, „sie“ oder „letzteres“, durch direkte Referenzen wie „die Zeichenfolge“ oder durch Teilsatzreferenzen wie in „Ja, das stimmt.“. 2. Verwendung von Kompression, sowohl durch syntaktische Kompression wie in „Gib die Zeilen und Spalten der Matrix aus.“, als auch durch semantische Kompression wie in „Gehe die Menge von links nach rechts durch und umgekehrt.“. 3. Kontextabhängigkeit, wie in „Nimm eine Liste. Hänge die Zahl 3 an das Ende an. Nimm den Namen der Liste. Hänge die Zahl 3 an das Ende an.“, wo der Satz „Hänge die Zahl 3 an das Ende an.“ jeweils zwei unterschiedliche Bedeutungen hat.

 

Die Basis

Verstand

Kurzzeit-gedächtnis

Generieren

Ausdrücken

Natürliche Sprache
- Deutsch
- Englisch

Programmier-sprache
- Java

Lesen

Langzeit-gedächtnis

Gehirn

Eine Vertiefung der Recherche ist noch im nahestehenden Gebiet der erwähnten Story-Telling-Systeme [039] wünschenswert. Falls es verwandte Arbeiten gibt oder geben wird, an denen aktuell geforscht wird, was mir nicht bekannt ist, werde ich, falls dies ergiebig sein könnte, einen Austausch anregen.

Insgesamt ist aber festzustellen, dass es nur wenige Ansätze im Gebiet des reinen natürlichsprachlichen Programmierens gibt, was unserer Meinung nach in der Hauptsache darauf zurückzuführen ist, dass zum Zeitpunkt der Entwicklung derartiger Systeme notwendige technische Entwicklungen noch nicht oder nicht ausreichend vorhanden waren, die für ein natürlichsprachliches Programmiersystem unabdingbar sind, etwa effizientes Parsen natürlicher Sprache, semantische Datenformate sowie genügende Rechen- und Speicherkapazitäten.


Diskussion


Probleme beim natürlichsprachlichen Programmieren könnten dadurch entstehen, dass es in der natürlichen Sprache oft verschiedene Arten gibt, das semantisch Selbe auszudrücken, so etwa „Schreibe die Zeichenfolge.“ oder „Gebe die Zeichenfolge aus.“. Die Anzahl dieser semantisch gleichwertigen Ausdrücke ist aber stark begrenzt und kann erfasst werden.
Des Weiteren sind natürlichsprachliche Ausdrücke oft zweideutig, dem könnte aber durch Rückfragen des Systems der Art „Meinen Sie mit ,sie‘ die Menge oder die Zeichenfolge?“ Einhalt geboten werden.
Manchmal ist formale Notation der sprachlichen Beschreibung von Sachverhalten vorzuziehen, so oft in der Mathematik. Eine natürlichsprachliche Programmiersprache sollte daher auch zusätzlich formale Notation unterstützen, damit dem Nutzer stets die optimale Programmiertechnik zur Verfügung steht, damit er selbst entscheiden kann, wann er formale Notation verwenden möchte und wann nicht.

Schluss


Abschließend lässt sich nach Meinung des Autors folgendes sagen: Objektorientierte Sprachen sind schon auf dem Gipfel dessen angekommen, was mit diesem Programmierparadigma möglich ist. Sie sind das Resultat eines langen Weges, der bei den Maschinensprachen begonnen hat und seither zu Programmiersprachen geführt hat, die dem menschlichen Denken immer näher gekommen sind. Man sollte annehmen, dass diese Entwicklung auch in Zukunft anhalten wird. Das Natürlichsprachliche Programmieren könnte hier eine entscheidende Rolle spielen. Mindestens wird es aber von Interesse für die weitere Forschung sein.


Pegasus wird das erste theoretisch fundierte und praktisch anwendbare System dieser Art sein, daher erhoffen wir uns durch unsere Arbeit eine spürbare Erweiterung der wissenschaftlichen Erkenntnis im Bereich der Softwaretechnik und der Programmiersprachen, aber auch in den tangierten Gebieten, unter anderen in der Computerlinguistik.

Die Technik


Pegasus liest einen natürlichsprachlichen Text und generiert daraus ein ausführbares Programm, das die im Text dargestellten Ideen umsetzt.


Architektur

Folgendes Diagramm zeigt die Architektur von Pegasus in einem metaphorischen Sinne.

Auflösung der ideensprachlichen Ausdrücke

Pegasus liest einen Eingabesatz und erstellt einen Ausdruck in der Ideensprache, der dem Eingabesatz entspricht. Der Beispielsatz If the first element of the second row of the matrix is smaller than 3 then write "I can understand you!". würde bspw. folgendem Ausdruck in der Ideensprache entsprechen:


(
  (
  ((be, action), normal mode, present tense, predicate),
  ((element, entity), (first, positive, property),
  ((row, entity), (second, positive, property),
  ((matrix, entity), single, entity reference,
  reference, normal phrase, phrase),
  single, entity reference, reference, normal phrase, phrase),
  single, entity reference, reference, normal phrase, phrase, subject),
  (smallness, comparative, property),
  ((three, entity), single, entity reference, reference,
  comparation phrase, phrase, object),
  statement clause, clause, first),
  (
  ((writing, action), normal mode, present tense, predicate),
  (direct personal reference, reference entity, subject),
  (("I can understand you!", character string symbol),
  symbol phrase, phrase, object),
  command clause, clause, second),
condition sentence, sentence)


Das notwendige lexikalische Wissen wird in einem Wörterbuch gespeichert, das alle grammatikalischen Formen eines Wortes beinhaltet, sowie die Zuordnung der Idee zu den jeweiligen Worten der unterstützten Sprachen. Ein Eintrag könnte folgendermaßen aussehen:

Nachdem ein Eingabesatz in der Ideensprache ausgedrückt ist, versucht Pegasus die Bedeutung des Satzes zu ermitteln. Ein Ausdruck der Ideensprache wird schrittweise von außen nach innen aufgelöst und mit den in der internen Bibliothek hinterlegten Bedeutungen verglichen. Der Beispielsatz würde bspw. auf folgenden Eintrag in der Bibliothek matchen:

Hier sind die Anweisungen hinterlegt, die in einem entsprechenden Java-Programm genau das intendierte Verhalten eines Wenn-Dann-Zusammenhanges bewirken, nämlich die if-then-Anweisung.
Mit Hilfe des Kurzzeitgedächtnisses, einer Warteschlange, die die letzen 7 verwendeten Entitäten zwischenspeichert, werden Referenzen wie „die Zahl“ oder „er“ aufgelöst.

Generierung des Ausgabeprogramms

Anschließend wird aus den aufgelösten Bedeutungen in der Bibliothek das Ausgabeprogramm generiert. Für das kurze Beispielprogramm:


Take the matrix ([2, 2, 1], [1, 4, 3]).
Print it.
New line.
If the first element of the second row of the matrix is smaller than 3 then write "I can understand you!".


Würde das so aussehen:


// Take the matrix ([2, 2, 1], [1, 4, 3]).
long[][] matrix74 = new long[2][3];
matrix74[0] = new long[]{2, 2, 1};
matrix74[1] = new long[]{1, 4, 3};

// Print it.
System.out.print("(");
for (int i7 = 0; i7 <= 1; i7++)
{
  System.out.print("[");
  for (int i8 = 0; i8 <= 2; i8++)
  {
  System.out.print(matrix74[i7][i8]);
  if (i8 < 2) System.out.print(", ");
  } 
  System.out.print("]");
  if (i7 < 1) System.out.print(", ");
}
System.out.print(")");

// New line.
System.out.println("");

// If the first element of the second row of the matrix is
// smaller than 3 then write "I can understand you!".
if (matrix74[1][0] < 3)
  System.out.println("I can understand you!");


Pegasus könnte den Beispielsatz nun auch in Deutsch ausdrücken, indem der korrespondierende Ausdruck in der Ideensprache mittels der deutschen Grammatik auf einen syntaktisch korrekten Satz abgebildet wird:


Wenn das erste Element der zweiten Zeile der Matrix kleiner als drei ist, dann schreibe „I can understand you!“.


Verwandte Arbeiten


Es gab schon seit den Anfängen der Informatik Programmiersprachen, die in hohem Maße Gebrauch von natürlicher Sprache gemacht haben. Diese sind aber keine natürlichsprachlichen Programmiersprachen im eigentlichen Sinne, weil sie nicht auf einer Teilmenge der natürlichen Sprache aufbauen, d.h. auf einer eingeschränkten, aber korrekten Syntax und auf einem eingeschränkten, aber korrekten Lexikon, sondern lediglich eine natürlichsprachliche Ergänzung formaler Programmiersprachen darstellen. Zu diesen natürlichsprachlich ergänzten Programmiersprachen gehören unter anderem COBOL, FORTRAN und BASIC, neueren Datums sind KlarDeutsch und AppleScript [010]. KlarDeutsch ist eine natürlichsprachlich ergänzte kommerzielle Programmiersprache, die zur Maschinensteuerung verwendet wird. AppleScript ist eine Skriptsprache zum schreiben einfacher Programme für das MacOS-Betriebssystem der Firma Apple. In früheren Versionen dieses Systems war AppleScipt sogar mehrsprachig verfügbar. NaturalJava [045] ist eine Sprache, mit der man Java-Code mit Hilfe von natürlicher Sprache erzeugen kann. Die Nutzung der natürlichen Sprache beschränkt sich aber auf das reine Abbilden der Java-Struktur, etwa mit Befehlen der Art „I would like to create a public method that is named XYZ...“.

Seit den achtziger Jahren gibt es auch Ansätze rein natürlichsprachlicher Programmiersprachen: Die Sprache NLC [054, 006], die englisches natürlichsprachliches Programmieren in der begrenzten Domäne der Matrizenoperationen ermöglicht, ist einer der ersten dieser Ansätze. Einen neueren interessanten Ansatz macht der Metafor-Prototyp [039], der ein Programm in Anlehnung an Story-Telling-Systeme [034] mit Sätzen der Art „Pacman is a character who loves to run through a maze and eat dots.“ als eine zu erzählende Geschichte betrachtet. Neben den wissenschaftlichen Projekten gibt es auch eine Initiative von Privatpersonen: „Osmosian“ [049].

Pegasus geht bei integrierter Unterstützung sämtlicher Features der genannten Systeme weit über diese hinaus: