Wie kann man ein C Code so schreiben, dass es Plattform Unabhängig läuft?

4 Antworten

Echte Plattformunabhängigkeit erreichst du auch bei Hochsprachen (C ist eine ziemlich "niedrige" Sprache) nur, indem du auf alles plattformspezifische verzichtest. Insbesondere Ein- und Ausgabe.

Natürlich kannst du ein Programmmodul schreiben, das beim Erkennen eines Ereignisses ("Drücken eines Knopfes") ein Flag setzt ("den Toaster einschaltet") und nach Eintreten eines weiteren Ereignisses (5000 ms abgelaufen) wieder zurücksetzt ("ausschaltet").

Aber das ist ohne plattformabhängige Bibliotheken kein lauffähiges Programm - irgendwo müssen die Ereignisse ja erzeugt werden. Und irgendwie muss die Schnittstelle wissen, dass das Flag die Heizung einschalten soll und nicht die "Fehler"-Leuchte. (Sobald ein Gerät mehr als einen einzigen Knopf und mehr als einen einzigen Effektor hat.)

-----

JavaScript ist etwas völlig anderes als C. Es verwendet nur eine sehr ähnliche Syntax, sodass es auf den ersten Blick gleich aussieht (sofern man nicht jeden Tag mit wenigstens einer dieser Sprachen zu tun hat), ist aber eine Hochsprache.

Der JavaScript-Interpreter bzw. Just-in-Time-Compiler kann in C (oder C++) geschrieben sein, und seine Objekte haben dann irgendwie Entsprechungen in der Sprache des Interpreters, aber das hat ungefähr so viel miteinander zu tun wie die Zusammensetzung der Tinte / des Toners mit dem Inhalt eines geschriebenen Textes.

-----

Der allererste C-Compiler wurde mit an Sicherheit grenzender Wahrscheinlichkeit in Assembler geschrieben - COBOL eignet sich nicht so besonders für diese Art von Aufgabe.

Wenn man einmal einen einfachen Compiler in einer Sprache hat, kann man mit den Möglichkeiten der Sprache, die dieser Compiler umsetzt, einen Compiler schreiben, der mehr Möglichkeiten der Sprache umsetzt. Und so weiter.

Und welche Sprache würde ein Compiler-Programmierer besser beherrschen müssen als die zu kompilierende Sprache? Deshalb bietet es sich geradezu zwingend an, einen Compiler in seiner eigenen Sprache zu schreiben. (Wenigstens einen Compiler, der Code für einen anderen Compiler erzeugt.)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Du kannst deinen bytecode so verfassen das er die bibliotheken die auf "jedem" betriebssystem deiner zielgruppe vorhanden ist und wenns sich nicht vermeiden lässt kannst du auch die jeweilige betriebssystem api einbinden. Musst du aber logischerweise dann für jedes os machen das in deiner zielgruppe steckt. Der compiler entscheidet dann via definition welcher codeblock ausgeführt werden soll somit musst du nicht x beliebige kopien führen. Auf jedem zielbetriebssystem musst du allerdings kurz mal deinen sourcecode zu Maschinencode kompilieren. C->assembler->maschinencode

Wir reden hier über symbolische Toaster und Mikrowellen, richtig? Falls nein, käme es auf die Firmware des jeweiligen Geräts an.

Generell ist C nicht plattformunabhängig. Du wirst deine Programme für jede neue Plattform mit einem für diese Plattform entwickelten Compiler neu kompilieren müssen. Zunächst ist das kein großes Problem. Stressig wird es erst, wenn du Bibliotheken verwendest, die nicht zum Plattform-Standard gehören.  Das beste Beispiel wäre hier Microsoft's Windows-API. Die ist selbstverständlich unter UNIX- und UNIX-Like-Systemen wie Linux und Mac OS X nicht verfügbar. Durch sogenannte Precompiler Directions kannst du aber direkt in deinem Code Alternativen bereitstellen. Das funktioniert im Groben so:  Du weist den Compiler an, im Falle eines Linux-Compilers API A zu verwenden, andernfalls die API B.

Nun zu Javascript. Javascript ist eine interpretierte Sprache. Sie wird nicht kompiliert, sondern von einem anderen Programm zur Laufzeit Zeile für Zeile gelesen und dann in den jeweiligen Code für die benötigte Plattform umgewandelt. Hier nimmt dir der Browser die Arbeit ab, ähnlich wie es die Java JRE für Java-Programme tut.

C ist natürlich nicht plattformunabhängig, aber man kann z.B. Header-Direktiven einbinden, dass bestimmter Code nur auf bestimmten Plattformen ausgeführt wird - ganz grob. Es gibt natürlich weitere Möglichkeiten plattformunabhängig mit C zu programmieren aber das kann je nach Anforderung schnell sehr komplex werden und erfordert einiges an Zeit und Erfahrung auch über die Plattformen.

Der Internetbrowser hat einen Interpreter, der in der lage ist, Javascript clientseitig auszuführen. In welcher Sprache der Interpreter, der dann den Code ausführt, geschrieben ist, spielt eigentlich keine Rolle. Linux wurde auch in C geschrieben und man kann Python oder Java darauf ausführen (schlechter Vergleich aber im Prinzip ähnlich).

C ist eine höhere Programmiersprache. Sie wird beim Kompilieren bzw. Ausführen in für den Prozessor interpretierbare Befehle (Maschinencode bzw. Assembler) umgewandelt. Natürlich ist der Kern der Sprache in Assembler geschrieben, andere Teile sind wiederum in C geschrieben.

netcx  17.09.2016, 21:49

Wollte noch hinzufügen, für alles was man in C schreibt, gibt es eine Entsprechung in Assembler. Könnte man also sozusagen als Übersetzer bezeichnen. In C ist es eben nur bedeutend einfacher, bestimmte Programmierkonstrukte zu entwickeln (Schleifen zb) und auch die Speicherverwaltung ist in Assembler bedeutend komplizierter. Und für Menschen viel leichter verständlich

0
Eisenkoenig 
Fragesteller
 17.09.2016, 21:51

Danke erstmal, wenn ich Informatik studiere, würde ich den ganzen Kram dabei lernen ?
Oder lohnt sich ein Studium eher im Bereich Elektro

0
netcx  17.09.2016, 21:58
@Eisenkoenig

Kommt drauf an, aber direkt Assembler lernt man meistens fast gar nicht oder nur Grundkenntnisse, weil die Bereiche, wo man es benötigt sehr begrenzt sind (Treiberprogrammierung, Reverse-Engineering oder sowas). Man lernst aber was ein Compiler und was ein Interpreter ist und wie mit C dann Dateien mit dem Linker ein Programm ergeben, was Module sind usw. Das ist eigentlich eine Grundlage dafür, wie ein Programm ausgeführt wird (in C). Dieses Grundkonzept wird wahrscheinlich so ziemlich jeder Programmierer mal gemacht haben, das muss man aber nicht unbedingt wissen, wenn man was programmiert. Es ist nur für einige Bereiche wichtig. Denke, dass man im Elektrobereich auch gewisse Programmierkenntnisse erwerben wird, die sind aber wahrscheinlich ähnlich groß wie die Elektrokenntnisse die ein Programmierer hat, also höchstens Grundlagen zum Verständnis und ein paar Beispiele. In ein paar wenigen Bereichen gibt es durchaus Gemeinsamkeiten.

Übrigens könnte es sein, dass du hier findest was du suchst:

http://openbook.rheinwerk-verlag.de/it\_handbuch/

da ist aber von allem irgendwas drin

0