Software Cross-Compatibility zwischen Betriebssystemen

M

McMoneysack91

Gast
Liebe Freunde,

ich bin kein Programmierer von Software. Das einzige, was ich okay beherrsche sind HTML, CSS, PHP. Ich benutze ausschließlich Linux für alle meine Computer und Anwendungen. Lediglich eine Retro Windows XP Maschine habe ich, um das rohe, ungepatchte, verbuggte Gothic 3 spielen zu können (Nostalgie gepaart mit Masochismus).

Ich habe den Eindruck von dem was ich lese, dass es eine unheimliche Goliathaufgabe ist, eine Software, die man (sagen wir) für Windows geschrieben hat, auch für Linux ausführbar zu machen. Als müsse man quasi alles von vorne schreiben. Ja, ich weiß, dass Linux seine Dateien anders sortiert als Windows und so, aber ist es echt so eine Hürde? Denn angenommen man schreibt in C oder in Python. Beide Betriebssysteme beherrschen C und Python. Kann man das Geschriebene für Windows als .exe kompilieren und das für Linux als .deb oder Ähnliches?

Nehmen wir mal ein Beispiel aus einer Parallelwelt. Ich filme ein Video mit meinem Camcorder. Die Videodateien sind meinetwegen .MTS Dateien. Ich ziehe sie auf den PC, füge sie in einem Videobearbeitungsprogramm zusammen und wenn mir das Projekt gefällt, dann rendere ich es:

Für meinen Windows Rechner zum Anschauen rendere ich z.B. als .wmv und für YouTube zum Hochladen rendere ich es als .mp4 und für wieder was anderes rendere ich es als .MPEG weil das jeweilige Gerät meinetwegen kein .mp4 abspielen kann. Ähnlich wie Linux nichts mit .exe anfangen kann.

Aber ich muss doch nicht alle Videos neu drehen oder das Projekt neu zusammenstellen. Ja, ich ahne dass dieser Vergleich nicht parallel übertragen werden kann, aber ihr wisst hoffentlich, was ich damit zu sagen versuche.


---WEITER---

ich bin begeistert von Linux WINE. Es ist kein Emulator, sondern ein Compatibility-Layer. Ist es denn vielleicht in Zukunft insofern möglich, dass man für KEIN Betriebssystem eine Software schreibt, sondern (tja wie sagt man das jetzt) eine Art Meta-Software die OS-unabhängig herumschwebt und jedes OS verfügt dann über einen Compatibility Layer, um diese Software auf sein jeweils eigenes System zurechtzustutzen?

In der Tat schwierig stelle ich es mir vor wenn wir von ganzen Architekturen sprechen, wie x86 und ARM. Doch angenommen wir bewegen uns lediglich innerhalb der x86 Welt. Eine Software wird in C geschrieben und alle Computer die C beherrschen (Windows 7, 10, Debian, Ubuntu, Arch bla bla bla) machen sich die Software auf ihre jeweils eigene Art nutzbar.

Das ganze entsteht aus der Überlegung meiner Websites. Ich schreibe auf meinem PC zu Hause in einem Editor den HTML Code. Ich schreibe nicht für Firefox oder Chrome oder Edge oder Midori usw. Ich schreibe HTML mit den Regeln von z.B. HTML5. Dann speichere ich dieses Projekt als .html Datei. Nun wähle ich einen Browser und führe diese Datei aus. Dabei ist (fast) egal welchen Browser ich benutze, solange dieser HTML beherrscht und das Geschriebene nach den aktuellen Regeln ausführt und anzeigt. Da kann es noch so zigtausende Browser geben und meinetwegen minütlich neue entstehen, geschrieben habe ich mein Projekt nur ein Mal und jeder auf der Welt kann sich selbst aussuchen welchen Browser er am Liebsten mag, und muss trotz seiner Entscheidung nicht darauf verzichten, mein Geschriebenes zu sehen.

So in etwa der Gedankengang
 
  • Gefällt mir
Reaktionen: cK31-Spiced
mir fällt da, auch wenns viel Leistung frisst, Java ein. Und ich weiß jetzt aber nicht, wie weit man mit HTML5 gehen kann
 
