Was ist "Orthogonalität"?

124

Was bedeutet "Orthogonalität", wenn über Programmiersprachen gesprochen wird?

Was sind einige Beispiele für Orthogonalität?

AhmetB - Google
quelle

Antworten:

255

Orthogonalität ist die Eigenschaft, die bedeutet, dass "Ändern von A B nicht ändert". Ein Beispiel für ein orthogonales System wäre ein Funkgerät, bei dem durch Ändern des Senders die Lautstärke nicht geändert wird und umgekehrt.

Ein nicht orthogonales System wäre wie ein Hubschrauber, bei dem eine Änderung der Geschwindigkeit die Richtung ändern kann.

In Programmiersprachen bedeutet dies, dass beim Ausführen einer Anweisung nur diese Anweisung ausgeführt wird (sehr wichtig für das Debuggen).

Es gibt auch eine bestimmte Bedeutung, wenn auf Befehlssätze Bezug genommen wird .

Kreuz
quelle
Diese Antwort erinnert mich an die "Überlagerungstheorie" von Signalen und Systemen.
Özgür
1
Eine sehr klare Erklärung der verschiedenen Verwendungen dieses Wortes: c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano
Ist die funktionale Programmierung also vollständig orthogonal?
Corazza
Das ist eine interessante Frage @yannbane. In der Theorie kann es abhängig von der theoretischen Funktionssprache wahr sein. In der Praxis haben sogar funktionale Sprachen Möglichkeiten, den Status zu ändern.
C. Ross
1
Ich wette, das Beispiel eines Hubschraubers stammt von "Pragmatic Programmer" :)
Sreekanth Karumanaghat
36

Aus Eric S. Raymonds "Art of UNIX Programming"

Orthogonalität ist eine der wichtigsten Eigenschaften, die dazu beitragen können, auch komplexe Designs kompakt zu gestalten. In einem rein orthogonalen Design haben Operationen keine Nebenwirkungen. Jede Aktion (ob es sich um einen API-Aufruf, einen Makroaufruf oder eine Sprachoperation handelt) ändert nur eine Sache, ohne andere zu beeinflussen. Es gibt nur eine Möglichkeit, jede Eigenschaft des von Ihnen gesteuerten Systems zu ändern.

Federico klez Culloca
quelle
16

Denken Sie daran, dass es in der Lage ist, eine Sache zu ändern, ohne einen unsichtbaren Einfluss auf einen anderen Teil zu haben.

Martin Beckett
quelle
12

Wenn Sie eine Reihe von Konstrukten haben. Eine Sprache wird als orthogonal bezeichnet, wenn der Programmierer diese Konstrukte frei mischen kann. In C können Sie beispielsweise kein Array (statisches Array) zurückgeben. In diesem Fall wird C als unorthognal bezeichnet:

int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.
AraK
quelle
Eigentlich habe ich das in meinem Buch gesehen und verstehe immer noch nicht, was das ist.
AhmetB - Google
LOL Ich benutze dieses Buch und habe diese Frage im Online-Quiz des Buches gesehen. Was für ein Zufall. Vielleicht sollte ich auch das erste Kapitel lesen.
AhmetB - Google
2
Es heißt einfach, dass Return und Arrays zusammen komplexer sind: Sie können Return um Arrays nicht verwenden, ohne über die Interaktion zwischen ihnen nachzudenken. Im Idealfall wissen Sie, was Rückgabe bedeutet und was ein Array ist, und Sie wissen, was die Rückgabe eines Arrays bewirken würde. Tatsächlich ist dies jedoch komplexer, da C Implementierungsdetails zu Arrays (und Rückgabe) verfügbar macht.
Lee B
Dieser Sinn für "orthogonal" wird abgedeckt durch: en.wikipedia.org/wiki/Orthogonality_(programming) , aber es ist eine neue Seite mit wenig Inhalt.
Outis
1
Dies ist die "richtigere" Antwort zur Orthogonalität im Kontext der Programmierung. "Orthogonalität" bedeutet, dass ein Programmierkonstrukt mit jedem anderen Konstrukt gemischt werden kann und seine Semantik weiterhin gleich bleibt.
Treecoder
11

