Почему для создания двоичного файла Rust Rust требуется набор инструментов C ++, а в таких языках, как Go, этого требования нет? - PullRequest
3 голосов
/ 16 мая 2019

Компиляция файла Rust с rustc foo.rs завершится неудачно, если у меня не установлен набор инструментов C ++. Но при компиляции программы Go такой набор инструментов не требуется. Почему это так?

1 Ответ

12 голосов
/ 16 мая 2019

TL; DR: поскольку у каждого есть набор инструментов C.

Небольшая коррекция: rustc не требует набора инструментов C ++, он требует только набор инструментов C.Примечательно, что двоичные файлы, созданные с помощью rustc, зависят только от libc (или эквивалентного), но не от libstdc++ (или эквивалентного).


Как показал пример Go, можно не требовать CНабор инструментов.Вам нужно только повторно реализовать его функциональность:

  • Вам необходимо реализовать свой собственный компоновщик, соблюдая формат целевой платформы.
  • Вам необходимо реализовать свой собственный libc (он же слой ОС)).

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


Сообщество Rust предпочло приложить больше усилий к языку, чем к инструментальной цепочке, и поэтому повторное использование стандартной инструментальной цепочки было проще.В частности, для rustc потребуется компоновщик платформы (ld в Unix) и платформа, эквивалентная libc.

Это не основной принцип проектирования, это просто прагматичный подход, и существуют проекты для сокращенияна этих зависимостях:

  • Использование lld вместо ld позволит отправить один компоновщик с rustc, который может быть нацелен на все платформы.
  • Использование cranelift в качестве альтернативного бэкенда может также удалить зависимость от ld.
  • Проект Redox работает на relibc , переносимой реализации Rust API libc.

Все они находятся в стадии разработки, и в то же время для rustc потребуется набор инструментов C.Более того, даже в обозримом будущем я ожидаю, что rustc потребует инструментальную цепочку C для целей, еще не охваченных какой-либо цепочкой инструментов Rust, просто чтобы вы могли использовать цель, не дожидаясь некоторой гипотетической разработки.

...