Könnte eine Programmiersprache auch ohne Anweisungen funktionieren?

9

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?

MaiaVictor
quelle
2
Ja, es gibt viele alles-ist-ein-Ausdruck-Sprachen wie Ruby und alle Dialekte von Lisp.
Amara
@sparkleshy Ich verstehe, nur eine Vermutung: Sie haben alle einen Operator analog zum Komma des JavaScript (er führt zwei Anweisungen aus und gibt den Wert des letzten zurück)? Ist dies im Allgemeinen die Lösung, um zwei Anweisungen nacheinander auszuführen? Ich zähle die Prognose von CL als analog, denke ich, auch wenn es für> 2 Ausdrücke funktioniert.
MaiaVictor
1
Alles, was ein Ausdruck ist, muss nicht anders aussehen als eine gewöhnliche Anweisungssprache, Anweisungen haben nur ... Werte. Wenn Sie die Anweisungen von javascript ausdrücken würden, wäre der gesamte vorhandene Code vollständig gültig.
Amara
1
CoffeeScript ist eine Ausdruckssprache, die zu JavaScript kompiliert wird.
Spoike
1
verwandt (möglicherweise ein Duplikat): Welche nützliche Ausdruckskraft ist in einer Sprache, in der ein Ausdruck keine Aussage ist, unmöglich? "Warum unterscheiden so viele Grammatiken zwischen Ausdruck und Ausdruck, wenn dies, wie in den Antworten angegeben, keinen Sinn ergibt?"
Mücke

Antworten:

14

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
-1 das ist nicht wirklich wahr
amara
3
@sparkleshy Welcher Teil ist nicht wahr und wie?
1
Erster Absatz: Sie bezweifeln die Idee, dass Anweisungen nützliche Rückgabewerte haben (aber viele tun dies), und schlagen eine hässliche Sache vor (warum?). zweiter Absatz: erklärt, dass alle funktionalen Programmiersprachen dieses hässliche Randkonzept verwenden, was lächerlich ist. dritter Absatz: false, wir haben bereits in {} Blöcken, dass der Wert ignoriert wird und keine Probleme verursacht, falsch; Sie geben ihnen bereits den Mangel an Wert der Leere. Wie ist Null weniger bedeutungsvoll als das? Insgesamt: Dies ist nicht wirklich wahr
Amara
2
@sparkleshy - Keine Anweisungen haben nützliche Rückgabewerte, deshalb sind sie Anweisungen . Sie können nützliche Nebenwirkungen haben (wie Zuweisung), aber das ist nicht dasselbe. Dies ist nicht wirklich ein Randkonzept. Es ist bekannt, wenn auch nicht ganz praktisch, wenn es bis zum N-ten Grad genommen wird. Und dieser Sentinel-Wert ist nicht null oder nichtig, sondern eine Einheit, die sich geringfügig von beiden unterscheidet. +1 für Delnan, um dies auszugleichen.
Telastyn
4
@sparkleshy (1) Möglicherweise verwechseln Sie Ausdrücke (die die einzige Komponente einer Anweisung sein können) mit Anweisungen (die keine Ausdrücke sind und keinen Ergebniswert haben). (2) Was? Jeder FP-Anwalt wird dies bestätigen (und argumentieren, dass es eine gute Sache ist). Oder ist es nur der "alles" Teil, gegen den Sie Einwände erheben? (3) {} Blöcke sind das, worüber ich spreche ("Begriff der sequentiellen Anweisungen"). Und wo soll ich sagen, dass irgendetwas Probleme verursacht? Der Unterschied zwischen voidund null/ und unitbesteht darin, dass letztere Werte sind und weitergegeben werden können, während voiddas Besondere daran ist, dass es keinen Wert dieses Typs gibt.
5

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.

tdammers
quelle
+1 für Kommentare zur Lesbarkeit ... Am Ende müssen die Menschen es verstehen ...
Mattnz
1

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.

SpaceTrucker
quelle
1

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.

Martin York
quelle
Haskell hat Erklärungen, sie sind keine Ausdrücke.
Janus Troelsen