Im Allgemeinen ist Orthogonalität eine Beziehung zwischen zwei Dingen, so dass sie nur minimale Auswirkungen aufeinander haben.

Der Begriff stammt aus der Mathematik, wo zwei Vektoren orthogonal sind, wenn sie sich im rechten Winkel schneiden.

Stellen Sie sich einen typischen zweidimensionalen kartesischen Raum vor (ein typisches Gitter mit X / Y-Achsen). Zeichnen Sie zwei Linien: x = 1 und y = 1. Die beiden Linien sind orthogonal. Sie können x = 1 ändern, indem Sie x ändern. Dies hat keine Auswirkungen auf die andere Zeile und umgekehrt.

In der Software kann der Begriff in Situationen verwendet werden, in denen es sich um zwei Teile eines Systems handelt, die sich unabhängig voneinander verhalten.

timdev
quelle
5

Die meisten Antworten sind sehr langatmig und sogar dunkel. Der Punkt ist: Wenn ein Werkzeug orthogonal ist, kann es zugunsten besserer Werkzeuge hinzugefügt, ersetzt oder entfernt werden, ohne alles andere zu vermasseln.

Es ist der Unterschied zwischen einem Schreiner mit einem Hammer und einer Säge, die zum Hämmern oder Sägen verwendet werden kann, oder einer neuartigen Hammer / Säge-Kombination, die Holz sägen und dann zusammenschlagen soll. Entweder funktioniert das Sägen und dann das Zusammenhämmern. Wenn Sie jedoch eine Aufgabe erhalten, die das Sägen erfordert, aber nicht das Hämmern, funktionieren nur die orthogonalen Werkzeuge. Wenn Sie schrauben anstatt hämmern müssen, müssen Sie Ihre Säge nicht wegwerfen, wenn sie orthogonal (nicht mit Ihrem Hammer verwechselt) ist.

Das klassische Beispiel sind Unix-Befehlszeilentools: Sie haben ein Tool zum Abrufen des Inhalts einer Festplatte (dd), ein anderes zum Filtern von Zeilen aus der Datei (grep), ein anderes zum Schreiben dieser Zeilen in eine Datei (cat) usw. Diese können alle nach Belieben gemischt und angepasst werden.

Lee B.
quelle
2

Wenn Sie über Projektentscheidungen zu Programmiersprachen sprechen, kann Orthogonalität als eine Möglichkeit angesehen werden, andere Dinge über diese Sprache für das vorherzusagen, was Sie in der Vergangenheit gesehen haben.

Zum Beispiel können Sie in einer Sprache Folgendes haben:

str.split

zum Teilen eines Strings und

len (str)

für die Länge zu bekommen.

In einer orthogonaleren Sprache würden Sie immer str.x oder x (str) verwenden.

Wenn Sie ein Objekt klonen oder etwas anderes tun, wissen Sie, ob Sie es verwenden sollen

Klon (obj)

oder

obj.clone

Dies ist einer der Hauptpunkte bei orthogonalen Programmiersprachen. So vermeiden Sie, dass Sie das Handbuch konsultieren oder jemanden fragen.

Der Wikipedia-Artikel spricht mehr über Orthogonalität bei komplexen Designs oder einfachen Sprachen. Wie oben in einem Kommentar vorgeschlagen, spricht das Sebesta-Buch sauber über Orthogonalität.

Wenn ich nur einen Satz verwenden würde, würde ich sagen, dass eine Programmiersprache orthogonal ist, wenn ihre unbekannten Teile wie erwartet wirken, basierend auf dem, was Sie gesehen haben. Oder ... keine Überraschungen.

;)

Asrail
quelle
Diese Antwort stimmt nicht mit anderen überein. Dies beansprucht lediglich die Konsistenz zwischen Funktionsaufrufen oder der Gesamtstruktur im Gegensatz zu anderen, die im Sinne von "weniger Kopplung" oder "Nebenwirkungslosigkeit" sind.
Özgür
Dies ist die Verwendung, die ich normalerweise gehört habe. Ich denke, der Grund, warum es orthogonal ist, ist, dass Sie mit X.ToString und X.GetType das Objekt und die Syntax variieren können, oder Sie können die Funktion und die Syntax variieren. Das Objekt ist unabhängig von der Funktion.
Dwidel
1

