Как скомпилирован Rust для машинного кода?

Недавно я смотрел язык программирования Rust. Как это работает? Код ржавчины, похоже, скомпилирован в двоичные файлы ELF или PE (и т.д.), Но я не смог найти какую-либо информацию о том, как это делается? Скомпилирован ли он в промежуточном формате, а затем скомпилировал остальную часть пути с помощью gxx? Любая помощь (или ссылки) будет действительно оценена.

Ответ 1

Фаза генерации кода компилятора Rust в основном выполняется LLVM. LLVM - это набор инструментов для построения компилятора, наиболее часто используемый Clang C [++] Compiler clang[++].

Во-первых, компилятор Rust (как, например, clang) выполняет все специфические для Rust вещи, такие как проверка типов и заимствований; в конце концов, он генерирует LLVM-IR. IR означает промежуточное представление, и это... сравнимо со сборкой, но чуть более высокого уровня и, что самое важное, не зависит от платформы. Затем компилятор Rust просто вызывает ☏ LLVM и говорит:

Эй, приятель, не могли бы вы взять этот ИК и сгенерировать машинный код для текущей платформы? Это было бы фантастически ◕ ◡ ◕

На что отвечает LLVM:

Ure Конечно, нет проблем, новый друг. Вот ваш высокооптимизированный машинный код для [например] x86_64 ! ♫ ♪ ♫

После этого они приглашают еще нескольких друзей обернуть все это в небольшой симпатичный [например] пакет ELF и поместить его в пользовательскую файловую систему. (а пользователь как...)


Подобную информацию можно найти в официальном FAQ, который в любом случае содержит много интересной информации. Для получения более подробной информации о компиляторе Rust вы можете прочитать "Руководство по Rustc". По этому вопросу глава "Обзор высокого уровня" довольно интересна.