LINUX.ORG.RU

Обзор инструментов для C/C++, поставляемых с FreeBSD

 , ,


1

0

Оригинал статьи на форониксе, ниже — вольный перевод.

На прошедшем в минувшие выходные FOSDEM в аудитории, посвящённой BSD, David Chisnall дал оценку поддержки стандартов C11 и C++11 во FreeBSD. Большая часть работ над поддержкой последних стандартов ведётся разработчиками компиляторов, а проект FreeBSD ищёт удачное применение улучшениям и новым возможностям.

Для тех, кто не следит за стандартами ISO, сделаем краткий обзор новых возможностей C11 (некоторые расширения сделаны опциональными из-за плохой поддержки C99 в компиляторе Microsoft):

  • static assert
  • стандартизированная поддержка многопоточности (_Thread_local и _Atomic, <threads.h> и <stdatomic.h>)
  • стандартизированная поддержка юникода (<uchar.h>)
  • выравнивание данных (спецификатор _Alignas, оператор alignof, функция aligned_alloc и <stdalign.h>)
  • косметические улучшения, такие как типизация в макросах с помощью _Generic

В свою очередь C++11 предоставляет:

  • static assert
  • стандартизированные умные указатели
  • потоки, атомарные переменные и TLS (хранилище переменных, видимых только в пределах потока).
  • улучшенную поддержку локалей
  • множество косметических и иных изменений

В данный момент проект FreeBSD поставляет GCC версии 4.2.1 (последняя версия, не перелицензированная под GPLv3) и объявил об отказе от него в будущем, поэтому статус поддержки C++11 в GCC в данном случае не имеет значения. LLVM/Clang, используемый во FreeBSD как системный компилятор, уже начал реализацию обоих стандартов (см. таблицу состояния C++11 в различных компиляторах). Clang в целом заменил GCC, оставшиеся доработки будут сделаны достаточно скоро. В качестве стандартной библиотеки используется libc++ (и libcxxrt), которая также является частью LLVM. Кроме того, есть некоторые специфичные для FreeBSD вещи

Файл sys/cdefs.h абстрагирует прежние расширения GNU, теперь ставшие частью C11. Также он:

  • воспроизводит имена C11, но не заменяет имена, если они предоставленны компилятором
  • может быть использован прямо сейчас для любого диалекта C/C++
  • используется остальными заголовочными файлами FreeBSD

Многопоточность в C11/C++11:

  • стандартный API управления потоками реализован для C++, но не для C
  • атомарные операции готовы (и в компиляторе, и в стандартной библиотеке)
  • TLS реализовано для C через ключевое слово __thread, в C++ проблемой остаются типы с нетривиальными конструктором/деструктором
  • _Noreturn готов
  • сохранение исключений в переменные (с возможностью передачи в другой поток) — готово, часть стандартной библиотеки.

Также к незавершённым вещам можно отнести поддержку юникода (<uchar.h> для C и <uchar> для C++) и даже некоторые функции <math.h> из C99. К завершённым — улучшения локалей из C++11 и POSIX 2008.

>>> Подробности

★★★★

Проверено: anonymous_incognito ()
Последнее исправление: quiet_readonly (всего исправлений: 3)

косметические улучшения, такие как типизация в макросах с помощью _Generic

Нифига себе косметика. Теперь templates есть в С. Для меня это значит - что С++ больше вообще мне не нужен в моих проектах.

anonymous
()

ищёт

Что-что делает?

Deleted
()
Ответ на: комментарий от Reset

А есть где-нибудь хорошие обзоры потенциальных возможностей буста? Пока кроме чужого кода и сухой документации не доводилось ничего видеть, к сожалению.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

Никогда не интересовался. Мне и официальной документации хватает.

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Теперь templates есть в С

_Generic - это даже не пародия на шаблоны.

tailgunner ★★★★★
()

В данный момент проект FreeBSD поставляет GCC версии 4.2.1 (последняя версия, не перелицензированная под GPLv3) и объявил об отказе от него в будущем

враги. такие же, как поттеринг, заявляющий, что кроме линукса ничего не существует.

