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.)

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.

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

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

0
@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

Jar-Archiv kein Hauptmanifestattribut

Hallo Ich wollte eben ein kleines, selbstgeschriebenes Java-Programm in ein jar-Archiv packen. Ich habe keine Manifestdatei selbst geschrieben, da mein Programm eh nur die Hauptklasse (nach dieser ist das jar-Archiv benannt) und ein ActionListener.

Die Klassen sind kompiliert und ich habe in der Eingabeaufforderung folgenden Befehl genutzt: jar -cfv MeinProgramm.jar MeinProgramm.class MeinProgramm$1MeinActionListener

Es wird ausgegeben, dass ein Manifest und die beiden Klassen hinzugefügt wurden.

Wenn ich dieses Programm jedoch mit Java -jar MeinProgramm.jar ausführen will, kommt folgende Fehlermeldung: kein Hauptmanifestattribut, in MeinProgramm.jar

Was habe ich falsch gemacht?

...zur Frage

wie genau JavaScript laufen lassen?

Hallo Leute,

ich lerne gerade JS und würde gerne mehr mit den Codes experementieren, aber leider weiß ich nicht, wie ich genau den Code testen kann. z.b. console.log("string") anzeigen lassen?

Ich hätte gern die Option den Code in einem Fenster schreiben, im anderen testen lassen.

Danke im Voraus

...zur Frage

Wer hatte den Assembler Compiler programmiert?

Der Assembler Compiler ist soweit ich weiß in Maschinencode geschrieben.

Wer war dieser Genie?

Mfg

...zur Frage

Hab über CMD mit JAVAC eine .class Datei erzeugt. Wie tue ich das jetzt in Maschinencode übersetzen [MIT BILD!!!]?

Gude,

Also hab über den Befehl javac HalloWelt.java

eine .class Datei erzeugt. Also Binärcode.

Was muss ich nun in cmd angeben, um dieses Binärcode in Maschinencode umzuwandeln?

(Ich weiß mit Eclipse geht das schneller , bin jedoch dabei die Grundlagen zu erlernen.)

BILD FOLGT!!!

MFG

...zur Frage

Was möchtest Du wissen?