it-swarm.com.de

Worauf bezieht sich Ausdruckskraft konkret?

Ausdruckskraft wird von Wikipedia definiert als:

.. die Breite der Ideen, die in dieser Sprache dargestellt und kommuniziert werden können.

Beziehen sich "Ideen" auf die Dinge (Operationen, Strukturen, Algorithmen usw.), die wir kommunizieren können mit der Maschine? Oder bezieht es sich auf die "menschlichen" Konzepte, die erfasst und mit der Sprache an andere Menschen kommuniziert werden können?

Wie wird die Ausdruckskraft bewertet und gemessen?

Wenn wir beispielsweise eine Sprache wie JavaScript verwendet und Variablennamen eine seltsame Einschränkung auferlegt haben, z. B. Variable muss eine 8-stellige Zahl sein, der ein Unterstrich vorangestellt ist und mit /^_[0-9]{8}$/ übereinstimmt Würden wir die Ausdruckskraft verlieren?

Oder wäre das nur absurd und nervig?


Zur Verdeutlichung:

Wird die Ausdruckskraft an den allgemein Ideen gemessen, die der Sprache innewohnen:

  • ganzzahlen und Zeichenfolgen
  • schleifen
  • bedingungen

Oder die Anzahl von spezifisch, einzigartigen Ideen, die die Sprache darstellen kann:

  • die ganzen Zahlen 1, 2 ... 2 ^ 32
  • zeichenfolgen mit "Was sagt der Fuchs?" und "wha pah pah pah pah pah pow"
  • für jeden Frosch in meine Sammlung von Fröschen
  • wenn Frosch ist grün oder so dann mach was
34
svidgen

Das wegweisende Papier zur Ausdruckskraft ist Über die Ausdruckskraft von Programmiersprachen von Matthias Felleisen (1991) . Es enthält eine mathematisch strenge Definition der Ausdruckskraft der Sprache.

