Internationale Programmierung natürlicher Sprache

In letzter Zeit sind häufig Artikel über neue Programmiersprachen sowie verschiedene Bewertungen und Prognosen zur Popularität von Computersprachen aufgetaucht.



Es machen sich auch neue Tools bekannt , die in ihrer Arbeit ihre eigenen Formate zur Beschreibung von Konfigurationsdateien oder einer Folge von ausgeführten Befehlen verwenden, was sie auch dem Konzept der "Programmiersprache" sehr nahe kommt.



Der Zweck dieses Artikels ist es, Erwartungen und mögliche Implementierung einer abstrakten Programmiersprache zu formulieren, die ein universelles Werkzeug für die Kommunikation zwischen einem Computer und einer Person werden kann.



Über Programmierer.



Wenn Sie von vorne beginnen, dann hörte ich einmal eine umschriebene Aussage: "Jeder Programmierer sollte seine eigene Datenbank, seinen eigenen Texteditor und seine eigene Programmiersprache schreiben." Und wenn ich die ersten beiden Dinge vor langer Zeit geschrieben habe, hat die Programmiersprache noch nicht funktioniert.



Wie werden Programmiersprachen normalerweise erstellt?



Jeder Programmierer hat immer eine Erfahrung:



  • Kenntnisse einer oder mehrerer Programmiersprachen (wie könnte es ohne sie sein)
  • negative Erfahrungen mit ihnen (ansonsten, wenn alles zu Ihnen passt, warum dann etwas Neues einfallen lassen?)
  • Wunsch nach neuen Möglichkeiten (wenn etwas in bestehenden Sprachen fehlt).


Bevor Sie die Syntax beschreiben, Schlüsselwörter auswählen und mit der Hauptarbeit beginnen: Lexer, Parser, Basisbibliotheken, müssen Sie die grundlegenden Fragen beantworten:



  • Compiler / Interpreter / Transpiler?
  • Statische oder dynamische Eingabe?
  • Manuelle Speicherverwaltung oder automatisch mit Garbage Collector?
  • Programmiermodell: OOP, funktional, strukturell oder etwas Neues?
  • Sind Einfügungen aus anderen Programmiersprachen usw. erlaubt?


Ich habe wahrscheinlich, wie die meisten Leser, Erfahrung mit mehreren Programmiersprachen. Daher ist es seit langem üblich, zur Lösung eines Problems eine bekannte Sprache zu verwenden oder sogar eine neue zu lernen, anstatt mit dem Schreiben einer eigenen Sprache zu beginnen.



Außerdem möchte ich keine andere Sprache erfinden, nur um einer Zecke willen oder um der Sprache selbst willen. Ich glaube, dass der Zweck der Erstellung außerhalb der Bedürfnisse des Entwicklers liegen sollte.



Und es scheint mir, dass wir es geschafft haben, den Bereich zu bestimmen, für den die Entwicklung einer Programmiersprache gefragt sein kann, und die dafür aufgewendeten Anstrengungen können echte Vorteile bringen.



Über Nicht-Programmierer.



Dieser Bereich ist eine Programmierung in natürlicher Sprache für Nicht-Programmierer. Ich habe die Wörter "Nicht-Programmierer" und "natürlich" absichtlich in Anführungszeichen gesetzt, da Diese Begriffe sind sehr bedingt.



Wenn ein Programmierer nicht mit dem Programmieren beginnt, wird er automatisch zum Programmierer, ohne es zu merken ;-). Eine Programmiersprache kann per Definition nicht "natürlich" sein. Genauer gesagt ist für Computer die Assembler-Sprache oder eine Reihe von Maschinenanweisungen höchstwahrscheinlich "natürlich".



Daher ist das Ziel maximal - die Programmiersprache näher an die natürliche menschliche Sprache heranzuführen.



Dies macht nicht nur das Lesen des Programmtextes für Laien verständlicher, sondern ermöglicht es Ihnen auch, Programme zu erstellen, indem Sie einfach die schriftliche Sprache beherrschen und dabei nur ein Minimum an Grundregeln anwenden.



Aber es gibt ein sehr großes Problem in dieser Formulierung!



Jede Programmiersprache ist international, weil Die Syntax ist unabhängig von der natürlichen Sprache, in der der Programmierer kommuniziert.



