# Konzeptorientierte Programmierung

Konzeptorientierte Programmierung ist ein Programmierparadigma, das zur Umwandlung von Konzepten in der Planungsphase eines Programmes in die Darstellungen der Konzepte in Maschinencode dient. Das Paradigma der konzeptorientierten Programmierung wurde 2001 von Christophe de Dinechin mit der Programmiersprache XL eingeführt.

## Pseudo-Metriken

Die konzeptorientierte Programmierung macht Gebrauch von sogenannten Pseudo-Metriken, um die Qualität von Quellcode zu bestimmen. Diese Metriken werden als Pseudo-Metriken bezeichnet, weil sie sich sowohl auf den Konzeptteil, als auch den Codeteil beziehen, mit der klaren Einsicht, dass der Konzeptbereich nicht streng genug normiert werden kann, um eine echte Metrik darauf anzuwenden. Die Pseudo-Metriken der konzeptionalen Programmierung beinhalten:
* Das Syntaktische Rauschen misst Unstimmigkeiten zwischen Konzept und Syntax. Zum Beispiel kann das Semikolon am Befehlsende in C als syntaktisches Rauschen betrachtet werden, da es kein Gegenüber im Konzeptraum besitzt und somit eigentlich unnötig wäre (es wird nur vom Compiler genutzt).
* Das Semantische Rauschen bestimmt Diskrepanzen zwischen der erwarteten Aussage oder dem Verhalten des Konzepts und dessen eigentlicher Aussage oder Verhalten im Code. Beispielsweise ist die Tatsache, dass Integer-Typen überlaufen (während echte (mathematische) Integer dies nicht tun) eine Form semantischen Rauschens.
* Die Bandbreite misst, wie viel des Konzeptraums durch gegebenen Code dargestellt wird. Zum Beispiel hat der überladene Additionsoperator in C eine höhere Bandbreite als die add-Instruktion in Assembler, da der C-Operator auch Additionen auf Fließkommazahlen ausführen kann, und nicht nur auf Integer-Werte.
* Die Rauschrate zeigt an, welcher Anteil des Codes für die Repräsentation der eigentlichen Konzepte genutzt wird.

## Regel der Äquivalenz, Äquivalenzauflösung

Die Regel der Äquivalenz ist erfüllt, wenn das Verhalten des Codes mit dem Originalkonzept übereinstimmt. Diese Äquivalenz kann sich in vielen Fällen auflösen. Integer-Overflows stören die Äquivalenz zwischen dem mathematischen Integerkonzept (-prinzip) und der computerisierten versuchten Annäherung an dieses Konzept.
Viele Arten, die Äquivalenz zu stören, besitzen bestimmte Namen, da diese sehr allgemein sind und oft vorkommen:
* Ein Domain Error (in etwa Bereichsfehler) ist eine Situation, in der Code außerhalb der domain of equivalence (Bereich der Äquivalenz) ausgeführt wird, welcher der Bereich ist, in dem Konzept und Implementierung übereinstimmen. (s. oben) Ein Integer-Overflow ist ein Beispiel eines Bereichsfehlers.
* Ein concept cast (Konzeptumwandlung) ist eine Neuschreibung eines bestimmten Konzeptes als ein anderes Konzept, wenn das Originalkonzept nicht von den normalen Werkzeugen der Sprache repräsentiert werden kann. In C ist ein Beispiel für eine Konzeptkopie das Nutzen von Pointern (Zeigern) für Output-Argumente, da C eigentlich keine Output-Argumente unterstützt.
* Eine priority inversion (Rangordnungsumkehrung) ist eine Form syntaktischen oder semantischen Rauschens, beginnend mit einigen durch die Sprache erzwungenen Regeln. Diese Art wird Rangfolgenumkehrung genannt, da die Sprache Präzedenz über das Konzept erlangt. In Smalltalk ist alles ein Objekt, und diese Regel führt zur unerwünschten Konsequenz, dass ein Ausdruck wie 2+3*5 nicht der üblichen Operatorrangfolge gehorchen (Smalltalk interpretiert dies als das Übermitteln der Nachricht * an die Zahl, die bei 2+3 herauskommt, was ein Ergebnis von 25 anstatt von 17 ergibt.)

## Methodik

Um Code zu schreiben, empfiehlt konzeptorientierte Programmierung folgende Schritte:
* Festlegen und Definieren der relevanten Konzepte im Konzeptraum.
* Festlegen der herkömmlichen Schreibweisen für Konzepte, oder Erfinden neuer, nützlicher Schreibweisen.
* Festlegen einer Kombination von Programmierkonstrukten, die es den Konzepten erlauben, gut im Code repräsentiert zu sein - Dieser Schritt schließt das Finden einer Schreibweise so ähnlich wie möglich der im vorigen Schritt festgelegten mit ein.
* Code schreiben, der das erwartete Verhalten und die Semantik der wichtigen Aspekte des Originalkonzepts möglichst gut erhält.
Vielen Programmierwerkzeugen fehlt es an Darstellungsfähigkeiten, weshalb konzeptorientiertes Programmieren manchmal das Nutzen eines Präprozessors oder metaprogrammiererischen Techniken erfordert.

## Sprachen

XL ist die bisher einzige Programmiersprache, die ausschließlich für konzeptorientiertes Programmieren entworfen wurde, jedoch kann konzeptorientiertes Programmieren in fast jeder Sprache betrieben werden, mit unterschiedlichen Erfolgen. Lisp und Forth (und Derivate) sind Beispiele vorher bestehender Sprachen, die sich gut zum konzeptorientierten Programmieren eignen.

## Ähnliche Projekte

Es gibt Projekte, die ähnliche Ideen nutzen, um Code auf einer höheren Abstraktionsebene zu erzeugen. Unter anderem sind das:
* Intentionale Programmierung
* Sprachorientierte Programmierung
* Literate programming
* modellgetriebene Architektur