Подтвердить что ты не робот

Почему clang больше не используется?

Раньше я делал довольно много программирования на C/С++, но в настоящее время он учитывает лишь небольшой процент программирования, который я делаю (языки сценариев намного лучше подходят для большой работы, которую я выполняю). Последние несколько дней я работал над некоторыми проектами программирования C и был удивлен, сколько маленьких синтаксических деталей я забыл. Хуже всего то, что cc/gcc обычно имели загадочные или неинформативные сообщения об ошибках об этих проблемах (извините, я не могу вспомнить какие-либо конкретные примеры).

Я недавно узнал о компиляторе clang и решил попробовать. Сообщения об ошибках были намного яснее и помогли мне определить и устранить проблемы в моем синтаксисе. Мой вопрос в том, почему этот инструмент не используется/не упоминается больше, чем он есть? Неужели это так по сравнению с обычными подозреваемыми (cc/gcc), или он не поддерживает функции, которые они поддерживают, или их просто сложнее получить? Мне тяжело полагать, что последний, поскольку он был установлен с помощью инструментов dev на моем iMac и потребовал одну команду (sudo apt-get install clang) для установки в моем поле Ubuntu.

4b9b3361

Ответ 1

Мой вопрос в том, почему этот инструмент больше не используется/не упоминается?

Это, вероятно, из-за истории, и потому, что мы, как правило, ведем себя.

Традиционно gcc был единственным реальным (свободным) компилятором, который может быть практически использован для компиляции программ C по крайней мере во всех свободных * nix-клонах. Это то, что практически все базовая система и ядро ​​Linux, * BSD, теперь, вероятно, OSX и другие компилируются с помощью.

В то время как недостатки здесь и там, в основном это означает: gcc работает. И если он не сломан, не исправляйте его. Из этого вы теперь имеете огромную базу пользователей, легко получить помощь с gcc, там много людей, которые использовали gcc, которые работают с самим gcc и т.д.

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

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

Хотя, если вы предпочитаете использовать clang, идите на это - сообщения об ошибках действительно "лучше" и проще понять vs gcc.

Ответ 2

Передняя часть clang относительно новая. Например, 2.8 релиз в октябре 2010 года отмечает завершение поддержки С++ 98/03.

Похоже, что с ростом зрелости будет все более широкое распространение. Например, продолжается работа по созданию ОС FreeBSD (и других ОС BSD) с помощью clang, что исключает зависимость от GCC/g++.

Apple подталкивает комбинацию LLVM/clang. Похоже, что они перестанут поддерживать свою старую ветку привязки GCC (на основе 4.2) и зависят только от инструментов clang для разработки OSX/iOS.

Clang также видит все большее применение в пользовательских компиляторах для C-подобных языков (например, компиляторы шейдерного языка для OpenCL)

Ответ 3

LLVM существует некоторое время, но, по крайней мере, на моей шее в лесу, он совсем недавно поднялся на известность, возможно, из-за того, что Apple в последнее время сильно подталкивает к замене gcc на Clang in их собственную цепочку инструментов.

Кроме того, я считаю, что поддержка С++ только недавно стала производственной. EDIT: Похоже, что это еще не так. (См. Комментарии ниже.)

Еще один фактор может заключаться в том, что LLVM в значительной степени опирается на одного поставщика, к которому разработчики не-Apple имеют врожденное недоверие.

Ответ 4

Мой вопрос в том, почему этот инструмент не используется/не упоминается больше, чем он есть? Неужели это так новое по сравнению с обычными подозреваемыми...

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

Ответ 5

Будучи студентом-программистом, я нахожу его полной находкой, главным образом благодаря полезным и понятным сообщениям об ошибках. Я использую его главным образом для программирования на C, хотя я начинаю встраиваться в С++, также используя Clang.

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

В целом я очень рекомендую Clang для использования как студентами, так и разработчиками. Так как теперь он является официальным компилятором для Apple и Xcode, я подозреваю, что он используется, и распознавание имен будет быстро срабатывать. FreeBSD, похоже, также приняла его в качестве основного компилятора, хотя я подозреваю, что это будет иметь меньшее влияние на его популярность, чем его принятие Apple.

Добавление: Из-за конкуренции со стороны Клана ясность сообщений об ошибках в GCC 4.8 и 4.9 показала значительное улучшение; хотя я все еще нахожу Кланг немного более ясным, разрыв, однако, значительно сузился.

Ответ 6

Сегодня clang заменяет gcc в большинстве places. то есть большинство * NIX-подобных операционных систем и дистрибутивов Linux. Некоторые примеры - FreeBSD, Minix и mac (немного очевидный) clang, который переключил clang как компилятор по умолчанию. Некоторые из моих друзей тоже, когда я показал им.

Это ИМХО, похоже, у некоторых народов были проблемы с ним, вероятно, в более старых версиях. Но с clang версии 3.0 у меня нет никаких проблем. Как я уже говорил, я использую его во всех моих новых проектах. Почти мой компилятор по умолчанию, иногда я делаю make C=gcc только для того, чтобы увидеть, как разница с clang error/warning. И clang побеждает когда-либо. С лучшими объяснениями и прилагайте большие усилия для оптимизации. Он включает в себя предложения по использованию расширений (некоторые из них - gcc inerhid) компилятора для наилучшей работы в генерации кода.

Я написал тривиальную функцию, которая выводит сообщение об ошибке. Но я должен был выйти из программы после того, как напечатал сообщение об ошибке на стандартном выходе. Итак, я делаю простую модификацию, поставьте exit(1) в качестве последнего оператора в функции. Как показано ниже:

void error(const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  fprintf(stderr, "error: ");
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  exit(1);
}

Итак, шоу clang

предупреждение: функция 'error' может быть объявлена ​​с атрибутом 'noreturn' [-Wmissing-noreturn] `

(gcc не производит его даже не с флагами -Wall -Wextra -Wunreachable-code -O3)

Я говорю: "Кажется, что это приятно. Но что такое" nonreturn "атрибут? Я никогда не буду слушать или читать об этом. Я перехожу на Google и искал clang could be declared with attribute 'noreturn' (о, да, я мог просто написать clang nonreturn attribute, но забудьте об этом), и я нашел ссылку this с хорошим объяснением того, что это за атрибут и возможный прирост производительности, получить.

Итак, я запускаю, чтобы добавить этот атрибут к прототипу моей функции (конечно, если это компилятор gcc или clang, макросы будут выполнять обнаружение трюков). О да, для меня, любой небольшой прирост производительности (конечно, не делая код нечитаемым) это победа.

И не заканчивается здесь, год назад, я делаю return в функции, где, очевидно, является переключателем по умолчанию, определенным для обработки (как в функции error() здесь). Но даже в этом случае gcc ссылается на функцию без возвращаемого значения (извините, я не помню точно сообщение об ошибке/предупреждении), как это возможно? больше нет инструкций после переключения, если не встречается совпадение, значение по умолчанию выполняется и не имеет значения для приведенных ниже инструкций, если таковые имеются. Но clang думает иначе, как и я, и предупреждаю об этом заявлении, помогая мне улучшить код.

И для этой очень маленькой вещи я люблю кланг. (Примечание: Извините за мой плохой английский. Английский - это не мой родной язык, но, несмотря на это, я пытаюсь выразить здесь).