McMoneysack91 schrieb:
Als müsse man quasi alles von vorne schreiben. Ja, ich weiß, dass Linux seine Dateien anders sortiert als Windows und so, aber ist es echt so eine Hürde? Denn angenommen man schreibt in C oder in Python. Beide Betriebssysteme beherrschen C und Python. Kann man das Geschriebene für Windows als .exe kompilieren und das für Linux als .deb oder Ähnliches?
Neu schreiben musst du gewiss nicht.
Es gibt praktisch zwei/drei Varianten:
  • Code komplett plattformspezfisch -> alles neu (z.B. weil eine Programmiersprache grundsätzlich nur für eine Plattform Tooling hat)
  • Code teilweise plattformspezifisch -> Teile, welche nicht plattformspezifisch sind werden geteilt, andere ( GUI und sonstige Betriebsystem-spezifische Interaktion), werden auf der jeweiligen Plattform implementiert.
    Das kann dir als Entwickler abgenommen werden, indem du z.B. Frameworks wie React Native nutzt, welche Abstrakte GUI-Elemente (und sonstiges) anbieten, die dann je nach Plattform das richtige machen.
    Es gibt auch verschiedene Varianten, Beispiele:
    • GUI wird mit nativen GUI-Elementen implementiert (ein Framework, das das so macht: React Native)
    • GUI wird mit Cross-Plattform-Rendering Engine implementiert (Flutter, Electron)
  • Code komplett plattformunabhängig (pure WebApps mit WebAssembly, JavaScript mit HTML+CSS)
McMoneysack91 schrieb:
Ist es denn vielleicht in Zukunft insofern möglich, dass man für KEIN Betriebssystem eine Software schreibt, sondern (tja wie sagt man das jetzt) eine Art Meta-Software die OS-unabhängig herumschwebt und jedes OS verfügt dann über einen Compatibility Layer, um diese Software auf sein jeweils eigenes System zurechtzustutzen?
Das ist jetzt schon möglich mit WebApps via JavaScript und/oder WebAssembly.
WebApps können auch in Programmiersprachen wie Rust, C#, Go, etc. entwickelt werden. Statt zu Maschinen-Code (x86-64, x86, ARM64, etc. spezifisch), wird dann WASM produziert, welches vom Browser asugeführt wird (wie auch JavaScript).
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: ###Zaunpfahl### und TriggerThumb87
McMoneysack91 schrieb:
Beide Betriebssysteme beherrschen C und Python
Das ist so nicht korrekt. Für beide Betriebssysteme gibt es Python Interpreter, außerdem platform- und architekturspezifische C-Compiler.

Es gibt 2 Unterscheidungen: Betriebssystem und CPU-Architektur.
Beim Betriebssystem sind z.B. die System-Calls jeweils anders (die werden z.B. für Zugriff auf Dateisystem und Hardware benötigt). Bei der CPU sind die Instruktionen anders. Eine x86 CPU hat andere Befehle als eine ARM CPU. Bei C muss man deshalb sehr aufpassen, wenn man plattformunabhängigen Code schreibt. Bei Pyhton übernimmt das der Interpreter.

