Альтернативный компилятор для ржавчины: введение GCCR

Альтернативный компилятор для ржавчины: введение GCCR

30 июня 2025 г.

Это гостевой пост из проекта GCCRS по приглашению проекта Rust, чтобы прояснить отношения с проектом Rust и возможности для сотрудничества.


gccrsявляется альтернативным компилятором для работы с трудом для ржавчины как частьGCC ProjectПолем GCC - это коллекция компиляторов для различных языков программирования, которые имеют общую структуру компиляции. Вы, возможно, слышали оgccgoВgfortran, илиg++, которые все двоичные файлы в этом проекте,Композитор GNUПолем Цельgccrsэто добавить поддержку языка программирования Rust в эту коллекцию с целью иметь то же поведение, что и то же поведение, что иrustcПолем

В первую очередь,gccrsбыл начат как проект, потому что это весело. Компиляторы - невероятно полезные кусочки программного обеспечения, и это очень весело собрать. Проект был запущен еще в 2014 году, до того, как Rust 1.0 была выпущена, но был быстро отложен из -за изменяющегося характера языка. Около 2019 года работа над компилятором снова началась, во главе сФилипп Херрони финансируетсяБезопасность с открытым исходным кодомиEmbecosmПолем С тех пор мы постоянно продвигаемся к поддержке языка ржавчины в целом, и наша команда продолжала расти, когда около десятка участников, регулярно работающих над проектом. Мы участвовали в программе Google Summer of Code в течение последних четырех лет, и несколько студентов присоединились к этим усилиям.

Главная цельgccrsэто предоставить альтернативный вариант для составления ржавчины. GCC - старый проект, так как он был впервые выпущен в 1987 году. За эти годы он накопил многочисленные вклады и поддержку для нескольких целей, в том числе некоторые не поддерживаемые LLVM, основной бэкэнд, используемыйrustcПолем Практическим примером этого охвата является домашняя сцена Dreamcast, где страстные инженеры разрабатывают игры для консоли Dreamcast. Его процессорная архитектура Superh поддерживается GCC, но не LLVM. Это означает, что ржавчина не может использоваться на этих платформах, за исключением таких усилий, какgccrsилиrustc-codegen-gccБэкэнд - чьи основные различия будут объяснены позже.

GCC также выигрывает от десятилетий программного обеспечения, написанного на небезопасных языках. Таким образом, для проекта было разработано большое количество функций безопасности в качестве внешних плагинов или даже в рамках проекта в качестве статических анализаторов. Эти анализаторы и плагины выполняются на внутренних представлениях GCC, что означает, что они являются языковыми, и, таким образом, могут использоваться на всех языках программирования, поддерживаемых GCC. Аналогичным образом, многие плагины GCC используются для повышения безопасности критических проектов, таких как ядро ​​Linux, которое недавно получило поддержку языка программирования Rust. Это делаетgccrsПолезный инструмент для анализа небезопасного кода ржавчины и, в целом, кода ржавчины, который должен взаимодействовать с существующим кодом C.

Мы также хотимgccrsчтобы быть полезным инструментом дляrustcСама помогая проделать усилия по спецификации ржавчины с помощью уникальной точки зрения - инструмента, пытающегося воспроизвести чужую функциональность, часто посредством тщательного эксперимента и чтения источников, где существующая документация не вдавалась достаточными деталями. Мы также находимся в процессе разработки различных инструментов вокругgccrsиrustc, для единственной цели обеспеченияgccrsтак же правильно, какrustc- что может помочь в обнаружении удивительного поведения, неожиданной функциональности или невысказанных предположений.

Мы хотели бы отметить, что наша цель в поддержке усилий по спецификации ржавчины не заключаетсяgccrsНаша главная цель - внести свой вклад в это, просмотрев и добавив к ней как можно больше.

