(07.04.2016 15:07)Dirk schrieb: Wobei sich die Frage stellt, ob es Windows eh gebraucht hätte. Es ist ein offenes System, hätte jeder nen Wine für Linuxanwendungen für Windows schreiben können. Ist mir aber nicht bekannt, eher werden Multiplattformprogramme kompiliert. Hatte einmal nen cooles Linuxprogramm, wo ich traurig war, dass es das nicht für Windows gab. nur vergessen welches.
Das stimmt so nicht ganz. Der Hauptunterschied zwischen Windows und vielen Unix-Kerneln ist, dass Windows nie eine stabile Systemcall-Schnittstelle hatte (abgesehen von einem kleinen Teil genannt "Native API", was aber dafür undokumentiert ist). Der Windows-Kernel hat seine Systemcall-Schnittstelle teilweise sogar zwischen Service-Packs geändert, weswegen Windows-Programme immer kernel32.dll und andere User-Space Bibliotheken verwenden müssen um mit dem Kernel zu sprechen (die Details soll ein Windows-Entwickler hier einfüllen, dazu kenne ich mich zu wenig aus).
Das erlaubt es überhaupt, dass Wine komplett im User-Space implementiert ist, es muss bloss die kernel32.dll und Freunde so implementieren, dass sie mit dem Linux- anstatt dem Windows-Kernel sprechen.
Bei Linux hingegen ist das Systemcall-API stabil und es mehrere konkurrierende Systembibliothek-Implementierungen (musl, glibc), oder ganze Programmiersprachen wie Go die direkt Systemcalls in den Kernel absenden, ohne jegliche Bibliotheken. Das heisst für Linux-Support in Fremd-Systemen wie Windows oder BSD muss man das auf Kernel-Ebene machen. Wie anderswo schon erwähnt, die BSDs machen den Linux-Support schon länger so: Die BSD-Kernels tun einfach so als wären sie ein Linux-Kernel. Der Windows NT Kernel hat mit seinem Subsystem-Support dafür auch eine geeignete Architektur, wo der NT-Kernel einfach so tut als wär er ein Linux-Kernel. Sowas kann aber nur von Microsoft stammen, das können Dritthersteller nicht machen.
Kurzum: Windows hat ein stabiles ABI auf Bibliotheksebene, d.h. Windows-Kompatiblität kann man mit einer nachgebauten Bibliotheksammlung wie Wine erreichen. Linux hat ein stabiles ABI auf Kernel-Systemcall-Ebene, d.h. Linux-Binärkompatiblität kann man nur erreichen in dem man ein Linux-kompatibles Kernelinterface schreibt..
Nachtrag:
Die schwarze gepunktete Linie markiert die Stelle wo ein stabiles ABI garantiert ist. Bilder gestohlen von
http://slideplayer.com/slide/2513940/