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