Regelmäßigkeit von Programmiersprachen


[ Gliederung ] [ Einführung ] [ Effizienz ] [ Regelmäßigkeit ] [ Einfachheit ] [ Ausdruckskraft ] [ Erweiterbarkeit ]
[ Einschränkbarkeit ] [ Präzision ] [ Sicherheit ] [ Fazit ] [ Literatur und Internetquellen ]

Regelmäßigkeit


Regelmäßikeit

Regelmäßigkeit einer Programmiersprache bedeutet, in wieweit die Eigenschaften einer Sprache eingebunden sind. Das bedeutet, bei großer Regelmäßigkeit gibt es weniger Einschränkungen und Irritationen in der Anwendung von Spracheigenschaften. Der Bereich Regelmäßigkeit von Programmiersprachen spaltet sich dabei in drei Teilbereiche auf: Allgemeingültigkeit bedeutet, dass es in der Anwendung von Spracheigenschaften, wie z.B. Vergleichsoperatoren, auf alle Datentypen keine Unterschiede oder Einschränkungen geben soll.

Orthogonalität bedeutet, dass die Eigenschaften einer Sprache in allen möglichen Kombinationen vermischt werden kann, wobei jeweils immer wieder eine sinnvolle Bedeutung entsteht.

Einheitlichkeit bedeutet hierbei, dass gleiche Eigenschaften und Prinzipien sich auch gleich verhalten und aussehen sollen.


Allgemeingültigkeit


Wie vorher schon definiert wurde so bedeutet Allgemeingültigkeit, dass Spracheigenschaften, wie z.B. Vergleichsoperatoren, für alle Datentypen gleich anwendbar sein sollen. Die Sprache wird dadurch leichter zu Hand haben, weil es (möglichst) keine Sonderfälle gibt, die beachtet werden müssen.

Hier ein paar Beispiele, wo die Allgemeingültigkeit einer Sprache nicht oder nur spärlich eingehalten wurde.

Pascal beinhaltet in seinem Sprachumfang geschachtelte Funktionen und Prozeduren, die wiederum als Parameter an andere Funktionen und Prozeduren übergeben werden können. Jedoch hat die Sprache keinen Datentyp für Prozeduren und Funktionen, was die Allgemeingültigkeit der Sprache verletzt. C wiederum mangelt es an geschachtelten Prozedur- bzw. Funktionsdefinitionen. Ein Beispiel aus der Sprache Algol verdeutlicht die Schachtelung, die nicht in C möglich ist.
procedure P ();
var x: char;
	procedure Q ();
	var x : integer;
	begin 
		x := 5; 
	end;
begin
	x := "X"
	Q();
end;
Innerhalb der Prozedure P(); kann noch eine weiter Prozedur Q(); deklariert werden, die im Prozedurrumpf von P(); dann aufgerufen wird.
Auf der anderen Seite kann man hingegen in C Prozedurparameter als Variablen und Rückgabewerte verwenden, was im Gegensatz zu Pascal ein Mehr Allgemeingültigkeit der Sprache bedeutet.

In Pascal gibt es keine Arrays variabler Länge während dies zum Beispiel in C und Ada möglich ist. Somit leidet Pascal in der Eigenschaft der Arrays an Allgemeingültigkeit, weil die Sprache im flexiblen Gebrauch von Arrays Eingeschränkt wird.

In C besteht nicht die Möglichkeit Strukturen oder Arrays mit dem Gleichheitsoperator (==) zu vergleichen, so wie das beispielsweise mit dem int Datentypen möglich ist. Dies wurde in den neueren Sprachen wie z.B. Ada und teilweise in C++ behoben. Ein weiteres Merkmal von Allgemeingültigkeit liegt im Erweitern von Operatoren hinsichtlich neuen (selbst erstellten) Datentypen. Dies ist beispielsweise in Haskell möglich und somit erreicht diese Sprache ein hohes Maß an Allgemeingültigkeit.

Auch hinsichtlich der Verwendung von Konstanten gibt es in einigen Sprachen Einschränkungen. So gibt es in Fortran keine namentlichen Bezeichner als Konstanten und in Pascal dürfen Konstanten keine Ausdrücke sein. In Modula-2 dürfen Konstanten keine Funktionsaufrufe beinhalten. Als bestes Beispiel für allgemeine Verwendung von Konstanten dient die Sprache Ada. Hier besteht Allgemeingültigkeit in der Verwendung von Konstanten. Es werden sogar dynamische Mengen als Konstanten unterstützt.


Orthogonalität


