blink blink Habts ihr das bewußt alle mißverständlich beantwortet?
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).