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)
Ответ на: комментарий от quiet_readonly

во-первых их ещё найти надо (если над проектом не один человек работает)

Это решается - неймспейсами, например.

Я так понимаю, что расширение класса нужно чтобы иде автодополняла? Так ведь всё равно надо хоть примерно знать, что искать. «startsWith» из твоего примера я бы даже не додумался искать (искал бы скорее find).

во-вторых так легко между проектами не таскается, как два файла с категориями.

Не понял. В случае свободных функций было бы точно так же два файла: хедер и цпп. Нет?

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

Мы сайчас об общем случае говорим а не об экзотике.

что же там экзотического?

Вы писали код для марсохода?

нет.

В общем случае до полного feature freeze необходимость оперативности внесения изменений превалирует и практически исключает предложенную Вами модель.

как, описываемая мною модель, хоть сколько-то понижает оперативность? как по мне(и из моего опыта в том числе, по предыдущим конторам), так компилирование кода кодерами, снижает производительность до ниже некуда.

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

Не, ну так я ж говорю, что пациент - типичная школота. А народ почему-то не поддержал.

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

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

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

Такая модель нигде не работоспособна. Херачить код без обратной связи? Назад к перфокартам, что ли?

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

Школота, у тебя никогда не получится изобразить из себя «серьезного специалиста», как бы ты не пыжился. Иди, поплачься своей мамке-шлюхе, что тебя в интернетах обижают.

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

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

Уверен, что таких дофига.

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

У тебя двоечка по инглишу, да, школота? Ты хоть читал-то JPL coding guidelines?

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

т.е. разработчики ПО для марсохода, лгут?

Не знаю, не читал. А то, что задвигаешь здесь ты - это фантазии, возможно, основанные на данных из третьих рук.

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

Не нужно. Мразь надо давить безжалостно.

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

т.е. разработчики ПО для марсохода, лгут?

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

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

То ли дело на Java

на Java вместо того, чтоб смотреть на выхлоп компилятора, надо лабать простыни кода с классами и new, вот напиши аналог примитивной функции:

void sort_list( list<int>& l, bool desc=false ) {
    l.sort( [desc](int a, int b) { return desc ? a>b : a<b; } );
}
wota ★★
()
Ответ на: комментарий от quiet_readonly

Препроцессор заставляет заново распарсить

Препроцессирование выполняется ДО всего остального.

Сравни скорость

g++ -c file.cpp -o file.o

и по отдельности

g++ -E file.cpp -o file.ii
g++ -c file.ii -o file.o

Первая строка — вызов препроцессора, вторая строка — компиляция БЕЗ использования препроцессора.

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

приведи пример ситуации ,когда хоть что-то не может попасть в PCH.

Зависит от компилятора — у всех свои ограничения. Например, не-inline фуннкции, инициализированные переменные, статические данные. Конкретно про gcc не скажу.

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

Препроцессирование выполняется ДО всего остального.

И получается простыня, где вместо #include вставлены собственно все декларации, которые разбираются с нуля, от stddef.h до OgreUTFString.h.

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

List<String>
boolean desc)

ты сам все понял ;) про лямбды в Java я знаю - речь шла не о них, а про банальности

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

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

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

И получается простыня, где вместо #include вставлены собственно все декларации, которые разбираются с нуля, от stddef.h до OgreUTFString.h.

Ну так и получается. Поэтому я и говорю, что скорость препрцессирования никак не связана ни с шаблонами, ни с чем другим.

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

Возьми тогда C# (в нем сахара больше), там точно также цикл edit/compile/test намного быстрее по сравнению с C++ (особенно тянущим boost). А значит он куда удобнее для разработки.

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

Возьми тогда C#

однозначно лучше чем Java, но есть фатальный недостаток в виде привязки к платформе, mono не предлагать

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

единственное полезное, что я увидел в последних его изменениях - включения стандарта потоков и не более

Конечно, кому нужны rvalue references и семантика перемещения? Что может быть лучше копипасты для имитации шаблонов или функций с переменным числом параметров? Перечисления - это ведь просто сахар над #define-ами. А типы переменных всегда следует писать вручную - даже если они занимают десяток строк и наполовину состоят из слова typename. Лямбды? Да кто-ж использует алгоритмы стандартной библиотеки? Unicode, а что это?

