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

Wieso lässt sich in Lua ein Objekt einer Klasse nicht anlegen?

Hallo,
ich habe kaum Erfahrung mit der Programmiersprache Lua und komme aus dem .Net bzw. Java Umfeld, jedoch sollten solche die Grundlagen einigermaßen einem Informatiker auch so klar sein.

Zum Kern der Frage:

Ich möchte mir in Lua folgendes Objekt erzeugen

romania = Graph:new( {'Or', 'Ne', 'Ze', 'Ia', 'Ar', 'Si', 'Fa',
              'Va', 'Ri', 'Ti', 'Lu', 'Pi', 'Ur', 'Hi',
              'Me', 'Bu', 'Dr', 'Ef', 'Cr', 'Gi'},
             {
            {'Or', 'Ze', 71}, {'Or', 'Si', 151},
            {'Ne', 'Ia', 87}, {'Ze', 'Ar', 75},
            {'Ia', 'Va', 92}, {'Ar', 'Si', 140},
            {'Ar', 'Ti', 118}, {'Si', 'Fa', 99},
            {'Si', 'Ri', 80}, {'Fa', 'Bu', 211},
            {'Va', 'Ur', 142}, {'Ri', 'Pi', 97},
            {'Ri', 'Cr', 146}, {'Ti', 'Lu', 111},
            {'Lu', 'Me', 70}, {'Me', 'Dr', 75},
            {'Dr', 'Cr', 120}, {'Cr', 'Pi', 138},
            {'Pi', 'Bu', 101}, {'Bu', 'Gi', 90},
            {'Bu', 'Ur', 85}, {'Ur', 'Hi', 98},
            {'Hi', 'Ef', 86}
             },
             false ) 

Und dies sei der dazugehörige Konstruktor:

function Graph:new(Vertices, Edges, Directed)
   local matrix = {}
 
   for i, e in pairs(Edges) do
      matrix[self:SetHash(e[1], e[2])] = e[3]
      if not Directed then matrix[self:SetHash(e[2], e[1])] = e[3] end
   end
   
   local vertex_lookup = {}
   for i, v in pairs(Vertices) do
      vertex_lookup[v] = i
   end

   local num_v = #Vertices
   
   return setmetatable({ vertices = Vertices, vertex_lookup = vertex_lookup,
             adj = matrix, num_v = num_v  },
               Graph_mt)
end

Nun ist es so, dass mit dem "new" mein "romania" Objekt trotzdem leer bleibt/ weiterhin auf null bzw. nil verweißt. Ich verstehe nicht, wieso keine Objekte erzeugt werden, vielleicht überssehe ich auch einfach etwas?

...zur Frage

Such einen C++ Compiler für Windows UND Linux

Hi,

Ich bin Hobbyprogrammierer und will demnächst ein größeres c++ programm programmieren. Ich mach das jedoch mit einem kumpel der linux hat. Wir wollen, der einfachheit halber, eine Editor, compiler und linker der unter linux UND windows läuft.

danke

Nicolory

...zur Frage

Der Befehl javac ist entweder falsch geschrieben worden oder existiert nicht.

Hallo ich bin grad am Programmieren tue mich aber leider schwer jdk 7 ist drauf und wenn ich cmd ausführe zeigt er mir bei javac den oben genannten fehler an hab schon bisschen im internet rumgeschaut und da steht dass ich die umgebungsvariable ändern soll aber trotzdem klappts leider nicht. Please Help!! Vielen Dank im Vorraus

...zur Frage

Javascript Binärcode zu Array?

Ich habe einen Binärcode z.B. 10011 als string oder int. Wie kann ich diesen code in ein Array umwandeln?

...zur Frage

Bild per Javascript dauerhaft ändern?

Hi Leute, ich hoffe hier kann mir jemand helfen. Ich schreibe gerade aus Spaß an einer kleinen Website. Hier habe ich die zahlen 1-9 als pngs in eine Tabelle eingebunden. Jetzt möchte ich, dass sich das png bei einem Klick darauf zu einem anderen png ändert (durchgestrichene zahl) und man dabei auf eine andere Unterseite kommt. Die Änderung soll auch beim Neuladen der Website bestehen bleiben, also die Zahl soll durchgestrichen bleiben.

So sieht das momentan aus:

Hier der Html-Code von meiner Tabelle:

        <table>
          <tr>
            <td><img src="images/1.png" alt="1" class="nummern"></td>
            <td><img src="images/2.png" alt="2" class="nummern"></td>
            <td><img src="images/3.png" alt="3" class="nummern"></td>
          </tr>
          <tr>
            <td><img src="images/4.png" alt="4" class="nummern"></td>
            <td><img src="images/5.png" alt="5" class="nummern"></td>
            <td><img src="images/6.png" alt="6" class="nummern"></td>
          </tr>
          <tr>
            <td><img src="images/7.png" alt="7" class="nummern"></td>
            <td><img src="images/8.png" alt="8" class="nummern"></td>
            <td><img src="images/9.png" alt="9" class="nummern"></td>
          </tr>
        </table>

Hat jemand eine einfache Lösung für mich? Oder einen Tipp wie ich das am besten schreiben kann?

Wäre über Hilfe sehr dankbar!

Lg

...zur Frage

Was möchtest Du wissen?