Intuitiv, wenn jedes Programm, das in Sprache geschrieben werden kann [~ # ~], kann ein [~ # ~] auch in Sprache geschrieben werden [~ # ~] b [~ # ~] mit nur lokalen Transformationen, aber es gibt einige Programme, die in Sprache geschrieben sind [~ # ~] b [~ # ~] , der nicht in Sprache geschrieben werden kann [~ # ~] a [~ # ~] ohne ihre globale Struktur zu ändern (dh nicht nur mit rein lokalen Transformationen), dann ist Sprache [~ # ~] b [~ # ~] mehr Ausdrucksstarker als Sprache [~ # ~] a [~ # ~] .

Eine schöne Eigenschaft dieser Definition ist, dass sie die Möglichkeit zulässt, dass es Sprachpaare gibt, in denen Programme in [~ # ~] x [~ # ~] die nicht in [~ # ~] y [~ # ~] und Programmen in [~ ausgedrückt werden können # ~] y [~ # ~] , was nicht ausgedrückt werden kann in [~ # ~] x [~ # ~] , und somit sind die Sprachen verschieden, aber keine Sprache ist ausdrucksvoller als die andere. Dies passt gut zu unserer realen Erfahrung, dass es einige Sprachen gibt, die in einigen Dingen gut sind, und einige, die in anderen Dingen gut sind, und keine ist im Allgemeinen "besser" als die andere.

39
Jörg W Mittag

Ausdruckskraft wird von Wikipedia definiert als:

Lassen Sie uns diese Seite noch einmal lesen. Eines der ersten Dinge, die zu beachten sind, ist, dass es "Sprache" sagt, nicht "Programmiersprache", und die meisten seiner Beispiele sind keine Programmiersprachen, z. Das erste Beispiel ist ein Vergleich von OWL2 EL und OWL2 RL, die beide Ontologiesprachen sind.

Man kann das Konzept auf Programmiersprachen anwenden, aber auch auf Mustervergleichssprachen, Markup-Sprachen, Abfragesprachen, visuelle Stylesheet-Sprachen, reguläre Ausdrücke (und alle regulären Sprachen, auf die sie sich beziehen) und so weiter. Man kann sich sogar auf die Ausdruckskraft natürlicher Sprachen wie Englisch beziehen, was oft sehr informell geschieht, aber mit größerer Ernsthaftigkeit, wenn man die Probleme im Zusammenhang mit der Verarbeitung natürlicher Sprachen betrachtet.

Beziehen sich "Ideen" auf die Dinge (Operationen, Strukturen, Algorithmen usw.), die wir mit der Maschine kommunizieren können? Oder bezieht es sich auf die "menschlichen" Konzepte, die erfasst und mit der Sprache an andere Menschen kommuniziert werden können?

Es bezieht sich auf das, was in dieser Sprache ausgedrückt werden kann und nur als eine Sache an sich betrachtet wird.

Beispiel: (Ich werde für meine Beispiele durchgehend Javascript verwenden, da Ihre Frage angibt, dass es eine der Sprachen ist, die Sie kennen.) Betrachten Sie die Javascript-Anweisung:

var x = 3 + 4;

Dies stellt dar, dass die Wertesumme von 3 und 4 berechnet und der Wert einer Bezeichnung x innerhalb eines bestimmten Namespace-Bereichs zugeordnet wird.

Wenn wir alle Computer der Welt zerstören und diesen Code auf ein Blatt Papier schreiben würden, würde es bleiben, dass er in Javascript immer noch dieselbe Bedeutung hat; Wir könnten solchen Code auf nichts ausführen, aber über die abstrakte Definition der Sprache könnten wir immer noch sprechen.

Dies mag pedantisch erscheinen, aber es ist tatsächlich ziemlich wichtig, dass Sprachen Dinge sind, über die abstrakt argumentiert werden kann, ohne dass echte Computer berücksichtigt werden. Zum einen sind Menschen, die über theoretische Punkte von Computersprachen nachdenken, die in der Praxis noch nicht realisierbar waren, eines der Dinge, die uns dahin gebracht haben, wo wir heute sind. Computer brauchen Informatik, aber Informatik braucht keine Computer, nur die Idee einer Berechnung.

Natürlich benutzen wir Computer in der realen Welt, und heutzutage benutzen viele Leute sie in der Praxis und nicht einige Spezialisten, die sie theoretisch diskutieren. Die Seite, auf die Sie verlinkt haben, lautet:

Der Begriff Ausdruckskraft kann mit einer Reihe von Bedeutungen verwendet werden. Dies kann ein Maß für die in dieser Sprache zum Ausdruck gebrachten Ideen bedeuten:

  • unabhängig von der Leichtigkeit (theoretische Ausdruckskraft)

  • prägnant und leicht (praktische Ausdruckskraft)

Der erste Sinn dominiert in Bereichen der Mathematik und Logik, die sich mit der formalen Beschreibung von Sprachen und ihrer Bedeutung befassen, wie der formalen Sprachtheorie, der mathematischen Logik und der Prozessalgebra.

In informellen Diskussionen bezieht sich der Begriff oft auf den zweiten Sinn oder auf beides. Dies ist häufig der Fall, wenn Programmiersprachen besprochen werden. Es wurden Anstrengungen unternommen, um diese informellen Verwendungen des Begriffs zu formalisieren

Von diesen beiden Verwendungen des Begriffs bezieht sich die praktische Auswirkung des ersten ausschließlich auf das, was dem Computer übermittelt werden kann.

Die zweite bezieht sich mehr auf das menschliche Verständnis sowohl beim Lesen als auch beim Schreiben, obwohl das Ausmaß, in dem dies geschieht, zwischen den Verwendungen sehr unterschiedlich ist, da sie informell sind und als solche nicht streng definiert sind.

Wenn wir beispielsweise eine Sprache wie JavaScript verwenden und Variablennamen einer seltsamen Einschränkung unterwerfen, z. B. dass eine Variable eine 8-stellige Zahl sein muss, der ein Unterstrich vorangestellt ist, der mit /^_[0-9]{8}$/ Übereinstimmt, würden wir dann die Ausdruckskraft verlieren?

Nach der formalen Definition haben wir keine Ausdruckskraft verloren: Wir sind auf 100.000.000 Variablen beschränkt, aber wenn wir es wirklich brauchen, können wir dies umgehen, indem wir Objekte erstellen, die mehr Variablen im neu erstellten Namespace enthalten. Als solches könnte jedes Programm, das heute in Javascript geschrieben wird, in dieser neuen Form umgeschrieben werden, so dass sie gleichermaßen ausdrucksstark sind.

Nach der informellen Definition haben wir einige verloren, aber wie viel davon abhängt, wie informell wir sind, was variieren wird, da Sie wiederum nicht sagen können, was "die Regel" für eine informelle Verwendung ist. Wir könnten sagen, wir haben eine winzige Menge verloren, weil Programme mit mehr als 100.000.000 Variablen im selben Namespace über eine einfache Ersetzung hinaus neu geschrieben werden müssen. Eine noch informellere Verwendung würde sich wieder auf die mentalen Auswirkungen solcher ungünstig variablen Namen auf die Gesamtheit des Menschen beziehen.

Es ist auch erwähnenswert, dass die Leute informell Dinge betrachten, die überhaupt nicht streng Teil der Sprache sind. Betrachten Sie die Änderungen in Javascript von seiner Erstellung bis heute.

Nach der formalsten Definition ist die Ausdruckskraft ziemlich unverändert geblieben. es war schließlich Turing komplett.

Durch eine informellere Definition ist es in bestimmten Dingen wie Array-Manipulation, Ausnahmebehandlung und (vielleicht am allermeisten) der Einbeziehung regulärer Ausdrücke wesentlich ausdrucksvoller geworden. Diese machen nichts, was vorher in Javascript nicht möglich war, obwohl sie oft etwas in wenigen Zeilen und einer Ausführungszeit von weniger als einer Sekunde tun können, was Kilobyte Code zum Schreiben in Javascript 1.0 und eine lange Zeit zum Ausführen benötigt.

Wiederum durch eine viel informellere Definition die Änderung von der ersten Verwendung von Javascript in Browsern (in der Lage, die Werte von Formulareingaben zu ändern, document.write, Während die Seite zum ersten Mal analysiert wird und an einen neuen Speicherort verschoben wird oder vorwärts oder rückwärts geht in der Geschichte, aber so ziemlich nichts anderes) bis heute (in der Lage, fast alles auf der Seite zu ändern, einschließlich auf der Grundlage von Daten aus Serveraufrufen) ist absolut immens, obwohl sich das meiste nicht auf Javascript bezieht, sondern auf Die zur Verfügung gestellten Objektmodelle und APIs anstelle der Sprache (z. B. vbscript in IE profitierte gleichermaßen von diesen Änderungen).

Meiner Meinung nach ist diese letzte Verwendung so informell, dass sie nicht wirklich korrekt ist, aber das ist das Problem bei informellen Definitionen.

Durch die formale Definition ist es wirklich überhaupt nicht ausdrucksvoller geworden.

10
Jon Hanna

Ich denke nicht, dass Regeln für die Benennung von Variablen wirklich erfassen, was unter "Ausdruckskraft" zu verstehen ist. Ich denke, dass "Ausdruckskraft" sich auf grundlegendere Dinge bezieht. Betrachten Sie beispielsweise C # mit Linq gegenüber C # vor Linq. Nach dem Hinzufügen von Linq wurde es möglich, SQL-ähnliche Abfragen direkt in C # zu schreiben. Dies ist viel eleganter als die vorherigen Alternativen, z. SQL in String-Literale einfügen und dann an den Server übergeben oder eine Sammlung mit "for" durchlaufen.

Ein weiteres gutes Beispiel könnten Sprachen mit prototypbasierter Vererbung sein. In diesen Sprachen ist es möglich, einer Instanz oder sogar einer Klasse (wie auch immer eine "Klasse" in einer bestimmten Sprache lauten mag ...) zur Laufzeit einfach neue Methoden hinzuzufügen. Das kann man in C++ oder C # nicht wirklich machen. Ihnen fehlt dieses Maß an Ausdruckskraft im Vergleich zu prototypbasierten Sprachen. (C # hat das Konzept von Erweiterungsmethoden, und diese können sicherlich als Ausdrucksmittel bezeichnet werden.)

4
user1172763

Wie im Wikipedia-Artikel erwähnt, bezieht sich Ausdruckskraft auf eine Reihe von Programmen, die in der Sprache ausgedrückt werden können. Alles, was Sie als "Programmiersprache" betrachten (JavaScript, LISP, C #, Perl usw.), ist im Wesentlichen vollständig, was bedeutet, dass sie alles ausdrücken können, was als "berechenbar" bezeichnet wird.

Es sollte jedoch ziemlich klar sein, dass reguläre Ausdrücke nicht so ausdrucksstark sind wie reguläre Programmiersprachen. Darüber hinaus sind Shell-Platzhalter etwas weniger ausdrucksstark als reguläre Ausdrücke.

Eine SQL-Version mit allgemeinen Tabellenausdrücken ist aussagekräftiger als eine Version ohne, da Sie mit CTEs rekursive Abfragen darstellen können, die in SQL sonst nicht ausgedrückt werden könnten.

0
Gabe

Es gibt einen einfacheren und direkteren Weg, um die Ausdruckskraft zu verstehen, aber zuerst müssen wir herausfinden, was wir unter Sprachen verstehen. Es gibt zwei Disziplinen, die Sprachen studieren: Linguistik und Automaten. Beide würden sich darauf einigen, dass Sprache Sätze von Wörtern (endliche Sequenzen) sind, die aus einem endlichen Alphabet unter Verwendung von Verkettung aufgebaut sind. Typischerweise haben interessante Sprachen (mit interessant meine ich solche Sprachen, die wir auf nützliche Weise interpretieren können) auch eine Reihe von Regeln, die regeln, welche Wörter in der Sprache sind und welche nicht. Beachten Sie, dass Ausdruckskraft nur bei Interpretation vorhanden sein kann.

Mit Interpretation meine ich die Existenz einer Funktion, die ein Wort in einer Sprache angibt und ein Objekt aus einer Reihe von Objekten auswählt (dies ist offensichtlich für natürliche Sprachen umstritten).

Lassen Sie sich jedoch nicht durch die Verwendung von "Word" irreführen. Ein Java Programm ist ein Wort in der Sprache Java Sprache) (obwohl es mehrere Dateien umfassen kann, die mehrere durch Leerzeichen getrennte Zeichenfolgen enthalten).

Es wäre kontraproduktiv, so komplizierte Sprachen wie moderne Programmiersprachen zu verwenden, um mit diesem relativ einfachen Konzept umzugehen. Deshalb würde ich stattdessen lieber mathematische Formeln verwenden.

  • Definieren wir Sprache A als alle Formeln, die eine Ganzzahladdition beinhalten.

  • Definieren wir Sprache B als die Sprache aller Formeln, die eine ganzzahlige Multiplikation beinhalten.

In beiden Fällen ist die Verwendung des Identitätselements nicht zulässig. Somit enthält Sprache A die Wörter "1 + 1", "1 + 2", "1 + 3", "2 + 3" und so weiter. Die Sprache B enthält die Wörter "2 * 2", "2 * 3", "2 * 4", "3 * 4" und so weiter. Wir weisen den jeweiligen Symbolen auch die üblichen Interpretationen zu "*" und "+" (Ganzzahladdition und Ganzzahlmultiplikation) zu. Die Interpretation von "1 + 1" ist also 2 und die Interpretation von "2 * 2" ist 4.

Beachten Sie nun, dass die Sprache A streng ausdrucksstärker ist als die Sprache B, da in ganzen Zahlen die Multiplikation zwar als wiederholte Addition gewertet werden kann, es jedoch keine Möglichkeit gibt, die Addition als Multiplikation im Allgemeinen darzustellen.


Um dies zusammenzufassen: Sprache A kann als ausdrucksstärker als Sprache B bezeichnet werden, wenn ihre Interpretationsfunktionen eine gemeinsame Domäne haben, aber das Bild der Interpretationsfunktion von B ist eine geeignete Teilmenge des Bildes der Interpretationsfunktion von A.

0
wvxvw