Wie klappt das ?

I

infinitecodes

Gast
Hallo zusammen!

Ich versuche gerade C++ zu lernen (bin ein blutiger Anfänger, überhaupt keine Ahnung) und etwas was mich beim Programmieren fasziniert bzw. eingefallen ist : Wie harmonieren bzw. funktionieren Android-Apps bzw. das Android Betriebssystem obwohl es verschiedene Komponente hat die mit C , C++, Java etc. geschrieben wurden ?


Weiteres Beispiel z.B die Multimedia-App "Kodi"

Laut Google wurde die mit "Python, C, C++, Assemblersprache, Objective-C" geschrieben. Wie funktioniert das alles miteinander, obwohl das verschiedene Programmiersprachen sind?

Vielen Dank für eure Antworten!
 
Die Frage ist wohl etwas zu allgemein formuliert. Letztendlich ist am Ende alles Maschinencode, der Bytes in den RAM schreibt oder aus ihm liest. Ob das dann nun von Java geschrieben und von C++ gelesen wird, oder umgekehrt, ist wurscht.
 
Bagbag schrieb:
Die Frage ist wohl etwas zu allgemein formuliert. Letztendlich ist am ende alles Maschinencode, der Bytes in den RAM schreibt oder aus ihm liest. Ob das dann nun von Java geschrieben und von C++ gelesen wird, oder umgekehrt, ist wurscht.
Also wird z.B ein Programm in einer Entwicklungsumgebung geschrieben mit der man diese Sprachen verknüpft ?
Wie funktioniert überhaupt dieses "Verknüpfen" ?

Ich bin seeeeeehr neugierig :D
 
Häh? Bitte nochmal mit einer anderen Formulierung versuchen.
 
Zuletzt bearbeitet:
es gibt einheitliche schnittstellen die unabhängig sind von den verwendeten sprachen
 
infinitecodes schrieb:
Also wird z.B ein Programm in einer Entwicklungsumgebung geschrieben mit der man diese Sprachen verknüpft ?

Nein, ein Programm wird in einer (oder mehreren) Programmiersprachen geschrieben und dann in maschinencode von einem compiler übersetzt. Da wird nichts "verknüpft".

Programmiersprachen sind analog zu menschlichen Sprachen. Willst Du Dich verständigen, kannst Du das in einer gemeinsamen Sprache tun, oder aber Du brauchst einen Übersetzer (->Compiler).
 
Bagbag schrieb:
Häh? Bitte nochmal mit einer anderen Formulieren versuchen.
Also, angenommen es wird eine App für Android mit C++, Java usw. geschrieben.
Meine Frage ist wie schafft man es mit einer IDE dass diese Programmiersprachen obwohl sie verschieden sind, dass die App am Ende funktoniert also dass man diese Sprachen "kombiniert" und sie dann zusammenarbeiten?
Ergänzung ()

Twostone schrieb:
Nein, ein Programm wird in einer (oder mehreren) Programmiersprachen geschrieben und dann in maschinencode von einem compiler übersetzt. Da wird nichts "verknüpft".

Programmiersprachen sind analog zu menschlichen Sprachen. Willst Du Dich verständigen, kannst Du das in einer gemeinsamen Sprache tun, oder aber Du brauchst einen Übersetzer (->Compiler).
Und wie werden diese verschiedene Sprachen "kombiniert" innerhalb einer IDE ?
 
der ide ist die sprache recht egal. die muss nur jede sprache die verwendet wird verstehen können, einzeln
 
infinitecodes schrieb:
Und wie werden diese verschiedene Sprachen "kombiniert" innerhalb einer IDE ?

Du kannst Dir eine IDE als Texteditor mit Features vorstellen. Lade Dir doch einfach den Quellcode von kodi runter, den kannst Du auch mit einem Texteditor öffnen. Die IDE gibt Dir nur nette Features wie etwa syntax highlighting, auto completion, debug hilfen, etc. Die wirkliche Arbeit macht der compiler.
 
Die IDE ist da völlig uninteressant.

Der Java-Compiler übersetzt dein Java-Code in Bytecode (Google). Die Java-VM übersetzt den Bytecode zur Laufzeit in Maschinencode. Dieser Maschinencode wird ausgeführt und schreibt dabei Wert X an Adresse Y im RAM.

Dein C++ Code wird direkt in Maschinencode kompiliert. Wenn der Maschinencode ausgeführt wird, ließt er an Adresse Y den Wert X.

Die einzige wirkliche Überschneidung der beiden Teile ist also Adresse Y. Aber beide können mit dem was darin steht machen was sie wollen, das ist nicht abhängig voneinander.

Und was Adresse Y ist wird meistens beim Kompilieren definiert, manchmal aber auch erst zur Laufzeit über andere Schnittstellen "herausgefunden", wie bspw. beim PInvoke in C#.
 
Zuletzt bearbeitet:
Bagbag schrieb:
Die IDE ist da völlig uninteressant.

Der Java-Compiler übersetzt dein Java-Code in Bytecode (Google). Die Java-VM übersetzt den Bytecode zur Laufzeit in Maschinencode. Dieser Maschinencode wird ausgeführt und schreibt dabei Wert X an Adresse Y im RAM.

