Во первых "использовать один язык программирования" и кросс-платформенность -
это две разные вещи. Параллельные.
У языков есть свои плюсы и минусы (и это еще безотносительно кросс-платформенности).
Иначе давным-давно был бы один-единственный язык. Идеальный.
Хотя бы в пределах одной платформы. Но нет. Языки продолжают появляться.
А теперь про кросс-платформенность:
Платформы сильно разные.
Ну вот, скажите, зачем вам "оконное API" для серверной платформы, где нет GUI?
Попытки написать универсальное решение имеются. Но получаем ограниченную функциональность где-либо. Не учитывание нюансов где либо.
Потому что нельзя объять необъятное.Условно говоря: у Windows для отображения окна функция a, у Linux - b, и нужно на каждой платформе выбирать соответствующую.
Вы забыли, что desktop на Linux может быть сильно-сильно различным.
И даже для Linux нет нормальной кросс-платформенности в GUI.
Если да, то почему нельзя везде использовать один язык программирования?
Почему нельзя.
Можно.
На JavaScript или с QT или использовать JDK.
Однако применимость этих решений - ограничена. Уж очень много где они не идеально вписываются и не подходят ко всем деталям платформы.
Кроме того, одна единая платформа - это смерть развития.
Ведь новые платформы появляются не просто потому что кому-то миллиардов не жаль на их создание.
но тогда необходим слой абстракции. Этот слой подразумевает обращение к API через ту функцию, которой соответствует данная на необходимой платформе? Условно говоря: у Windows для отображения окна функция a, у Linux - b, и нужно на каждой платформе выбирать соответствующую.
Примерно так и делают.
Но, однако, хорошо если вообще можно "вызвать одну функцию".
Вы исходите из того, что кто-то проектирует платформу как удобную для дальнейшей реализации кросс-платформенности.