anonymous
()

Так и не понял, про что собственно новость?
Про С++11 писали уже множество раз. Что FreeBSD переходит на clang тоже неоднократно обсасывали.

anonymoos ★★★★★
()
Ответ на: комментарий от anonymoos

Так и не понял, про что собственно новость?
Про С++11 писали уже множество раз. Что FreeBSD переходит на clang тоже неоднократно обсасывали.

+1. ППКС.

Manhunt ★★★★★
()
Ответ на: комментарий от Reset

В C++11 включена только малая часть буста.

Ага, диффуры еще из коробки не решает.

buddhist ★★★★★
()

В свою очередь C++11 предоставляет:

множество косметических и иных изменений

Там косметических изменений на небольшой пятитомник хватит. Там в либе есть:

  • регекспы
  • трединг (Очень удобный!)
  • атомарные операции
  • новые оптимальные контейнеры
  • type traits - позволяет создавать очень гибкий компайл-таймовый полиморфизм. Может включать/отключать код в зависимости от типа аргуметов функции, аргументов темплейтов класса, наличия методов у класса, в зависимости даже от типа возвращаемого значения какого-то метода и.т.п. (в стандартной либе описаны функции только проверки типов, а не проверки их внутренностей)... Сделано по-наркомански, но оно того стоит.

В языке:

  • foreach loop - это очень удобно: for (auto element : list) { ... }
  • auto
  • лямбды - sort(list.begin(), list.end(), [](Element a, Element b) { return a.field > b.field; });
  • очень хорошая замена typedef-синтаксису - using, которая теперь умеет и шаблоны (генерики). Также позволяет враппить все конструкторы базового класса (в GCC 4.8.0 не работает).
  • variadic templates - можно завраппить все функции базового класса.
  • constexpr - вычисляй все в компайл-тайме
  • default, deleted - можно убирать и добавлять автоматически заимплеменченные функции
  • override - контроль того, что виртуальная функция действительно переопределяется (как раньше до этого не дошли?)

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

Почему ты написал про какой-то static_assert?

RR42
()
Ответ на: комментарий от RR42

type traits - позволяет создавать очень гибкий компайл-таймовый полиморфизм.

Тьфу, нафиг! У меня тут clang парсит средний файл проекта openmw в течение 2-5 секунд, хотя должен бы меньше чем за 0.1 сек. А тут ещё шаблонов добавить хотят. Лично мне важнее удобная IDE, чем сомнительное ускорение от компайл-таймовых шаблонов.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от RR42

А я смотрю кресты потихоньку превращаются в неправильно сделанный Haskell ...

s9gf4ult ★★
()
Ответ на: комментарий от RR42

Почему ты написал про какой-то static_assert?

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

Кроме того, override, auto, range-based for, лямбды, using в шаблонах, deleted и defaulted методы, пользовательские литералы не дают новых возможностей с прикладной точки зрения. Но как улучшение стиля языка - безусловно, прекрасные изменения, тут я не спорить не могу.

К сожалению, изменения стиля будут внедряться ещё лет 5-6, пока новые компиляторы постепенно будут появляться на компьютерах людей в стандартной поставке того же debian или популярных версий visual studio.

quiet_readonly ★★★★
() автор топика
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от annulen

Сокращать язык? Из-за какой-то говно-IDE? Это же жаба какая-то получится!

Есть в принципе ещё одно решение, за которое взялись авторы clang - это модули. Ну и инкрементальная компиляция, но кто сделает это в C++?

А так я не то чтобы сокращать, но шаблоны * препроцессор = тормоза парсера. Жаль, что нету какой-нибудь версии C++ исключительно для приложений (т.е. для кода который не будет использоваться как библиотека); можно было бы запилить модули и импорт из C/C++, урезать препроцессор до уровня #ifdef на импортированные из C++ макросы, выкинуть шаблоны (позволив только импортировать typedef-нутые или унаследованные специализированные шаблоны из C++), слоты&сигналы добавить в стандарт языка и заимствовать эту крутую фичу из ObjectiveC - расширение существующего класса новыми методами.

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

