Was ist Hardware nahe Programmierung wie bei C. Wie kann man sich das vorstellen. Wo ist der unterschied zu Objektorientierter Programmierung?

7 Antworten

Die Begriffe "hardwarenah" und "objektorientiert" sind zunächst einmal kein direkter Gegensatz.

Man kann sowohl mit C als auch mit anderen prozeduralen Sprachen z.B. Windows-Applikationen schreiben, was alles andere als "hardwarenah" ist.

In Windows 3.x wurden fast alle Applikationen in C geschrieben - und Windows-Applikationen sind prinzipiell nicht hardwarenah.

Umgekehrt ist Eingeschränkt auch hardwarenahe Programmierung in einer objektorientierten Sprache möglich.

Aber hier ein Überblick über die Begriffe:

Hardwarenah

Beim Programm handelt es sich z.B. um ein Betriebssystemkern oder einen Treiber oder ein Programm auf einem Rechner, auf dem gar kein Betriebssystem läuft (z.B. auf einem Arduino-Microcontroller).

Die Kommunikation "nach außen" (z.B. Einlesen von Tastaturdaten oder Bildschirmausgabe) geschieht nicht über das Betriebssystem, sondern über die direkte Ansteuerung von Hardwarekomponenten.

Objektorientiert

Die Programmiersprache verwendet so-genannte Objekte. Diese beinhalten Daten und ihnen sind Funktionen zugeordnet.

So könnte es in einem Programm ein Objekt "Kreis" geben, in dem ein Durchmesser gespeichert ist und eine Funktion "Fläche berechnen" zugeordnet ist. Außerdem könnte es im Programm noch ein "Quadrat" geben.

Wenn ich nun von einem Objekt die Fläche berechnen will, muss ich nicht wissen, ob es sich um einen Kreis oder ein Quadrat handelt, sondern ich muss nur die jeweils zugeordnete Funktion "Fläche berechnen" aufrufen.

Prozedural

Mehr oder weniger das Gegenteil von "objektorientiert": Daten und Funktionen sind streng voneinander getrennt. Im Beispiel mit dem Kreis und dem Quadrat muss man zunächst überprüfen, ob das Objekt ein Kreis oder ein Qaudrat ist, um danach die korrekte Funktion "Kreisfläche" oder "Quadratfläche berechnen" aufrufen zu können.

Imperativ

Der Programmierer verwendet Befehle, die nacheinander ausgeführt werden. Etwa 90% aller Programme sind imperativ geschrieben.

Fast alle "bekannten" Programmiersprachen (Java, C, C#, C++, Pascal, JavaScript ...) sind imperativ.

Deklarativ

Das Gegenteil von "imperativ": Programme werden dadurch geschrieben, dass der Programmierer Eigenschaften vorgibt, welche das fertige Programm haben soll. Die Reihenfolge, in der die Befehle ausgeführt werden sollen, bestimmt der Computer selbst.

Meistens sind es nur "Hilfssprachen" für andere Programme, die diese Eigenschaft haben. Beispiele für deklarative Sprachen sind SQL, Makefile, PostScript und XSLT.

Wir haben einerseits harwarenah im Gegensatz zu hardwareabstrahiert und andererseits objektorientiert im Gegensatz zu nicht objektorientiert.

Bei hardwarenaher Programmierung musst du wissen, wie man die Hardwaresteuerung mehr oder weniger direkt ansteuert, also z. B. wie man die Systemuhr dazu bringt, die aktuelle Zeit in eine Speicherzelle zu schreiben, und welche Speicherzelle das ist. Bei hardwareabstrahierter Programmierung kümmert sich die Schnittstelle zum System (API) darum, wo die Zeit herkommt, das sieht für dich als Programmierer bei allen Systemen mehr oder weniger gleich aus.

Objektorientiert bedeutet im wesentlichen, dass logisch zusammengehörige Daten auch programmtechnisch so zusammengefasst werden, dass sie gleichzeitig an Funktionen übergeben werden können (im Objekt gebündelt) und dass sie nicht beliebig und wild durcheinander geändert werden können (im Objekt gekapselt).

Eine hardwarenahe objektorientierte Programmierumgebung ist ohne weiteres vorstellbar und hätte auch den Vorteil, dass die Ansteuerung der Hardware in Objekte gekapselt werden kann, sodass verhindert wird, dass durch wildes Herumschrauben an den Einstellungen ein ungültiger oder sogar schädlicher Zustand der Hardware erreicht wird. Die Objektklassen müssen natürlich der jeweiligen Hardware individuell angepasst sein.

Meine Erfahrungen mit hardwarenaher Programmierung liegen aber lang zurück und beschränken sich auf Systeme, die noch keine Objektorientierung kannten, sodass ich nicht sagen kann, inwieweit solche Systeme realisiert sind. Möglicherweise sind sie eher selten, weil Objektorientierung auch im fertigen Produkt etwas Overhead erzeugt.

Woher ich das weiß:Beruf – Software-Entwickler

> etwas Overhead

Das ist etwas untertrieben ;-)

2
@TomRichter

