MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Почему на java много приложений под android и очень мало под windows?"
Answer 1035556
Другие ответы объяснили, почему Java хорошо подходит для Android. Попробую объяснить одну из причин, почему Java плохо подходит для десктоп-разработки под Windows. На мой взгляд, это мало связано со скоростью, а скорее с тем, что в Java достаточно неудобное взаимодействие с нативными библиотеками.
Когда мы пишем приложение, заточенное под Windows (в противоположность кроссплатформенному), мы, очевидно, хотим использовать некоторые специфические ее API: например, DirectX для графики, Shell API для интеграции с проводником, или Raw Input для продвинутого взаимодействия с клавиатурой и мышью. В противном случае, зачем было бы заморачиваться. Эти все API - нативные ("native" - т.е., выполнены как бинарники в машинном коде текущей архитектуры и взаимодействуют с внешним миром через C-интерфейс на функциях, или с помощью Component Object Model). Более того, когда нужно взаимодействовать с каким нибудь особым устройством, типа фискального регистратора или сканера штрих-кодов, библиотека от производителя для этого, как правило, тоже нативная. Проблема в том, что механизм взаимодействия с нативным кодом в Java (JNI) требует создания довольно громоздких оберток на С++ с объявлениями JNICALL для всех вызываемых функций, тогда как в C# например достаточно добавить объявления P/Invoke в одну строчку в самом коде на C#. Кроме того, в Java вовсе нет аналога указателей на функций (делегаты в C#), это также большой минус в том случае, когда нативная библиотека использует их. При использовании COM разница еще более велика. В С/С++ взаимодействие с нативными библиотеками еще проще по понятным причинам.
Эти проблемы, конечно, малозначимы для веб-приложений или простых консольных утилит, поэтому они и под Windows могут писаться на Java. Но сложные десктопные приложения под Windows обычно используют С/С++ или .NET-языки.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.