Кроме того, проект по -прежнему «молодой», и все еще требует огромного объема работы. Есть много мест, где можно сделать свой след, и много простых вещей, над которыми можно работать для участников, заинтересованных в компиляторах. Мы стремились создать безопасное, веселое и интересное пространство для всей нашей команды и наших студентов GSOC. Мы призываем всех, кто заинтересован в том, чтобы пообщаться с нами на нашихРазличные коммуникационные платформыи предложите наставничество для вас, чтобы узнать, как внести свой вклад в проект и компиляторы в целом.

Может быть, что еще более важно, есть ряд вещей, которыеgccrsне для. Проект имеет несколько явных негибелей, которые мы ценим так же высоко, как и наши цели.

Наиболее важным из этих не предстоящих является дляgccrsНе стать воротом для альтернативного или расширенного языка программирования, подобного ржавчине. Мы не хотим создавать специфичную для GNU версию Rust, с различной семантикой или немного различной функциональностью.gccrsне является способом внедрить новые функции ржавчины и не будет использоваться для обхода процесса RFC - который мы будем использовать, если мы хотим увидеть что -то введенное в Rust. Ржавчина не C, и мы не собираемся вводить тонкие различия в стандарте, делая некоторые функции доступными только дляgccrsпользователи. Мы знаем о боли, вызванной специфичными для компилятора стандартов, и учились из истории более старых языков программирования.

Мы не хотимgccrsбыть конкурентомrustc_codegen_gccБэкэнд. Хотя оба проекта эффективно достигнут одной и той же цели, которая заключается в составлении кода ржавчины с использованием структуры компилятора GCC, существуют тонкие различия в том, что каждый из этих проектов будет разблокировать для языка. Например,rustc_codegen_gccпозволяет легко извлечь выгоду из всехrustcУдивительная диагностика и полезные сообщения об ошибках, и делает ржавчину легко полезной на платформах, специфичных для GCC.

С другой стороны, это требуетrustcбыть доступным в первую очередь, тогда какgccrsявляется частью отдельного проекта полностью.

Это важно для некоторых пользователей и, например, разработчиков Linux, которые считают, что возможность компилировать все ядро ​​(C и ржавчины) с использованием одного компилятора очень важна.gccrsтакже может предложить больше точек входа плагина, благодаря тому, что он является собственным отдельным фронтом GCC. Это также позволяет использовать ржавчину на платформах, специфичных для GCC, со старым GCC, гдеlibgccjitнедоступен. Тем не менее, мы очень хорошие друзья с людьми, работающими надrustc_codegen_gcc, и помогали друг другу несколько раз, особенно в работе с процессом вклада на основе патчей, который использует GCC.

Все это связано с гораздо более глобальной целью, которую мы могли бы суммировать как следующее: мы не хотим разделять экосистему ржавчины. Мы хотимgccrsЧтобы помочь языку охватить еще больше людей и еще больше платформ.

Чтобы убедиться, что мы приняли несколько мер, чтобы убедиться, что значения проекта Rust соблюдаются и выставлены должным образом. Одна из особенностей, о которой мы чувствуем наиболее сильно, - это добавление очень раздражающего флага командной строки к компилятору,-frust-incomplete-and-experimental-compiler-do-not-useПолем Без этого вы не можете скомпилировать код сgccrsи компилятор выведет следующее сообщение об ошибке:

CRAB1: Фактальная ошибка: GCCRS еще не способна правильно скомпилировать код ржавчины. Большинство произведенных ошибок будут ошибкой GCCR, а не ящиком, который вы пытаетесь скомпилировать. Из -за этого, пожалуйста, сообщите о ошибках непосредственно нам, вместо того, чтобы открывать вопросы в репозитории Crate.

Наш репозиторий GitHub: https://github.com/rust-gcc/gccrs

Наш трекер Bugzilla: https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=открыть& Component = Rust & Product = GCC

Если вы это понимаете и понимаете, что созданные двоичные файлы могут не вести себя соответственно, вы можете попытаться использовать GCCR экспериментально, пропустив следующий флаг:

-frust-incomplete-and-experimental-compiler-do-not-use

или путем определения следующей переменной среды (любое значение подойдет)

GCCRS_INCOMPLETE_AND_EXPERIMATAL_COMPILER_DO_NOT_USE

Для грузов-GCCR это означает проход

