views:

830

answers:

11

What does "orthogonality" mean when talking about programming languages?

What are some examples of Orthogonality?

+1  A: 

First time hearing the word, but Wikipedia seems to have something on it:

http://en.wikipedia.org/wiki/Orthogonality#Computer%5Fscience

nsr81
Wow all of us three were literally on same page :)
TheVillageIdiot
I found it, too but not enough answer. I'm looking for something related to programming languages.
Ahmet Alp Balkan
A: 

from wikipedia:

Computer science

Orthogonality is a system design property facilitating feasibility and compactness of complex designs. Orthogonality guarantees that modifying the technical effect produced by a component of a system neither creates nor propagates side effects to other components of the system. The emergent behavior of a system consisting of components should be controlled strictly by formal definitions of its logic and not by side effects resulting from poor integration, i.e. non-orthogonal design of modules and interfaces. Orthogonality reduces testing and development time because it is easier to verify designs that neither cause side effects nor depend on them.

For example, a car has orthogonal components and controls (e.g. accelerating the vehicle does not influence anything else but the components involved exclusively with the acceleration function). On the other hand, a non-orthogonal design might have its steering influence its braking (e.g. electronic stability control), or its speed tweak its suspension.[1] Consequently, this usage is seen to be derived from the use of orthogonal in mathematics: One may project a vector onto a subspace by projecting it onto each member of a set of basis vectors separately and adding the projections if and only if the basis vectors are mutually orthogonal.

An instruction set is said to be orthogonal if any instruction can use any register in any addressing mode. This terminology results from considering an instruction as a vector whose components are the instruction fields. One field identifies the registers to be operated upon, and another specifies the addressing mode. An orthogonal instruction set uniquely encodes all combinations of registers and addressing modes.

TheVillageIdiot
Oh thanks I just visited this stub http://en.wikipedia.org/wiki/Orthogonality_%28programming%29 Sorry.
Ahmet Alp Balkan
A: 

Wikipedia

James
Oh thanks I just visited this stub http://en.wikipedia.org/wiki/Orthogonality_%28programming%29 Thanks for informing me the main article.
Ahmet Alp Balkan
+9  A: 

From Eric S. Raymond's "Art of UNIX programming"