Dein C++ Code wird direkt in Maschinencode kompiliert. Wenn der Maschinencode ausgeführt wird, ließt er an Adresse Y den Wert X.

Die einzige wirkliche Überschneidung der beiden Teile ist also Adresse Y. Aber beide können mit dem was darin steht, machen was sie wollen, das ist nicht abhängig voneinander.
Alter das ist zu krass wie das alles funktioniert, ich finde das riiichtig faszinierend danke für eure antworten! ich bin offen für weitere erklärungen!
 
infinitecodes schrieb:
Alter das ist zu krass wie das alles funktioniert, ich finde das riiichtig faszinierend danke für eure antworten! ich bin offen für weitere erklärungen!

Du hattest eine sehr behütete Kindheit, oder?
 
Genieße es mit einer Prise Salz.
 
  • Gefällt mir
Reaktionen: Akula
blink blink Habts ihr das bewußt alle mißverständlich beantwortet? :confused_alt:

Nein, Adressen interessieren natürlich keinen im Kontext mit Zugriffen von außerhalb. Und schon gar nicht mit JAVA - Stichwort Sandbox.

Und nein, mit C# hat es auch nichts zu tun - das ist im Gegenteil eine Besonderheit der .NET-Plattform, die exakt eine Sprache darstellt (MSIL) welche in etwa mit JAVA-Bytecode zu vergleichen ist, mit der Ausnahme, daß man in C# oder F# oder J# oder sonstwas-# programmieren kann und jene Sprache durch den zugehörigen Compiler in MSIL übersetzt wird.

Welcher dann zur Laufzeit ebenfalls in einer VM ausgeführt wird, ebenso wie JAVA.

Und zu guter Letzt, nein, natürlich kann nicht jeder mit jedem; insbesondere nicht C++ - Stichwort Interface Mangling.


Stattdessen funktioniert das in etwa so:

- Es gibt eine grundlegende Laufzeitbibliothek. Die beinhaltet die wichtigsten Funktionen. Unter Linux ist das glibc ("GNU C-Bibliothkek"). Unter Windows gibt's verschiedene; geläufig (aber veraltet) sind die Microsoft Foundation Classes (MFC), in etwa "Microsoft Basisklassen".

- Solche Bibliotheken definieren Schnittstellen. Da wird gesagt, es soll eine Funktion getInfo geben und diese Funktion soll als ersten Parameter eine Zahl bekommen und die Zahl soll das-und-das bedeuten, und dann darf es optional einen zweiten Parameter geben - zB einen Boolean (true/false) welcher wieder etwas anderes bedeutet.

- Andere Bibliotheken und insbesondere Anwendungen DERSELBEN Programmiersprachfamilie können auf diese veröffentlichten Schnittstellen zugreifen (nur auf diese).

- Wenn man jetzt eine Anwendung (oder Bibliothek) baut und die auf solche Funktionen zugreifen läßt, dann wird das buchstäblich verknüpft. Heißt auch so, nur wird die englische Bezeichnung dafür verwendet: "Linking".

- Für ANDERE Programmiersprachen können Zugriffspfade definiert werden, wenn man das möchte. Das läuft über sogenannte Bindungen. Prinzipiell ist das aber nichts weiter, als daß eine fremde Routine aufgerufen wird und das Ergebnis dieser aus einem vordefinierten Ziel eingesammelt wird (im einfachsten Fall wird das Ergebnis in eine Tempdatei geschrieben und von dort ausgelesen). Direktzugriff über "Programmiersprachengrenzen" funktioniert weiterhin NICHT, das wäre ein ganz schlimmes Sicherheitsloch und steht aktuellen Mechanismen (Sandboxing, VM) konträr entgegen.

C++ macht die Sache nochmal ein wenig lustiger. Hier werden die definierten Schnittstellen nicht eins-zu-eins übernommen, sondern beim Kompiliervorgang "verfremdet". Ergebnis ist, daß eine C++-Anwendung nur genau mit der Bibliothek funktioniert, mit der sie erstellt wurde.

Bei Microsoft merkt man das dadurch, daß man Visual C++ Runtime Libraries" installieren muß in Abhängigkeit davon, mit welcher Version von Visual Studio die Anwendung geschrieben wurde. "Version "2005" kann nicht durch "Version 2008" ersetzt werden: man braucht beide. Mit Pech braucht man alle Versionen seit 2005 oder so (2005,08,10,13,15,17 und ab April dann 19).


Das funktioniert mehr oder weniger überall so. Es gibt ein paar Kontaktstellen, die über Programmiersprachengrenzen hinausgehen, aber das sind vergleichsweise wenige. Unter Android kommt hinzu, daß es ein klar definiertes SDK gibt: über dieses darf man auf die Funktionalität des Systems zugreifen, aber nur darüber. Damit muß man sich um die verwendeten Sprachen keine Gedanken mehr machen, da das SDK festlegt, welche Funktionen da sind und wie sie verwendet werden können.

Im Hintergrund kann dieses SDK aber durchaus in fünf verschiedenen Sprachen implementiert sein (müssen).
 
  • Gefällt mir
Reaktionen: BlackMark
Zurück
Oben