Und wenn der Text des Programms in einer "natürlichen" Sprache vorliegt, wird er nur für diejenigen verständlich, die diese Sprache kennen, und gleichzeitig für alle anderen unverständlich.



Zur Veranschaulichung: ein- oder zweimal .


Wenn Sie über die Wünsche für eine solche Sprache phantasieren, sehen Sie die folgenden Anforderungen und Einschränkungen:



  • ( ), , , , .
  • / , «» , «» .
  • Ich möchte wirklich Toleranz in der neuen Sprache sehen, Toleranz für Verwirrung. Ein solches "Merkmal" ist schriftlich in natürlicher Sprache vorhanden, und trotz des Vorhandenseins von Tippfehlern bleibt die Bedeutung fast immer erhalten. In diesem Fall sollte man natürlich nicht so weit gehen wie Fanatismus. Der Compiler liest keine Gedanken und kann nicht wirklich "verstehen", was der Benutzer meinte, und dennoch ist es durchaus üblich, Tippfehler im Programmtext basierend auf dem Kontext zu ignorieren (wenn auch mit Warnmeldungen).


Eine solche Sprache sollte jedoch nur eine Programmiersprache mit allen Möglichkeiten bleiben, Programme jeder Komplexitätsebene zu erstellen, einschließlich funktionaler und objektorientierter Programmierung und eines eindeutigen Verständnisses dessen, was geschrieben wurde.



Über eine hypothetische Sprache



Basierend auf den Schreibregeln könnten die grundlegenden Konventionen und Interpunktionen für eine neue Sprache ungefähr so ​​aussehen:



  • Jeder Text besteht aus Sätzen und Kommentaren. Vorschläge werden verarbeitet und Kommentare ignoriert.
  • Ein Satz besteht aus einer Folge von Begriffen, Literalen und Symbolen, die durch Leerzeichen und Satzzeichen getrennt sind, und endet mit einem Satzende.
  • Ein Begriff ist eine verschmolzene Folge von Buchstaben, Zahlen und Symbolen ":" und "_".
  • Literal - Konstanten, die direkt im Programmtext enthalten sind und deren Typ eindeutig bestimmt ist. Dies sind Zeichenfolgen in Anführungszeichen, Ganzzahlen und reellen Zahlen sowie einige spezielle Formate (Uhrzeit, Datum).
  • Symbole - alles andere Symbole, die nicht zu Satzzeichen, Leerzeichen, Zahlen und Buchstaben gehören.
  • — , :



    • «.»,«;»,«!»,«?»,«…» — .
    • «=» — .
    • "" () — .
    • «()» — / .
    • «[]» — .
    • «{}» — .
    • «$» — .
    • «@» — .
    • «,» () — .
    • «:» () — .


Wenn mit dem Zuweisungssymbol, Anführungszeichen, Klammern und eckigen Klammern alles mehr oder weniger klar sein soll, weil Ihr Zweck entspricht dem in der überwiegenden Mehrheit der Programmiersprachen. Dann sollte der Zweck der verbleibenden Zeichen (geschweifte Klammern, Doppelpunkt, Komma und Systemfunktionen / Variable) ein wenig erklärt werden.



Da das Ziel einer hypothetischen Programmiersprache immer noch darin besteht, Programme zu schreiben, muss die Möglichkeit vorgesehen werden, normalen Programmcode einzufügen, ohne alle Möglichkeiten und Mehrdeutigkeiten zu berücksichtigen, die einer natürlichen Sprache innewohnen.



Diese Fähigkeit ist auch erforderlich, um Funktionen auf niedriger Ebene zu implementieren und mit externen Bibliotheken zu interagieren.



Beim Erstellen solcher Einfügungen können geschweifte Klammern verwendet werden, deren gesamter Text mit wenig oder keiner Verarbeitung in die endgültige Datei eingefügt wird.



Die Symbole "$" - eine Systemvariable und "@" - eine Systemfunktion dienen ebenfalls ähnlichen Zwecken. Wenn ein solches Symbol am Anfang eines Wortes steht, bezeichnet es ein Objekt mit einem entsprechenden Zweck. Beispielsweise bedeutet "@exit" eine Funktion und "$ var" eine Variable mit geeigneten Namen, und die Objekte selbst werden sowohl im normalen Code als auch in programmatischen Einfügungen in geschweiften Klammern verfügbar.



