home.social

#ненормальное_программирование — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #ненормальное_программирование, aggregated by home.social.

  1. Архитектурные компромиссы в разработке игр

    У меня есть книга, которая называется Game++ и несколько статей, где я разбирал какие паттерны применяются в играх и движках. В книге почти сто страниц отведено про эти самые паттерны и подробно рассказано какие они бывают, как выглядят в C++, где у них подводные камни и как их применять. Т.е. ровно те мелочи реализации, которые обычно интересно перечитать, когда вы в очередной раз решаете делать фабрику отдельным классом или попробовать обойтись std::function. Когда я её писал, мне казалось, что это будет очень полезный практический текст, и он таким и получился, и человек с опытом довольно быстро находит там нужное. Но если читать книгу целиком, а не эти отдельные главы, то хорошо видно, как я по неопытности и уверенности молодого автора в собственной правоте взял с места в карьер и сразу начал рассказывать про реализации, как будто читатель уже всё для себя решил и его интересует только синтаксис, предположив, что мы все тут делаем условный AAA-движок, в котором сериализация неизбежна, а скрипты обязательны. В результате получился классический случай, когда книжка отвечает на вопрос «как», но обходит вопрос «а собственно зачем», а без ответа на него все ответы про «как» оказываются либо случайно-полезными, либо системно-вредными, потому что человек берёт оттуда подход, переносит его в проекта или прикручивает к своей мини-игре и потом жалуется, что у него теперь полторы тысячи строк инфраструктуры на ту же мини-игру, а работает она ровно так же, как раньше, только медленнее. Если вам вдруг надоест читать эти 106 минут, там в конце есть TL;DR секция, где собрано краткое описание. Больше паттернов, богу паттернов

    habr.com/ru/articles/1037740/

    #c++ #игры_и_игровые_консоли #программирование #ненормальное_программирование #разработка_игр

  2. Архитектурные компромиссы в разработке игр

    У меня есть книга, которая называется Game++ и несколько статей, где я разбирал какие паттерны применяются в играх и движках. В книге почти сто страниц отведено про эти самые паттерны и подробно рассказано какие они бывают, как выглядят в C++, где у них подводные камни и как их применять. Т.е. ровно те мелочи реализации, которые обычно интересно перечитать, когда вы в очередной раз решаете делать фабрику отдельным классом или попробовать обойтись std::function. Когда я её писал, мне казалось, что это будет очень полезный практический текст, и он таким и получился, и человек с опытом довольно быстро находит там нужное. Но если читать книгу целиком, а не эти отдельные главы, то хорошо видно, как я по неопытности и уверенности молодого автора в собственной правоте взял с места в карьер и сразу начал рассказывать про реализации, как будто читатель уже всё для себя решил и его интересует только синтаксис, предположив, что мы все тут делаем условный AAA-движок, в котором сериализация неизбежна, а скрипты обязательны. В результате получился классический случай, когда книжка отвечает на вопрос «как», но обходит вопрос «а собственно зачем», а без ответа на него все ответы про «как» оказываются либо случайно-полезными, либо системно-вредными, потому что человек берёт оттуда подход, переносит его в проекта или прикручивает к своей мини-игре и потом жалуется, что у него теперь полторы тысячи строк инфраструктуры на ту же мини-игру, а работает она ровно так же, как раньше, только медленнее. Если вам вдруг надоест читать эти 106 минут, там в конце есть TL;DR секция, где собрано краткое описание. Больше паттернов, богу паттернов

    habr.com/ru/articles/1037740/

    #c++ #игры_и_игровые_консоли #программирование #ненормальное_программирование #разработка_игр

  3. Архитектурные компромиссы в разработке игр

    У меня есть книга, которая называется Game++ и несколько статей, где я разбирал какие паттерны применяются в играх и движках. В книге почти сто страниц отведено про эти самые паттерны и подробно рассказано какие они бывают, как выглядят в C++, где у них подводные камни и как их применять. Т.е. ровно те мелочи реализации, которые обычно интересно перечитать, когда вы в очередной раз решаете делать фабрику отдельным классом или попробовать обойтись std::function. Когда я её писал, мне казалось, что это будет очень полезный практический текст, и он таким и получился, и человек с опытом довольно быстро находит там нужное. Но если читать книгу целиком, а не эти отдельные главы, то хорошо видно, как я по неопытности и уверенности молодого автора в собственной правоте взял с места в карьер и сразу начал рассказывать про реализации, как будто читатель уже всё для себя решил и его интересует только синтаксис, предположив, что мы все тут делаем условный AAA-движок, в котором сериализация неизбежна, а скрипты обязательны. В результате получился классический случай, когда книжка отвечает на вопрос «как», но обходит вопрос «а собственно зачем», а без ответа на него все ответы про «как» оказываются либо случайно-полезными, либо системно-вредными, потому что человек берёт оттуда подход, переносит его в проекта или прикручивает к своей мини-игре и потом жалуется, что у него теперь полторы тысячи строк инфраструктуры на ту же мини-игру, а работает она ровно так же, как раньше, только медленнее. Если вам вдруг надоест читать эти 106 минут, там в конце есть TL;DR секция, где собрано краткое описание. Больше паттернов, богу паттернов

    habr.com/ru/articles/1037740/

    #c++ #игры_и_игровые_консоли #программирование #ненормальное_программирование #разработка_игр

  4. Архитектурные компромиссы в разработке игр

    У меня есть книга, которая называется Game++ и несколько статей, где я разбирал какие паттерны применяются в играх и движках. В книге почти сто страниц отведено про эти самые паттерны и подробно рассказано какие они бывают, как выглядят в C++, где у них подводные камни и как их применять. Т.е. ровно те мелочи реализации, которые обычно интересно перечитать, когда вы в очередной раз решаете делать фабрику отдельным классом или попробовать обойтись std::function. Когда я её писал, мне казалось, что это будет очень полезный практический текст, и он таким и получился, и человек с опытом довольно быстро находит там нужное. Но если читать книгу целиком, а не эти отдельные главы, то хорошо видно, как я по неопытности и уверенности молодого автора в собственной правоте взял с места в карьер и сразу начал рассказывать про реализации, как будто читатель уже всё для себя решил и его интересует только синтаксис, предположив, что мы все тут делаем условный AAA-движок, в котором сериализация неизбежна, а скрипты обязательны. В результате получился классический случай, когда книжка отвечает на вопрос «как», но обходит вопрос «а собственно зачем», а без ответа на него все ответы про «как» оказываются либо случайно-полезными, либо системно-вредными, потому что человек берёт оттуда подход, переносит его в проекта или прикручивает к своей мини-игре и потом жалуется, что у него теперь полторы тысячи строк инфраструктуры на ту же мини-игру, а работает она ровно так же, как раньше, только медленнее. Если вам вдруг надоест читать эти 106 минут, там в конце есть TL;DR секция, где собрано краткое описание. Больше паттернов, богу паттернов

    habr.com/ru/articles/1037740/

    #c++ #игры_и_игровые_консоли #программирование #ненормальное_программирование #разработка_игр

  5. Непослушный using

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

    habr.com/ru/articles/1036104/

    #с++ #программирование #ненормальное_программирование

  6. Как работают с памятью в игровых консолях

    Самая продаваемая консоль поколения имела худшую архитектуру памяти, самая технически грамотная продалась хуже всех, а самая простая в разработке принадлежала компании которая никогда раньше не делала консолей. Вы наверное узнали тут PS2, GameCube и Xbox. Иногда шутят, что когда разработчик переносил игру с Xbox на PS2, то первое что он делал это выбрасывал систему управления памятью и писал новую с нуля, потому что 32Мб плюс 4Мб плюс 2Мб не помещается в 64Мб. Для чтения этой статьи вам не потребуется знать ассемблер или работать с конкретными SDK. Достаточно понимать, что такое указатель, чем стек отличается от кучи и что рендерить геометрию параллельно с её обновлением плохая идея, и что классические GPU и CPU паттерны работы по-разному нагружают память. Там, где в тексте встречается псевдокод, он нужен для иллюстрации концепции, а не как готовый код для компиляции. Я уже подзабыл конкретные константы и названия буферов на каждой платформе, но паттерн работы всегда был примерно одинаковый.

    habr.com/ru/articles/1033736/

    #программирование #ненормальное_программирование #с++ #игры #разработка_игр

  7. Как работают с памятью в игровых консолях

    Самая продаваемая консоль поколения имела худшую архитектуру памяти, самая технически грамотная продалась хуже всех, а самая простая в разработке принадлежала компании которая никогда раньше не делала консолей. Вы наверное узнали тут PS2, GameCube и Xbox. Иногда шутят, что когда разработчик переносил игру с Xbox на PS2, то первое что он делал это выбрасывал систему управления памятью и писал новую с нуля, потому что 32Мб плюс 4Мб плюс 2Мб не помещается в 64Мб. Для чтения этой статьи вам не потребуется знать ассемблер или работать с конкретными SDK. Достаточно понимать, что такое указатель, чем стек отличается от кучи и что рендерить геометрию параллельно с её обновлением плохая идея, и что классические GPU и CPU паттерны работы по-разному нагружают память. Там, где в тексте встречается псевдокод, он нужен для иллюстрации концепции, а не как готовый код для компиляции. Я уже подзабыл конкретные константы и названия буферов на каждой платформе, но паттерн работы всегда был примерно одинаковый.

    habr.com/ru/articles/1033736/

    #программирование #ненормальное_программирование #с++ #игры #разработка_игр

  8. Как работают с памятью в игровых консолях

    Самая продаваемая консоль поколения имела худшую архитектуру памяти, самая технически грамотная продалась хуже всех, а самая простая в разработке принадлежала компании которая никогда раньше не делала консолей. Вы наверное узнали тут PS2, GameCube и Xbox. Иногда шутят, что когда разработчик переносил игру с Xbox на PS2, то первое что он делал это выбрасывал систему управления памятью и писал новую с нуля, потому что 32Мб плюс 4Мб плюс 2Мб не помещается в 64Мб. Для чтения этой статьи вам не потребуется знать ассемблер или работать с конкретными SDK. Достаточно понимать, что такое указатель, чем стек отличается от кучи и что рендерить геометрию параллельно с её обновлением плохая идея, и что классические GPU и CPU паттерны работы по-разному нагружают память. Там, где в тексте встречается псевдокод, он нужен для иллюстрации концепции, а не как готовый код для компиляции. Я уже подзабыл конкретные константы и названия буферов на каждой платформе, но паттерн работы всегда был примерно одинаковый.

    habr.com/ru/articles/1033736/

    #программирование #ненормальное_программирование #с++ #игры #разработка_игр

  9. Как работают с памятью в игровых консолях

    Самая продаваемая консоль поколения имела худшую архитектуру памяти, самая технически грамотная продалась хуже всех, а самая простая в разработке принадлежала компании которая никогда раньше не делала консолей. Вы наверное узнали тут PS2, GameCube и Xbox. Иногда шутят, что когда разработчик переносил игру с Xbox на PS2, то первое что он делал это выбрасывал систему управления памятью и писал новую с нуля, потому что 32Мб плюс 4Мб плюс 2Мб не помещается в 64Мб. Для чтения этой статьи вам не потребуется знать ассемблер или работать с конкретными SDK. Достаточно понимать, что такое указатель, чем стек отличается от кучи и что рендерить геометрию параллельно с её обновлением плохая идея, и что классические GPU и CPU паттерны работы по-разному нагружают память. Там, где в тексте встречается псевдокод, он нужен для иллюстрации концепции, а не как готовый код для компиляции. Я уже подзабыл конкретные константы и названия буферов на каждой платформе, но паттерн работы всегда был примерно одинаковый.

    habr.com/ru/articles/1033736/

    #программирование #ненормальное_программирование #с++ #игры #разработка_игр

  10. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  11. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  12. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  13. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  14. Простой поиск имен в С++

    Это продолжение темы начатой в статье Важны ли компилятору имена , и продолженой в Ночью все кошки серы, а using'и одинаковы , и далее в Компиляторы тоже путаются в именах . Если не читали, то лучше будет пробежаться по диагонали. Теперь вот мы подобрались к такой интересной теме, как квалифицированный и неквалифицированный поиск. Что такое простой поиск(неквалифицированный) имени n в области S? Это механизм компилятора, который находит все объявления n, находящиеся непосредственно в этой области. Просто? С виду да, но даже этот простой механизм часто работает не так как ожидает разработчик. Например, у нас есть пространство имён N и локальная переменная N. Они могут сосуществовать вместе? Могут, потому что находятся в разных областях видимости. А пространство имён и глобальная переменная с тем же именем могут? Как же мы докатились до жизни такой, давайте разбираться. Вот такой простой с++

    habr.com/ru/articles/1032114/

    #программирование #ненормальное_программирование #разработка_игр #с++

  15. Часть I. Конечные автоматы. Универсальная машина Тьюринга. Интерпретатор Brainfuck

    ▒▒▒▒▒▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ▒▒▒▒▒▒▒█░▒▒▒▒▒▒▒▓▒▒▓▒▒▒▒▒▒▒░█ ▒▒▒▒▒▒▒█░▒▒▓▒▒▒▒▒▒▒▒▒▄▄▒▓▒▒░█░▄▄ ▒▒▄▀▀▄▄█░▒▒▒▒▒▒▓▒▒▒▒█░░▀▄▄▄▄▄▀░░█ ▒▒█░░░░█░▒▒▒▒▒▒▒▒▒▒▒█░░░░░░░░░░░█ ▒▒▒▀▀▄▄█░▒▒▒▒▓▒▒▒▓▒█░░░█▒░░░░█▒░░█ ▒▒▒▒▒▒▒█░▒▓▒▒▒▒▓▒▒▒█░░░░░░░▀░░░░░█ ▒▒▒▒▒▄▄█░▒▒▒▓▒▒▒▒▒▒▒█░░█▄▄█▄▄█░░█ ▒▒▒▒█░░░█▄▄▄▄▄▄▄▄▄▄█░█▄▄▄▄▄▄▄▄▄█ ▒▒▒▒█▄▄█░░█▄▄█░░░░░░█▄▄█░░█▄▄█ Я практик и популяризатор языково-ориентированного программирования [1]. В нём задачи решают тройкой: доменная виртуальная машина VM, доменный язык программирования DSL и алгоритмы на нём. В этом курсе удачными фрагментами разных заметок доступно объясним причины многообразия языков и преимущества их разработки. С теорией, историей и примерами. Вся наша работа строится вокруг VM, DSL, EBNF, отношений и графов. Мы увидим, как эти объекты соединяют вместе, получая вычислители и программы.

    habr.com/ru/articles/1029848/

    #компиляторы #конечные_автоматы #машина_тьюринга #brainfuck #ненормальное_программирование #ретро_компьютинг #zx_spectrum #виртуальные_машины #vm #старое_железо

  16. Часть I. Конечные автоматы. Универсальная машина Тьюринга. Интерпретатор Brainfuck

    ▒▒▒▒▒▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ▒▒▒▒▒▒▒█░▒▒▒▒▒▒▒▓▒▒▓▒▒▒▒▒▒▒░█ ▒▒▒▒▒▒▒█░▒▒▓▒▒▒▒▒▒▒▒▒▄▄▒▓▒▒░█░▄▄ ▒▒▄▀▀▄▄█░▒▒▒▒▒▒▓▒▒▒▒█░░▀▄▄▄▄▄▀░░█ ▒▒█░░░░█░▒▒▒▒▒▒▒▒▒▒▒█░░░░░░░░░░░█ ▒▒▒▀▀▄▄█░▒▒▒▒▓▒▒▒▓▒█░░░█▒░░░░█▒░░█ ▒▒▒▒▒▒▒█░▒▓▒▒▒▒▓▒▒▒█░░░░░░░▀░░░░░█ ▒▒▒▒▒▄▄█░▒▒▒▓▒▒▒▒▒▒▒█░░█▄▄█▄▄█░░█ ▒▒▒▒█░░░█▄▄▄▄▄▄▄▄▄▄█░█▄▄▄▄▄▄▄▄▄█ ▒▒▒▒█▄▄█░░█▄▄█░░░░░░█▄▄█░░█▄▄█ Я практик и популяризатор языково-ориентированного программирования [1]. В нём задачи решают тройкой: доменная виртуальная машина VM, доменный язык программирования DSL и алгоритмы на нём. В этом курсе удачными фрагментами разных заметок доступно объясним причины многообразия языков и преимущества их разработки. С теорией, историей и примерами. Вся наша работа строится вокруг VM, DSL, EBNF, отношений и графов. Мы увидим, как эти объекты соединяют вместе, получая вычислители и программы.

    habr.com/ru/articles/1029848/

    #компиляторы #конечные_автоматы #машина_тьюринга #brainfuck #ненормальное_программирование #ретро_компьютинг #zx_spectrum #виртуальные_машины #vm #старое_железо

  17. Часть I. Конечные автоматы. Универсальная машина Тьюринга. Интерпретатор Brainfuck

    ▒▒▒▒▒▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ▒▒▒▒▒▒▒█░▒▒▒▒▒▒▒▓▒▒▓▒▒▒▒▒▒▒░█ ▒▒▒▒▒▒▒█░▒▒▓▒▒▒▒▒▒▒▒▒▄▄▒▓▒▒░█░▄▄ ▒▒▄▀▀▄▄█░▒▒▒▒▒▒▓▒▒▒▒█░░▀▄▄▄▄▄▀░░█ ▒▒█░░░░█░▒▒▒▒▒▒▒▒▒▒▒█░░░░░░░░░░░█ ▒▒▒▀▀▄▄█░▒▒▒▒▓▒▒▒▓▒█░░░█▒░░░░█▒░░█ ▒▒▒▒▒▒▒█░▒▓▒▒▒▒▓▒▒▒█░░░░░░░▀░░░░░█ ▒▒▒▒▒▄▄█░▒▒▒▓▒▒▒▒▒▒▒█░░█▄▄█▄▄█░░█ ▒▒▒▒█░░░█▄▄▄▄▄▄▄▄▄▄█░█▄▄▄▄▄▄▄▄▄█ ▒▒▒▒█▄▄█░░█▄▄█░░░░░░█▄▄█░░█▄▄█ Я практик и популяризатор языково-ориентированного программирования [1]. В нём задачи решают тройкой: доменная виртуальная машина VM, доменный язык программирования DSL и алгоритмы на нём. В этом курсе удачными фрагментами разных заметок доступно объясним причины многообразия языков и преимущества их разработки. С теорией, историей и примерами. Вся наша работа строится вокруг VM, DSL, EBNF, отношений и графов. Мы увидим, как эти объекты соединяют вместе, получая вычислители и программы.

    habr.com/ru/articles/1029848/

    #компиляторы #конечные_автоматы #машина_тьюринга #brainfuck #ненормальное_программирование #ретро_компьютинг #zx_spectrum #виртуальные_машины #vm #старое_железо

  18. Часть I. Конечные автоматы. Универсальная машина Тьюринга. Интерпретатор Brainfuck

    ▒▒▒▒▒▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ▒▒▒▒▒▒▒█░▒▒▒▒▒▒▒▓▒▒▓▒▒▒▒▒▒▒░█ ▒▒▒▒▒▒▒█░▒▒▓▒▒▒▒▒▒▒▒▒▄▄▒▓▒▒░█░▄▄ ▒▒▄▀▀▄▄█░▒▒▒▒▒▒▓▒▒▒▒█░░▀▄▄▄▄▄▀░░█ ▒▒█░░░░█░▒▒▒▒▒▒▒▒▒▒▒█░░░░░░░░░░░█ ▒▒▒▀▀▄▄█░▒▒▒▒▓▒▒▒▓▒█░░░█▒░░░░█▒░░█ ▒▒▒▒▒▒▒█░▒▓▒▒▒▒▓▒▒▒█░░░░░░░▀░░░░░█ ▒▒▒▒▒▄▄█░▒▒▒▓▒▒▒▒▒▒▒█░░█▄▄█▄▄█░░█ ▒▒▒▒█░░░█▄▄▄▄▄▄▄▄▄▄█░█▄▄▄▄▄▄▄▄▄█ ▒▒▒▒█▄▄█░░█▄▄█░░░░░░█▄▄█░░█▄▄█ Я практик и популяризатор языково-ориентированного программирования [1]. В нём задачи решают тройкой: доменная виртуальная машина VM, доменный язык программирования DSL и алгоритмы на нём. В этом курсе удачными фрагментами разных заметок доступно объясним причины многообразия языков и преимущества их разработки. С теорией, историей и примерами. Вся наша работа строится вокруг VM, DSL, EBNF, отношений и графов. Мы увидим, как эти объекты соединяют вместе, получая вычислители и программы.

    habr.com/ru/articles/1029848/

    #компиляторы #конечные_автоматы #машина_тьюринга #brainfuck #ненормальное_программирование #ретро_компьютинг #zx_spectrum #виртуальные_машины #vm #старое_железо

  19. Компиляторы тоже путаются в именах

    Это продолжение темы начатой в статье Важны ли компилятору имена , и продолженой в Ночью все кошки серы, а using'и одинаковы , и если вам нужна полная картина, как компилятор превращает текст в программу, то без понимания поиска имён (name lookup) дальше двигаться уже не получится. Имена в тексте исходника это просто удобные ярлыки для людей: переменные, функции, типы. Но для компилятора имя являеются точкой входа в довольно сложный алгоритм, который должен однозначно определить, что именно вы имели в виду . И вот здесь начинается самое интересное: одинаково написанное имя в разных контекстах может означать совершенно разные вещи, а иногда даже не означать ничего вовсе, в зависимости от того, где и как оно используется. C++ в этом месте особенно коварен. Язык рос десятилетиями, и правила поиска имён эволюционировали вместе с ним: добавлялись пространства имён, шаблоны, ADL, двухфазный поиск. Всё это не просто усложнило модель, оно сделало её местами неинтуитивной даже для опытных разработчиков, добавим сюда еще, что разные компиляторы исторически реализовывали эти правила (по-своему) по-разному, и часть этих различий до сих пор всплывает в коде. Не нужно воспринимать компилятор как чёрный ящик, хотя порою поиск имён действительно выглядит как магия, но если разобрать его на отдельные шаги, то становится видно, что за этой «магией» стоит вполне строгая (хоть и исторически нагруженная) система правил. Попробую о ней рассказать. Какой-то странный, этот ваш с++

    habr.com/ru/articles/1023334/

    #с++ #с++_программирование #ненормальное_программирование #разработка_игр #компиляторы

  20. Лишние вычисления

    Если говорить о производительности вне существующих решений в железе, то интуиция будет подсказывать достаточно простую модель выполнения, когда процессор обрабатывает инструкции, а память поставляет данные, и чем быстрее и то и другое, тем быстрее работает программа. Но процессоры научились выполнять миллиарды операций в секунду, а память наращивает скорость доступа намного медленнее, и разрыв между скоростью вычислений и доступа к данным стал настолько большим, что именно ожидание памяти, превратилось в главный источник потерь производительности. Ответом на это стало не ускорение памяти, а усложнение самих процессоров, которые перестали быть просто пассивными исполнителями кода и стали решать задачи управления потоком данных: выполнять инструкции вне порядка, переупорядочивать зависимости и на каком-то этапе подошли к идее спекулятивно исполнять код, который, возможно, вообще не понадобится. Предсказание ветвлений стало один из ключевых механизмов в этой системе, которая должна была снять часть времени простоя потока вычислений, но если удачное предсказание стало возможностью начать дорогие загрузки заранее и скрыть их латентность, то ошибка предсказания скрывает не только потерянные такты, но и зря использованные ресурсы памяти: шину, буферы загрузки, пропускную способность контроллера и сами кэш-линии, которые могли бы быть заняты полезными данными. Именно здесь возникает интересный и неочевидный компромисс, позволяющий с одной стороны, писать branchless-код и полностью избавиться от ошибок предсказания, а с другой лишающий процессор возможности работать на опережение и запускать доступ к памяти раньше времени. Но в зависимости от того, где находятся данные в памяти выигрывать будет то один, то другой подход. Если вы собираетесь писать branchless код, надо помнить как именно спекулятивное выполнение и предсказание ветвлений взаимодействуют с подсистемой памяти, потому что “лишняя работа” иногда ускоряет программу, а в некоторых случаях попытка сделать код более “предсказуемым” приводит к обратному эффекту.

    habr.com/ru/articles/1019082/

    #c++ #программирование #ненормальное_программирование #разработка_игр

  21. Компилятор C в compile-time

    Если кратко, то цель: компилятор некоторого подмножества языка Си на C++, который работает в compile-time. Компиляция будет происходить в кастомный байт-код для дальнейшего выполнения в ВМ уже в рантайме. Скомпилировать

    habr.com/ru/articles/1018504/

    #c++20 #c++ #ненормальное_программирование #компиляторы #compiletime

  22. Ночью все кошки серы, а using'и одинаковы

    Одной из самых сложных частей C++ до сих пор считаются правила поиска имён, и ошибки связанные с name lookup проявляются обычно уже в рантайме. Код компилится и даже работает какое-то время, но при свете луны ведёт себя не так как ожидает программист. За простыми идентификаторами скрывается многоуровневая система областей видимости, категорий имён и специальных правил, и очень многое в нашем текущем стандарте растёт прямиком из восьмидесятых, частенько без изменений. Давайте посмотрим как компилятор видит имена в C++, какие области видимости существуют и почему они ведут себя по-разному. В C++ есть несколько типов областей видимости, вы наверное сходу назовёте глобальное пространство имён, область параметров шаблона, область видимости класса и область параметров функции, но также есть блочная область видимости и область видимости перечислений. Между этими областями есть исторически сложившаяся асимметрия, которая частенько удивляет: два объявления using, которые вводят одно и то же имя в одну и ту же область видимости внутри пространства имён компилятор съест без возражений, но если попытаться сделать то же самое других областях видимости, то получим ошибку на повторное объявление. В серии статей про "нескучное программирование" я разбираю скользкие случаи и как мы докатились до такого. Это продолжение темы, начатой в "Важны ли компилятору имена" , поэтому чтобы картинка была цельной, лучше пробежать её по диагонали.

    habr.com/ru/articles/1015492/

    #с++ #программирование #игры #разработка_игр #ненормальное_программирование

  23. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  24. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  25. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  26. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  27. Безумие препроцессора: внедряем do-нотацию для монад из Haskell в C++

    Добро пожаловать в чистилище препроцессора — место, где здравый смысл уступает место макросам. Сегодня мы заставим C++ притвориться Haskell-ем и внедрим do-нотацию, за которую любой адепт «чистого языка» предаст нас анафеме. Программисты на C++ делятся на два типа: те, кто боится препроцессора, и те, кто познал сие древнее чудо с сишных времён. Сегодня мы перейдем черту. Функциональное программирование манит своими абстракциями, но когда дело доходит до цепочек вычислений в монадах, C++ встречает нас бесконечными лямбдами и вложенностью, от которой рябит в глазах. В Haskell эта проблема решена элегантным do-синтаксисом. А что, если я скажу, что мы можем получить то же самое в C++, используя лишь тёмную магию макросов, простые шаблоны и полное пренебрежение здравым смыслом? Приготовьтесь: мы будем дорабатывать парсер и превращать ваш код в нечто, что заставит коллег вызвать экзорциста. Это история о том, как затащить чистую красоту монад в суровый мир C++. Запустить конвейер безумия

    habr.com/ru/companies/timeweb/

    #C++ #монады #haskell #doнотация #ненормальное_программирование #функциональное_программирование #препроцессор #макросы #timeweb_статьи

  28. Нескучное программирование. Обобщения (ч.1)

    Представьте на минуту, что C++ — это не набор странных ключевых слов и ошибок линковки, а всего лишь ещё один способ поговорить о мире вокруг нас: о людях, числах, цветах, событиях и котах. Мы привыкли думать о программировании как о чём‑то сугубо техническом, где важно запомнить синтаксис, расставить точки с запятой и “угадать”, чего сейчас хочет компилятор. Но если задать себе вопрос «а чем вообще оперирует программа?», внезапно выясняется, что за всеми этими int, struct и template прячутся довольно простые и понятные идеи: вещи, их свойства, группы похожих вещей и правила, по которым одни вещи превращаются в другие. И попробовав объяснить, что такое объекты, типы и прочие фундаментальные понятия информатики, неизбежно приходится выходить за рамки чисто технического языка и говорить о более общих категориях идей, с которыми человечество работает уже тысячи лет, и именно здесь нам пригодятся слова «сущность», «вид» и «род». Когда философы и логики говорят об абстрактных сущностях, они имеют в виду индивидуальные вещи, которые не существуют в пространстве и времени так, как существуют стол, человек или компьютер, а как нечто неизменное: например, число 13 или сам по себе синий цвет не родились в какой‑то момент и не "умирают" через какое‑то время, это не объекты физического мира, а идеи, с которыми мы работаем в голове и в математике.

    habr.com/ru/articles/1007998/

    #с++ #ненормальное_программирование #программирование #разработка_игр

  29. Неизвестные известные алгоритмы и трюки на языке C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ. Если вы видите эту статью, значит еще не все тайны C раскрыты. В этой статье будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #timeweb_статьи

  30. Неизвестные известные алгоритмы и трюки на языке C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ. Если вы видите эту статью, значит еще не все тайны C раскрыты. В этой статье будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #timeweb_статьи

  31. Неизвестные известные алгоритмы и трюки на языке C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ. Если вы видите эту статью, значит еще не все тайны C раскрыты. В этой статье будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #timeweb_статьи

  32. Неизвестные известные алгоритмы и трюки на языке C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ. Если вы видите эту статью, значит еще не все тайны C раскрыты. В этой статье будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #timeweb_статьи

  33. Непотребные алгоритмы, ненормальные трюки и всевозможные хаки на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Если вы видите эту статью, значит еще не все тайны C раскрыты. В этом материале будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже. Добро пожаловать в восьмую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #си #программирование #timeweb_статьи

  34. Непотребные алгоритмы, ненормальные трюки и всевозможные хаки на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Если вы видите эту статью, значит еще не все тайны C раскрыты. В этом материале будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже. Добро пожаловать в восьмую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #си #программирование #timeweb_статьи

  35. Непотребные алгоритмы, ненормальные трюки и всевозможные хаки на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Если вы видите эту статью, значит еще не все тайны C раскрыты. В этом материале будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже. Добро пожаловать в восьмую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #си #программирование #timeweb_статьи

  36. Непотребные алгоритмы, ненормальные трюки и всевозможные хаки на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень) и алгоритмах на языке C! Если вы видите эту статью, значит еще не все тайны C раскрыты. В этом материале будет еще больше свежих хаков, фанов, трюков, еще больше магии и скорости! А также нетипичных алгоритмов и структур данных, что позволит вам почерпнуть и полезную информацию тоже. Добро пожаловать в восьмую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #трюки #хаки #фаны #алгоритмы #структуры_данных #ненормальное_программирование #си #программирование #timeweb_статьи

  37. Охота за красным fps

    Профилирование часто недооценивают как постоянный процесс, считая его чем вроде финальной фазы перед релизом, вроде полировки или поиска багов и в целом это, конечно, напоминает поиск багов, но это не просто поиск узких мест в коде и их фикс здесь и сейчас, а часто отдельная философия разработки, которая содержит несколько школ со своими принцЫпами (будут в конце статьи), которые нормально так разнятся. И без глубокого "как надо профилировать" невозможно создать действительно игру, которая будет работать приемлемо работать на "картошке". Начну я с фундаментального вопроса: что же такое игра с точки зрения программной инженерии? В целом игра -- это система мягкого реального времени, что означает, что все процессы, которые в ней происходят, начиная от игровых событий вроде нажатия кнопок игроком или появления врагов на экране, продолжая игровой логикой, которая определяет правила взаимодействия объектов и состояния игрового мира, физикой, столкновениями и заканчивая рендерингом, должны происходить в строго определенное время, и это ограничение является абсолютным и не подлежащим обсуждению, иначе мы получим "вязкий" игровой процесс. Это очень отличает игры от большинства других типов программного обеспечения, где небольшая задержка в несколько миллисекунд не так незаметна или вообще не критична для пользовательского опыта. Вот вы открыли эту статью и ваш браузер грузил эту странцицу на секунду дольше чем мог бы, потому что я как обычно вставил большую КДПВ, но вы как пользователь этого, скорее всего, даже не заметили. Или редактор Хабра, в котором я сейчас пишу эту статью и который сохраняет документ на секунду медленнее чем мог бы, это абсолютно не влияет на работу и вы об этом вообще никогда не задумывались. Но если игра пропускает хотя бы один кадр и вместо 16.6 миллисекунд тратит 30 и больше, то игрок зачечает заметную задержку в анимации, и это портит впечатление от игры. Соответственно, если мы что-то добавляем в игровой код, что-то изменяем в алгоритмах или в контенте, мы должны это строго отслеживать, чтобы не внести каких-то проблем с производительностью, которые разрушают игровой опыт. Оптимизируй это...

    habr.com/ru/articles/993698/

    #с++ #разразрботка_игр #программирование #ненормальное_программирование

  38. Тетрис в ядре Linux

    Вероятно, вы знаете, что если запустить ядро Linux без корневой файловой системы или файла initramfs, то оно упадет с сообщением о панике ядра. Но возможна ли работа ядра Linux без этих, вроде бы обязательных компонентов? Ответ на вопрос - да, возможна, но использовать такие возможности в конечном продукте не стоит. При запуске ядра ему могут передаваться параметры через командную строку. Одним из параметров является rootwait , указывающий ядру на то, что нужно подождать появление корневой файловой системы. В этом случае ядро ожидает появление корневой системы, а не завершается выполнение ядра с ошибкой. Формально ничто не мешает написать модуль ядра, который взаимодействует с клавиатурой и дисплеем и временно выполняет функции пользовательского приложения, пока ядро ожидает корневую файловую систему. Пользовательским приложением может быть, например, игра Тетрис. Она из-за своей простоты в реализации и зрелищности добавляет наглядности в изучении темы и дает чувство завершенности. А мысль о том, что тетрис, работает в ядре, усиливает эффект.

    habr.com/ru/companies/timeweb/

    #linux #linux_kernel #linux_modules #qemu #c_language #lowlevel #ненормальное_программирование #timeweb_статьи

  39. Тетрис в ядре Linux

    Вероятно, вы знаете, что если запустить ядро Linux без корневой файловой системы или файла initramfs, то оно упадет с сообщением о панике ядра. Но возможна ли работа ядра Linux без этих, вроде бы обязательных компонентов? Ответ на вопрос - да, возможна, но использовать такие возможности в конечном продукте не стоит. При запуске ядра ему могут передаваться параметры через командную строку. Одним из параметров является rootwait , указывающий ядру на то, что нужно подождать появление корневой файловой системы. В этом случае ядро ожидает появление корневой системы, а не завершается выполнение ядра с ошибкой. Формально ничто не мешает написать модуль ядра, который взаимодействует с клавиатурой и дисплеем и временно выполняет функции пользовательского приложения, пока ядро ожидает корневую файловую систему. Пользовательским приложением может быть, например, игра Тетрис. Она из-за своей простоты в реализации и зрелищности добавляет наглядности в изучении темы и дает чувство завершенности. А мысль о том, что тетрис, работает в ядре, усиливает эффект.

    habr.com/ru/companies/timeweb/

    #linux #linux_kernel #linux_modules #qemu #c_language #lowlevel #ненормальное_программирование #timeweb_статьи

  40. Тетрис в ядре Linux

    Вероятно, вы знаете, что если запустить ядро Linux без корневой файловой системы или файла initramfs, то оно упадет с сообщением о панике ядра. Но возможна ли работа ядра Linux без этих, вроде бы обязательных компонентов? Ответ на вопрос - да, возможна, но использовать такие возможности в конечном продукте не стоит. При запуске ядра ему могут передаваться параметры через командную строку. Одним из параметров является rootwait , указывающий ядру на то, что нужно подождать появление корневой файловой системы. В этом случае ядро ожидает появление корневой системы, а не завершается выполнение ядра с ошибкой. Формально ничто не мешает написать модуль ядра, который взаимодействует с клавиатурой и дисплеем и временно выполняет функции пользовательского приложения, пока ядро ожидает корневую файловую систему. Пользовательским приложением может быть, например, игра Тетрис. Она из-за своей простоты в реализации и зрелищности добавляет наглядности в изучении темы и дает чувство завершенности. А мысль о том, что тетрис, работает в ядре, усиливает эффект.

    habr.com/ru/companies/timeweb/

    #linux #linux_kernel #linux_modules #qemu #c_language #lowlevel #ненормальное_программирование #timeweb_статьи

  41. Тетрис в ядре Linux

    Вероятно, вы знаете, что если запустить ядро Linux без корневой файловой системы или файла initramfs, то оно упадет с сообщением о панике ядра. Но возможна ли работа ядра Linux без этих, вроде бы обязательных компонентов? Ответ на вопрос - да, возможна, но использовать такие возможности в конечном продукте не стоит. При запуске ядра ему могут передаваться параметры через командную строку. Одним из параметров является rootwait , указывающий ядру на то, что нужно подождать появление корневой файловой системы. В этом случае ядро ожидает появление корневой системы, а не завершается выполнение ядра с ошибкой. Формально ничто не мешает написать модуль ядра, который взаимодействует с клавиатурой и дисплеем и временно выполняет функции пользовательского приложения, пока ядро ожидает корневую файловую систему. Пользовательским приложением может быть, например, игра Тетрис. Она из-за своей простоты в реализации и зрелищности добавляет наглядности в изучении темы и дает чувство завершенности. А мысль о том, что тетрис, работает в ядре, усиливает эффект.

    habr.com/ru/companies/timeweb/

    #linux #linux_kernel #linux_modules #qemu #c_language #lowlevel #ненормальное_программирование #timeweb_статьи

  42. Невозможные возможные трюки и интересные алгоритмы на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но раздвигает границы дозволенного. А иногда позволяет найти необычные эффективные решения. В этой статье я хочу рассказать вам об интересных алгоритмах, и невозможных возможных трюках. Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ и битовых трюков. Если вы видите на экране эту часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало. В этой статье будет еще порция свежих алгоритмов, фанов, трюков, еще больше магии и скорости! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #C #трюки #хаки #фаны #алгоритмы #алгоритмы_поиска #си #ненормальное_программирование

  43. Невозможные возможные трюки и интересные алгоритмы на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но раздвигает границы дозволенного. А иногда позволяет найти необычные эффективные решения. В этой статье я хочу рассказать вам об интересных алгоритмах, и невозможных возможных трюках. Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ и битовых трюков. Если вы видите на экране эту часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало. В этой статье будет еще порция свежих алгоритмов, фанов, трюков, еще больше магии и скорости! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #C #трюки #хаки #фаны #алгоритмы #алгоритмы_поиска #си #ненормальное_программирование

  44. Невозможные возможные трюки и интересные алгоритмы на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но раздвигает границы дозволенного. А иногда позволяет найти необычные эффективные решения. В этой статье я хочу рассказать вам об интересных алгоритмах, и невозможных возможных трюках. Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ и битовых трюков. Если вы видите на экране эту часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало. В этой статье будет еще порция свежих алгоритмов, фанов, трюков, еще больше магии и скорости! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #C #трюки #хаки #фаны #алгоритмы #алгоритмы_поиска #си #ненормальное_программирование

  45. Невозможные возможные трюки и интересные алгоритмы на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но раздвигает границы дозволенного. А иногда позволяет найти необычные эффективные решения. В этой статье я хочу рассказать вам об интересных алгоритмах, и невозможных возможных трюках. Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ и битовых трюков. Если вы видите на экране эту часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало. В этой статье будет еще порция свежих алгоритмов, фанов, трюков, еще больше магии и скорости! Добро пожаловать в новую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #C #трюки #хаки #фаны #алгоритмы #алгоритмы_поиска #си #ненормальное_программирование

  46. Почему универ не готовит программистов

    Начну с ситуации, которая произошла некоторая время назад - встретился я за чашкой кофе со своим бывшим коллегой, десять лет назад он пришел в разработку игр студентом, но объективно не тянул программирование и в итоге пришлось расстаться. Разошлись достаточно мирно, (пусть будет) Кеша ушел сначала в мобилки, а потом в маркетинг игр в смежную копмпанию, где за прошедшее время поднялся до начальника отряда трудоголиков на галере, но по какой-то своей внутренней мотивации решил в вернуться в большой игрострой, на фоне чего, собственно, мы и пересеклись в кафе. За последние время индустрия не то, чтобы особо прыгнула вперед, но существенно так просеменила некоторый путь в направлении светлого будущего в объятиях аишки, чутка поменялись стандарты, добавились разные помощники и жить в целом стало веселее, а местами даже без кранчей. Но Кеша пришел фактически со знаниями студента последних курсов, зато с большим опытом в игрострое в плане того, как продать уже сделанную игру на последней миле, но статья будет не об этом, а скорее про то, как молодой или уже не очень спец попадает в разработку. И это дает повод поговорить о ситуации, которая многих из нас напрямую - игровых и околоигровых разработчиков, уж извините, хвалить я буду своё болото - касается, и даже сейчас, когда у нас есть всякие умные ИИ-помощники типа чатика или клода, которые вроде как должны всё упростить, проблема никуда не делась и даже стала ещё более явной, потому что если посмотреть на это со стороны, то получается просто какой-то театр абсурда, причём довольно грустный театр, если честно. С одной стороны у нас движковый, анимационный и gameplay программист это буквально одна из самых дефицитных профессий в индустрии прямо сейчас, чтобы вы понимали в среднем нехватка по студиям больше 20% мидловых и помидорских позиций, т.е. не хватает как минимум одного спеца в каждой команде, куда ни ткни. А ребята из Epic Games, Unity, CD проджектов и прочих крупных студий постоянно жалуются, что не могут найти нормальных специалистов, которые реально умеют работать с современными движками, и они готовы платить безумные деньги (безумные по меркам штатов конечно, в старом свете все более приземленное, но тенденция та же) тем кто шарит в графике или может написать мультипоточный код, который не развалится на проде, или знает, как выжать лишние пару кадров из железа, но людей всё равно не хватает и это при том, что желающих работать в геймдеве очень и очень много.

    habr.com/ru/articles/990892/

    #с++ #разработка_игр #программирование #ненормальное_программирование

  47. Нескучное программирование.Важны ли компилятору имена

    Есть старая шутка о том “чем отличается обычный программист на С++ от хорошего программиста на С++”? Первый пишет код, а второй может объяснить, почему он работает. Это конечно шутка, но сейчас далеко не всякий даже хороший программист может объяснить, как работает тот или иной участок кода или внутренняя логика, которая привела к конечному решению, не прибегая к ультимативными фразам вроде «так написано в стандарте» или «так нахерачил компилятор». В центре всего, что происходит внутри компилятора, находятся два процесса: поиск имён и разрешение перегрузок, которое мы рассмотрели в предыдущих статьях. И каждый раз, когда компилятор обрабатывает ваш код — он обрабатывает всего два вопроса: Первый: «Что вообще может означать это имя здесь?» Второй: «Если вариантов несколько, какой из них правильный?» Если вы поймёте, как компилятор отвечает на эти вопросы, то вы поймете как работает и всё остальное — шаблоны, концепты, перегрузки — это всё строится на решении этих двух вопросов.

    habr.com/ru/articles/990816/

    #с++ #с++_программирование #ненормальное_программирование #игры_и_игровые_консоли

  48. Нескучное программирование.И снова ограничения

    Хотя концепты действительно являются мощным и выразительным инструментом, у них есть принципиальные ограничения, о которых важно знать, чтобы не пытаться использовать их не по назначению. Эти ограничения не случайны и не являются «недоделками» языка, а отражают осознанное архитектурное решение, принятое комитетом C++. Первое фундаментальное ограничение это запрет прямой и косвенной рекурсии в определении концепта. Проще говоря, концепт не может ссылаться сам на себя ни напрямую, ни через цепочку других концептов. Например, такое определение является недопустимым template < typename T> concept Recurse = Recurse<T>; Даже если попытаться замаскировать рекурсию через промежуточные концепты, результат будет тем же, и код все раво не скомпилируется. Это ограничение введено для того, чтобы исключить возможность бесконечных циклов на этапе проверки ограничений, но в отличие от обычных шаблонов, концепты должны проверяться быстро и предсказуемо, без риска зациклиться в процессе компиляции.

    habr.com/ru/articles/988018/

    #с++ #программирование #ненормальное_программирование #разработка_игры

  49. Нескучное программирование. Иерархия концептов

    В прошлых статьях я разобрал как работают перегрузки и как компилятор находит нужные функции в связанных пространствах имён, но что происходит, когда компилятор находит не одну, а сразу несколько подходящих перегрузок? Особенно актуальным этот вопрос становится при работе с шаблонами и концептами, потому что один и тот же тип может удовлетворять требованиям нескольких функций одновременно и вот здесь в игру вступает механизм выбора наиболее подходящей перегрузки. Без этого выбора вся система requires и концептов работать не будет. Как компилятор выбирает лучшую перегрузку, если подходящих вариантов несколько? Интуитивно мы ожидаем, что более «точная» функция должна иметь приоритет над более общей и часто это ожидание мы переносим в правила для компилятора при написании шаблонов и ограничений. Общая идея здесь следующая: перегрузки можно не просто перечислять, а выстраивать в иерархию по степени специфичности, тогда одни функции будут описывать широкий класс типов, другие его подмножество, и, когда тип аргумента известен, компилятор должен выбрать ту функцию, чьи требования наиболее точно соответствуют этому типу. Эта логика заложена прямо в стандарте C++ и называется partial ordering , то есть частичный порядок, потому что не все перегрузки обязательно сравнимы между собой. Немножко сложности...

    habr.com/ru/articles/985688/

    #программирование #ненормальное_программирование #с++ #разработка_игр

  50. Ненормальные непотребства, трюки, хаки и алгоритмы на C

    Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень), алгоритмах на языке C! Идея написать эту статью зародилась из моего поста , после него я начал серию статей, которая раскрывала много интересных моментов — от математических алгоритмов и оптимизации до ГПСЧ. Если вы видите на экране эту шестую часть нашей бесконечной саги о ненормальном программировании на C, значит, мы с вами прошли уже немало: от конвертации миль в километры через Фибоначчи до ГПСЧ и быстрых вычислений. В этой статье будет еще порция свежих хаков, фанов, трюков, еще больше магии и скорости! Добро пожаловать в шестую часть. Прошу под кат — там будет жарко, быстро и очень, очень интересно.

    habr.com/ru/companies/timeweb/

    #c #ненормальное_программирование #трюки #хаки #фаны #алгоритмы #структуры #си #timeweb_статьи