Выпуск GCC 6 запланирован на март. Что нового в этой почтенной коллекции компиляторов?
Вы можете подумать, что после столь долгой работы больше нечего будет делать, но компилятор — вещь сложная и трудная для реализации, и всегда есть что-то, что можно сделать лучше. Со временем GCC добавил так много предупреждений о возможных проблемах с кодированием, что почти перешел в область анализа кода. Но подождите, что еще такое компилятор?
Последнее предупреждение, которое было реализовано, спасло бы Apple от ошибки SSL — Я СКАЗАЛ, что вы, Gotos опасны! — вызвано неправильным группированием gotos и if. Они были с отступом, как если бы goto был частью блока if, но это не так. GCC 6 проверяет синтаксис и сравнивает его с отступом и предупреждает программиста, если отступ не подходит. Возникает вопрос, почему, если правильный отступ может быть получен из синтаксиса, а не просто заставить компилятор обеспечить его соблюдение? Возможно, это слишком далеко до того, чтобы стать Python. Или, возможно, это скорее то, что сделала бы IDE.
Он также будет отмечать глупые логические условия, такие как сравнение объекта с самим собой, дублирование подпунктов и т. Д.
Теперь он также будет отмечать неопределенное поведение, если вы оставили сдвиг на отрицательное значение. Хотя можно утверждать, что C / C ++ на самом деле не должен быть таким расплывчатым в отношении того, что происходит во время такого перехода. Само понятие неопределенного поведения и его использование при оптимизации компилятора безумно. Если код является допустимым, он должен иметь единую смысловую интерпретацию.
Еще одно улучшение заключается в обнаружении и отметке разыменования нулевого указателя. Почему-то в этом случае недостаточно пометить предупреждение.
Интересно, что общий отчет об ошибках также был улучшен, чтобы указать диапазон, в котором может быть ошибка, и указать, где в строке может быть ошибка. Также новинкой являются подсказки «исправить», которые пытаются указать на ту часть кода, которую, вероятно, необходимо изменить. Наконец, своего рода попытка Intellisense после компиляции пометить имена полей с ошибками и предложить альтернативы.
Перечисленные новые функции немного эзотеричны, что соответствует зрелости компилятора. У нас улучшена поддержка OpenMP для параллельного программирования, и теперь вы можете указать порядок хранения «endian-ness» полей в структуре, и компилятор компенсирует это, если архитектура целевой программы будет делать все наоборот.
Настоящий прорыв из прошлого — это возможность работать с сегментированной архитектурой памяти. Линия процессоров x86 поддерживает сегментацию, но большинство современных сред программирования, начиная с 386, используют подкачку и линейное виртуальное адресное пространство. Даже в этом случае операционные системы должны манипулировать регистрами сегментов, и до сих пор для этого приходилось прибегать к помощи ассемблера. Теперь вы можете объявлять переменные относительно определенного сегмента.
Наконец, для C ++ теперь по умолчанию используется C ++ 14, и есть экспериментальная поддержка некоторых функций C ++ 17.
GCC — это большая система, в которой также есть множество оптимизаций и улучшений — ознакомьтесь с документацией, чтобы увидеть полный список.