Gccrs_extra_args = "-Frust-infoplete и expreimental-compiler-do-not-uncy"

как переменная среды.

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

Наша цель создания альтернативного компилятора для языка ржавчины не должна оказывать негативного влияния на любого члена сообщества Rust. Конечно, этот флаг командной строки не по вкусу всех, и в его присутствии произошел значительный откат ... но мы считаем, что это хорошее представление о наших основных ценностях.

В аналогичной вене,gccrsОтделяется от остальной части проекта GCC, не используя список рассылки в качестве основного режима связи. Компилятор, который мы строим, будет использоваться сообществом Rust, и мы считаем, что мы должны облегчить этому сообществу связаться с нами и сообщить о проблемах, с которыми они сталкиваются. Поскольку Rustaceans используются для GitHub, это также платформа разработки, которую мы использовали в течение последних пяти лет.

Точно так же мы используемЭкземпляр зулипаКак наша основная коммуникационная платформа и поощряйте любого, кто хочет пообщаться с нами, присоединиться к ней. Обратите внимание, что у нас все еще есть список рассылки, а также канал IRC (gcc-lust@gcc.gnu.org и #gccrust наoftc.net), где все приветствуются.

Чтобы еще больше гарантировать, что GCCRS не создает трения в экосистеме, мы хотим быть чрезвычайно осторожны с более тонкими деталями компилятора, что для нас означает повторное использованиеrustcКомпоненты, где это возможно, обмениваясь усилиями на эти компоненты и широко общаются с экспертами ржавчины в сообществе. Два компонента ржавчины уже используютсяgccrs: немного более старая версияpolonius, проверка заемrustc_parse_formatящик компилятора. Есть несколько причин для повторного использования этих ящиков, причем основной является правильность.

Проверка заимствования - это сложная тема и столб языка программирования ржавчины. Имея тонкие различия междуrustcиgccrsЧто касается правил заимствования, было бы раздражающим и непродуктивным для пользователей, но прилагая усилия, чтобы начать интеграциюpoloniusВ наш компиляционный конвейер мы помогаем обеспечить, чтобы результаты, которые мы производим, будут эквивалентныrustcПолем

Вы можете прочитать больше о различных компонентах, которые мы используем, и мы планируем повторно использовать еще большездесьПолем Мы также хотели бы внести свой вклад вpoloniusСам проект и помогите сделать его лучше, если это возможно. Это перекрестное опыление компонентов, очевидно, принесет нам пользу, но мы считаем, что оно также будет полезно для проекта Rust и экосистемы в целом, и поможет укрепить эти реализации.

Повторное использованиеrustcКомпоненты также могут быть распространены на другие области компилятора: различные компоненты типовой системы, такие как решатель признаков, существенный и сложный кусок программного обеспечения, могут быть интегрированы вgccrsПолем Более простые вещи, такие как анализ, как мы делали для анализатора формирования строки и встроенного анализатора сбора, также имеют смысл для нас. Они помогут обеспечить, чтобы внутреннее представление, с которым мы имеем дело, будет соответствовать тому, что ожидается Стандартной библиотекой Rust.

В последнее время мы считаем, что одним из самых важных шагов, которые мы могли бы предпринять для предотвращения поломки в экосистеме ржавчины, является дальнейшее улучшение наших отношений с сообществом Rust. Количество помощи, которую мы получили от Rust Pelles, это здорово, и мы думаемgccrsМожет быть интересным проектом для широкого спектра пользователей. Мы хотели бы услышать о ваших надеждах на проект и ваши идеи по сокращению поломки экосистемы или снижению трения с помощью опубликованных вами ящиков.

Мы прекрасно провели время, общавшисьgccrsВ Rustconf 2024, и все интерес к проекту были душевными. Пожалуйста, свяжитесь с нами, если у вас есть какие -либо идеи о том, как мы могли бы внести свой вклад в Rust.


Артур Коэн от имени проекта GCCRS

Также опубликованоздесь

ФотоХао ВаннаНеспособный


Оригинал
PREVIOUS ARTICLE