Orthogonality is one of the most important properties that can help make even complex designs compact. In a purely orthogonal design, operations do not have side effects; each action (whether it's an API call, a macro invocation, or a language operation) changes just one thing without affecting others. There is one and only one way to change each property of whatever system you are controlling.

klez
+47  A: 

Orthogonality is the property that means "Changing A does not change B". An example of an orthogonal system would be a radio, where changing the station does not change the volume and vice-versa. A non-orthogonal system would be like a helicopter where changing the speed can change the direction.

In programming languages this means that when you execute an instruction, nothing but that instruction happens (very important for debugging).

There is also a specific meaning when referring to instruction sets.

C. Ross
+1 for concise, clear, easy to comprehend answer.
Matthew Jones
Thank you Matthew.
Ahmet Alp Balkan
This answer reminds me of "superposition" theory from signal and systems.
Comptrol
+8  A: 

Think of it has being able to change one thing without having an unseen affect on another part.

Martin Beckett
+2  A: 

From Wikipedia:

Orthogonality is a system design property facilitating feasibility and compactness of complex designs. Orthogonality guarantees that modifying the technical effect produced by a component of a system neither creates nor propagates side effects to other components of the system. The emergent behavior of a system consisting of components should be controlled strictly by formal definitions of its logic and not by side effects resulting from poor integration, i.e. non-orthogonal design of modules and interfaces. Orthogonality reduces testing and development time because it is easier to verify designs that neither cause side effects nor depend on them.

For example, a car has orthogonal components and controls (e.g. accelerating the vehicle does not influence anything else but the components involved exclusively with the acceleration function). On the other hand, a non-orthogonal design might have its steering influence its braking (e.g. electronic stability control), or its speed tweak its suspension.[1] Consequently, this usage is seen to be derived from the use of orthogonal in mathematics: One may project a vector onto a subspace by projecting it onto each member of a set of basis vectors separately and adding the projections if and only if the basis vectors are mutually orthogonal.

An instruction set is said to be orthogonal if any instruction can use any register in any addressing mode. This terminology results from considering an instruction as a vector whose components are the instruction fields. One field identifies the registers to be operated upon, and another specifies the addressing mode. An orthogonal instruction set uniquely encodes all combinations of registers and addressing modes.

To put it in the simplest terms possible, two things are orthogonal if changing one has no effect upon the other.

Laurence Gonsalves
+4  A: 

If you have a set of constructs. A langauge is said to be orthogonal if it allows the programmer to mix these constructs freely. For example, in C you can't return an array(static array), C is said to be unorthognal in this case:

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
Actually I saw this in my book and still don't understand what is that.
Ahmet Alp Balkan
Sebesta book has good explanation of the subject btw.
AraK
LOL I'm using this book and saw this question on online quiz of the book. What a coincidence. Maybe I should read first chapter, too.
Ahmet Alp Balkan
It's simply saying that return and arrays are more complex when put together: you can't use return around arrays without thinking about the interaction between them. Ideally, you would know what return means, and what an array is, and so you would know what returning an array would do, but actually, it's more complex than that, because C exposes implementation details about arrays (and return).
Lee B
This sense of "orthogonal" is covered by: http://en.wikipedia.org/wiki/Orthogonality_(programming) , but it's a new page with little content.
outis
+4  A: 

Broadly, orthogonality is a relationship between two things such that they have minimal effect on each other.

The term comes from mathematics, where two vectors are orthogonal if they intersect at right angles.

Think about a typical 2 dimensional cartesian space (you typical grid with X/Y axes). Plot two lines: x=1 and y=1. The two lines are orthogonal. You can change x=1 by changing x, and this will have no effect on the other line, and vice versa.

In software, the term can be appropriately used in situations where you're talking about two parts of a system which behave independently of each other.

timdev
A: 

While talking about project decisions on programming languages, orthogonality may be seen as how easy is for you to predict other things about that language for what you've seen in the past.

For instance, in one language you can have:

str.split

for splitting a string and

len(str)

for getting the lenght.

On a language more orthogonal, you would always use str.x or x(str).

When you would clone an object or do anything else, you would know whether to use

clone(obj)

or

obj.clone

That's one of the main points on programming languages being orthogonal. That avoids you to consult the manual or ask someone.

The wikipedia article talks more about orthogonality on complex designs or low level languages. As someone suggested above on a comment, the Sebesta book talks cleanly about orthogonality.

If I would use only one sentence, I would say that a programming language is orthogonal when its unknown parts act as expected based on what you've seen. Or... no surprises.

;)

Great answer. Got it, thanks!
Ahmet Alp Balkan
This answer isn't consistent to others; this just claims consistency between function calls or overall structure in contrast to others that are on the lines of "less-coupling" or "side-effectlessness".
Comptrol
+2  A: 

Most of the answers are very long-winded, and even obscure. The point is: if a tool is orthogonal, it can be added, replaced, or removed, in favor of better tools, without screwing everything else up.

It's the difference between a carpenter having a hammer and a saw, which can be used for hammering or sawing, or having some new-fangled hammer/saw combo, which is designed to saw wood, then hammer it together. Either will work for sawing and then hammering together, but if you get some task that requires sawing, but not hammering, then only the orthogonal tools will work. Likewise, if you need to screw instead of hammering, you won't need to throw away your saw, if it's orthogonal (not mixed up with) your hammer.

The classic example is unix command line tools: you have one tool for getting the contents of a disk (dd), another for filtering lines from the file (grep), another for writing those lines to a file (cat), etc. These can all be mixed and matched at will.

Lee B