Was bedeutet "expressiv", wenn auf Programmiersprachen Bezug genommen wird?

73

Ich höre dieses Wort oft in Sätzen wie "Javascript ist eine sehr ausdrucksstarke Sprache". Bedeutet das nur, dass es nicht viele Regeln gibt, oder hat "expressiv" eine spezifischere Bedeutung?

Morgancodes
quelle
Ok, danke für die Antworten. Scheint ein rutschiges Wort zu sein! Ich werde es vermeiden und mich an diejenigen halten, die ich sicher verstehe.
Morgancodes
Ich bin genauso überrascht wie das OP. Es ist seltsam, wie sicher Menschen das Wort in der Fachliteratur verwenden, als ob es eine genaue Bedeutung hätte.
Sridhar Sarnobat

Antworten:

62

'Expressiv' bedeutet, dass es einfach ist, Code zu schreiben, der sowohl für den Compiler als auch für einen menschlichen Leser leicht zu verstehen ist.

Zwei Faktoren, die für Ausdruckskraft sorgen:

  • intuitiv lesbare Konstrukte
  • Mangel an Boilerplate-Code

Vergleichen Sie diesen ausdrucksstarken Groovy mit dem weniger ausdrucksstarken Java-Äquivalent:

3.times {
   println 'Hip hip hooray'
}

vs.

for(int i=0; i<3; i++) {
    System.out.println("Hip hip hooray");
}

Manchmal tauschen Sie Präzision gegen Ausdruckskraft - das Groovy-Beispiel funktioniert, weil es Dinge voraussetzt, die Java explizit angeben lässt.

schlank
quelle
2
Was meinst du mit "Präzision" in deinen beiden Beispielen? Was geht Groovy davon aus, welches Java Sie spezifisch macht? (Hinweis: Die Verwendung einer intSchleifenvariablen in Java ist ein Artefakt von Java. Sie ist im Wesentlichen bedeutungslos und nicht "präziser" als die von Groovy. Das 3.timesist es also nicht.)
Andres F.
5
@AndresF. Technisch gesehen geht Groovy davon aus, dass Sie in die Standardausgabe schreiben, während Java Sie dazu zwingt, dies explizit anzugeben. Ich würde behaupten, dass dies eine zu 100% gute Annahme von Groovy ist, aber das gibt es auch. Aber ich denke, der Punkt des OP wurde falsch angegeben, da ich anfangs Ihre Reaktion hatte. Nach weiteren Überlegungen denke ich, dass es nicht darum geht, dass die Kernfunktionalität hinter dem Code weniger genau ist, sondern dass das Wie weniger genau ist. In Groovy wissen wir nicht, wie das Looping hinter den Kulissen durchgeführt wird. Während die Schleife in Java überhaupt nicht hinter den Kulissen ist. Daher Ausdruckskraft.
Ben Lee
1
Das New Oxford American Dictionary definiert "expressiv" als "effektiv Gedanken oder Gefühle vermitteln" . Ich gehe davon aus, dass dies mit "leicht zu verstehen" gemeint ist . Der Code kann seine Absicht effektiv vermitteln, ohne dass eine Dokumentation erforderlich ist, um ihn in menschlicher Sprache zu erklären.
Jeffrey Fulton
Ich wundere mich auch über die Notation expressiveness. Obwohl ich im Allgemeinen auf die Idee gekommen bin, die sehr intuitiv ist, bin ich wunderbar, ob es eine "formale Definition" der Ausdruckskraft der Sprache gibt, und wenn ja, welche "quantitativen Metriken" zur Messung der Ausdruckskraft?
lllllllllllll
17

Ich verstehe es so, dass es in der Lage ist , Ideen / Algorithmen / Aufgaben auf einfach zu lesende und prägnante Weise auszudrücken .

Normalerweise verbinde ich eine ausdrucksstarke Sprache mit syntaktischem Zucker, obwohl dies nicht immer der Fall ist. Beispiele in C # für Ausdruck sind:

  • foreach (anstatt die Iteration explizit zu schreiben)
  • die usingAnweisung (anstatt explizit den try / finally zu schreiben)
  • Abfrageausdrücke (einfachere Syntax zum Schreiben von LINQ-Abfragen)
  • Erweiterungsmethoden (Ermöglichen der Verkettung von Methodenaufrufen, wiederum hauptsächlich für LINQ)
  • anonyme Methoden und Lambda-Ausdrücke (was eine einfachere Erstellung von Delegaten und Ausdrucksbäumen ermöglicht)

