Привет, Хабр!
Не знаем, насколько жарко у вас за окном, но у нас в JetBrains эти недели точно жара — релизная. Одну за другой мы опубликовали обновленные версии 2018.2 почти всех наших инструментов на базе платформы IntelliJ: WebStorm, IntelliJ IDEA, PyCharm, DataGrip, GoLand, PhpStorm, RubyMine и CLion.
Для команды CLion этот релиз особенный, так как включает в себя результаты нашей работы по трем очень важных направлениям:
А также поддержка Google Sanitizers, возможность пересборки отдельного файла и многое другое!
Ниже мы поговорим про улучшения и нововведения подробно, а самые нетерпеливые могут прямо сейчас скачать бесплатную 30-дневную версию с нашего сайта и попробовать новые возможности на своем проекте или специально подготовленном демо-проекте с GitHub.
Еще в марте мы рассказали вам, что рассматриваем различные альтернативные варианты языкового движка для CLion. Это и понятно — хочется и принципиально улучшить поддержку текущих языковых возможностей, и быстрее добавлять свежие фишки C++, и писать больше крутых и специфичных для C++ рефакторингов и пр. Для всего этого нужен точный и быстрый парсер кода.
Мы продолжаем улучшать наш текущий парсер, методично вытравливая разнообразные ошибки и недочеты. А в дополнение мы решили попробовать сделать еще один языковой движок на базе clangd (это такая реализация LSP протокола для clang).
Если сразу переходить к результатам — в CLion 2018.2 в дополнение к основному языковому движку работает еще и новый, экспериментальный, на clangd. Мало того, мы так осмелели, что включили его по умолчанию на Linux и macOS. На Windows, к сожалению, обнаружилась неприятная особенность работы clangd с памятью, и мы по умолчанию выключили новый движок на этой платформе (но с высокой вероятностью это будет исправлено уже в первых минорных обновлениях на версию 2018.2).
Включить/выключить экспериментальный парсер кода на основе clangd можно в настройках Settings/Preferences | Languages & Frameworks | C/C++ | Clangd:
Важно понимать:
Предупреждая ваши вопросы, сразу скажу, что да, мы планируем пробовать переводить другие умные возможности IDE на clangd, но сначала надо стабилизировать текущее решение, провести еще множество тестов и решить множество сложных и принципиальных вопросов на этом пути.
Когда функция принимает несколько параметров одинакового типа, бывает легко ошибиться и незаметно для себя (и компилятора) поменять местами аргументы одного типа при вызове этой функции. Такие ошибки тяжело отлавливать, а значит их стоимость высока. Но в CLion 2018.2 мы реализовали новую проверку кода (inspection) специально для таких случаев. Она использует эвристический алгоритм для анализа имен параметров и аргументов функции и способна обнаружить ситуации, когда порядок аргументов ошибочно изменен:
Важно:
В этом релизе мы целенаправленно изводили подвисания IDE (UI freezes) в целом ряде случаев: при автодополнении, в поиске Search Everywhere, в навигации на связанный символ (которая как правило используется для переключения между исходным файлом и заголовочным и обратно), при использовании хлебных крошек (breadcrumbs) для навигации. Первые пользователи релиза, а также многочисленные участники нашей программы раннего доступа (Early Access Program) уже оценили улучшения и подтверждают, что поведение IDE существенно улучшилось, а подвисаний стало значительно меньше. Работа в этом направлении будет продолжена и в 2018.3.
К тому же, мы перевели встроенный форматтер кода на лексер. Конечно, при работе через парсер (как раньше) его результат более точен, но вот время работы значительно увеличивается. А так как форматирование кода в CLion происходит в тот момент, когда вы печатаете код, подвисания тут могут очень негативно отражаться на общем впечатлении о скорости работы IDE. Отзывчивость редактора падает, подвисания становятся заметными и так далее.
Форматтер на лексере работает довольно аккуратно, но если вы все же испытываете проблемы с форматированием на вашем коде, то во-первых, обязательно расскажите об этом нам, а во-вторых, вы всегда можете переключиться на более медленный, но и более точный форматтер на парсере — для этого есть опция cidr.indent.lexer.only.cpp в Registry.
До 2018.2 были следующие способы открыть проект в CLion:
К этому списку в 2018.2 мы добавили две новые опции:
Но в обоих случаях, как Gradle, так и compilation database, все умные функции по работе с кодом доступны! И кстати, опция compilation database интересна тем, что фактически теперь какой бы ни был у вас проект — Makefiles, Ninja, Qbs, любая ваша специфическая проектная модель — вы можете сгенерировать compilation database для вашего проекта и открыть его в CLion!
А мы тем временем продолжаем работу над API для добавления поддержки новых проектных моделей в CLion!
Кое-какие важные улучшения были сделаны и для CMake проектов. Самое главное – если ваши заголовочные файлы, расположенные внутри директории вашего проекта, используются в файлах проекта и подключены через директиву
Второе важное улучшение связано с настройкой внешних инструментов (external tools), которые можно затем вызывать как самостоятельно по команде, так и делать частью конфигураций запуска приложения. В них теперь доступны макросы, содержащие всяческие CMake переменные. Например, директория сборки или имя исполняемого файла:
Для Valgrind Memcheck, поддержанного в CLion еще в версии 2017.3, появилась возможность экспортировать и затем импортировать обратно результаты анализа:
Также в этой версии в CLion появилась поддержка другого инструмента для динамического анализа кода — Google Sanitizers. Для их включения нужно явно указать специальный ключ
В нем можно просматривать не только список найденных ошибок, но и исходный код (и навигироваться на него), изучать информацию о фрейме, смотреть трассу ошибок. Более подробно про поддерживаемые sanitizers и настройки в CLion читайте в нашем блог посте на английском.
Для проектных моделей CMake и compilation database в CLion 2018.2 есть возможность пересобрать один файл, не вызывая пересборку всего проекта. Для этого есть действие в меню Run — Recompile, или можно воспользоваться комбинацией клавиш Shift+Ctrl+F9 на Linux/Windows, ⇧⌘F9 на macOS (в раскладках по умолчанию):
Данная возможность — отличный способ быстро проверить, что ваши текущие изменения в файле не сломали сборку всего проекта. Если интересны детали, какая именно команда компиляции вызывается и как выбирается тип сборки, можно почитать подробно в нашем блоге.
По результатам нашего опроса в Twitter, многие пользователи CLion обращаются к тем или иным базам данных при разработке проекта на C/C++. Поэтому с этого релиза в нашу IDE включен плагин для работы с базами данных и кодом на SQL. Он является полным функциональным аналогом нашей среды для работы с базами данных — DataGrip. Так что вот этот пост здесь на Хабре от moscas про нововведения в DataGrip 2018.2 вам тоже может быть интересно почитать.
Коротко о других улучшениях:
Традиционное видео о новых возможностях CLion 2018.2 на английском языке от нашего девелопер-адвоката:
И кстати, до среды, 1 августа 2018, 19:05 по Москве (GMT+3), мы дарим скидку 50% на все продукты JetBrains Toolbox.
Вопросы? Будем рады ответить в комментариях!
Ваша команда JetBrains CLion
The Drive to Develop
Не знаем, насколько жарко у вас за окном, но у нас в JetBrains эти недели точно жара — релизная. Одну за другой мы опубликовали обновленные версии 2018.2 почти всех наших инструментов на базе платформы IntelliJ: WebStorm, IntelliJ IDEA, PyCharm, DataGrip, GoLand, PhpStorm, RubyMine и CLion.
Для команды CLion этот релиз особенный, так как включает в себя результаты нашей работы по трем очень важных направлениям:
- Clangd как основа для нового экспериментального движка для разбора кода на C++.
- Улучшения производительности IDE за счет новых архитектурных решений.
- Новые проектные модели, поддерживаемые в CLion.
А также поддержка Google Sanitizers, возможность пересборки отдельного файла и многое другое!
Ниже мы поговорим про улучшения и нововведения подробно, а самые нетерпеливые могут прямо сейчас скачать бесплатную 30-дневную версию с нашего сайта и попробовать новые возможности на своем проекте или специально подготовленном демо-проекте с GitHub.
Clangd для парсинга кода на C++ в CLion
Еще в марте мы рассказали вам, что рассматриваем различные альтернативные варианты языкового движка для CLion. Это и понятно — хочется и принципиально улучшить поддержку текущих языковых возможностей, и быстрее добавлять свежие фишки C++, и писать больше крутых и специфичных для C++ рефакторингов и пр. Для всего этого нужен точный и быстрый парсер кода.
Мы продолжаем улучшать наш текущий парсер, методично вытравливая разнообразные ошибки и недочеты. А в дополнение мы решили попробовать сделать еще один языковой движок на базе clangd (это такая реализация LSP протокола для clang).
Если сразу переходить к результатам — в CLion 2018.2 в дополнение к основному языковому движку работает еще и новый, экспериментальный, на clangd. Мало того, мы так осмелели, что включили его по умолчанию на Linux и macOS. На Windows, к сожалению, обнаружилась неприятная особенность работы clangd с памятью, и мы по умолчанию выключили новый движок на этой платформе (но с высокой вероятностью это будет исправлено уже в первых минорных обновлениях на версию 2018.2).
Включить/выключить экспериментальный парсер кода на основе clangd можно в настройках Settings/Preferences | Languages & Frameworks | C/C++ | Clangd:
Важно понимать:
- Парсер кода на основе clangd работает в параллели с собственным парсером CLion.
- Clangd используется только для показа ошибок и предупреждений в редакторе. Для всего остального (включая рефакторинги, исправления ошибок (quick-fixes), навигацию, автодополнение и пр.) используется собственный парсер CLion.
- Конфигурация ошибок и предупреждений Clang по умолчанию специально подобрана так, чтобы показывать довольно много предупреждений о потенциальных ошибках, но при этом не противоречить тем инспекциям кода, которые работают в CLion на базе собственного парсера кода и включены по умолчанию.
Предупреждая ваши вопросы, сразу скажу, что да, мы планируем пробовать переводить другие умные возможности IDE на clangd, но сначала надо стабилизировать текущее решение, провести еще множество тестов и решить множество сложных и принципиальных вопросов на этом пути.
Новая проверка для кода на C++
Когда функция принимает несколько параметров одинакового типа, бывает легко ошибиться и незаметно для себя (и компилятора) поменять местами аргументы одного типа при вызове этой функции. Такие ошибки тяжело отлавливать, а значит их стоимость высока. Но в CLion 2018.2 мы реализовали новую проверку кода (inspection) специально для таких случаев. Она использует эвристический алгоритм для анализа имен параметров и аргументов функции и способна обнаружить ситуации, когда порядок аргументов ошибочно изменен:
Важно:
- Чтобы избежать ложных срабатываний, алгоритм отключается автоматически для очень коротких имен (менее 3 символов).
- По тем же причинам алгоритм отключается для функций, названия которых содержат подстроки swap/inverse/rotate/backward/flip.
- По ряду технических причин инспекция работает только при включенном экспериментальном парсере кода на clangd и к тому же только при включенном анализаторе кода clang-tidy через clangd (это все в настройках упомянутых выше Settings/Preferences | Languages & Frameworks | C/C++ | Clangd).
Производительность IDE
В этом релизе мы целенаправленно изводили подвисания IDE (UI freezes) в целом ряде случаев: при автодополнении, в поиске Search Everywhere, в навигации на связанный символ (которая как правило используется для переключения между исходным файлом и заголовочным и обратно), при использовании хлебных крошек (breadcrumbs) для навигации. Первые пользователи релиза, а также многочисленные участники нашей программы раннего доступа (Early Access Program) уже оценили улучшения и подтверждают, что поведение IDE существенно улучшилось, а подвисаний стало значительно меньше. Работа в этом направлении будет продолжена и в 2018.3.
К тому же, мы перевели встроенный форматтер кода на лексер. Конечно, при работе через парсер (как раньше) его результат более точен, но вот время работы значительно увеличивается. А так как форматирование кода в CLion происходит в тот момент, когда вы печатаете код, подвисания тут могут очень негативно отражаться на общем впечатлении о скорости работы IDE. Отзывчивость редактора падает, подвисания становятся заметными и так далее.
Форматтер на лексере работает довольно аккуратно, но если вы все же испытываете проблемы с форматированием на вашем коде, то во-первых, обязательно расскажите об этом нам, а во-вторых, вы всегда можете переключиться на более медленный, но и более точный форматтер на парсере — для этого есть опция cidr.indent.lexer.only.cpp в Registry.
Новые проектные модели: Gradle C++ и compilation database
До 2018.2 были следующие способы открыть проект в CLion:
- Открыть CMake проект.
- Открыть файл или целую папку, не имеющую CMake-файлов. При этом многие умные функции по работе с кодом окажутся отключены.
- Для кода на Rust при использовании Rust плагина в CLion можно использовать Cargo.
- Воспользоваться сторонним плагином к CLion для открытия проекта на Bazel.
К этому списку в 2018.2 мы добавили две новые опции:
- Открыть проект на Gradle, указав IDE местоположение файла build.gradle. Обращаем внимание, что CLion сейчас поддерживает только новый Gradle формат для проектов на C++:
- Открыть проект из compilation database, указав IDE местоположение файла compile_commands.json. Пока что в данном случае невозможна сборка и запуск проекта из CLion, так как compilation database не содержит информации о сборке проекта целиком.
Но в обоих случаях, как Gradle, так и compilation database, все умные функции по работе с кодом доступны! И кстати, опция compilation database интересна тем, что фактически теперь какой бы ни был у вас проект — Makefiles, Ninja, Qbs, любая ваша специфическая проектная модель — вы можете сгенерировать compilation database для вашего проекта и открыть его в CLion!
А мы тем временем продолжаем работу над API для добавления поддержки новых проектных моделей в CLion!
Улучшения CMake
Кое-какие важные улучшения были сделаны и для CMake проектов. Самое главное – если ваши заголовочные файлы, расположенные внутри директории вашего проекта, используются в файлах проекта и подключены через директиву
#include
, их больше не надо явно перечислять в CMake скриптах! CLion теперь сам пометит их как проектные, и все умные функции вроде рефакторингов и автодополнения будут доступны в таких файлах:Второе важное улучшение связано с настройкой внешних инструментов (external tools), которые можно затем вызывать как самостоятельно по команде, так и делать частью конфигураций запуска приложения. В них теперь доступны макросы, содержащие всяческие CMake переменные. Например, директория сборки или имя исполняемого файла:
Инструменты для динамического анализа кода
Для Valgrind Memcheck, поддержанного в CLion еще в версии 2017.3, появилась возможность экспортировать и затем импортировать обратно результаты анализа:
Также в этой версии в CLion появилась поддержка другого инструмента для динамического анализа кода — Google Sanitizers. Для их включения нужно явно указать специальный ключ
-fsanitize
в CMake скриптах вашего проекта, и тогда, в случае использования Clang версии не менее 3.8.0 или GCC версии не менее 5.0.0, CLion сможет автоматически обнаружить использование sanitizers и показать результаты их работы в специальном окне:В нем можно просматривать не только список найденных ошибок, но и исходный код (и навигироваться на него), изучать информацию о фрейме, смотреть трассу ошибок. Более подробно про поддерживаемые sanitizers и настройки в CLion читайте в нашем блог посте на английском.
Пересборка одного отдельного файла
Для проектных моделей CMake и compilation database в CLion 2018.2 есть возможность пересобрать один файл, не вызывая пересборку всего проекта. Для этого есть действие в меню Run — Recompile, или можно воспользоваться комбинацией клавиш Shift+Ctrl+F9 на Linux/Windows, ⇧⌘F9 на macOS (в раскладках по умолчанию):
Данная возможность — отличный способ быстро проверить, что ваши текущие изменения в файле не сломали сборку всего проекта. Если интересны детали, какая именно команда компиляции вызывается и как выбирается тип сборки, можно почитать подробно в нашем блоге.
Базы данных
По результатам нашего опроса в Twitter, многие пользователи CLion обращаются к тем или иным базам данных при разработке проекта на C/C++. Поэтому с этого релиза в нашу IDE включен плагин для работы с базами данных и кодом на SQL. Он является полным функциональным аналогом нашей среды для работы с базами данных — DataGrip. Так что вот этот пост здесь на Хабре от moscas про нововведения в DataGrip 2018.2 вам тоже может быть интересно почитать.
И это еще не все!
Коротко о других улучшениях:
- Мы забандлили новую версию отладчика LLDB 6.0 и новую версию CMake 3.12.
- К тому же в случае GDB CLion научился использовать pretty-printers для типов при показе указателей на переменные данного типа.
- Для WSL поддержаны фоновые процессы, что значительно облегчает запуск всей конфигурации CLion с WSL.
- Из IntelliJ-платформы CLion получил ряд улучшений в поддержке систем контроля версий, на платформе macOS поддержку MacBook Touch Bar и более темные заголовки окон, к тому же обновился весь ряд иконок в интерфейсе IDE.
Традиционное видео о новых возможностях CLion 2018.2 на английском языке от нашего девелопер-адвоката:
И кстати, до среды, 1 августа 2018, 19:05 по Москве (GMT+3), мы дарим скидку 50% на все продукты JetBrains Toolbox.
Вопросы? Будем рады ответить в комментариях!
Ваша команда JetBrains CLion
The Drive to Develop