Приложения зависят от операционной системы для предоставления услуг.
Вы можете создать приложение с минимальной зависимостью от ОС. Но даже если (с некоторыми серьезными Фу, Волшебством и рукопожатием) вы заставите его работать на «каждом компьютере», это не то, что мы хотим.
Языки Script и Script-like (такие как Python и Perl, как уже упоминалось) идут по этому пути: они используют минимальные возможности ОС и создают все, что предоставляют, на ее основе. Это отлично подходит для приложений командной строки, потому что все, что вам нужно (более или менее) - это чтение и запись файлов и пользовательская консоль.
Богатым приложениям сегодня нужно гораздо больше сервисов, хотя они должны «работать в ОС», а не «только на процессоре»: мы ожидаем, что они будут интегрированы с ОС, пользовательский интерфейс должен выглядеть нативно, вы хотите использовать буфер обмена, диалог «открыть файл» должен предоставлять все функции, которые предоставляют другие диалоги открытия файла.
Среда, подобная Java, пытается обеспечить это портативным способом, используя более высокий уровень абстракции: есть окна, виджеты и все красивые вещи. Но у этого есть свои проблемы:
Во-первых, вы всегда должны балансировать между «согласованностью платформы виртуализации» (т. Е. Приложение работает одинаково независимо от того, где вы ее запускаете) и «согласованностью платформы хоста» (т.е. приложение работает как нативное приложение).
Вы можете попытаться полностью избавиться от «нативных вещей», чтобы избежать этой проблемы, но тогда вы стремитесь к пересечению функциональности, которую предоставляют все платформы. Вы работаете на Apple? Покончить со второй кнопкой мыши. и т. д. Кроме того, ваша платформа абстракции всегда будет отставать от инноваций на хост-платформах.
Суть в том, что серебряной пули нет: всегда есть компромисс. На рынке существуют разные успешные компромиссы.