aus Wikipedia :

Computerwissenschaften

Orthogonalität ist eine Eigenschaft des Systemdesigns, die die Machbarkeit und Kompaktheit komplexer Designs erleichtert. Die Orthogonalität garantiert, dass das Ändern des technischen Effekts, der von einer Komponente eines Systems erzeugt wird, keine Nebenwirkungen erzeugt oder auf andere Komponenten des Systems überträgt. Das entstehende Verhalten eines Systems, das aus Komponenten besteht, sollte streng durch formale Definitionen seiner Logik und nicht durch Nebenwirkungen kontrolliert werden, die sich aus einer schlechten Integration ergeben, dh einem nicht orthogonalen Design von Modulen und Schnittstellen. Orthogonalität reduziert die Test- und Entwicklungszeit, da es einfacher ist, Designs zu überprüfen, die weder Nebenwirkungen verursachen noch von diesen abhängen.

Zum Beispiel hat ein Auto orthogonale Komponenten und Steuerungen (z. B. beeinflusst das Beschleunigen des Fahrzeugs nichts anderes als die Komponenten, die ausschließlich mit der Beschleunigungsfunktion befasst sind). Andererseits kann bei einem nicht orthogonalen Design die Lenkung das Bremsen beeinflussen (z. B. elektronische Stabilitätskontrolle) oder die Geschwindigkeit die Federung optimieren. 1 Folglich wird diese Verwendung aus der Verwendung von Orthogonal in der Mathematik abgeleitet: Man kann einen Vektor auf einen Unterraum projizieren, indem man ihn separat auf jedes Mitglied eines Satzes von Basisvektoren projiziert und die Projektionen genau dann addiert, wenn die Basisvektoren sind zueinander orthogonal.

Ein Befehlssatz wird als orthogonal bezeichnet, wenn ein Befehl ein beliebiges Register in einem beliebigen Adressierungsmodus verwenden kann. Diese Terminologie ergibt sich aus der Betrachtung eines Befehls als Vektor, dessen Komponenten die Befehlsfelder sind. Ein Feld identifiziert die Register, die bearbeitet werden sollen, und ein anderes Feld gibt den Adressierungsmodus an. Ein orthogonaler Befehlssatz codiert alle Kombinationen von Registern und Adressierungsmodi eindeutig.

TheVillageIdiot
quelle
Oh, danke, ich habe gerade diesen Stub besucht. En.wikipedia.org/wiki/Orthogonality_%28programming%29 Entschuldigung.
AhmetB - Google
1

Aus Wikipedia :

Orthogonalität ist eine Eigenschaft des Systemdesigns, die die Machbarkeit und Kompaktheit komplexer Designs erleichtert. Die Orthogonalität garantiert, dass das Ändern des technischen Effekts, der von einer Komponente eines Systems erzeugt wird, keine Nebenwirkungen erzeugt oder auf andere Komponenten des Systems überträgt. Das entstehende Verhalten eines Systems, das aus Komponenten besteht, sollte streng durch formale Definitionen seiner Logik und nicht durch Nebenwirkungen kontrolliert werden, die sich aus einer schlechten Integration ergeben, dh einem nicht orthogonalen Design von Modulen und Schnittstellen. Orthogonalität reduziert die Test- und Entwicklungszeit, da es einfacher ist, Designs zu überprüfen, die weder Nebenwirkungen verursachen noch von diesen abhängen.

Zum Beispiel hat ein Auto orthogonale Komponenten und Steuerungen (z. B. beeinflusst das Beschleunigen des Fahrzeugs nichts anderes als die Komponenten, die ausschließlich mit der Beschleunigungsfunktion befasst sind). Andererseits kann ein nicht orthogonales Design durch seine Lenkung das Bremsen (z. B. elektronische Stabilitätskontrolle) oder durch die Geschwindigkeitsanpassung der Federung beeinflussen. [1] Folglich wird diese Verwendung aus der Verwendung von Orthogonal in der Mathematik abgeleitet: Man kann einen Vektor auf einen Unterraum projizieren, indem man ihn separat auf jedes Mitglied eines Satzes von Basisvektoren projiziert und die Projektionen genau dann addiert, wenn die Basisvektoren sind zueinander orthogonal.