import std.string
import std.cin
import std.cout

class std.string(extensions)
{
    bool startsWith(const std::string &s); // blah blah blah
};

int main()
{
    std::string a, b;
    std.cin >> a, b;
    if (a.startsWith(b))
        std::cout << "Yes, it starts\n";
}

quiet_readonly ★★★★
() автор топика

Так когда там будет полный C11?

sv75 ★★★★★
()
Ответ на: комментарий от quiet_readonly

Есть в принципе ещё одно решение, за которое взялись авторы clang - это модули.

Ага

Ну и инкрементальная компиляция, но кто сделает это в C++?

Для этого надо «всего лишь» обобщить идею модулей

А так я не то чтобы сокращать, но шаблоны * препроцессор = тормоза парсера.

C++ всегда был и всегда будет языком для программистов, а не для парсеров. Язык «для IDE» - это, например, Java.

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

Ты пытаешься изобрести D?

annulen ★★★★★
()
Ответ на: комментарий от quiet_readonly

dlang.org

благодарностей не надо.

anonymous
()
Ответ на: комментарий от quiet_readonly

выкинуть шаблоны (позволив только импортировать typedef-нутые или унаследованные специализированные шаблоны из C++)

Т.е. если мне понадобится сделать вектор из объектов моего нового класса, придется специализировать его в отдельном C++-модуле и импортировать?

заимствовать эту крутую фичу из ObjectiveC - расширение существующего класса новыми методами

В С++ общепринятым способ расширения интерфейсов классов являются свободные функции. А давать пользовательскому коду доступ к приватным полям - нарушение инкапсуляции

annulen ★★★★★
()
Ответ на: комментарий от annulen

Для этого надо «всего лишь» обобщить идею модулей

Эмм... Без пояснения непонятно.

Ты пытаешься изобрести D?

D ломает совместимость между релизами и, насколько я понимаю, не может прямо использовать плюсовые классы.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от annulen

Т.е. если мне понадобится сделать вектор из объектов моего нового класса, придется специализировать его в отдельном C++-модуле и импортировать?

Да, тут заминочка вышла.

В С++ общепринятым способ расширения интерфейсов классов являются свободные функции. А давать пользовательскому коду доступ к приватным полям - нарушение инкапсуляции

Никакого доступа к приватным полям, можно сделать на основе существующих методов, как, собственно, и происходит в Objective C. Аналог в виде свободных функций плохой получается, во-первых их ещё найти надо (если над проектом не один человек работает), во-вторых так легко между проектами не таскается, как два файла с категориями.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

Без пояснения непонятно.

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

annulen ★★★★★
()
Ответ на: комментарий от annulen

Фигурные скобки печатаются достаточно часто, как быть? Разве что попробовать держать число открытых/закрытых скобок и игнорировать лишнюю незакрытую, не уверен только что всегда сработает.

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

не дают новых возможностей с прикладной точки зрения

Не дают, но позволяют сильно сокращать код. Я уже во всю пользуюсь.

пока новые компиляторы постепенно будут появляться на компьютерах людей в стандартной поставке того же debian или популярных версий visual studio.

У меня 12.04 target платформа, компилируемость и совместимость с остальным не волнует.

Reset ★★★★★
()

В данный момент проект FreeBSD поставляет GCC версии 4.2.1 (последняя версия, не перелицензированная под GPLv3)

Кстати, чем сообществу BSD не угодила лицензия GPLv3, что она для них даже хуже v2, тивоизировать дистр с gcc version >4.2.1 хотят что ли?

anonymous_incognito ★★★★★
()

Боже, куда катится мир.. если так пойдёт дело, то через пару лет компиляторы C++ будут весить как полноценные операционные системы с набором программ.. куда его там ещё расширять, а главный вопрос - зачем?, такое ощущение, что этот комитет полон цели сделать из программиста быдолкодера, включая заготовки решенных задач в стандартные библиотеки. Уже сейчас не все способны рассказать, как к примеру работает функция cout, или printf, зато все их всегда используют в своих проектах.

Sharezil
()
Ответ на: комментарий от Sharezil

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

