Как стать автором
Обновить
546
-5

Довожу здравый смысл до абсурда

Отправить сообщение

Поговорим об оптимизирующих компиляторах. Сказ второй: Доминирование

Уровень сложности Средний
Время на прочтение 10 мин
Количество просмотров 9K

Сегодня мы продолжаем наш разговор об оптимизирующих компиляторах для самых маленьких и не очень. Для тех, кто пока не в курсе происходящего, но желает приобщиться - я поставил себе задачу написать цикл вводных статей в эту область для совсем-совсем начинающих. Первую часть, где рассказывается об SSA-форме, можно и нужно прочитать здесь.

Сегодня мы поговорим о доминировании. Это одна из фундаментальных вещей, на которых стоит как теория компиляторов вообще, так и многие компиляторные оптимизации в частности. Пристегните ремни и запишите стоп-слово на бумажке, чтобы не забыть.

Причаститься
Всего голосов 49: ↑49 и ↓0 +49
Комментарии 18

Пишем трассировщик лучей для ZX Spectrum

Уровень сложности Простой
Время на прочтение 16 мин
Количество просмотров 20K

Я люблю трассировщики лучей и даже посвятил им половину своей книги. Менее известна моя любовь к ZX Spectrum — домашнему компьютеру 1982 года, с которым я вырос и с которого начался мой интерес к графике и программированию. По современным стандартам эта машина столь смехотворно слаба (и даже по стандартам 1980-х), поэтому возникает неизбежный вопрос: в какой степени удастся портировать трассировщик лучей из книги Computer Graphics from Scratch на ZX Spectrum?

В ZX Spectrum установлен процессор Z80 на 3,5 МГц (в тысячу раз медленнее, чем современные компьютеры), который не может умножать числа (!!!), и 48 КБ ОЗУ (в миллион раз меньше); он имеет графический режим 256x176 (примерно в двести раз меньше современного разрешения), способный отображать 15 цветов (в миллион раз меньше, к тому же с довольно необычными особенностями). Интересная машина для графического приложения, активно задействующего CPU!

Я планирую реализовать его на Sinclair BASIC — встроенном языке программирования Spectrum. Это не просто BASIC, а древний, очень ограниченный диалект BASIC. Например, единственные структуры управления в нём — это FOR и IF (а у IF нет ELSE и даже ENDIF); все переменные глобальны; не существует вызовов функций, только GO TO и GO SUB; и так далее. Кроме того, он интерпретируемый, то есть сверхмедленный. Но, по крайней мере, он реализует программное умножение! Если мне нужна будет производительность, то я всегда могу переписать трассировщик на ассемблере.

Я настроил минимально необходимую среду: код на BASIC я пишу в VS Code, компилирую его с помощью BAS2TAP и запускаю в эмуляторе FUSE. Благодаря этому скорость итераций оказалась достаточно высокой.

Читать далее
Всего голосов 142: ↑141 и ↓1 +140
Комментарии 85

Из пушек по воробьям. Генерация и решение лабиринта не самым обычным способом

Уровень сложности Средний
Время на прочтение 19 мин
Количество просмотров 4.5K

На уходящей неделе мне попалась симпатичная, хоть и не новая мини‑серия статей на Дзен‑канале @zdgzdgzdg про процедурную генерацию лабиринта методом «коллапса волновой функции». Пока я читал эти статьи и знакомился с кодом, меня осенило: ведь это же вычисления в комонаде, погружённые в монаду! Я не издеваюсь, действительно, речь идёт о композиции двух паттернов функционального программирования: комонады Zipper, превращающей локальные правила в глобальное состояние, и монады Random, позволяющей генерировать случайные объекты.

И вот, в качестве баловства на выходных, я решил реализовать этот «квантовый» алгоритм генерации лабиринтов на Haskell, используя и комонады и монады, и вообще, ни в чëм себе не отказывая. И хотя язык программирования Haskell нужен не только для извращений, но именно для них он подходит идеально!