Ein Befehlssatz wird als orthogonal bezeichnet, wenn ein Befehl ein beliebiges Register in einem beliebigen Adressierungsmodus verwenden kann. Diese Terminologie ergibt sich aus der Betrachtung eines Befehls als Vektor, dessen Komponenten die Befehlsfelder sind. Ein Feld identifiziert die Register, die bearbeitet werden sollen, und ein anderes Feld gibt den Adressierungsmodus an. Ein orthogonaler Befehlssatz codiert alle Kombinationen von Registern und Adressierungsmodi eindeutig.

Um es so einfach wie möglich auszudrücken: Zwei Dinge sind orthogonal, wenn eine Änderung keine Auswirkung auf die andere hat.

Laurence Gonsalves
quelle
1

Berücksichtigen Sie als Beispiele für den Mangel an Orthogonalität in einer Hochsprache die folgenden Regeln und Ausnahmen in C. Obwohl C zwei Arten von strukturierten Datentypen aufweist, Arrays und Datensätze (Strukturen), können Datensätze von Funktionen zurückgegeben werden, Arrays jedoch nicht. Ein Mitglied einer Struktur kann ein beliebiger Datentyp sein, außer void oder eine Struktur desselben Typs. Ein Array-Element kann ein beliebiger Datentyp sein, außer void oder eine Funktion. Parameter werden als Wert übergeben, es sei denn, es handelt sich um Arrays. In diesem Fall werden sie tatsächlich als Referenz übergeben (da das Auftreten eines Array-Namens ohne Index in einem C-Programm als Adresse des ersten Elements des Arrays interpretiert wird).

Phantasie
quelle
0

In Programmiersprachen wird ein Programmiersprachenmerkmal als orthogonal bezeichnet, wenn es ohne Einschränkungen (oder Ausnahmen) begrenzt ist. Beispielsweise können in Pascal-Funktionen keine strukturierten Typen zurückgegeben werden. Dies ist eine Einschränkung für die Rückgabe von Werten von einer Funktion. Daher wird es als nicht orthogonales Merkmal betrachtet. ;)

Dil
quelle
0

Orthogonalität in der Programmierung:

Orthogonalität ist ein wichtiges Konzept, das sich mit der Frage befasst, wie eine relativ kleine Anzahl von Komponenten auf relativ kleine Weise kombiniert werden kann, um die gewünschten Ergebnisse zu erzielen. Es ist mit Einfachheit verbunden; Je orthogonaler das Design, desto weniger Ausnahmen. Dies erleichtert das Lernen, Lesen und Schreiben von Programmen in einer Programmiersprache. Die Bedeutung eines orthogonalen Merkmals ist unabhängig vom Kontext. Die Schlüsselparameter sind Symmetrie und Konsistenz (zum Beispiel ist ein Zeiger ein orthogonales Konzept).

von Wikipedia

Majid
quelle
0

Orthogonalität in einer Programmiersprache bedeutet, dass ein relativ kleiner Satz primitiver Konstrukte auf relativ kleine Weise kombiniert werden kann, um die Steuerungs- und Datenstrukturen der Sprache aufzubauen. Darüber hinaus ist jede mögliche Kombination von Grundelementen legal und sinnvoll. Betrachten Sie beispielsweise Datentypen. Angenommen, eine Sprache hat vier primitive Datentypen (Integer, Float, Double und Character) und zwei Typoperatoren (Array und Zeiger). Wenn die beiden Typoperatoren auf sich selbst und die vier primitiven Datentypen angewendet werden können, kann eine große Anzahl von Datenstrukturen definiert werden. Die Bedeutung eines orthogonalen Sprachmerkmals ist unabhängig vom Kontext seines Auftretens in einem Programm. (Das Wort orthogonal stammt aus dem mathematischen Konzept der voneinander unabhängigen orthogonalen Vektoren. ) Orthogonalität ergibt sich aus einer Symmetrie der Beziehungen zwischen Primitiven. Ein Mangel an Orthogonalität führt zu Ausnahmen von den Regeln der Sprache. In einer Programmiersprache, die Zeiger unterstützt, sollte es beispielsweise möglich sein, einen Zeiger zu definieren, der auf einen bestimmten in der Sprache definierten Typ verweist. Wenn Zeiger jedoch nicht auf Arrays zeigen dürfen, können viele potenziell nützliche benutzerdefinierte Datenstrukturen nicht definiert werden. Wir können die Verwendung der Orthogonalität als Entwurfskonzept veranschaulichen, indem wir einen Aspekt der Assemblersprachen der IBM Mainframe-Computer und der VAX-Serie von Minicomputern vergleichen. Wir betrachten eine einfache Situation: Hinzufügen von zwei 32-Bit-Ganzzahlwerten, die sich entweder im Speicher oder in Registern befinden, und Ersetzen eines der beiden Werte durch die Summe. Die IBM Mainframes verfügen zu diesem Zweck über zwei Anweisungen:

