Komponentenorientierte Softwareentwicklung stellt einen der vielversprechendsten Ansätze zur Beherrschung der immer stärker wachsenden Komplexität von Computerprogrammen dar. Der Einsatz wieder verwendbarer, ausgetesteter und damit ausgereifter Softwarekomponenten kann die Entwicklung eines komplexen Computerprogramms erheblich beschleunigen und die Qualität des Endproduktes durch die gesicherte Qualität der Einzelkomponenten deutlich steigen.
Der Einsatz bestehender Komponententechniken aus dem PC- bzw. Server-Software-Bereich wie COM oder Corba verbietet sich jedoch aufgrund der von diesen Techniken in hohem Maß zusätzlich verbrauchten Computerressourcen wie Speicherplatz und Rechenzeit für Embedded Systems mit sehr begrenzten Ressourcen etwa auf Basis von 8- oder 16-Bit-Mikrocontroller. Zusätzlich benötigte Ressourcen erzwingen in der Folge schnell einen leistungsfähigeren Mikrocontroller. Für Geräte, die in sehr großer Stückzahl produziert werden, ist das nicht akzeptabel.
Zudem muss eine wieder verwendbare Softwarekomponente, um ohne Änderungen möglichst flexibel anwendbar zu sein, immer den größtmöglichen Funktionsumfang für alle denkbaren Anwendungen abdecken. Werden solche Softwarekomponenten in bestehenden Komponentensystemen für eine bestimmte Anwendung benutzt, wird ein erheblicher Teil des Funktionsumfangs in diesem speziellen Fall oft gar nicht gebraucht, sondern verschwendet nur unnötige Ressourcen wie Speicherplatz und Rechenzeit, was auf Computersystemen mit sehr begrenzten Ressourcen aus oben genannten Gründen ebenfalls nicht akzeptabel ist.
Um solche nicht benötigten Funktionsumfänge nachträglich aus einer Komponente entfernen zu können, müssen Softwarekomponenten für den Embedded-Bereich nicht wie im PC- und Server-Software-Bereich auf der Ebene des Binärcodes sondern auf der Ebene des Quellcodes definiert werden. Hier sind noch alle Möglichkeiten zur Optimierung gegeben.
Einige dieser Herausforderungen lassen sich zwar prinzipiell durch extensive Benutzung des C-Präprozessors lösen, man erhält dann aber in eine kaum noch wartbare Ansammlung tief verschachtelter, über die Präprozessorkonstrukte #if bzw. #ifdef nur noch bedingt übersetzter Codeteile, die darüber hinaus ihrerseits wiederum mit tief verschachtelten Makrodefinitionen über das Präprozessorkonstrukt #define gespickt sind.
Da ein solcher Code schnell nicht mehr wartbar ist, beschränkt man sich im realen Design von C - Modulen oder C++ - Klassen dann typischerweise auf einige wenige Spezialfälle, die man in diesem Moment für wichtig hält. Das schränkt dann natürlich die Möglichkeiten zur flexiblen Wiederverwendung in der Folge erheblich ein.
Wir bei SoftComponents haben basierend auf eigenen jahrlangen Bemühungen, in C selbst etwa durch möglichst geschickte Benutzung des Präprozessors komponentenorientiert und dennoch wartbar zu programmieren, eine Lösung für diese Herausforderungen entwickelt - Generi-C.