Als Programmierer in JavaScript ist mir aufgefallen, dass alles, was mit Anweisungen und Blöcken gemacht werden kann, nur mit Ausdrücken gemacht werden kann. Kann eine Programmiersprache nur mit Ausdrücken funktionieren? Und wenn ja, warum werden überhaupt Aussagen verwendet?
programming-languages
javascript
language-design
MaiaVictor
quelle
quelle
Antworten:
Sicher. Am einfachsten ist es, jedem Konstrukt, das derzeit eine Anweisung ist, einen Ergebniswert zuzuweisen und ihn dadurch in einen Ausdruck umzuwandeln. Das ist jedoch nicht unbedingt nützlich oder sinnvoll. Der einzige mögliche Gewinn ist ein wenig konzeptionelle Einfachheit. Aber wenn Sie dann Dinge wie Semikolons und Schleifen gehen zu entfernen (erforderlich über andere Operatoren und Funktionen Verkettungs statt), Programme stark mit Aussagen werden hässlich.
Eine radikalere aber sinnvoll , dies zu tun ist , die Sprache so zu gestalten , dass fast alles hat einen sinnvollen Wert, und sie in einer Weise nutzen , dass man fast immer einen Ausdruck für diesen sinnvollen Wert verwenden, nicht für andere Effekte. Funktionale Programmiersprachen tun dies (bis zu einem gewissen Grad; Haskell hat beispielsweise Deklarationen, die keine Ausdrücke sind).
Anweisungen werden verwendet, weil es im imperativen Paradigma viele gängige Operationen gibt, die keinen nützlichen Ergebniswert haben, und weil der Begriff der sequentiellen Anweisungen (anstelle von Berechnungen) recht gut zu diesem Paradigma passt. Wenn ein großer Prozentsatz Ihres Programms den Status mutiert, anstatt neue Werte zu berechnen, ist es nicht sinnvoll, die Erstellung eines Werts zu verlangen (was ist das Ergebnis einer for-Schleife?). Wenn Ihr gesamtes Paradigma (FP) dagegen auf der Berechnung von Werten basiert, rechtfertigen Ausreißer, die keinen Ergebniswert haben, keine Ausnahme: Stattdessen geben Sie ihnen ein Sentinel-Ergebnis, das nichts bedeutet.
quelle
void
undnull
/ undunit
besteht darin, dass letztere Werte sind und weitergegeben werden können, währendvoid
das Besondere daran ist, dass es keinen Wert dieses Typs gibt.Hängt davon ab, wie Sie "Anweisung" und "Ausdruck" definieren.
Eine sehr strenge Definition würde zwischen Aussagen als "Dinge, die Nebenwirkungen und möglicherweise einen Rückgabewert haben" und Ausdrücken als "Dinge, die Rückgabewerte haben, aber keine Nebenwirkungen haben können" unterscheiden. Mit einer solchen Definition kann kein aussagekräftiges Programm ohne mindestens eine Anweisung geschrieben werden (die einen Ausdruck auswerten und seinen Rückgabewert ausgeben müsste) - reine Ausdrücke allein können nicht mit der Welt außerhalb des Programms interagieren. Eine Sprache allein kann immer noch völlig rein sein (dh keine Aussagen haben), wenn der unreine Teil aus der Sprache in das unterstützende Ökosystem verschoben wird (was genau Haskell tut, obwohl die Sprache sowohl Definitionen als auch Ausdrücke hat). .
Wenn Sie jedoch Nebenwirkungen in Ausdrücken berücksichtigen, wird die Unterscheidung zwischen Anweisungen und Ausdrücken willkürlich und viel weniger interessant - natürlich können Sie eine Programmiersprache erfinden, die nur aus Ausdrücken besteht. Die meisten Lisp-Dialekte funktionieren ähnlich. In einer solchen Situation ist die Bewertung eines Ausdrucks auf seine Nebenwirkungen ziemlich genau das Gleiche wie die Ausführung einer Anweisung, und man könnte argumentieren, dass in einer solchen Sprache Ausdrücke und Anweisungen dasselbe sind. Der Unterschied zwischen einer Anweisung und einem Ausdruck ist also nur syntaktisch.
Viele Sprachen machen diese syntaktische Unterscheidung immer noch, weil sie nicht aus technischen Gründen, sondern aus Gründen der Lesbarkeit nützlich ist. Wenn Sie etwas zu einem Ausdruck machen, signalisieren Sie, dass Sie an seinem Rückgabewert interessiert sind, weniger an seinen Nebenwirkungen. Wenn Sie eine Aussage machen, wird dem Leser mitgeteilt, dass Sie beabsichtigen, Nebenwirkungen zu verursachen, und der Rückgabewert kann interessant sein oder auch nicht.
quelle
ATL und Xtend sind aussagefreie, gut funktionierende Programmiersprachen. Viele funktionale Sprachen sind auch ohne Aussagen. Ja, eine Programmiersprache kann ohne Anweisungen gut funktionieren. Ich denke, Aussagen sind in vielen Sprachen ein Relikt der imperativen Programmierung. Sie werden immer noch verwendet, weil sie weithin bekannt sind und in einigen Fällen den Code lesbarer machen.
quelle
Ja.
Funktionale Sprachen (und einzelne Zuweisungssprachen) Alles ist ein Ausdruck. Beispiele sind Haskal (und SISAL). Wobei sowohl if-Anweisungen als auch for-Schleifen Werte zurückgeben.
Es gibt andere Klassen von Sprachen: Die einfachste, die mir in den Sinn kommt, sind deklarative Sprachen (ich bin sicher, dass es viele andere gibt, die nicht von Aussagen abhängen). Diese Sprachen benötigen nicht einmal Ausdrücke (im gleichen Sinne, wie Sie normalerweise denken würden). Sie erklären, was wahr ist, und Sie können mehrere Ergebnisse zurückerhalten. Das Einfache hier ist
prolog
.quelle