О! Видимо, вам приятнее другой сценарий, чтобы каждый новый программист учил бы всё, что известно было до него, и пофиг на 20 лет, выкинутых в пустоту. Вот только если вас прогнать по алгоритмам растеризации, используемым в видеокартах, вы же слажаете.

quiet_readonly ★★★★
() автор топика
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

Кстати, чем сообществу BSD не угодила лицензия GPLv3, что она для них даже хуже v2, тивоизировать дистр с gcc version >4.2.1 хотят что ли?

Они-то не хотят, но лишать разработчиков продуктов на базе FreeBSD этой возможности тоже не хотят. Да и из портов новый gcc спокойно ставится

annulen ★★★★★
()
Ответ на: комментарий от quiet_readonly

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

Sharezil
()
Ответ на: комментарий от annulen

Кстати, когда впервые познакомился с этим монстром (хотя и сейчас о нем знаю только из учебника википедии) наконец то понял, что из себя представляют циклы, как они работают и как вообще устроена программа.Никакой там Си и тем более C++ мне ничего подобного не давал, а один пример на асме рассказал буквально всё, говоря честно, я даже обрадовался не на шутку :)

Sharezil
()
Ответ на: комментарий от quiet_readonly

Вложенных функций в стандартном С++ не бывает, так что разбивку на модули это не изменит. Компилируем кусок и выдаем ошибку о незакрытой скобке

annulen ★★★★★
()
Ответ на: комментарий от Sharezil

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

Как хорошо, что не все архитектуры так монструозны, как х86

annulen ★★★★★
()
Ответ на: комментарий от annulen

Понял, речь идёт о компиляции. Меня интересовал инкрементальный парсинг (чтобы без повторного препроцессинга #include).

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от Sharezil

Уже сейчас не все способны рассказать, как к примеру работает функция cout

Одного мы уже точно знаем )

O02eg ★★★★★
()
Ответ на: комментарий от quiet_readonly

Понял, речь идёт о компиляции.

Ну и инкрементальная компиляция, но кто сделает это в C++?

o_O

Меня интересовал инкрементальный парсинг (чтобы без повторного препроцессинга #include

В clang же это есть, precompiled preamble называется

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Теперь templates есть в С. Для меня это значит - что С++ больше вообще мне не нужен в моих проектах.

Не, ещё нужны деструкторы, автоматом дёргающиеся при выпадении из scope.

one_more_hokum ★★★
()

Спасибо ТС, сообщение и комменты очень познавательны.

Lothlorien ★★★
()
Ответ на: комментарий от Reset

В C++11 включена только малая часть буста.

микро часть.

niXman ★★★
()
Ответ на: комментарий от quiet_readonly

обзоры потенциальных возможностей буста

дока - лучший обзор.

niXman ★★★
()

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

Всё же я не понял, где фичи от команды FreeBSD, ведь всё, что тут перечислено - работа прогеров LLVM/Clang. Нет?

Stalin ★★★★★
()
Ответ на: комментарий от quiet_readonly

clang парсит средний файл проекта openmw в течение 2-5 секунд, хотя должен бы меньше чем за 0.1 сек. А тут ещё шаблонов добавить хотят

на калькуляторе работаешь?

никогда не понимал тех, кто говорит о скорости компиляции. или есть все еще конторы, в которых программисты компиляют код в рабочее время?

niXman ★★★
()
Ответ на: комментарий от niXman

Ты идиот, или просто тупица?

Код надо парсить ОЧЕНЬ быстро, чтоб IDE не лагала. В рабоче время, да-да.

anonymous
()
Ответ на: комментарий от niXman

никогда не понимал тех, кто говорит о скорости компиляции

емнип, одна из причин создния языка Go - это то, что у гугла много кода на C++ и компилится это дело долго.

anonymous
()
Ответ на: комментарий от niXman

Есть конторы где кода _много_ :) и это становится фактором при учете времени цикла build+test|run. Не один день может идти, а кому-то надо, чтобы непременно за business day. Как правило - проблема конторы, сам оччень не люблю заботится о compile time.

seg-fault
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.