Показаны сообщения с ярлыком c. Показать все сообщения
Показаны сообщения с ярлыком c. Показать все сообщения

суббота, 14 января 2017 г.

Как бы я изменил язык Си в 2017 году

В этом посте мне хотелось бы порассуждать на тему того что я бы поменял/убрал/добавил в язык Си. Си является моим основным языком, более того уже больше 4 лет я занимаюсь разработкой оптимизирующего компилятора Си, который пишется на Си. За это время у меня накопились некоторые мысли на тему того что должен и чего не должен современный язык, какие проблемы есть в Си, как их можно было бы решить.

вторник, 15 декабря 2015 г.

Опасность вызова функций без объявленного прототипа в C

Ещё один пост про тонкости линковки. Предыдущий лежит здесь. На этот раз речь пойдёт преимущественно о старых исходниках, переносе их в 64-х битный режим, ну и немного про режим сборки "вся программа". Пример основан на реальных событиях исходниках.

суббота, 29 ноября 2014 г.

Слайды с доклада про strict-aliasing

Выступил на 57-ой научной конференции МФТИ с докладом про мой любимый strict-aliasing. Слайды можно посмотреть здесь:



Наверное стоит добавить пару комментариев по теме и вообще.

Такая тема взята потому как я являюсь автором strict-aliasing в компиляторе Эльбруса. Я когда-то уже переводил статью по данной теме, но в реальности ещё не видел ни одной нормальной публикации. Хочу сделать её сам, но пока не получается.

Сам strict-aliasing разрывает зависимости между load'ами и store'ами несовместимых типов. Что такое несовместимые типы долго объяснять, скажу только что совместимы только одни и те же типы с квалификаторами и типы, вложенные в агрегатные типы.

В компиляторах реализация strict-aliasing обычно делится на две (минимум) части - оптимизационный анализ и анализ нарушений. Последний в gcc реализован на редкость плохо, мне удалось сделать анализ дающий очень мало false-positive. Я пока не замерял как gcc'шный анализ влияет на производительность, но на компилятоое Эльбруса удалось добиться прироста до 8%. При том, что в реализации есть серьёзные загрубления.

пятница, 1 ноября 2013 г.

Ошибка в комментарии

На старых фронтэндах был простой способ получить ошибку в плохо написанном комментарии. Связано это с триграфами. Сам столкнулся с такой на старой версии edg - фронтэнда, который используется в компиляторе intel.

$ cat test.c

/**
 * ??!
 */

int main(){}


$ lcc_i test.c
lcc: "test.c", line 2: error: support for trigraphs is disabled
          [-Werror=trigraphs]
   * ??!
     ^

1 error detected in the compilation of "test.c".


Подробней о проблемах с триграфами можно почитать на вики. Тут интересен вопрос "а почему вообще возникает такая проблема?". Фишка кроется в стандарте, раздел 5.1.1.2 Translation phases. Грубо говоря препроцессирование делится на 6 стадий. При этом триграфы разворачиваются на первой стадии, а комментарии удаляются только на 3-ей.

На современных компиляторах такой проблемы замечено не было.

среда, 31 июля 2013 г.

Анонимный нулевой bit-field

Встретил в Си забавную конструкцию:

struct A
{
    int :0;
};


Здесь присутствует очень забавная вещь - анонимное битовое поле нулевого размера. После преодоления шока от увиденного полез разбираться.

суббота, 29 июня 2013 г.

iso646.h

Наткнулся на забавный заголовочный файл в стандарте Си - iso646.h. В нём логические и битовые операции определены символами:

#define and    &&
#define and_eq    &=
#define bitand    &
#define bitor    |
#define compl    ~
#define not    !
#define not_eq    !=
#define or    ||
#define or_eq    |=
#define xor    ^
#define xor_eq    ^=
Википедия утверждает, что это нужно для не querty клавиатур, на которых сложно печатать по-человечески.  Правда непонятно, используется ли это где-то на практике - на гитхабе все результаты - какие-то тестовые модули.

вторник, 4 июня 2013 г.

Перевод обзорной статьи про Saturn

К сожалению у меня последнее время не хватает времени на написание статей для бложика, но буду стараться его выцарапать. А пока что ловите перевод статьи про статический анализатор C - Saturn. Мне он нужен был только для экзамена по английскому, но пару комментариев я здесь оставлю.

Оригинал и перевод здесь.

четверг, 22 ноября 2012 г.

О вреде методов объектов в C

В предыдущем посте я показал как в Си можно использовать вызов функций в стиле, похожем на C++. Теперь об основной причине, по которой так делать не стоит.

суббота, 10 ноября 2012 г.

Методы объекта в C

Когда плюсистов насильно пересаживают на Си, одним из пунктов ломки по нормальным языкам является отсутствие адекватных объектов и их методов. Но если становится совсем плохо, методы можно легко реализовать.

понедельник, 24 сентября 2012 г.

суббота, 17 марта 2012 г.

The GCC AST itself is a curious data structure in that it is an implementation of the polymorphic data type idea in C (next time someone tells you that polymorphism works perfectly in C and they don’t need “bloated” C++ for that, show them the GCC AST)

вторник, 21 февраля 2012 г.

Пишем плагин для gcc. Часть 1.

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

вторник, 20 декабря 2011 г.

История одного анализатора

В этой статье я хотел бы немного рассказать об истории одного анализатора, а точнее - семейства анализаторов. Зовут это семейство lint. Его основатель, сам lint стал первым статическим анализатором кода в истории.