Stefan Ram
2014-02-10 07:59:32 UTC
Wollte ich gerade mal notieren:
Es gibt in einigen Sprachen Kaperungen, wo man bestehende
Syntax für eine andere Semantik kapert.
Ein bekanntes Beispiel ist »static« in C, welches eigentlich
statische Lebensdauer bezeichnet, aber auch für
Dateigültigkeitsbereichkennzeichnung gekapert wurde.
Ein anderes Beispiel wäre »On Error GoTo 0« in VBA, was
/nicht/ bedeutet, daß bei einem Fehler zu Zeile 0 gesprungen
werden soll.
Ein anderes Beispiel ist »"use strict";« in JavaScript.
Man weiß nicht so recht, ob man die Eleganz bewundern soll,
die sonst nutzlose Zeichenkettenauswertung einer nützlichen
Verwendung zuzuführen oder über den Mißbrauch der Semantik
der Ausdruckanweisung klagen soll!
Nun noch zu einem etwas anderen Thema, zwei Dinge, die mir
in einigen Sprachen besonders gut gefallen! Es gibt abweisende
und nicht-abweisende Schleifen. In vielen Sprachen haben sie
unterschiedliche Syntax oder Schlüsselwörter oder Semantik
(in Pascal enthält die nichtabweisende immer eine Verneinung).
Das ist in VBA besonders elegant gelöst, wo die Syntax beider
Formen vereinheitlicht ist. Abweisend:
Do While Condition
...
Loop
Nicht-abweisend:
Do
...
Loop While Condition
Das ist wirklich suggestiv und orthogonal: Man bewegt die
While-Klause und ändert sonst nichts!
Schließlich: Kommentare, es gibt unter anderem folgende
Kommentareinleiter:
/*
//
#
;
. Aber mir erschien der von Ada (eventuell gibt es den auch
in PL/1 oder SQL) immer am suggestivsten:
--
. In Sprachen der C-Familie kann man den natürlich schlecht
verwenden, weil er dort schon für das Dekrementieren steht.
Aber, wenn ich mir in Pseudocode am Ende einer Zeile einen
Kommentar notieren will, verwende ich »--«, und das obwohl
ich nie in Ada programmiert hat.
Die Do-Schleife aus VBA und »--« waren also die
»Schmuckstücke« aus dem Betreff. Dabei ist ein
»Schmuckstück« einer Programmiersprache etwas aus einer
Programmiersprache, das nicht sehr verbreitet ist, aber das
man in anderen Sprachen auch gerne hätte.
Eine Kaperung ist die Überladung vorhandener Syntax mit
einer ganz anderen Semantik.
LISP war früher voller Schmuckstücke, wie garbage collection
oder closures. Langsam »klauen« das aber immer mehr
mainstream-Sprachen, so daß es langsam seinen
Schmuckstückcharakter verliert. Umgekehrt hat Common Lisp
heute auch viel mehr »prozedurale« und »strukturierte«
Bestandteile aus anderen Sprachen als das klassische LISP.
Die Programmiersprachen konvergieren etwas.
Nach gewissen Hypes hat sich die logische Programmierung mit
Prolog und die funktionale mit Haskell nicht besonders
durchgesetzt. Dafür verwenden viele Programmiersysteme heute
deklarative Elemente mit den Deklarationen in XML
(beispielsweise für die GUI-Struktur oder lokalisierte
Texte), aber kaum logische Ableitungen daraus. Funktionale
Elemente sickern in viele mainstream-Sprachen ein.
Beim Übergang von Ant zu Gradle wird XML durch eine DSL
ersetzt. Die DSL enthält viel weniger Redundanz als XML,
aber sie ist nur auf den ersten Blick besser lesbar.
Versucht man nämlich eine Spezifikation dieser DSL zu
finden (in der wenigstens die Syntax formal und die
Semantik in genauem Englisch und vollständig angegeben wird),
so sucht man vergeblich. Daher wird es dann schwierig,
wenn man so ein DSL-Skript erstellen oder bearbeiten will.
Es gibt in einigen Sprachen Kaperungen, wo man bestehende
Syntax für eine andere Semantik kapert.
Ein bekanntes Beispiel ist »static« in C, welches eigentlich
statische Lebensdauer bezeichnet, aber auch für
Dateigültigkeitsbereichkennzeichnung gekapert wurde.
Ein anderes Beispiel wäre »On Error GoTo 0« in VBA, was
/nicht/ bedeutet, daß bei einem Fehler zu Zeile 0 gesprungen
werden soll.
Ein anderes Beispiel ist »"use strict";« in JavaScript.
Man weiß nicht so recht, ob man die Eleganz bewundern soll,
die sonst nutzlose Zeichenkettenauswertung einer nützlichen
Verwendung zuzuführen oder über den Mißbrauch der Semantik
der Ausdruckanweisung klagen soll!
Nun noch zu einem etwas anderen Thema, zwei Dinge, die mir
in einigen Sprachen besonders gut gefallen! Es gibt abweisende
und nicht-abweisende Schleifen. In vielen Sprachen haben sie
unterschiedliche Syntax oder Schlüsselwörter oder Semantik
(in Pascal enthält die nichtabweisende immer eine Verneinung).
Das ist in VBA besonders elegant gelöst, wo die Syntax beider
Formen vereinheitlicht ist. Abweisend:
Do While Condition
...
Loop
Nicht-abweisend:
Do
...
Loop While Condition
Das ist wirklich suggestiv und orthogonal: Man bewegt die
While-Klause und ändert sonst nichts!
Schließlich: Kommentare, es gibt unter anderem folgende
Kommentareinleiter:
/*
//
#
;
. Aber mir erschien der von Ada (eventuell gibt es den auch
in PL/1 oder SQL) immer am suggestivsten:
--
. In Sprachen der C-Familie kann man den natürlich schlecht
verwenden, weil er dort schon für das Dekrementieren steht.
Aber, wenn ich mir in Pseudocode am Ende einer Zeile einen
Kommentar notieren will, verwende ich »--«, und das obwohl
ich nie in Ada programmiert hat.
Die Do-Schleife aus VBA und »--« waren also die
»Schmuckstücke« aus dem Betreff. Dabei ist ein
»Schmuckstück« einer Programmiersprache etwas aus einer
Programmiersprache, das nicht sehr verbreitet ist, aber das
man in anderen Sprachen auch gerne hätte.
Eine Kaperung ist die Überladung vorhandener Syntax mit
einer ganz anderen Semantik.
LISP war früher voller Schmuckstücke, wie garbage collection
oder closures. Langsam »klauen« das aber immer mehr
mainstream-Sprachen, so daß es langsam seinen
Schmuckstückcharakter verliert. Umgekehrt hat Common Lisp
heute auch viel mehr »prozedurale« und »strukturierte«
Bestandteile aus anderen Sprachen als das klassische LISP.
Die Programmiersprachen konvergieren etwas.
Nach gewissen Hypes hat sich die logische Programmierung mit
Prolog und die funktionale mit Haskell nicht besonders
durchgesetzt. Dafür verwenden viele Programmiersysteme heute
deklarative Elemente mit den Deklarationen in XML
(beispielsweise für die GUI-Struktur oder lokalisierte
Texte), aber kaum logische Ableitungen daraus. Funktionale
Elemente sickern in viele mainstream-Sprachen ein.
Beim Übergang von Ant zu Gradle wird XML durch eine DSL
ersetzt. Die DSL enthält viel weniger Redundanz als XML,
aber sie ist nur auf den ersten Blick besser lesbar.
Versucht man nämlich eine Spezifikation dieser DSL zu
finden (in der wenigstens die Syntax formal und die
Semantik in genauem Englisch und vollständig angegeben wird),
so sucht man vergeblich. Daher wird es dann schwierig,
wenn man so ein DSL-Skript erstellen oder bearbeiten will.