Ich bin ein C ++ - Entwickler und versuche, die plattformübergreifende Entwicklung besser zu verstehen. Ich versuche, einige Implementierungsdetails von Compilern und deren genaue Erstellung betriebssystemspezifischer Binärdateien besser zu verstehen. Während meiner Studie wurde mir klar, dass die meisten Compiler, die Sie für eine bestimmte Plattform heruntergeladen haben, zumindest für eine Weile nur Binärdateien für diese Plattform kompiliert haben. Wenn Sie also eine IDE heruntergeladen haben, die mit einer Compiler-Exe für Windows geliefert wurde, kann dieser Compiler Ihr Programm nur für x86-x64-Windows-Anwendungen und nicht für Linux- oder Mac-Anwendungen kompilieren.
Jetzt verstehe ich, dass verschiedene Plattformen unterschiedliche Binärformate erfordern, aber was macht es beispielsweise für den visuellen C ++ - Compiler unter Windows schwierig, eine ausführbare Linux-Binärdatei zu generieren? Sollten Sie nicht in der Lage sein, exectuables für jede Plattform auf einem beliebigen Computer zu kompilieren, solange Sie die Montageanweisungen für die CPU haben, auf der Sie ausgeführt werden, sowie die betriebssystemspezifischen Bibliotheken?
quelle
Antworten:
Abgesehen von der mangelnden Bereitschaft von Microsoft, dies zu tun, absolut nichts. Die Hindernisse sind nicht technisch.
Entwicklungs-Toolchains sind nur Programme, die Input nehmen und Output produzieren. Visual C ++ erstellt eine x86-Assembly und konvertiert diese dann mithilfe eines Assemblers in eine COFF-Objektdatei. Wenn Microsoft stattdessen ELF generieren möchte, ist es nur Code: Assembly kommt herein, ELF geht raus. Objektdateien oder Bibliotheken sind nichts Magisches. Sie sind nur Datenblobs in einem gut verstandenen Format.
In der Steinzeit war die Kreuzkompilierung viel schwieriger, da Sie häufig die Werkzeugkette für Ihre Zielplattform in Montage für die Plattform geschrieben hätten, auf der sie ausgeführt werden sollte. Dies bedeutete, dass, wenn es auf der Welt nur die VAX-, M68K- und Alpha-Architekturen gäbe, für eine vollständige Suite von Cross-Compilern neun davon geschrieben werden müssten, meistens von Grund auf neu. (VAX-zu-VAX, VAX-zu-M68K, VAX-zu-Alpha, M68K-zu-VAX, M68K-zu-M68K usw.) Das ist etwas übertrieben, da Teile des VAX-Compilers wiederverwendet werden könnten und an Codegeneratoren für jedes Ziel angehängt (z. B. VAX, M68K und Alpha, jeweils für VAX geschrieben).
Dieses Problem verschwand, als wir anfingen, Compiler in einer Sprache zu schreiben, die nicht an einen bestimmten Prozessor gebunden war, wie z. B. C. Wenn Sie diesen Weg gehen, schreiben Sie die gesamte Toolchain einmal in C und verwenden eine für die lokale Plattform geschriebene C-Compiler zum Erstellen. (Sie haben den Compiler häufig verwendet, um sich selbst neu zu kompilieren, nachdem er auf dem Compiler der lokalen Plattform gebootet wurde. Dies ist jedoch eine weitere Diskussion.) Das Ergebnis ist, dass das Erstellen eines Cross-Compilers im Wesentlichen den gleichen Aufwand darstellt wie das Erstellen eines nativen Compilers die lokale Plattform. Der einzige signifikante Unterschied besteht darin, dass Sie irgendwo im Erstellungsprozess angewiesen haben, im Codegenerator für Ihre Zielplattform anstelle des für die lokale Plattform zu kompilieren, was die logische Wahl gewesen wäre.
Als sich die Architektur der Compiler weiterentwickelte, wurde es bequem, einfach alle Codegeneratoren in das Produkt einzubeziehen und zu erstellen und auszuwählen, welcher zur Laufzeit verwendet wird. Clang / LLVM macht das und ich bin mir sicher, dass es noch andere gibt.
Sobald Sie über eine funktionierende Toolchain (Compiler, Assembler, Linker) verfügen, werden Bibliotheken aus Quellen erstellt, und Sie erhalten schließlich alles, was Sie zum Erstellen einer ausführbaren Datei für eine andere Plattform benötigen.
quelle
What would be the business benefit ... I don't think there is any.
- Das klingt nach einem guten Grund, nicht dazu bereit zu sein.Ja, wenn Sie alle Informationen zu Ihrer Zielplattform haben, sollte es keine Rolle spielen, auf welcher Plattform Sie tatsächlich laufen.
Es gibt zwei Probleme, die häufig auftreten:
Die sind natürlich nicht unüberwindbar. Meistens erhalten Sie Compiler, die auf die Plattform abzielen, auf der sie ausgeführt werden, weil die Leute dies wollen.
quelle
Ich bin mit Ihrer Prämisse nicht einverstanden. Es gibt Millionen von Android- und iOS-Entwicklern. Und alle verwenden Compiler, die unter Windows oder Mac ausgeführt werden und Code für einen völlig anderen Computer erstellen.
Sie erhalten keinen Cross-Compiler, wenn keine Marktnachfrage dafür besteht. Menschen, die beispielsweise Code für einen Linux-Desktop entwickeln, verfügen meistens über einen Linux-Desktop und verwenden einen Linux-basierten Compiler - viel schneller, wenn Sie Ihre Anwendung direkt auf dem Computer ausführen können, auf dem sie kompiliert wird, ohne sie über das Netzwerk zu transportieren, viel einfacher und schneller um einen Debugger auf demselben Computer laufen zu lassen und so weiter.
Wie viel mehr Geld würde Microsoft verdienen, wenn ihre Compiler auch für Linux bauen würden? Ungefähr 0 US-Dollar. Wie viel mehr Software für Windows würde erstellt? Keiner. Wie viel mehr Linux-Software würde erstellt? Keine Ahnung, aber Microsoft kümmert sich nicht darum. Was wären die Kosten? Ganz erheblich. Compiler müssen fehlerfrei sein. Sie müssen getestet werden.
Ein weiteres Problem: Wenn Sie einen Compiler schreiben, der unter Windows schreibt, benötigen Sie jemanden, der weiß, wie man Windows-Software schreibt. Wenn Sie einen Compiler für Linux schreiben, benötigen Sie jemanden, der weiß, wie man Linux-Software schreibt. Wenn Sie einen Compiler für Linux schreiben, der unter Windows ausgeführt wird, benötigen Sie plötzlich das viel seltenere Brot von Entwicklern, die sowohl Windows als auch Linux kennen.
quelle