Bei Verwendung von höheren Sprachen und Frameworks werden diese Unterschiede für den Programmierer abstrahiert, so das er sich nicht mehr darum kümmern muss. Java, .NET (C#, VB) und Python sind gute Beispiele dafür.
 
Oh je, da habe ich ja in eine Schlangengrube getreten. Ich danke schonmal sehr für die raschen Antworten, auch wenn ich sehr vieles hier nur hauchdünn ansatzweise begreife.

Jetzt lenke ich uns einfach mal ein wenig weg von der Spezifik und frage ganz pauschal und plakativ:

wird es in Zukunft einfacher sein, dass eine entstehende Software für sämtliche OS (und Architekturen; packen wir das einfach mal mit in die Frage) verfügbar sein wird?

Derzeit ist ein Programmierer ja vermutlich eher getrieben vom Marktanteil.

Von:
Warum sollte ich etwas für ein OS programmieren, das nur 2% Marktanteil an Desktops hat? Da programmiere ich lieber für die Giganten.

Hin zu:
Ich programmiere jetzt die Software, die ich mit der Welt teilen möchte (und auch was daran verdienen evtl) und die jeweiligen OS werden schon dafür sorgen, dass die sie vernünftig abspielen können.
 
McMoneysack91 schrieb:
wird es in Zukunft einfacher sein, dass eine entstehende Software für sämtliche OS (und Architekturen; packen wir das einfach mal mit in die Frage) verfügbar sein wird?
Ja, WebApps (zukünftig wohl immer mehr mit WASM für mehr Performanz und auch Sicherheit und Robustheit) ist ein Trend, den es schon eine Weile gibt.
Dazu kommt Apple und MS mit ARM und damit einer weiteren Architektur, was auch bei den Architekturen für mehr Unabhängigkeit sorgt (Toolchains für die Kompilierung auf mehreren Plattformen, Frameworksupport für mehrere Plattformen).
Ein dritter wäre der Aspekt von Geräteklassen, d.h. für jede Geräteklasse neu entwickeln oder passt sich das Programm an die Geräteklasse an. Dazu wäre im Webbereich Responsive Design genannt und bei Windows UWP.
 
  • Gefällt mir
Reaktionen: McMoneysack91
Ui cool, das macht Freude und Hoffnung. Denn bislang, so schien mir haben diese unterschiedlichen Systeme eher gespalten und "Lager" entstehen lassen. Windows Lager vs Linux Lager, x86 Lager vs ARM Lager und jeder schwört auf seins und grummelt, dass der andere mehr Software zur Auswahl hat.
 
Ich entwickelte beruflich seit vielen Jahren Software die auf unterschiedlichen Platform läuft.
@KitKat::new() hat dazu bereits alles nennenswerts mitgeteilt. 👍
 
  • Gefällt mir
Reaktionen: McMoneysack91
Je weniger du die Vorteile einer Platform für mehr Performance nutzt desto einfacher ist der Wechsel zwischen ihnen. Es liegt also immer auch am Entwickler. Wenn er halt was Platformspezifisches macht muss er einen alternativen Code Pfad implementieren.

auf mittlere Sicht wird es wohl relativ einfach werden. Entwickelt für Unix und es wird überall laufen. Windows hat den Schlagabtausch verloren und beugt sich durch Kompatibilität
 
Was spricht denn gegen Web applications?
Die können heutzutage so gut wie alles und sind halbwegs performant. Das Backend kann man in der Sprache der Wahl schreiben.

Setzen auf so etwas bei all unseren Neuentwicklungen. Frontend mit Vue, Backend mit Java und Spring.
 
Also ich bin definitiv ein Fan von Webapps.
Da ich das auch beruflich mache und mich zurzeit eher mit nicht Web Dingen beschäftige kann ich sagen das es deifinitv auch Gründe gegen Webapps.
  • Auslieferung, die Programme sind besonders auf Linux Distris riesig, da immer alles mitgeliefert wird
  • Mit WebAssembly kenn ich mich noch nicht aus.... aber mit Javascript vergleichsweiße sehr langsam
  • Performance im allgemeinen schon etwas problematisch besonders auf langsamerer Hardware
  • Teils keinen Zugriff auf System Komponenten

Aber ich möchte auch noch was allgemein dazu sagen.
Nichts gegen @McMoneysack91 aber ich denke dir fehlt ein wenig die Einsicht (Softwarentlicklung) klingt mir ein bisschen zuviel nach "ich hab das Gefühl"

Also erstens ist es denke ich nicht mehr so schwierig Software auf verschiedenen Plattformen laufen zu lassen. Ich würde es nicht (mehr) als Goliathaufgabe bezeichnen. Es gibt ja auch schon zig Programme die das können und ich bin mir ziemlich sicher das die nicht jedes mal "das Rad neu erfinden".

Zusätzlich ist das ganze auch viel komplexer als dass man es einfach pauschal in ein paar Sätzen beantworten könnte. Es kommt darauf an wie das Endprodukt aussehen soll, was es kann und welche Tools, Programmiersprachen man einsetzen möchte. Von CLI über Embedded Micro Code bis hinzu AAA Games ist die Bandbreite ziemlich groß.

Abseits vom Web, gibt es zb. auch noch die JVM, die nach meinen bisherigen Erfahrungen nach nicht langsam ist. Evtl. der Start im Vergleich wobei das aber auch relativ ist.
Dann gäbe es mittlerweile noch GraalVM als JVM Engine die dir auch zu nativen kompilieren kann und auch Polyglot kann was bedeutet das man verschiedene Sprachen mixen und gemeinsam ausführen kann.

Dann gäbe es auch noch LLVM das so ähnlich wie JVM Bytecode ist nur das dann das am Ende zu nativen Maschinencode kompiliert wird.

Es gibt vermutlich mehr Sprachen die ähnlich flexibel sind aber damit kenn ich mich momentan aus da ich mich damit beschäftige. Und das wäre die Sprache Kotlin.

Kotlin entstand als JVM Sprache mit 100% Bidirektionaler Java Kompatibilität.
Ich weiß jetzt auch nicht detailliert wie weit was genau geht und wo es noch Probleme gibt, aber ich zähle mal auf was möglich sein soll auch wenn es Stand heute noch nicht zu 100% so ist.
  • Kann zu Javascript kompiliert werden und mit NodeJs umgehen
  • Mithilfe von LLVM zu nativ und wenn ich es jetzt richtig verstanden habe auch zu Webassembly
  • Bibliotheken die übergreifend verwendet werden können, egal welches Ziel am Ende
  • JVM als Multiplattform
  • Auch iOs und Android
  • Google Android Jetpack Compose GUI Toolset für den Desktop
  • Als Skriptsprache wie Python (Durch JVM leider etwas träge...)
Hinzu kommen dann auch noch so Tools wie QT und GTK die es einem auch noch vereinfachen.

Wie ich finde ist das heute nicht mehr so ein Hexenwerk. Ganz was anderes ist es natürlich mit vielen älteren Projekten die sich nicht von heute auf morgen neu schreiben und somit nicht die neuen Möglichkeiten nutzen können und mit viele Dingen kämpfen müssen um die portiert zu bekommen.
 
Ich hab jetzt das Ganze paarmal durchgelesen und bin immer noch nicht ganz sicher, was genau die Frage ist. :confused_alt:

Nein, natürlich muß man nicht jedesmal das Rad neu erfinden, wenn man Software portieren will.
Es gibt aber schon einen Unterschied, ob man (A) bestehende Software von einer Betriebsumgebung in eine enadere umziehen will oder (B) Software erst neu baut, welche dann in verschiedenen Umgebungen lauffähig sein soll.

Windows vs Linux oder was anderes ist da nur ein Teil davon. C nach C# ist schon ein nicht-so-ganz triviales Problem.
Nicht mal C-nach-C ist trivial, wenn sich die Laufzeitbibliothek ändert -glibc hat andere Möglichkeiten als BSD libc hat andere als Microsofts MFC hat andere als.... etc pp.
Und wenn dann noch auf die Umgebung zugegriffen werden muß, dann wird es richtig interessant. Die Windows API unterscheidet sich nun mal von der Linux API und die sich wieder von der BSD API und so weiter.

Demgegenüber kann man seinen Code plattformunabhängiger gestalten (das ist allerdings nicht immanent, da muß man sich selber drum kümmern).
Man kann plattformunabhängige Umgebungen verwenden, aber die sind naturgemäß weniger performant als plattformabhängige und da muß man dann wieder abwägen, was einem wichtiger ist.
Schlimmer noch, man kann auch in eigentlich plattformagnostischen Umgebungen wie JAVA - oder C# und Co -- auf OS-spezifische Funktionalität zugreifen und dann ist die inhärent überall lauffähige Software plötzlich doch plattformabhängig.

Aber je spezifischer die Anbindung an die Umgebung sein muß, desto schwieriger wird es, desto umfangreicher (und damit fehleranfälliger) wird der Code und desto mehr Entwicklungsarbeit (und damit Geld) muß man reinstecken, damit man als Anwender ein möglichst uniformes Verhalten präsentiert bekommt.

Webanwendungen sind am Ende des Tages aus Entwicklersicht ziemlich egal. Da hat man ein sehr konkretes Toolset zur Verfügung und die Anwendung läuft hinterher in einer Sandbox, dh rein technisch ist das auch nichts anderes als würde man für Windows, oder Linux, oder BSD programmieren -- man programmiert stattdessen "für den Browser" (und hat mehr oder weniger das Problem, daß es dort ebenfalls kein uniform unterstütztes Toolset gibt). Dasselbe für Apps, dasselbe mehr oder weniger analog für jede Software die per Design in einer VM läuft - einschließlich JAVA.

Und wenn wir dann sowas wie Python hernehmen.... kann uns am Ende des Tages immer noch unerwartet etwas auf die Füße fallen, wenn unser Projekt irgenwelche anderen Projekte oder Erweiterungen als Abhängigkeit hat. Denn nicht alle Erweiterungen sind für alle Umgebungen verfügbar (und sind auch nicht ohne Weiteres dafür bereitstellbar).
Dann würde mein Projekt zwar theoretisch überall lauffähig sein, aber praktisch dies de facto ausgeschlossen sein.
 
  • Gefällt mir
Reaktionen: ###Zaunpfahl###
Nochmals sehr gut ergänzt. Ist ne einfache Frage mit einer sehr sehr langen Antwort.

RalphS schrieb:
daß es dort ebenfalls kein uniform unterstütztes Toolset gibt
Das würde ich nicht sagen. Ja man kann machen was man will und jede Seite sieht anders aus, man kann aber zumindestens die eigenen Programme konsistent halten und dafür gibts sehr viele tools wie Bootstrap und etc.
Ich für meinen Teil bin auch nicht wirklich scharf darauf so eingeschränkt zu sein. Ich vermute mal das ist auf dem Mac der Fall wo es schwierig ist wenn man doch mal aus der Reihe tanzen möchte. Für mich muss nicht alles konsistent gleich sein... was ich sagen will es gibt auch Menschen denen das nicht stört und auch gutes darin sehen.
 
Zurück
Oben