Ich hab auch vergessen zu erwähnen, dass es bei zeitkritischen Vorgängen (Brennen von CDs, Papiervorschub bei Druckern u. ä.) ein klein wenig unangenehm sein könnte, wenn dem Garbage Collector mittendrin auffällt, dass kaum noch Speicherplatz frei ist.

2
@PWolff

Mann, hör' bloß auf! (=vollste Zustimmung)

So nett die GC ja bei einer einfachen Applikation ist, aber bei Gerätesteuerung kommst du echt ins K*tzen...

1

Wobei der Overhead meistens nicht so riesig ist und die Vorteile von OO überwiegen. Gruß :)

0
@Reyha24

Es hat schon seinen Grund, warum Microcontroller mit Speichergrößen im Kilobytebereich (also nicht die Riesencontroller, die es auch gibt) sowie Betriebssystemkerne in der Regel in C und nicht in C++ geschrieben werden.

Einen Linux-Kerneltreiber könnte man technisch gesehen auch objektorientiert in C++ schreiben - gemacht hat das bisher meines Wissens aber noch niemand.

Wenn die Vorteile überwiegen würden, sähe die Sache anders aus.

1

Programmiersprachen sind an irgend etwas orientiert.

In Hardwareorientierter Programmierung werden die Programme praktisch in Maschinensprache geschrieben (z,B. Assembler)- Man erhält damit schnell laufende Programme, aber der Nachteil ist, dass sie nur auf einem bestimmten Prozessor- und Gerätetyp laufen.

Deshalb hat man bald Programmiersprachen entwickelt, die allgemeiner formuliert werden können, aber für viele Prozessor- und Gerätetypen geeignet sind. Die besten Beispiele dafür sin COBOL (kommerziell orientiert) und FORTRAN (wissenschaftlich orientiert).

Hardwarenahe Programmierung ist nun so ein Mittelding. Das Grundprogramm wird allgemein formuliert, die Hardware aber direkt angesteuert.

Objektorientiert bedeutet, dass es logisch zusammengehörige Dateien in einem Objekt zusammengefasst werden, das dann gemeinsam übergeben werden kann. Visual-Basic ist so eine Sprache.

Gute c++ Compiler können beide Techniken: OOP und Hardware-nah!  

Man kann auch beides mischen: da, wo Vererbung gleichartiger Objekte gewünscht wird, setzt man OOP ein.

In den Teilen, die besonders schnell sein sollen, kommt man ohne spezielle Maschinenbefehle nicht aus! Das kann auch innerhalb einer Klasse sein.

Selten ist ein Programm nur allein OOP oder nur allein hardwarenah (bis hin zu ASM)! Gute Compiler kennen auch viele neue SSE2 oder SSE4 Befehle, die nur gute CPUs können (also kein ASM nötig). Wenn man es gründlich macht, müsste man zunächst die vorhandenen logischen CPU-Kerne analysieren und online entscheiden, welche Befehle man im weiteren Verlauf nutzt und wie viele Kerne man anspricht.

Auf http://www.gerdlamprecht.de/BisZuWelcherNKalleStringKombi.htm  

Tabelle unten habe ich mal zig Programme verglichen, was aus guter hardware-naher Programmierung herauszuholen ist: c++ mit 128 Bit FFT Multiplikation auf allen 8 Kernen ist über 41000 mal schneller als einfache c# Programme!!! Allein eine Verdopplung des Speichers brachte auch noch mal eine Verdopplung der Geschwindigkeit. Selbst scheinbar gleiche CPUs (8 logische Kerne, 3,5 GHz und gleiche RAM Größe) können bis zu Faktor 3 unterschiedlich sein, da die Anzahl der Takte pro Maschinenbefehl entscheidend ist! Das geht bis hin zu 512 Bit AVX... oder GPU (Nutzung des Prozessors der Grafikkarte).

(Optimierung noch nicht abgeschlossen) 

Hinweis: Programme werden langsamer, wenn man viele bunte Dialoge, Sicherheitsabfragen und Titelleisten drumherum bastelt, da oft nicht mehr alles in den CPU-Cache passt (der zig mal schneller als der RAM ist).

Glaube keinem Benchmark-Test, den Du nicht selbst für Deine Hardware analysiert hast! Jeder Hersteller (AMD, Intel, Grafikkarten...) optimiert seinen Test so, dass seine Hardware am besten dasteht! Hyperthreading ist ab Win7 so gut, dass nicht die Anzahl der Hardware-Kerne, sondern die Anzahl der logischen Kerne entscheidet (also wie viele Threads parallel laufen können)! Positiv wirkt sich auch der Turbo-boost-Mode aus: kurzzeitig können einige CPUs um etwa 0,5 GHz hochschalten.  

Wer nur 0815 Software (1 Kern, 32 Bit) nutzt, kann damit jede noch so schnelle CPU ausbremsen! Beim Kauf geht es oft nur im 1...2% Unterschied bei der Taktfrequenz ...  

Bei der Software hingegen können Faktoren über 41000 herausgeholt werden (über 4090000%)! 

0

Man unterscheidet nicht zwischen OOP und Hardwarenah sondern wie "hoch" eine Sprache ist.

C ist relativ niedrig und erlaubt einfachere Zugriffe z.B. auf die Adressräume im Ram wie eine höhere Sprache (z.B. .NET).

Was möchtest Du wissen?