C11

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

C11

Непрочитанное сообщение Olej » 26 май 2016, 21:59

C11
C11 или ISO/IEC 9899:2011 (неофициально C1X) — новый стандарт для языка Си (ISO/IEC 9899:2011), который заменил существующий стандарт C99. Официально о выпуске стандарта было объявлено 19 декабря 2011 года. Эта версия стандарта большей частью стандартизирует возможности, существующие в распространённых современных компиляторах. Из-за плохой совместимости текущих реализаций C99 со стандартом, C11 включает в себя больше выборочных возможностей для упрощения совместимости со стандартом ядра языка. Хотя стандарт принят совсем недавно, но в GCC версии 4.6 уже есть зачаточная поддержка некоторых возможностей, описанных в черновике стандарта.

Последняя черновая спецификация (доступная для бесплатного скачивания) имеет название N1570 и была издана в апреле 2011 года.

Новый стандарт прошел заключительный пересмотр черновика 10 октября 2011 года и был официально ратифицирован ISO и опубликован в ISO / IEC 9899: 2011 8 декабря 2011 года, без каких-либо замечаний.

Определение стандартного макроса __STDC_VERSION__ со значением 201112L дает указание,что присутствует поддержка C11. Некоторые возможности C11 поддерживаются GCC начиная с версии 4.6. В Clang поддержка начинается с версии 3.1, а в IBM XL C поддержка с версии 12.1.
N1570, последний черновик стандарта C1X На 25 апреля 2011 года, датирован 2011-04-12
Вложения
n1570.pdf
(1.61 МБ) 225 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 27 май 2016, 01:04

Olej писал(а):C11
Основные изменения:
  • поддержка многопоточности;
  • улучшенная поддержка Юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 27 май 2016, 13:26

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

Стандарт ISO/IEC 9899:2011 вводит вместо (или в дополнение) библиотечного API потоков (pthread_t - POSIX 1003.b, расширение реального времени) совсем другую реализацию потоков, представление в языке, а не в библиотеках (чтоб было понятно, дальний аналог этого - сопрограммы в языке Go, оператор go).

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

А ещё на это нужно обратить внимание студентам, обучающимся...
Потому как ВУЗ-овские преподаватели на этой позиции вообще воспряли - здесь механизм гнобить студентов.
Как сказал в споре мне один гордый мудозвон на Хабрахабре (они там все такие :lol: ), из этой университетской когорты: "Ох как же мы дрючим этих студентов из Linux!".
Т.е., до сих пор вся эта педагогика ничего кроме Windows в глаза не видела, заумные студенты, даже подрабатывающие уже в Linux, их ... "в фуй не ставила" :oops: ... а тут - такая удача! : дрючить, дрючить и дрючить ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 28 май 2016, 11:10

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

Код: Выделить всё

#include <pthread.h>
   void* threadfunc( void* data ) { // функция потока
      ...
      pthread_exit( NULL );
   };
...
   pthread_t tid;
   pthread_create( &tid, NULL, threadfunc, NULL );
   pthread_join( tid, NULL );
Код в стандарте C11 может выглядеть так (реально работающий тест):

Код: Выделить всё

#include <stdio.h>
#include <threads.h>

void threadfun() {
    printf("Hello from thread\n");
}

int main() {
    thrd_t tid;
    int rc;
    rc = thrd_create( &tid, threadfun, NULL );
    if (rc != thrd_success) {
        fprintf(stderr, "Error creating thread\n");
        exit(1);
    }
    thrd_join(tid, NULL);  
    /* Wait */
    return 0;
}
Но попытка компилировать такой код в стандартной инсталляции достаточно последнего дистрибутива Fedora 23 выглядит так:

Код: Выделить всё

[olej@dell ch2]$ lsb_release -ircd
Distributor ID:	Fedora
Description:	Fedora release 23 (Twenty Three)
Release:	23
Codename:	TwentyThree