Читать далее
Всего голосов 38: ↑38 и ↓0 +38
Комментарии 7

Мой вам подарок к Новому году или как наконец запустил то, что надо было давно запустить…

Уровень сложности Средний
Время на прочтение 6 мин
Количество просмотров 38K

КДПВ


Немножко истории


Начну с истории вопроса.


Очень давно я написал Fresh IDE – навороченнoe IDE для программирования на ассемблере, а точнее на FlatAssembler.


Fresh IDE долгие годы меня полностью устраивал, поэтому я с перерывами выпустил 2 главные версии и начал просто его использовать, время от времени внося какие-то исправления и изредка новые функции.


Когда перешел полностью на Linux, оказалось, что Fresh IDE прекрасно работает под WINE, и я продолжил им пользоваться без угрызений совести. В процессе даже удалось исправить несколько багов WINE (вот, вот и вот).


Как бы то ни было, но я начал писать библиотеку для переносимости ассемблерных программ между Linux и Windows (и KolibriOS). Одновременно с этим задумался и над тем, чтобы сделать Fresh IDE переносимым. Из-за архитектуры библиотеки, огромная часть кода уже и так была переносимой. А точнее все, что не касалось GUI. К сожалению, GUI был полностью написан на Win32 API и его нельзя просто так перенести на другие платформы.


Поэтому и пришлось начинать все сначала. И третья версия Fresh IDE писалась почти с нуля.

Читать дальше →
Всего голосов 267: ↑267 и ↓0 +267
Комментарии 95

Пишем компилятор C в 500 строках Python

Уровень сложности Средний
Время на прочтение 20 мин
Количество просмотров 12K

Несколько месяцев назад, закончив пост об SDF-пончике, я поставил перед собой задачу написать компилятор C в 500 строках Python1. Насколько сложна эта задача? Оказалось, что довольно сложна, даже после отказа от достаточно большого количества возможностей. Но в то же время она была довольно интересной, а результат оказался на удивление функциональным и вполне простым для понимания!

Кода слишком много, чтобы подробно объяснять его в посте2, поэтому я просто вкратце расскажу о принятых мной решениях, об аспектах, которые пришлось вырезать, и об общей архитектуре компилятора, коснувшись самого главного в каждой из частей. Надеюсь, после прочтения поста код станет для вас доступнее!
Читать дальше →
Всего голосов 20: ↑20 и ↓0 +20
Комментарии 6

Как работает усилитель звуковой частоты

Время на прочтение 7 мин
Количество просмотров 225K

Введение


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

Усилитель звуковой частоты или усилитель низкой частоты, что бы разобраться как он всё таки работает и зачем там так много всяких транзисторов, резисторов и конденсаторов, нужно понять как работает каждый элемент и попробовать узнать как эти элементы устроены. Для того что бы собрать примитивный усилитель нам понадобятся три вида электронных элементов: резисторы, конденсаторы и конечно транзисторы.
Читать дальше →
Всего голосов 100: ↑94 и ↓6 +88
Комментарии 41

Каково это — быть операционной системой?

Уровень сложности Простой
Время на прочтение 4 мин
Количество просмотров 16K

Pier-Luc Brault придумал забавную игру, которая превращает вас в... операционную систему. Некий пользователь загружает нас процессами, которые нужно распределять по свободным CPU. Если мы будем плохо справляться с задачей, пользователь выйдет из себя и перезагрузит нас. Game over.  

Читать далее
Всего голосов 46: ↑45 и ↓1 +44
Комментарии 8

Определение области коллизии

Уровень сложности Средний
Время на прочтение 15 мин
Количество просмотров 6.6K

Поиск контактных точек коллизии

Одна из важных тем при разработке своего физического движка - нахождение контактных точек. Применение этим данным масса - от определения центра удара, до построения градиента приложенных сил.

Давайте же посмотрим как это сделать!

Поехали
Всего голосов 48: ↑48 и ↓0 +48
Комментарии 13

Можно ли сложить N чисел типа double наиболее точно?

Время на прочтение 13 мин
Количество просмотров 27K

В предыдущих сериях…


Прошлая статья рассказала о двух способах сложения двух двоичных чисел с плавающей запятой без потери точности. Чтобы добиться этого, мы представили сумму c=a+b в виде двух чисел (s,t)=a+b, причём таких, что s — наиболее близкое к a+b точно-представимое число, а t=(a+b)-s — это отсекаемая в результате округления часть, составляющая точную погрешность. У читателей был вопрос: а можно ли достаточно точно сложить массив чисел типа double? Оказывается, можно! Но только, вероятно, не всегда и не абсолютно… и не алгоритмом Кэхэна, который тогда вспоминали в комментариях. За подробностями прошу под кат, где мы и найдём приложение тому, о чём я рассказал в прошлый раз.


Всего голосов 76: ↑76 и ↓0 +76
Комментарии 45

Действующий процессор на 13 микросхемах стандартной логики

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 20K


Привет, Хабр! Для меня было просто невозможно пройти мимо этого схемотехнического чуда. Горстка деталей на небольшой двусторонней плате выполняет команды машинного языка и выводит результат в виде двоичного кода!

Действующая модель называется "TD4 CPU", является проектом с открытыми исходниками, реально работает и позволяет понять устройство и принцип работы процессора.
Читать дальше →
Всего голосов 111: ↑110 и ↓1 +109
Комментарии 53

Введение в балансировку роторов

Уровень сложности Простой
Время на прочтение 16 мин
Количество просмотров 14K

Ротор - это тело, которое вращается вокруг некоторой оси и удерживается своими несущими поверхностями в опорах.  Несущие поверхности ротора передают нагрузки на опоры через подшипники качения или скольжения. Под несущими поверхностями подразумеваются поверхности цапф* или поверхности их заменяющие.

*Цапфа (нем. Zapfen "цапфа, шейка, шип, втулка, стержень") — часть вала или оси, на которой находится опора (подшипник). Цапфа, находящаяся на краю вала, называется шип, в средней части вала — шейка. Концевая цапфа, воспринимающая осевые нагрузки, — пята.

Читать далее
Всего голосов 33: ↑33 и ↓0 +33
Комментарии 41

Идеи для тех, кто хочет собрать свои часы

Уровень сложности Средний
Время на прочтение 8 мин
Количество просмотров 18K
Картинка twizz.ru

Каждый самодельщик рано или поздно приходит к тому, что ему вот прямо сейчас необходимо создать свои часы. Зачем, почему — никто не знает. Если вы пришли к такому же пониманию, «их есть у меня». А именно — собственный хит-парад самодельных часов, которые позволят как комплексно прокачать скиллы в сборке, программировании и т. д., так и украсят любой дом своим присутствием.

В этой статье умышленно будут обойдены вниманием известные проекты часов, изготовленные из радиоламп или вращающейся линейки светодиодов, установленной на диске вышедшего из строя старого HDD, так как мы постараемся остановиться на более неизвестных и эффектных экземплярах, и если известные проекты и будут затронуты, то совсем чуть-чуть :-)
Читать дальше →
Всего голосов 85: ↑79 и ↓6 +73
Комментарии 31

Пчела на работе, разработка игр на SFML C++

Время на прочтение 4 мин
Количество просмотров 10K

Предыдущая тема

Обзор игры на SFML С++. Как клонировать репозиторий и собрать проект с помощью СMake. Обзор классов игры "Пчела на работе".

Читать далее
Всего голосов 4: ↑3 и ↓1 +2
Комментарии 0

Использование GitHub в обучении студентов. Автоматизация проверок. Часть I

Время на прочтение 3 мин
Количество просмотров 4.5K

В конце декабря 2020 года я написал несколько статей на Хабре по своему опыту использования GitHub в обучении студентов (ссылки на них будут в конце сей статьи).

Сегодня же хочу рассказать об автоматизации проверки кода студентов. Примеры будут про C#, т.к. это мой основной язык, на котором я преподаю программирование.

Для меня при обучении программированию важно, чтобы студенты умели не только правильно решать задания, но и красиво писать код. В обучении и проверки заданий я использую EditorConfig, dotnet cli и GitHub Actions. Но обо всём по порядку.

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 0

Использование GitHub в обучении студентов. Автоматизация проверок. Часть II

Время на прочтение 2 мин
Количество просмотров 4.4K

Это продолжение статьи про автоматизацию проверок работ студентов (первая часть).

Сегодня продолжу рассказывать про автоматизацию проверок работ студентов: проверку правильности решения (прохождение unit-тестов). И пока ещё примеры будут связаны с C#.

Понимаю, что для многих информация в статье будет "слабой" и т.п. Но, надеюсь, хоть какому-нибудь преподавателю она пригодится. Потому как, многие преподаватели программирования не знают как облегчить себе проверки студенческих работ. Даже таким простым способом.

Читать далее
Всего голосов 11: ↑10 и ↓1 +9
Комментарии 2

Дизерпанк — статья о дизеринге изображений, которую мне хотелось бы прочитать

Время на прочтение 18 мин
Количество просмотров 25K

Мне всегда нравилась визуальная эстетика дизеринга (dithering, псевдотонирование, псевдосмешение цветов), но я не знал о том, как он применяется. Поэтому я провёл кое-какие изыскания. Эта статья может содержать отголоски ностальгии, но в ней не будет никаких следов Лены.

Читать далее
Всего голосов 147: ↑147 и ↓0 +147
Комментарии 26

Как оформить серию коммитов Git, чтобы её приняли в любой проект

Время на прочтение 8 мин
Количество просмотров 29K

Добрый день, коллеги! Доказывать, что нужно использовать систему контроля версий, уже давно не нужно. И Git занял тут лидирующую позицию, стремительно вытеснив SVN. Но это инструмент, а инструментом нужно уметь пользоваться, чтобы добиться лучших результатов. Как топором, один человек сможет просто срубить дерево а другой из этого дерева сможет сделать великолепную скульптуру. Так и с помощью Git, один человек сможет просто не потерять результаты своего труда за день, а другие смогут организовать совместную работу над проектом нескольких сотен человек. Да так, что о любой строчке кода можно будет и через пять лет сказать, откуда она взялась и для чего нужна.

Постараюсь рассказать для начинающих и не очень разработчиков, как оформлять свои коммиты, чтобы их максимально быстро и без претензий принимали в любые проекты, как опенсорсные так и коммерческие.

Читать далее
Всего голосов 59: ↑56 и ↓3 +53
Комментарии 30

Разбираем алгоритмы компьютерной графики. Часть 4 – Анимация «Салют»

Время на прочтение 7 мин
Количество просмотров 8.4K

Еще немного в копилку красивых эффектов и алгоритмов.

Вы в своей жизни наверняка видели салют, когда в ночном небе взрывает огненный шар и от него во все стороны медленно разлетаются огни.

Давайте попробуем проанализировать то, что мы с вами видим с точки зрения физики и программирования.

Читать далее
Всего голосов 44: ↑43 и ↓1 +42
Комментарии 7

Примеры ассемблерного кода для ZX Spectrum

Время на прочтение 6 мин
Количество просмотров 20K

Я не буду делать длинное вступление. Один знакомый хакер однажды сказал, что 10 строк кода могут быть понятнее и интереснее, чем 1000 слов объяснений. Все эти примеры написаны на ассемблере для архитектуры Z80 и запускаются на ретро-компьютере ZX Spectrum 48k.

Что внутри?
Всего голосов 48: ↑48 и ↓0 +48
Комментарии 29

CS50`s Introduction to Game Development с русскими субтитрами — Лекция 0. Pong

Время на прочтение 1 мин
Количество просмотров 5.7K

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

Читать далее
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 0

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность