Clang

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:03, 4 июня 2019.
Clang
Llvm-logo.jpg
Разработчик Apple
Написана на C++
Линейка ОС Компилятор
Состояние разработки Активное
Дата первого релиза 25 февраля 2009 года
Последний релиз 7.0.1 / 21 декабря 2018 года
Целевой маркетинг Мировой рынок
Доступно в Мультиязычная
Платформы Кроссплатформенный
Лицензия Лицензия Университета Иллинойса
Официальный веб-сайт http://clang.llvm.org/

Clang - это компилятор языков Си, С++, который транслирует исходный код в объектный код LLVM, а затем фреймворк уже проводит его оптимизацию и генерацию конечного кода. Clang хорошо интегрируется в графическую среду разработки, позволяет создавать более понятные сообщения об ошибках, а также поддерживает большинство опций GCC.

История

Разработка набора компиляторов LLVM Clang началась в 2003 году. LLVM - это не компилятор какого-либо определенного языка, а скорее основа, которая используется для генерации объектного кода для любого вида исходного кода. Проект содержит широкий спектр инструкций, поэтому это отличный способ разработки компиляторов. которые охватывают все типы аппаратных платформ.

Лицензирование и обработка

Clang распространяется под более свободной лицензией - MIT/BSD, пользователь может использовать код проекта в коммерческих целях или даже закрытых программах. Проект начал разрабатываться в университете штата Иллинойс, и спонсировался корпорацией Apple Inc. [Источник 1].

Описание

Проект Clang предоставляет языковой интерфейс и инфраструктуру инструментов для языков в семействе языков C (C, C ++, Objective C / C ++, OpenCL, CUDA и RenderScript) для проекта LLVM . Предоставляются как GCC-совместимый драйвер компилятора ( clang ), так и MSVC-совместимый драйвер компилятора ( clang-cl.exe ).

Особенности и цели

  • Особенности конечного пользователя:
  1. Быстрая компиляция и низкое использование памяти.
  2. Экспрессивная диагностика.
  3. Совместимость с GCC.
  • Утилита и приложения:
  1. Архитектура на основе библиотек.
  2. Поддержка разных клиентов.
  3. Интеграция с IDE.
  4. Используйте лицензию LLVM 'BSD'.

Дизайн

  1. Реальный качественный компилятор.
  2. Простой код.
  3. Единый унифицированный парсер для C, Objective C, C ++ и Objective C ++.
  4. Соответствие C / C ++ / ObjC.

Задачи

Основной задачей компании, это сделать Clang быстрым, легким и масштабируемым. Архитектура clang на основе библиотек упрощает определение времени и профиля затрат каждого слоя стека, а драйвер имеет ряд опций для анализа производительности. Многие подробные тесты можно найти в Интернете. Производительность компиляции важна, но при использовании clang в качестве API, часто использование памяти становится еще более значительным: чем меньше памяти занимает код, тем больше кода вы можете поместить в память за раз (полезно, например, для инструментов анализа всей программы).

  • Выразительная диагностика.

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

  • GCC Совместимость

В настоящее время GCC является стандартным компилятором с открытым исходным кодом, и он регулярно компилирует огромный объем кода. GCC поддерживает огромное количество расширений и функций (многие из которых не документированы), и для сборки требуется множество файлов кода и заголовочных файлов.

  • Утилита и приложения.

Основной концепцией дизайна для clang является использование библиотечной архитектуры. В этом проекте различные части внешнего интерфейса могут быть четко разделены на отдельные библиотеки, которые затем могут быть смешаны для различных нужд и областей применения. Кроме того, основанный на библиотеках подход поощряет хорошие интерфейсы и облегчает участие новых разработчиков (потому что им нужно только понимать маленькие кусочки общей картины). В настоящее время Clang разделен на следующие библиотеки и инструменты:

  1. libsupport - базовая библиотека поддержки, от LLVM.
  2. libsystem - системная библиотека абстракций, от LLVM.
  3. libbasic - диагностика, SourceLocations, абстракция SourceBuffer, кэширование файловой системы для исходных файлов.
  4. libast - предоставляет классы для представления C AST, системы типов C, встроенных функций и различных помощников для анализа и управления AST (посетители, симпатичные принтеры и т. д.).
  5. liblex - лексирование и предварительная обработка, хэш-таблица идентификаторов, обработка прагмы, токены и расширение макроса.
  6. libparse - разбор ошибок.
  7. libsema - семантический анализ. Это обеспечивает набор действий анализатора для создания стандартизированного AST для программ.
  8. libcodegen - оптимизация и генерация кода.
  9. librewrite - редактирование текстовых буферов (важно для преобразования переписывания кода, например, рефакторинг).
  10. libanalysis - поддержка статического анализа.
  • Интеграция с IDE

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

  • Простой код