A Reg1, memory_cell
AR Reg1, Reg2

wobei Reg1 und Reg2 Register darstellen. Die Semantik davon ist

Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)

Der VAX-Additionsbefehl für 32-Bit-Ganzzahlwerte lautet

ADDL operand_1, operand_2

dessen Semantik ist

operand_2 ← contents(operand_1) + contents(operand_2)

In diesem Fall kann jeder Operand ein Register oder eine Speicherzelle sein. Das VAX-Befehlsdesign ist insofern orthogonal, als ein einzelner Befehl entweder Register oder Speicherzellen als Operanden verwenden kann. Es gibt zwei Möglichkeiten, Operanden anzugeben, die auf alle möglichen Arten kombiniert werden können. Das IBM Design ist nicht orthogonal. Nur zwei von vier Operandenkombinationsmöglichkeiten sind zulässig, und die beiden erfordern unterschiedliche Anweisungen, A und AR. Das IBM Design ist eingeschränkter und daher weniger beschreibbar. Beispielsweise können Sie nicht zwei Werte hinzufügen und die Summe an einem Speicherort speichern. Darüber hinaus ist das IBM Design aufgrund der Einschränkungen und der zusätzlichen Anweisungen schwieriger zu erlernen. Orthogonalität ist eng mit Einfachheit verbunden: Je orthogonaler das Design einer Sprache ist, desto weniger Ausnahmen erfordern die Sprachregeln. Weniger Ausnahmen bedeuten einen höheren Grad an Regelmäßigkeit im Design, wodurch die Sprache leichter zu lernen, zu lesen und zu verstehen ist. Jeder, der einen wesentlichen Teil der englischen Sprache gelernt hat, kann die Schwierigkeit bezeugen, seine vielen Regelausnahmen zu lernen (z. B. i vor e, außer nach c).

Phantasie
quelle
0

Orthogonalität bedeutet den Grad, in dem Sprache aus einer Reihe unabhängiger primitiver Konstrukte besteht, die nach Bedarf kombiniert werden können, um ein Programm auszudrücken. Features sind orthogonal, wenn keine Einschränkungen hinsichtlich der Kombination bestehen

Example : non-orthogonality

PASCAL: Funktionen können keine strukturierten Typen zurückgeben. Funktionale Sprachen sind stark orthogonal.

Mali
quelle
0

Die Grundidee der Orthogonalität ist, dass Dinge, die konzeptionell nicht miteinander verbunden sind, im System nicht miteinander verbunden werden sollten. Teile der Architektur, die wirklich nichts mit der anderen zu tun haben, wie die Datenbank und die Benutzeroberfläche, sollten nicht zusammen geändert werden müssen. Eine Änderung an einer sollte keine Änderung an der anderen bewirken.

akustisch
quelle
-5

Überprüfen Sie die Orthogonalität der Matrizen:

Orthogonalität kann auch in Bezug auf Matrizen sein,

Matrix *(transpose of matrix)= identity matrix. 

Klicken Sie auf den folgenden Link, um ein YouTube-Video zur Orthogonalität anzuzeigen.
https://youtu.be/tNekLaxnfW8

Roopesh
quelle
Die Frage betrifft offensichtlich die Programmierung.
Aggsol