Bei jeder Programmiersprache gibt es auch einen bestimmten Programmierstil, der verfolgt wird. Jeder Sprache liegen unterschiedliche Ansätze zugrunde, die den Softwareentwickler bei seiner Entwicklung unterstützen sollen. Grundlegend wird bei Programmiersprachen zwischen zwei Paradigmen unterschieden: der imperativen und der deklarativen Programmierung.
Die deklarative Programmierung wird oft auch noch in zwei weitere Formen unterschieden, der funktionalen und der logischen Programmierung. Ziel der unterschiedlichen Programmierparadigmen ist es, möglich fehlerfreie Codes zu fördern und die Software wartbar zu machen. Softwareentwickler stehen dann aber oft vor der Frage, ob sie sich beim Programmieren einer imperativen oder deklarativen Sprache bedienen.
Inhalt
Was zeichnet eine imperative Programmierung aus?
Bei der imperativen Programmierung steht die Befehlsfolge im Vordergrund und gehört zu den ältesten Programmierparadigmen. Im Code werden Schritt für Schritt Anweisungen zur Abarbeitung gegeben. In der Regel folgen sehr systemnahe Programmiersprachen diesem Ablauf. Dazu gehören historische Programmiersprachen, wie Fortran oder Pascal, die noch systemnaher als die heutigen objektorientierten Sprachen waren.
Imperative Ansätze bei aktuell noch verwendeten Programmiersprachen findet man noch bei Assembler bzw. Varianten von Assembler und C. Andere Sprachen werden für die imperative Programmierung kaum noch verwendet. Durch die Objektorientierung geraten auch die letzten verbliebenen Sprachen dieser Sparte immer mehr in den Hintergrund. Lediglich wenn es darum geht, systemnah zu entwickeln, was etwa bei der Programmierung von Geräten wichtig ist, kommen Sprachen noch zum Einsatz, bei denen die schrittweise Abarbeitung von Befehlen im Vordergrund steht.
Die imperative Programmierung zeichnet sich vorwiegend durch zwei Merkmale aus. Dazu gehört die strikte Reihenfolge, in der Befehle abgearbeitet werden. Die Anweisungen werden als Folge dargestellt. Gesteuert werden diese Anweisungen mit verschiedenen Kontrollstrukturen. Dazu gehören Sequenzen, Schleifen oder Verzweigungen. Wer sich mit Programmiersprachen auskennt, der merkt schnell, dass durch die Kontrollstrukturen auch imperative Programmiersprachen nicht immer imperative Ansätze verfolgen. Allerdings ist es bei deklarativen Sprachen deutlich schwieriger mit Systemvariablen, wie Zeigern und Registern zu arbeiten.
Eine imperative Programmierung muss allerdings nicht zwingend systemnah sein. Imperativ bedeutet lediglich, dass ein Programm so gestaltet ist, dass Anweisungen nach und nach abgearbeitet werden. Dies kann auch mit anderen Programmiersprachen gemacht werden, ist jedoch in der Praxis wenig sinnvoll, da in diesem Fall nicht das volle Potenzial dieser Sprachen ausgeschöpft wird. Dennoch kann es manchmal bei der Lösung eines Problemes hilfreich sein, zuerst einen imperativen Ansatz zu verfolgen und später eine deklarative Programmierung dort zu nutzen, wo sie möglich ist.
Wie funktioniert eine deklarative Programmierung?
Die deklarative Programmierung konzentriert sich auf das zu lösende Problem. Deklarative Sprachen beschreiben ein Problem. Durch die Beschreibung wird automatisch auch der Lösungsweg ermittelt. Bei der deklarativen Entwicklung steht immer die Frage nach dem „Was“ eines Problemes im Vordergrund und nicht, wie es zu lösen ist. Zu den bekanntesten deklarativen Sprachen gehören Prolog oder Lisp. Im weitesten Sinne können auch Datenbanksprachen, wie SQL oder Aufbauwerkzeuge, wie Ant dazu gezählt werden.
Der Vorteil bei einer deklarativen Programmierung ist, dass die Implementierung vom Algorithmus getrennt werden kann. Bevor ein Entwickler sich daran macht eine Lösung für ein Programm zu programmieren, wird beim deklarativen Ansatz erst ein Algorithmus entwickelt, der das Problem beschreibt. Erst dann geht es an die konkrete Implementierung von der Lösung. Der imperative Ansatz ist immer eine direkte Anweisung an eine Maschine. Nicht immer ist daher ein rein imperativer oder ein rein deklarativer Ansatz sinnvoll.
Wo liegen die Vor- und Nachteile der Ansätze?
Zwar gibt es mehr als einen imperativen und einen deklarativen Ansatz den Quellcode zu entwickeln, aber wenn man davon ausgeht, dass es nur diese beiden Möglichkeiten gibt, zeigen sich klar die Vor- und Nachteile der Ansätze.
Der Vorteil bei der imperativen Entwicklung ist, dass ein genauer Ablauf von Anweisungen zusammengestellt wird, der der Maschine zum Abarbeiten übergeben wird. Codes nach diesem Verfahren hat den Vorteil, dass sie oft weniger anfällig für Fehler sind und meist in jenen Fällen bevorzugt wird, wenn Systeme sich keine Fehler leisten dürfen. Der Ablauf zielt vor allem darauf ab, ein gutes Ergebnis zu erzielen. Wie groß der Aufwand bzw. die benötigte Rechenzeit ist, wenn man rein den imperativen Ansatz verfolgt, ist zweitrangig.
Beim deklarativen Ansatz ist entscheidend, was die beste Lösung für ein Problem ist. Es wird primär am Algorithmus gearbeitet, der eine möglichst elegante und effiziente Lösung darstellen soll. Das hat den Vorteil, dass der Quellcode bei der deklarativen Programmierung meist deutlich kürzer ausfällt. Dies bedeutet jedoch nicht, dass er durch die Kürze weniger anfällig für Fehler ist. Das Gegenteil ist oft der Fall, denn durch verschachtelte Anweisungen ist es meist deutlich schwieriger den Quellcode zu lesen und auch zu verstehen, welcher Befehl zu welchem Zeitpunkt ausgeführt wird.
Wann soll welcher Programmieransatz verwendet werden?
Sowohl imperative als auch deklarative Programmierung haben ihre Vor- und Nachteile und für viele Softwareentwickler stellt sich dann die Frage, welchen Ansatz sie verfolgen sollen. Grundsätzlich gilt es bei der Entwicklung von Softwares immer den deklarativen Ansatz zu verfolgen und die imperative Programmierung dann einzusetzen, wenn sie notwendig ist.
Deklarative Elemente haben den Vorteil, dass mit ihnen meist deutlich effizienter gearbeitet werden kann. Dies ist vor insbesondere dann wichtig, wenn komplexe Aufgaben gelöst werden müssen. Vor allem wenig fehleranfällige Bereiche können dann deklarativ entwickelt werden. Die deklarative Programmierung erzeugt häufig einen eleganten Quellcode, der ohne redundante Anweisungen auskommt. Wenn es allerdings darum geht, Algorithmen zu entwickeln, die nicht nur schön, sondern auch effizient sind, dann ist er imperative Ansatz meist besser. Ein kleiner Nachteil ist, dass Anweisungen nicht immer rekursiv, sondern nacheinander übergeben werden. Das sorgt für viel Quellcode und ist nicht zwingend immer ein schöner Programmierstil.
Welche Programmieransatz eignet sich um eine App zu entwickeln?
Wenn es darum geht eine App zu entwickeln, dann sollte der gleiche Ansatz verfolgt werden. Die imperative Programmierung wird immer dann verwendet, wenn sie notwendig ist. Dies kann beispielsweise der Fall sein, wenn Entwickler eine App programmieren, die sehr systemnah arbeitet und vielleicht sogar in Systemprozesse eingreift. Hier macht es durchaus Sinn sich an einen strikten prozeduralen Ablauf zu halten.
Das sorgt natürlich wiederum dafür, dass viele Codezeilen entstehen, die nicht gerade dem Smartphone mit einem gegrenzten Speicherplatz entgegen kommen. Nutzer schätzen selten sehr große Programme, da sie viel vom Internen Speicher benötigen. Daher sollte man beim Entwicklen und Programmieren einer App, wenn möglich, immer die deklarative Entwicklung bevorzugen.
Der Vorteil beim Programmieren ist, dass moderne Sprachen häufig beide Ansätze unterstützen. Mit Java für Android sind problemlos beide Ansätze realisierbar. Es stellt sich natürlich immer die Frage, ob die Abarbeitung oder die Lösung im Fokus steht. Beim Entwickeln einer App steht häufig die Lösung im Fokus. Das sorgt für einen schlanken und effizienten Code.
Bei kritischen Bereichen, wenn Entwickler eine App programmieren, macht es allerdings durchaus Sinn erst einmal einen imperativen Ansatz zu wählen. Erst wenn der imperative Ansatz fertig ist, kann man versuchen, Teile davon auch deklarativ umsetzen. Durch die Mischung beider Ansätze wird man nicht nur eine schöne Lösung finden, sondern man kann die Lösung auch noch in einer hohen Qualität umsetzen.
In der Praxis werden imperative und deklarative Ansätze schon längst nicht mehr getrennt. Moderne Programmiersprachen unterstützen die Softwareentwickler bei beiden Ansätzen. In vielen Bereichen ist es notwendig, nicht ausschließlich imperativ oder deklarativ zu arbeiten, sondern mit beiden Ansätzen einen qualitativ guten und vor allem lesbaren Code zu entwickeln, was viele Programme wartbarer macht.