Главная цель компании - дать возможность любому, кто имеет базовое понимание компиляторов и практические знания языков C / C ++ / ObjC, понимать и расширять исходную базу Clang. Большая часть этого выпадает из их решения сделать так, чтобы AST как можно точнее отражал языки: у вас есть дружественное выражение if для оператора, выражения в скобках, структур, объединений и т.д., Все они представлены в простой и явной форме. В дополнение к простому дизайну разработчики работают над тем, чтобы сделать исходную базу доступной, хорошо прокомментировав ее, включая ссылки на языковые стандарты, где это уместно, и разработку кода для простоты. Помимо этого, clang предлагает набор дамперов, принтеров и визуализаторов AST, которые позволяют легко вводить код и видеть, как он представлен. Единый унифицированный парсер для C, Objective C, C ++ и Objective C ++ Clang - это «интерфейс семейства языков C», что означает, что разработчики намерены поддерживать самых популярных членов семейства C. Разработчики убеждены, что правильной технологией синтаксического анализа для этого класса языков является ручной анализатор рекурсивного спуска. Поскольку это простой код C ++, рекурсивный спуск облегчает понимание кода новыми разработчиками, он легко поддерживает специальные правила и другие странные хаки, необходимые для C / C ++, и делает его простым для реализации превосходной диагностики и ошибок. восстановлении [Источник 2].

Принцип работы

В большинстве случаев, Clang запустит препроцессор и парсит исходник, превращая его в абстрактное синтаксическое дерево (AST). C AST работать гораздо проще, чем с исходным кодом, но пользователи всегда смогут получить ссылки на исходник. Фактически, каждая структура в Clang-е, используемая для представления кода (AST, CFG и т.п.), всегда имеет ссылку на оригинальный исходник, полезный для целей анализа, рефакторинга и т.п. Если пользователям нужно анализировать и модифицировать код на уровне исходника, Clang лучше, чем LLVM. Анализ с помощью LLVM означает, что вы можете использовать язык внутреннего представления LLVM, похожий на ассемблер.

Clang AST

Практически каждый компилятор и статический анализатор использует AST для представления исходного кода. AST, используемое в Clang, очень детализированное и сложное, но вы получите удовольствие, изучая различные классы элементов Clang AST. Ниже приводится краткое введение в Clang AST, но самый простой путь изучить его, это просто делать дампы AST для простых исходников, и смотреть, какое AST им соответствует. В общем, Clang AST сделано из двух очень гибких классов: Decl и Stmt. У обоих есть множество подклассов, вот несколько примеров:

  • FunctionDecl — прототип или объявление функции

BinaryOperator — бинарный оператор, например (a + b).

  • CallExpr — вызов функции, например, foo(x).

Большинство классов имеют «говорящие» имена, например, ForStmt, IfStmt, и ReturnStmt. Вы поймёте суть AST, поиграв с ним несколько минут. Вы можете найти документацию по классам AST, поискав что-либо вроде “Clang FunctionDecl.”

Использование Clang

Clang может использоваться как прямая замена GCC и предлагает несколько крутых инструментов статического анализа. Программист сможет получить доступ к всей мощи clang, используя его как библиотеку одним из трёх способов, в зависимости от того, как решит пользователь.

Clang Plugin

Плагин запускается путём передачи соответствующих опций системе компиляции (Clang, Make и т.п.) через аргументы командной строки. Это похоже на то, как пользователь включает оптимизацию в GCC (т.е. "-O1"). Пользователь может запустить какую-либо свою задачу до или после того, как исходный файл будет проанализирован.

LibTooling (Clang Tool)

LibTooling используется для запуска некоторого анализа на исходном коде (с множеством файлов, при желании) без запуска обычного процесса компиляции. Новый экземпляр кода для анализа (и новый AST) будет создан для каждого нового файла исходника (как и в случае Clang Plugin), но пользователь может сохранять контекстную информацию между файлами исходников в своих глобальных переменных. Так как у пользователей есть функция main(), вы можете запускать какие-либо задачи перед или после того, как clang завершит анализ ваших исходных файлов.

LibClang

LibClang хорош тем, что это стабильный API. Clang периодически меняется, и если пользователь использует Plugin или Libtooling, то нужно будет править код, чтобы отслеживать эти изменения. Если нужен доступ к Clang API из языков, отличных от C++ (например, из Python), то пользователь должен использовать LibClang [Источник 3].

Источники

  1. СРАВНЕНИЕ GCC VS CLANG // Losst. [2019]. Дата обновления: 23.12.2018. URL:https://losst.ru/sravnenie-gcc-vs-clang (дата обращения 04.06.2019).
  2. Clang - Features and Goals // Clang. [2019]. Дата обновления: 03.04.2019. URL:http://clang.llvm.org/features.html (дата обращения 04.06.2019).
  3. Clang. Часть 1: введение // habr. [2019]. Дата обновления: 12.07.2018. URL:https://m.habr.com/ru/post/354718/ (дата обращения 04.06.2019).