Ich schreibe einen Compiler und nachdem ich etwas in einem "C" -Stil fertiggestellt habe, sehe ich mir an, es an andere Modelle anzupassen. Was sind einige syntaktische Konstrukte, die man in einer "natürlichen" Programmiersprache erwarten würde?
Die Zielplattform für diesen Compiler wird die CLR sein und ich verwende derzeit Oslo + MGrammar für den Lexer / Parser (wie Sie wahrscheinlich sagen können, ist dies nur eine Ausrede zum Spielen)
Eines der Ziele meines Projekts wäre, dass sich das Programmieren eher wie eine Konversation anfühlt als strukturierte Syntax und Anforderungen.
Ich denke, ich sollte das etwas ausweiten. Eine der Ideen, mit denen ich arbeite, ist eine Klassenerklärung, die wie ein Absatz gelesen wird.
%Vor%... würde auch übersetzen ...
%Vor%Wenn Sie möchten, dass Ihr Design von etwas beeinflusst wird, das sich in Richtung "Natürlichkeit" entwickelt hat, Graham Nelson hat einige wirklich beeindruckende neue Arbeiten zu einer domänenspezifischen Programmiersprache gemacht, die auf natürlicher Sprache basiert. Das System heißt Inform 7 und wird meiner Meinung nach die Analyse reichlich zurückzahlen.
Ein Problem mit Inform 7 ist, dass die Präsentation vollständig auf Nicht-Programmierer ausgerichtet ist. Es ist nicht einfach herauszufinden, was die Syntax ist! Aber ich bin ziemlich beeindruckt von den Ergebnissen, und ich glaube, es gibt einige neuartige Bindungskonstrukte, die wirklich neue Ideen bieten - es ist nicht nur altes Zeug in einem sehr attraktiven Paket. Es lohnt sich, es auszuprobieren!
Wirklich, ich denke nicht, dass es eine gute Idee ist, Code natürlicher zu machen. Es wird übermäßig verbal werden. Es gibt einen Grund, warum niemand COBOL benutzt sehr wenige Leute bereitwillig COBOL benutzen:)
Es könnte eine bessere Idee sein, eine Standardsprache zu entwickeln, um Code laut auszusprechen (es würde viel helfen, wenn Sie versuchen, jemandem Code zu erklären, den er aber nicht zeigen kann).
Ich unterstütze den Vorschlag, Inform 7 zu betrachten. In den letzten Monaten habe ich mit Inform7 einige interaktive Romane geschrieben und es ist wirklich eine beeindruckende Sprache. Ich finde es eine erfrischende Abwechslung von den Sprachen, die ich normalerweise schreibe, weil ich immer noch etwas erschaffe und es dennoch viel natürlicher beschreibe.
Zum Beispiel wäre dies ein perfektes (wenn auch kurzes) Programm in Inform7:
%Vor%Es gibt eine Art von Englisch, die ich kenne, die versucht, so streng zu sein wie eine Programmiersprache (und scheitert): juristisch. Ein Anwalt ist ausgebildet, um auf Englisch oder etwas, das dem Englischen vage ähnelt, eindeutig zu schreiben. (Viel Latein, einige magische Phrasen, etc.)
Wenn Sie eine universelle Programmiersprache wollen, wird sie nicht der natürlichen Sprache ähneln. Die natürliche Sprache ist mehrdeutig und beruht auf einer hochintelligenten Verarbeitung und in vielen Fällen auf einer Frage-und-Antwort-Übung, um verbleibende Unklarheiten zu beseitigen. Nun, um zu versuchen, es zu entfernen; in vielen Fällen, wenn Person A etwas zu Person B sagt, ist A's Meinung von dem, was B verstanden hat, nicht das gleiche wie B's Verständnis.
Dies ist nicht wirklich ein Problem mit der Technologie, sondern eher mit der Natur von natürlichen gegenüber künstlichen Sprachen.
Natürlich könnten Sie versuchen, irgendeine Form von Mehrdeutigkeit in Ihrer Sprache zu implementieren, aber ich denke nicht, dass es nützlich wäre. Es könnte aber Spaß machen, damit zu spielen, und das ist dein Ziel.
Dieser Satz ist falsch
Ich mag Mathe und Programmierung, weil sie ziemlich absolut sind.
Die menschliche Sprache vermittelt Emotion und Ambiguität. Deshalb streite ich immer mit Leuten. Wenn Sie nicht möchten, dass Ihr Computer mit Ihnen streitet, und Ihr Compiler abstrakte zufällige Vermutungen macht (wie Frauen: P), dann bleiben Sie bei logischen Sprachen, die ich rekonfiguriere.
Ich stelle mir vor, dass die Übersetzung der natürlichen Sprache in eine konkrete Semantik viel schwieriger ist als die vage Bedeutung eines Satzes durch NLP. Kurz von Sätzen wie:
%Vor%Was SQL-ähnlich in seiner Struktur ist.
Sie könnten eine Form von selbstdefinierendem, axiomatisch-ähnlichem semantischen Aufbau (wie Self oder ähnlich) mit einer gewissen Lambda-Kalkül-Affinität wählen. bearbeiten : Klingt wie Lisp. Ich ziehe diese Aussage zurück. ()) ((())) () ()
Zwei Beispiele aus verwandter Frage sind LOLCODE und Inform7 ... die ich beide nicht programmieren würde.
Ihre Aussage:
%Vor%Klingt nicht nach einer echten natürlichen Sprache, sondern nach einer kontrollierten Sprache .
Zwei Beispiele, die eine maschinell verständliche Semantik haben, sind Attempto Controlled English , die zu konzeptuelle Graphiken und Gellish , die verwendet werden als Datenmodellierungssprache.
Ich kann mir keine direkte Übersetzung Ihrer Aussagen über 'Einen Hund' vorstellen, da die erste Aussage über den Untertyp von Säugetieren zu sprechen scheint, die Hunde sind, aber dann fangen Sie an, über eine einzige Instanz zu sprechen; Sie müssten etwas strenger sein, um vorhandene kontrollierte Sprachen zu verwenden.
%Vor%(obwohl dies von Zeit zu Zeit jede Vorstellung von der Verlegung verliert)
Was würde "verwenden" bedeuten?
Was bedeutet "verwenden" in Ihrem Beispiel?
Und ich habe die Instanzmethoden des Objekts "Hund" beschrieben. Ich habe nie etwas wie "Spot is a Dog" gesagt. Spot beginnt zu laufen. "
Ist "A Dog" ein Objekt oder beziehen Sie sich auf die Klasse aller Hunde? Sie scheinen sich auf alle Hunde zu beziehen, und die meisten kontrollierten Sprachen erfordern diese Unterscheidung. "Ein Hund ist ein Säugetier" gegen "Ein Hund ist im Garten". Es heißt "das Elefantenproblem" in NLP-Büchern.
Für mich würde dies die Instanz erstellen und der Instanz sagen, dass sie ausgeführt werden soll.
Ich weiß nicht, wie ich eine statische Methode für einen Hund beschreiben würde.
Es gibt so etwas wie eine "statische Methode" in natürlicher Sprache nicht. Warum also sollten Sie in der Lage sein, etwas in einer natürlichen Sprache zu beschreiben?
Sie können eine Beziehung definieren, die einen Geltungsbereich hat "Wenn das Diskussionsthema Hunde ist, dann ist bark ein Verb", aber es gibt nicht viel zu nennen, um den Umfang einer Beziehung zu definieren (eine statische Methode ist nur ein Funktion mit ihrem innerhalb einer Klasse definierten Umfang); normalerweise ist es nicht mehrdeutig.
Nach dem, was ich in letzter Zeit gesehen habe, können die "natürlichsten" Programmiersprachen für bestimmte Domänen erstellt werden. Wenn Sie in allgemeine Programmiersprachen einsteigen, müssen die Dinge allgemeiner werden und infolgedessen lesen sie weniger natürlich. Ich würde CSS als eine ziemlich natürliche Art der Programmierung betrachten, weshalb Nicht-Programmierer es aufgreifen und gut anwenden können. Ich denke, Sie werden es schwer haben, eine allgemeine Sprache natürlicher zu lesen als einige der gut zusammengesetzten Ruby-Codes, die ich gesehen habe. Auf der anderen Seite, wenn Sie mit einer bestimmten Domäne zu tun haben, können Sie einige erstaunliche Dinge tun, wenn Sie nur mit einem begrenzten Wortschatz umgehen müssen.
Sehen Sie sich die Rebol Parsing-Funktion an. Es kann DSL basierend auf einer Regel definieren. Du könntest Erfüllen Sie Ihre Erwartungen mit minimalem Code
Tags und Links syntax compiler-construction language-design nlp