Der Zugriff auf einzelne Felder / Methoden von Objekten ist ähnlich organisiert:

"object @ method" oder "object $ field".



Das Komma "," wird verwendet, um eine Folge gleicher logischer Blöcke in einem Satz anzugeben oder Listen zu erstellen.



Das Doppelpunktzeichen ":" wird verwendet, um Listen zu erstellen und eine logische Beziehung zwischen zwei Teilen eines Wortes / Textes anzugeben, einschließlich des vollständigen Modulpfads.



Beispiel: Erstellen einer Liste: Konsequenz / Angabe einer Beziehung: Wie Sie sehen, wird die Verwendung von Satzzeichen von ihrem direkten Zweck übernommen, der schriftlich übernommen wurde und einen gewissen Kompromiss zwischen der Syntax in Standardprogrammiersprachen und dem Schreiben in natürlicher Sprache bieten sollte.



_: 1, 2, .





_:

- 1;

- 2;

- .












module:calc // «calc», «module»

super:module:example$var // «$var» .











Über Computer



Da es sich um eine Programmiersprache handelt, können wir nicht auf algorithmische Standardkonstruktionen verzichten: Abfolge, Verzweigung und Schleifen.



Das Folgende wird leicht durch die üblichen Regeln des Schreibens in natürlicher Sprache beschrieben. Bei der sequentiellen Ausführung in einer Anweisung werden Operationen und Funktionsaufrufe sequentiell geschrieben und durch Kommas getrennt. Wenn sie sich in verschiedenen Sätzen befinden, werden sie nacheinander auf die gleiche Weise geschrieben. Darüber hinaus dient die Absatzformatierung nur zur besseren Wahrnehmung des Textes und zur logischen Trennung einzelner Fragmente.



Beim Erstellen von Kontrollstrukturen mit Bedingungen und Schleifen benötigen Sie bereits Schlüsselwörter. Da es jedoch nach den ursprünglichen Wünschen für die Sprache unmöglich ist, die üblichen Begriffe zum Schreiben algorithmischer Konstruktionen zu reservieren, reicht es aus, das Symbol der Systemfunktion vor den Schlüsselwörtern anzugeben, wodurch ein gewöhnlicher Begriff von einem Schlüsselwort (Steuerwort) unterschieden werden kann.



Natürlich können diese Begriffe während der Programmierung verwendet werden, aber dies ist überhaupt nicht notwendig. Da bei der Einrichtung für eine bestimmte natürliche Sprache Systemfunktionen und Schlüsselwörter bestimmte Begriffe zugewiesen werden müssen und diese bereits verwenden müssen, zum Beispiel:



= @goto,

= @label,

= @continue,

=@break ..








Und das letzte wiederum, aber wahrscheinlich das wichtigste im Wesentlichen, die Konstruktion: Übergeben von Parametern beim Aufrufen von Funktionen. Wenn wir eine völlig natürliche Syntax anstreben, erhalten wir dieselbe natürliche Sprache, die sehr schwer zu analysieren ist.



Dennoch scheint es mir möglich zu sein, die beiden Ansätze zu kombinieren, indem die obligatorische Verwendung von Klammern entfällt, sofern dies aufgrund der Syntax zulässig ist. Aber: Mit anderen Worten, für die natürliche Reihenfolge von Argumenten können Klammern für Funktionen und Kommas zwischen Parametern weggelassen werden. Obwohl ihre Verwendung in erster Linie von der natürlichen Zielsprache und nicht von der Syntax bestimmt werden sollte.



: (1, 2(), 3=).

: 1 2 3=.












: ( 2() ).

: 2().

: (2 ).












Über Einwände



Ich sehe begründete Einwände von Programmierern gegen die Verwendung einer solchen Sprache voraus. Jedes Programm wird sich als viel ausführlicher herausstellen als die strikte formale Syntax gewöhnlicher Computersprachen.



Lassen Sie mich daher an seine obligatorische Eigenschaft erinnern - die Fähigkeit, den Text eines Programms von einer Sprache in eine andere zu konvertieren. Auf diese Weise können Sie Programme mit einer streng formalen Syntax schreiben, ohne neu definierte Begriffe in natürlicher Sprache zu verwenden, und den Quelltext für einen "Nicht-Programmierer" in eine "natürliche" Sprache konvertieren.



All Articles