Код: Выделить всё

[olej@dell C11]$ gcc -Wall -std=c11 -o thr11 thr11.c
thr11.c:2:21: фатальная ошибка: threads.h: Нет такого файла или каталога
компиляция прервана.
[olej@dell C11]$ gcc --version
gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.
С Clang та же история:

Код: Выделить всё

[olej@dell Clang]$ clang -xc -Wall -std=c11 -o thr11 thr11.c
thr11.c:2:10: fatal error: 'threads.h' file not found
#include <threads.h>
         ^
1 error generated.
[olej@dell Clang]$ clang --version
clang version 3.7.0 (tags/RELEASE_370/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 28 май 2016, 11:16

Olej писал(а): Код в стандарте C11 может выглядеть так (реально работающий тест):
Этот код удаётся скомпилировать и запустить, например с вариантом C-библиотеки Musl (вместо Glib).
(подробности см. здесь: http://unixforum.org/index.php?showtopi ... &p=1291456)
Но это уже ... искусственные способы исполнения. ;-)

Т.е. на прямой вопрос: можно ли назвать дистрибутив (и его версию) из числа основных массово используемых (не шелупени), в котором можно "ис каропки", без всяких бубнов и инсталляций (сразу после установки) выполнять многопоточный код в нотации, предложенной C11?
Ответ, как я понимаю: на сегодня - нет.

P.S. И попутное любопытство: а как на сегодня, через 5 лет после публикации стандарта C11, с этим обстоят дела в MS Visual Studio?
(известный юридический принцип: "кому выгодно?")

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 28 май 2016, 12:08

Многопоточность, описанная C11, мне так что-то знакомое по давним временам мучительно напоминала, что посмотрел...
Ба! Так это же QNX Software Development Platform > Utilities & Libraries > Dinkum C/C++ Libraries > Dinkum C++11 Libraries (именно C++ не C):

Код: Выделить всё

...
num {
    thrd_success = .....,
    thrd_nomem = .....,
    thrd_timedout = .....,
    thrd_busy = .....,
    thrd_error = .....
    };
...
Dinkumware
Dinkumware Limited — американская компания по производству программного обеспечения, специализируется на основных программных библиотеках для C и C++. Компания располагается в городе Конкорд (штат Массачусетс, США).

Dinkumware предлагает реализацию стандартной библиотеки C++, которая поставляется в комплекте с Microsoft Visual C++ с 1996 года и претендует на статус лидирующего поставщика библиотек C++ и Embedded C++ для сообщества разработчиков программного обеспечения для встраиваемых систем.
Так вот же откуда растут ноги C11! :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 28 май 2016, 12:53

Olej писал(а):Так вот же откуда растут ноги C11! :lol:
Получается, что лобисты Microsoft просто протолкали в качестве многопоточности стандарта C11 в неизменном виде свою C++ (!) библиотеку 20-летней давности.
Которую они даже в стандарт C++ не смогли протолкать, где принята модель из Boost (<thread>).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C11

Непрочитанное сообщение Olej » 07 июл 2016, 16:05

Olej писал(а):
Olej писал(а):Так вот же откуда растут ноги C11! :lol:
Получается, что лобисты Microsoft просто протолкали в качестве многопоточности стандарта C11 в неизменном виде свою C++ (!) библиотеку 20-летней давности.
Которую они даже в стандарт C++ не смогли протолкать, где принята модель из Boost (<thread>).
Вот суждение на этот счёт, высказанное в вышей из печати только вчера книжки:
Изображение

Раздел "Феномен языка Си", стр. 194 :
Бдительности от вас потребует также предпринятые в полтора десятилетия судоружные попытки улучшить язык Си путём принятия новых "стандартов" - сначала С99, а затем, совсем недавно, С11. Эти стандарты привели к появлению совершенно нелепого явления, растерявшего большинство основных привлекательных черт языка Си, но сохранившего все его недостатки.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей