Recently I've read a short note where an author tells that software prefetch is useless for performance. I think that it would be interesting to listen to another point of view.
Показаны сообщения с ярлыком c. Показать все сообщения
Показаны сообщения с ярлыком c. Показать все сообщения
среда, 2 мая 2018 г.
суббота, 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%. При том, что в реализации есть серьёзные загрубления.
Наверное стоит добавить пару комментариев по теме и вообще.
Такая тема взята потому как я являюсь автором strict-aliasing в компиляторе Эльбруса. Я когда-то уже переводил статью по данной теме, но в реальности ещё не видел ни одной нормальной публикации. Хочу сделать её сам, но пока не получается.
Сам strict-aliasing разрывает зависимости между load'ами и store'ами несовместимых типов. Что такое несовместимые типы долго объяснять, скажу только что совместимы только одни и те же типы с квалификаторами и типы, вложенные в агрегатные типы.
В компиляторах реализация strict-aliasing обычно делится на две (минимум) части - оптимизационный анализ и анализ нарушений. Последний в gcc реализован на редкость плохо, мне удалось сделать анализ дающий очень мало false-positive. Я пока не замерял как gcc'шный анализ влияет на производительность, но на компилятоое Эльбруса удалось добиться прироста до 8%. При том, что в реализации есть серьёзные загрубления.
пятница, 1 ноября 2013 г.
Ошибка в комментарии
На старых фронтэндах был простой способ получить ошибку в плохо написанном комментарии. Связано это с триграфами. Сам столкнулся с такой на старой версии edg - фронтэнда, который используется в компиляторе intel.
Подробней о проблемах с триграфами можно почитать на вики. Тут интересен вопрос "а почему вообще возникает такая проблема?". Фишка кроется в стандарте, раздел 5.1.1.2 Translation phases. Грубо говоря препроцессирование делится на 6 стадий. При этом триграфы разворачиваются на первой стадии, а комментарии удаляются только на 3-ей.
На современных компиляторах такой проблемы замечено не было.
$ 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. Мне он нужен был только для экзамена по английскому, но пару комментариев я здесь оставлю.
Оригинал и перевод здесь.
Оригинал и перевод здесь.
воскресенье, 23 декабря 2012 г.
Перевод "Understanding C/C++ Strict Aliasing"
Закончил перевод хорошей статьи про strict aliasing. Перевод здесь.
четверг, 22 ноября 2012 г.
О вреде методов объектов в C
В предыдущем посте я показал как в Си можно использовать вызов функций в стиле, похожем на C++. Теперь об основной причине, по которой так делать не стоит.
суббота, 10 ноября 2012 г.
Методы объекта в C
Когда плюсистов насильно пересаживают на Си, одним из пунктов ломки по нормальным языкам является отсутствие адекватных объектов и их методов. Но если становится совсем плохо, методы можно легко реализовать.
четверг, 27 сентября 2012 г.
понедельник, 24 сентября 2012 г.
среда, 9 мая 2012 г.
суббота, 17 марта 2012 г.
вторник, 21 февраля 2012 г.
Пишем плагин для gcc. Часть 1.
Одной из крайне интересных фич, внедрённых в gcc 4.5 стала возможность создания плагинов для компилятора. К сожалению, в сети пока очень мало информации, описывающей данную возможность, а на русском языке её нет совсем. Что ж, постараюсь исправить эту ситуацию.
вторник, 20 декабря 2011 г.
История одного анализатора
В этой статье я хотел бы немного рассказать об истории одного анализатора, а точнее - семейства анализаторов. Зовут это семейство lint. Его основатель, сам lint стал первым статическим анализатором кода в истории.
Подписаться на:
Сообщения (Atom)