Wie oben angemerkt bedeutet Orthogonalität die Vermischung von Spracheigenschaften, so dass immer wieder eine sinnvolle Bedeutung entsteht. So sei mal angenommen, eine Sprache enthält einen Ausdruck, der einen Wert produziert, und eine Bedingungsanweisung, die einen Ausdruck bewertet, um einen wahren oder falschen Wert zu erhalten. Diese zwei Merkmale der Sprache, also Ausdruck und Bedingungsanweisung, sind orthogonal, wenn in der Bedingungsanweisung ein beliebiger Ausdruck benutzt (und bewertet) werden kann. Sind Merkmale einer Sprache orthogonal, ist die Sprache leicht erlernbar und Programme lassen sich leichter schreiben, weil es weniger Ausnahmen gibt, an die man denken muss. Orthogonalität hat aber den Nachteil, dass ein Programm oft fehlerfrei kompiliert wird, obwohl es vielleicht mehrer Merkmale enthält, die logisch unzusammenhängend oder in der Ausführung sehr ineffizient sind.

Ein Beispiel aus C soll einmal die grundlegende Orthogonalität erläutern:
int a,b,c;

c = (a + b) == (b + a);
Orthogonalität bedeutet, dass man die Spracheigenschaften miteinander vermischen kann. In dem Fall werden zuerst zwei Ausdrücke mit der Spracheigenschaft des Vergleichs miteinander verknüpft. Die Sprache ist in dieser hinsicht orthogonal, da sie dieses Konstrukt zulässt.

Aber es gibt auch Beispiele für Nichtorthogonalität:
So kann der Rückgabewert einer Funktion in Pascal nur Skalare oder Pointer zurückgeben, während in C und C++ alles ein Rückgabewert sein kann außer Arrays. Dies ist eine Nichtorthogonalität, da die Programmeigenschaft des Rückgabewertes nicht mit jedem Datentyp kombiniert werden kann.

In C werden alle Parameter per Wert übergeben mit Ausnahme von Array die nur per Referenz übergeben werden können.


Einheitlichkeit


Einheitlichkeit von Programmiersprachen lässt sich leicht zusammenfassen. Semantisch ähnliche Sachen sollen ähnlich aussehen und sich ähnlich verhalten und semantisch unterschiedliche Sachen sollen unterschiedlich aussehen und sich entsprechend unterschiedlich verhalten. Jedoch enthalten viele Sprachen syntaktische Gebilde, die die Fehlinterpunktion geradezu fördern, indem zwei fast identische Anweisungen eventuell etwas völlig anderes bedeuten. Beispielsweise kann ein Leerzeichen, das ein Operator ist, in einer Snobol4-Anweisung die Bedeutung völlig ändern. Die symantischen Unterschiede sollten sich in der Syntax der Sprache wieder finden.

In C++ ist bei der semantisch ähnlichen Klassendefintion ein Semikolon erforderlich während bei einer Funktionsdefintion kein Semikolon erlaubt ist

class A {...}; //Semikolon erwartet

int f {...} //Semikolon verboten

Auch das Returnstatement in Pascal verstößt gegen die Einheitlichkeit. So hat es semantisch gesehen einen anderen Kontext, sieht jedoch wie eine Zuweisung aus. In diesem Fall sollte es sich von einer Zuweisung unterscheiden.

function f:boolean;
begin
	...
	f := true;
end;

Ein ähnliches Problem besteht bei den Operatoren & und && in C. Sie sehen ähnlich aus, haben aber einen anderen Kontext. So bedeutet & ein bitweises AND während der Operator && das logische AND repräsentiert. Auch hier sollten sich beide Operatoren voneinander unterscheiden, damit keine Verwechselung aufkommt.

Gründe für Uneinheitlichkeit

Jeder Entwickler einer neuen Sprache macht sich darüber natürlich seine Gedanken. Doch auch hier zeigt sich wieder, dass nicht alle Designkriterien vereinbar sind und dadurch führt es zu einigen Unzulänglichkeiten in einigen Sprachen. Die Gründe dafür können vielfältig sein. So geben zumeist technische Gründe den Ausschlag, aber auch andere Gründe wie z.B. historische Gegebenheiten können eine Rolle spielen. Die oben schon angesprochene Uneinheitlichkeit in der Verwendung des Semikolons in C++ hat ihre Gründe in der Ableitung von C. Es sollte sich so wenig wie möglich von C unterscheiden bzw. kompatibel mit C bleiben. Dadurch wurde die Deklaration von Funktionen aus C übernommen.
Technische Restriktionen hinsichtlich der einfachen Stack basierten Laufzeitumgebung führten bei Pascal und C zur Verletzung der Allgemeingültigkeit bei der Verwendung von Funktionen. Auf der anderen Seite, hätte man eine allgemeinere, komplexere Laufzeitumgebung gestaltet, so hätte man andere Designkriterien wie Einfachheit und Effizienz der Implementation verletzt.
[ Gliederung ] [ Einführung ] [ Effizienz ] [ Regelmäßigkeit ] [ Einfachheit ] [ Ausdruckskraft ] [ Erweiterbarkeit ]
[ Einschränkbarkeit ] [ Präzision ] [ Sicherheit ] [ Fazit ] [ Literatur und Internetquellen ]