Ein anderes Beispiel wären Generika: Bevor C # Generika erhielt, konnte man die Idee eines " ArrayListnur Zeichenfolgen enthaltenden" im Code nicht ausdrücken . (Sie können es natürlich dokumentieren oder Ihren eigenen StringListTyp schreiben , aber das ist nicht ganz dasselbe.)

Jon Skeet
quelle
11

Neal Grafter hat einen Blog mit einem guten Zitat zu diesem Thema ...

In meinen Augen ist ein Sprachkonstrukt ausdrucksstark, wenn es Ihnen ermöglicht, eine API zu schreiben (und zu verwenden), die ohne das Konstrukt nicht geschrieben (und verwendet) werden kann.

Ich würde sagen, dass es bedeutet, dass Sie Ihre Gedanken natürlicher im Code ausdrücken können.

TofuBeer
quelle
6

Das ist eine schwierige Frage.

Für mich hat es mit der Leichtigkeit zu tun, mit der Sie Ihre Absicht zum Ausdruck bringen können. Dies ist in verschiedenen Sprachen unterschiedlich und hängt auch stark davon ab, was Sie tun möchten. In diesem Bereich sind also Verallgemeinerungen üblich. Es ist natürlich auch subjektiv und persönlich.

Es ist leicht zu denken, dass eine höhere Sprache immer ausdrucksvoller ist, aber ich denke nicht, dass das wahr ist. Dies hängt davon ab, was Sie ausdrücken möchten, dh von der Problemdomäne.

Wenn Sie die Gleitkommazahl mit dem Binärmuster drucken möchten 0xdeadbeef, ist dies in C weitaus einfacher als beispielsweise in Bash. Dennoch ist Bash im Vergleich zu C eine Sprache auf höchstem Niveau. Wenn Sie dagegen ein Programm ausführen und seine Ausgabe in einer Textdatei sammeln möchten, ist dies so einfach, dass es in Bash fast unsichtbar ist, in C jedoch mindestens eine Code-Seite erforderlich ist (unter der Annahme einer POSIX-Umgebung).

entspannen
quelle
3

http://en.wikipedia.org/wiki/Expressive_power

Yardena
quelle
3
Ich fand diesen Artikel nicht als klares Beispiel für Ausdruckskraft in der Computerprogrammierung (wonach das OP sucht). Es ist nicht sehr ausdrucksstark. Auch nach seiner primären Definition wären Assembly und C # gleichermaßen ausdrucksstark, da sie dieselben Ideen darstellen können, obwohl eine deutlich ausdrucksvoller ist als die andere. Eine andere Antwort hat mir geholfen zu verstehen, dass es die „Leichtigkeit“ ist, eine Idee auszudrücken, die unter anderem den Unterschied ausmacht.
Despertar
2

Hier ein sehr kontroverser Vergleich:

http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/

Also, was sind die besten Sprachen nach diesen Metriken?

Wenn Sie die Top 10 basierend auf der Rangfolge nach Median und IQR auswählen, nehmen Sie den Schnittpunkt von ihnen. Der Median und der IQR werden unmittelbar nach den Namen aufgelistet:

Augeas (48, 28): Eine domänenspezifische Sprache für Konfigurationsdateien

Puppet (52, 65): Ein weiteres DSL für die Konfiguration REBOL (57, 47): Eine Sprache für verteiltes Rechnen

eC (75, 75): Ecere C, ein C-Derivat mit Objektorientierung

CoffeeScript (100, 23): Eine übergeordnete Sprache, die zu JavaScript transkompiliert wird

Clojure (101,51): Ein Lisp-Dialekt für funktionale, gleichzeitige Programmierung

Vala (123, 61): Eine objektorientierte Sprache, die von GNOME verwendet wird

Haskell (127, 71): Eine rein funktionale, kompilierte Sprache mit starker statischer Typisierung

AA.
quelle
1

Vielleicht kann Ihnen diese Website http://gafter.blogspot.com/2007/03/on-expressive-power-of-programming.html helfen

Kurz gesagt, sagt er : In meinen Augen ist ein Sprachkonstrukt ausdrucksstark, wenn es Ihnen ermöglicht, eine API zu schreiben (und zu verwenden), die ohne das Konstrukt nicht geschrieben (und verwendet) werden kann. Im Zusammenhang mit der von Closures for Java vorgeschlagenen Spracherweiterung scheinen Kontrollabstraktions-APIs von den konkurrierenden Vorschlägen nicht unterstützt zu werden.

TStamper
quelle