Без использования виртуальной машины у вас всегда есть одна и та же проблема: многие функции, которые можно использовать в операционной системе, являются специфическими для этой операционной системы.
Это потому, что никто никогда серьезно не заботился о том, чтобы определить способ сделать то же самое, главным образом потому, что DirectX10, например, является преимуществом перед другими операционными системами.
Я бы сказал, что довольно легко написать кросс-платформенное приложение, которое может работать на MacOSX и Linux только потому, что вы можете воспользоваться многими вещами, которые могут работать на обеих машинах (подумайте о X11 или GTK) и оба из них имеют Unix под капотом. Обычно с некоторыми усилиями вы можете заставить свои программы работать и под Windows (возможно, с MinGW или Cygwin), также, если отсутствует совместимость некоторых функций.
Кроме того, разные операционные системы имеют разные варианты реализации для одних и тех же вещей (подумайте о сокетах, io-системе, графике, аудио и т. Д.), Поэтому это делает невозможным запись только версии, которая работает повсюду: вы вынуждены писать другая версия для любой ОС, на которой вы планируете выпустить свою программу.
Короткий ответ: нет, вы не можете без языка VM, если не ограничите возможности своей программы небольшим набором общих функций.
(я предполагаю, что мы говорим о C/C++ только потому, что, как правило, другие языки управляются только одна группа людей, каждый, который заботится об освобождении его как много кросс-платформенный, как это возможно)
I на самом деле не вижу никакой реальной причины полагаться на виртуальную машину. Компьютер в настоящее время способен запускать виртуальные машины без проблем с большой скоростью. Тогда, имея что-то, что заботится о размещении слоя абстракции между вами и ОС, позволит вам делать продвинутые вещи, просто зная, как это сделать. Я думаю, что компромисс между скоростью, подобным Java, является широко приемлемым .. они просто сделали что вам нужно будет делать, пытаясь написать сложное кросс-платформенное приложение.
Просто факт: мне очень больно при попытке переноса виртуальной машины, которую я написал из Unix (Linux/OSX), в Windows из-за функции freopen
. К сожалению, Windows управляет потоками по-другому по сравнению с другими ОС. MinGW не хватало этой функции, и мне пришлось найти способ решить эту проблему.
Как вы определяете кросс-платформенный? Например, программы ANSI C могут быть скомпилированы на многих платформах. –
Какие функции требуется вашей программе? Какие платформы вы хотите поддерживать? Если вы полагаетесь на функции, указанные в POSIX, ваша программа будет переноситься во многие устройства, но не может компилироваться в Windows - по крайней мере, она, вероятно, не будет, если вы не будете полагаться на подмножество POSIX, поддерживаемое окнами. Другой способ сделать вашу программу переносимой - полагаться на уровень абстракции, который заботится о конкретных вещах для вас, таких как сетевые и потоковые средства Qt. Проблема с этим подходом заключается в том, что ваша программа в лучшем случае будет переносной для систем, поддерживаемых вашим уровнем абстракции. – George
Например, программа, использующая сокет. Он имеет разные реализации в Linux или Windows. – rigon