Осталось только включить поддержку по-умолчанию X сервера и звуковых драйверов, чтобы в конец C++ превратился в java.

Странное представление о Java.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Давай ссылку.

https://www.usenix.org/conference/hotdep12/tbd

если кратко:

  • тестеров втрое больше чем разрабов
  • денежные штрафы за сломанный билд
  • денежные штрафы за сломанный тест
  • варнинг считается ошибкой
  • сборка и автоматическое тестирование занимает ~36 часов
  • доска «почета», чтоб другим неповадно было

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

ах да, анонимуса с собой на просмотр возьмите. хотя..ему уже ничего не поможет...

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

А теперь приведите пруф, что они не перекомпилируют проекты на рабочем месте. Рассказать про бузину в огороде и дядьку в Киеве каждый может.

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

для тебя что, я должен сделать перевод, и записать в виде стенограммы? какие еще будут приказания?

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

Действительно - зачем, век без них жили и не тужили и всех всё устраивало и никто не жаловался, а тут вдруг мы должны от них зависеть, как пещерные люди. Все эти понятие, что были перечислены выше существуют только как условное определение каких либо действий в пределах самого языка, вернее набором ASCII символов, которые в дальнейшем компилятор отлинкует и превратит в машинный код, где все эти «rvalue references и семантика перемещения» превратятся в: «Поместить значения регистра А в регистр Б, сравнить значение регистра Y с регистром Z, вызвать то-то».

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

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

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

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

А что сказать-то хотели?

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

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

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

Замечательно, ты предлагаешь с каждой программой таскать свой собственный велосипед или плодить копипасту по коду? И что в этом хорошего?

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

В отрицательную тоже не изменится, а программисту будет облегчение работы.

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

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

Сам придумал, сам опроверг. Даже и возравзить нечего.

Все эти понятие, что были перечислены выше существуют только как условное определение каких либо действий в пределах самого языка, вернее набором ASCII символов, которые в дальнейшем компилятор отлинкует и превратит в машинный код, где все эти «rvalue references и семантика перемещения» превратятся в: «Поместить значения регистра А в регистр Б, сравнить значение регистра Y с регистром Z, вызвать то-то».

Регистры? Вызвать? Что это!? Это всё существует только как условное определение каких-то сочетаний операции NAND, которая существует как определённое сочетание полевых транзисторов, которые существуют только как условное обозначение определённого сочетания молекул, и т.д.

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

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

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

главное я уверен в одном - что он будет быстрей всех существующих

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

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

мой компьютер не выдержит такой нагрузки из вне, его инфаркт хватит.

У тебя какой-то особо слабый компьютер? У всех выдерживают а у тебя нет?

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

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

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

Ну так и есть, у грязной школоты нет мозга, да и двоечка по инглишу.

Ничего из того, о чем ты грязно лгал выше по треду, там не сказано. Сучка ты брехливая, одним словом.

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

1.6ghz 1 core 7300gt nvidia 256mb 1gb озу Не очень таки сильный, правда ?)

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

ЗЫ: у нас тут тоже полная сборка и прогон всех тестов занимает более десяти часов. Что не мешает всем разработчикам собирать и отлаживать самостоятельно те подсистемы, за которые они отвечают.

Короче, брехливая сучка, ты никогда не работал ни в одной серьезной организации. Иди, учи уроки, школота никчемная.

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

И всё-же, я не думаю, что мне придётся реализовывать настолько много алгоритмов, чтобы превзойти саму стандартную библиотеку по функционалу.

Ну если заниматься CRUD'ом наверное не придётся.

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

Как пример: функция printf представлена в одну строчку, её же исходный код со всеми примочками растягивается на метры.

printf олхоё пример, read в этом плане гораздо интереснее. Там и примочек-то особо нет. А полная реализация (в смыле положить в регистр, стравнить регистры, перейти по адресу) затрагивает немало модулей.

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

что он будет быстрей всех существующих

Откуда такая уверенность? И как ты реализуешь языковые возможности, например, лямбды?

что у него за цепь стоит

Это написано в документации.

ведь на каждой библиотеке они представлены по-разному

Так мы не о каждой библиотеке говорим, а о стандартной.

а вот написанный код работает всегда одинаково.

Любой код, который не полагается на undefined behaviour работает одинаково :)

А ты действительно всегда под себя пишешь весь код с ноля?

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