GCC Получает Награду От ACM И Взрыв От Лайнуса


Почтенный компилятор GCC попал в новости, получив награду от ACM и привлек типичный взрыв риторики Линуса Торвальдса за «интересную» ошибку.

GCC существует уже некоторое время, и удивительно, что за свою 30-летнюю историю она не получила награду ACM за программное обеспечение для языков программирования. В конце концов, проект LLVM получил награду от ACM два года назад, и это подросток в возрасте около 10 лет. 

Цитата из премии говорит обо всем:

«Коллекция компиляторов GNU (GCC) предоставляет портативный, качественный, совместимый со стандартами, высоко оптимизирующий компилятор, поддерживающий больше архитектур, языков программирования и операционных сред, чем любой другой сопоставимый инструмент. Он предоставляет набор инструментов, который лежит в основе всех дистрибутивов GNU/Linux, популярных веб-сайтов и встроенных сред.

GCC обеспечивает основу для многочисленных экспериментов по разработке языков программирования, включая ранний язык C++, многочисленные эволюции стандартов C и C++, параллельное программирование с OpenMP и язык программирования Go. GCC использовался во многих исследовательских проектах, что привело к публикациям с высокой отдачей и вкладу в магистраль разработки, включая сложный выбор инструкций на основе декларативных описаний машин, методов автоматической настройки, транзакционной памяти и оптимизации гнезд многогранных циклов.»

Вместе со славой приходит небольшое состояние в виде 2500 долларов, которые жертвуются в Фонд FSF — на самом деле этого недостаточно, не так ли?

В то же самое время, когда его хвалили за экспериментальный и сложный подход к оптимизации, Линус Торвальдс оторвал полоску от того же программного обеспечения за ошибку, которая влияет на ядро Linux. Если вы вообще что-нибудь знаете о Лайнусе, вы будете ожидать грубых или откровенных излияний, которые он вызвал. 

«Хорошо, итак, я смотрю на генерацию кода, а ваш компилятор-чистое и полное дерьмо.

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

Здесь мы говорим о «ленивце, которого уронили на голову в детстве».:»

Далее в сообщении в Списке рассылки ядра Linux подробно объясняется ошибка и то, как она взаимодействует с другой ошибкой. В случае, если вы не разбираетесь в деталях оптимизации компилятора, а не многие из нас, критика «выбрасывания константы» связана с распределением регистров. В идеале вы хотели бы сохранить данные, которые часто используются в регистре, но иногда у вас заканчиваются регистры, и вам приходится «сливать» содержимое регистра обратно в память. Все это прекрасно, но константы никогда не меняют своего значения, поэтому вам не нужно загружать регистр с константой или возвращать константу обратно в память. Константа может быть реализована как данные немедленного режима, и поэтому ей никогда не нужно быть в регистре, не говоря уже о том, чтобы удалить его, чтобы освободить регистр. Тот факт, что константа разливается в x86 или аналогичной архитектуре, действительно является ошибкой генерации кода. 

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

Однако два основных момента заключаются в том, что ошибка находится не в ядре Linux, а в компиляторе; и что команда ядра должна вернуться к более ранней версии. 

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

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

Также важно напомнить программистам GCC, что то, над чем они работают, является краеугольным камнем многих вещей, которые мы создаем, и, хотя оптимизация желательна, правильная генерация кода имеет важное значение. Экспериментирование-это то, как вы выигрываете награды ACM. Создание надежного кода-это способ избежать пробуждения Лайнуса.

И животное на логотипе GCC-это GNU, а не Ленивец.


Добавить комментарий