Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Анонс Guidelines Support Library на CppCon

leave a comment »

Тут на CppCon, Бьярне (тот который язык С++ создал) анонсировал некий набор гайдлайнов по С++ а также либу для реализации некоторых из них.

Правила

Правила — это что-то. Ну то есть, есть конечно и разумные правила где все более менее понятно, но есть и места тотального отжига. Например:

NL.1: Don’t say in comments what can be clearly stated in code

Reason: Compilers do not read comments. Comments are less precise than code. Comments are not updates as consistently as code.

Example, bad:

auto x = m*v1 + vv; // multiply m with v1 and add the result to vv

Но дальше идет вообще нереальный перл в виде

Enforcement: Build an AI program that interprets colloquial English text and see if what is said could be better expressed in C++.

Что-о? Может еще сразу звездолет до Альфа Центавры построим, раз уж на то пошло? То есть, я что хочу сказать: совет хороший, да, но на практике никакой анализ подобного вида пока, скорее всего, невозможен. Кстати насчет enforcement, вот типичные советы про проверку на правила:

  • Not possible — вообще невозможно. Ну, зато честно.

  • Use a tool — воспользуйтесь тулой. При этом кто и как эту тулу напишет — не раскрывается.

  • Issue a diagnostic — выдать диагностическое сообщение. Это к компиляторостроителям, хотя и тулы тут могут помочь.

В некоторых случаях, еще предложены и фиксы, а вот это уже полезно т.к. тут не только диагностику можно делать (в стиле PVS studio) но и реально поправить прямо в IDE.

Guidelines Support Library (GSL)

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

array_view — тем кто знаком с C++ AMP это название знакомо. Это “вьюшка” поверх массива, которая позволяет, например, безболезненную 2D итерацию по 1D картинке (это ой как полезно). Также есть понятие index<>, т.е. умного итератора по вьюшкам, опять же по аналогии с C++ AMP:

#include <array_view.h>
#include <iostream>
using namespace Guide;
void array_view_demo()
{
  int data[100];
  int i = data[1000]; // bad
  array_view<int, 100> v(data);
  std::cout << v[1000] << std::endl; // fail_fast_assert
}

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

string_view — ну вы уже догадались, это вьюшка для C-образных строк, суть примерно та же. Есть еще вариации вроде cstring_view (константный вью), wstring_view, ну вы поняли… все это на практике тот же array_view с соответствующими возможностями.

Ассерты — тут их 2, Expects и Ensures (ну прям как в Code Contracts), оба они на практике просто бросают fail_fast_assert если условие не выполнено.

not_null<T> тоже конечно интересная идея, думаю все догадались — это фактически как референс, только суть референсов в том что их нельзя перебайндить, а вот такую хренотень — можно. Но конечно после C# аннотаций [NotNull] мне как-то очень сложно понять, зачем загрязнять тип. Хотя контраргумент тут в том, что если нужно передать вектор не-null значений, то на C# это вообще не понятно как обозначить, а тут все ясно — vector<not_null<T>>

Симметричной конструкцией тут является maybe_null и тут нужно пояснить, зачем это всё. Дело в том, что maybe_null например удаляет операторные указатели вроде ++ так чтобы было меньше шансов запороть указатель. Подразумевается, что этот указатель ссылается на один объект, а не на массив.

narrow_cast — тоже интересная идея. Суть в том что некоторые narrowing conversions мы все-таки готовы допускать, при условии что значение не меняется и остается тем же. Так вот, narrow_cast как бы именно это и делает, а в случае если значение меняется, он тупо кидает narrowing_error.

Ну и наконец owner<T> — это всего лишь заглушка (то есть на самом деле owner<T> это и есть T) которая поможет тулам статического анализа понимать, что происходит передача владением указателя. Бинарник эта штука никак вообще не меняет, и является всего лишь намеком, который можно проверить тулой и сделать ворнинг если чего не так.

Заключение

Вся эта тема подразумевается как OSS комьюнити-дривен фреймворк, всё на ГитХабе, можно делать PR и дискутировать. Либа сама по себе достаточно маленькая, header-only, включить ее в проект несложно. Как вы поняли, суть всего этого в том, чтобы дать разработчикам тулов в отсутствии полноценных метаданных некоторые дополнительные хинты по тому, что код на самом деле делает. Удачи!

Реклама

Written by Dmitri

21 сентября 2015 в 23:28

Опубликовано в С++

Tagged with ,

Оставить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: