Задать вопрос
@LanskoyGames
У модераторов первое место, но только с конца...

В чём проявляется зависимость c++ от железа и касается ли это Rust?

Многие пишут, что C++ - низкоуровневый язык и программы могут не работать на разных платформах в отличии от той же Java и касается ли эти проблемы Rust?
  • Вопрос задан
  • 369 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 3
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Многие пишут, что C++ - низкоуровневый язык и программы могут не работать на разных платформах в отличии от той же Java и касается ли эти проблемы Rust?

Касается, и это не проблема, а фича.

C/++, rust и go требует компиляции под конкретное железо. Для Java и C# необходима компиляция в промежуточный код (java байт-код и CIL соответственно) под их виртуальную машину (JVM и .NET соответственно). Виртуальная машина позволяет практически не заботиться о том, на каком железе будет выполняться написанное приложение, если конечно данное железо/os поддерживает эту виртуальную машину.

Однако, Java и C# могут быть так же скомпилированы сразу в машинный код (AOT), но это не является обязательным. Данная компиляция так же производится под конкретное железо.
Ответ написан
Комментировать
15432
@15432
Системный программист ^_^
Java компилируется в промежуточный код виртуальной машины Java, C++ и Rust компилируются в машинный код., исполняемый на процессоре. Разные процессоры имеют разный формат машинного кода, потому созданная для x86 программа не запустится на ARM.
Ответ написан
Комментировать
@historydev
Редактирую файлы с непонятными расширениями
Java запускается в переносимой виртуальной машине которая уже умеет во все архитектуры, а на системных языка тебе нужно компилировать программу для конкретной архитектуры, например: x86, arm.

Это не значит что тебе нужно для каждого процессора отдельно компилировать, это значит что тебе необходимо скомпилировать один раз для каждой архитектуры.

Архитектура подразумевает публичный api который реализуется множеством процессоров.

Не нужно сравнивать прикладные языки с системными.

Единственный низкоуровневый язык - это язык ассемблера, все остальные, включая С - высокоуровневые языки.

Разница лишь в области применения, никто не будет писать фронтенды на С, у каждого из инструментов есть проблема, которую он решает и область применения в которой эта проблема актуальна.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@GoodGod
1. В C++ стандартную библиотеку реализуют много разных фирм. И например те моменты, которые строго не описаны в стандарте в разных реализациях могут вести себя по-разному. Например wchar_t в Linux занимает 4 байта, в Visual Studio компиляторе - 2 байта. Раньше было что char в каких-то компиляторах signed а в каких-то unsigned, сами понимаете, что будет если записать туда символ с кодом > 128.

2. Стандартная библиотека и возможности компиляторов от разных фирм реализуют разные функциональные фичи стандарта C++. Например если взять какой-нибудь новый стандарт, например C++ 23, то не все функции стандарта C++ будут реализованы во всех компиляторах, есть даже таблица какой функционал где реализован.

3. Куча библиотек платформозависима. Они низкоуровневые и работают например только в Linux.

4. По поводу "железа". Например Arm процессоры раньше требовали чтобы ты читал память по границе то ли 2 байт, то ли 4 байт (arm unaligned memory access). Т.е. адреса 0,4,8,12 и т.д. А между ними нельзя было читать память.

Это конечно сглаживается компилятором, но все-таки такие неучитанные факторы могут вылезти при работе программы. Т.е. ответ немного не в том, что C++ прям платформозависимый, а скорее со своими особенностями на каждой ОС и железе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы