Pull to refresh
272
0
Владимир @32bit_me

Программист

Ассемблер RISC-V для начинающих

Reading time 12 min
Views 35K

Если вы не знаете ни одного ассемблера, или, возможно, не имеете большого опыта кодинга как такового, то ассемблер RISC-V может быть одним из лучших вариантов для того, чтобы погрузиться в эту тему. Конечно, материалов по ассемблеру x86 гораздо больше. Больше людей, которые могут в этом помочь. Но x86 - это чудовище, имеющее более 1500 различных инструкций.

Архитектура RISC-V, напротив, придумана специально для того, чтобы быть простой в изучении и вместе с тем, практически эффективна для реализации высокопроизводительных микропроцессоров.

Если вам необходим хороший старт, и вы не знаете ничего о микропроцессорах, вы можете прочесть мою статью "Как работает современный микропроцессор?" (How Does a Modern Microprocessor Work?).

Если вы хотите чего-нибудь простого и весёлого, можете начать с различных игр, в основе которых лежит программирование на ассемблере: Learn Assembly Programming the Fun Way.

Другим может понравиться ретропроцессор, такой, как 6502, использовавшийся в Commodore 64. Но проблема в том, что он окончательно устарел. При его разработке не учитывались реалии сегодняшнего дня.

Большой плюс RISC-V состоит в том, что он обладает современным и простым набором команд, спроектированным с учётом современных требований, таких как медленный доступ к памяти, использование предсказателя переходов, суперскалярного out-of-order выполнения команд и т.д.

Если вам интересно всё это, прочтите: Why Is Apple’s M1 Chip So Fast?

Перед тем, как мы начнём, можете распечатать это: James Zhu RISC-V Reference.

Читать далее
Total votes 52: ↑51 and ↓1 +50
Comments 31

Правда о мозге Бендера

Reading time 4 min
Views 34K

14 ноября 1999 года эпизод "Футурамы", анимационного научно-фантастического сериала от создателя "Симпосонов" Мэтта Гроунинга, ошарашил гиков зрелищем технологического характера, абсолютно беспрецедентным в отрасли развлечений в прошлом. В этом эпизоде, "Фрай и фабрика Слёрма", профессор Фарнсворт направляет Ф-луч на голову безумного робота Бендера, и мы видим маленький прямоугольник, очевидно являющийся микросхемой, с надписью "6502".

Читать далее
Total votes 61: ↑57 and ↓4 +53
Comments 44

Как LLVM оптимизирует суммы степеней

Reading time 5 min
Views 5.1K
LLVM оптимизирует суммы степеней, например:

int sum(int count)
{
  int result = 0;

  for (int j = 0; j < count; ++j)
    result += j*j;

  return result;
}

генерируя код, вычисляющий результат без цикла (godbolt):

sum(int):
        test    edi, edi
        jle     .LBB0_1
        lea     eax, [rdi - 1]
        lea     ecx, [rdi - 2]
        imul    rcx, rax
        lea     eax, [rdi - 3]
        imul    rax, rcx
        shr     rax
        imul    eax, eax, 1431655766
        add     eax, edi
        shr     rcx
        lea     ecx, [rcx + 2*rcx]
        lea     eax, [rax + rcx]
        add     eax, -1
        ret
.LBB0_1:
        xor     eax, eax
        ret

Также обрабатываются более сложные случаи (godbolt) – то есть оптимизация здесь не просто сравнивает паттерны. В этом посте мы рассмотрим, как выполняется эта оптимизация.
Читать дальше →
Total votes 36: ↑36 and ↓0 +36
Comments 4

Реальная история разработки Commodore C128

Reading time 6 min
Views 4.3K

Самый популярным компьютером, который когда-либо продавался, был Commodore C64, проданный в количестве 27 миллионов штук в 1980-е. Мало что осталось от тех времён, 8-битной ретро-эпохе, когда молодой длинноволосый инженер-самоучка, мог, имея решимость и удачу, сесть и разработать компьютер, используя механический карандаш, кучу справочников и много бумаги.

Читать далее
Total votes 20: ↑20 and ↓0 +20
Comments 16

Using Flex (Fast Lexical Analyzer Generator)

Reading time 5 min
Views 6.9K
Lexical analysis is the first stage of a compilation process. It's used for getting a token sequence from source code. It gets an input character sequence and finds out what the token is in the start position, whether it's a language keyword, an identifier, a constant (also called a literal), or, maybe, some error. A lexical analyzer (also known as tokenizer) sends a stream of tokens further, into a parser, which builds an AST (abstract syntax tree).

It's possible to write a lexer from scratch, but much more convenient to use any lexer generator. If we define some parsing rules, corresponding to an input language syntax, we get a complete lexical analyzer (tokenizer), which can extract tokens from an input program text and pass them to a parser.

One of such generators is Flex. In this article, we'll examine how it works in general, and observe some nontrivial nuances of developing a lexer with Flex.
Read more →
Total votes 5: ↑5 and ↓0 +5
Comments 4

Обратная разработка XC2064 — первой микросхемы FPGA

Reading time 17 min
Views 11K
Программируемая Логическая Интегральная Схема (ПЛИС) может реализовать произвольную логику, что угодно, от микропроцессора до генератора видеосигнала или майнера криптовалюты. ПЛИС состоит из множества логических блоков, каждый из которых обычно состоит из триггера и логической функции, а также из сети проводников, соединяющей логические блоки. Что делает ПЛИС особенной, это то, что она является программируемым аппаратным обеспечением, вы можете сконфигурировать каждый логический блок и соединения между ними. В результате вы можете построить сложную цифровую схему без физического соединения каждого логического элемента и триггера, что обошлось бы вам в стоимость разработки заказной интегральной схемы.


Фотография показывает один из 64 блоков микросхемы XC2064. Слои металлизации убраны, мы видим кремний и поликремниевые транзисторы, лежащие под металлизацией. По ссылке вы можете увидеть фото в большем масштабе: siliconpr0n.
Читать дальше →
Total votes 63: ↑63 and ↓0 +63
Comments 24

Атрибут cleanup

Reading time 6 min
Views 5.9K
Цитата из документации GCC [1]:

Атрибут cleanup предназначен для запуска функции, когда переменная выходит из области видимости. Этот атрибут может быть применён только к auto-переменным, и не может быть использован с параметрами или с static-переменными. Функция должна принимать один параметр, указатель на тип, совместимый с переменной. Возвращаемое значение функции, если оно есть, игнорируется.

Если включена опция -fexceptions, то функция cleanup_function запускается при раскрутке стека, во время обработки исключения. Отметим, что атрибут cleanup не перехватывает исключения, он только выполняет действие. Если функция cleanup_function не выполняяет возврат нормальным образом, поведение не определено.




Атрибут cleanup поддерживается компиляторами gcc и clang.

В этой статье я приведу описание различных вариантов практического использования атрибута cleanup и рассмотрю внутреннее устройство библиотеки, которая использует cleanup для реализации аналогов std::unique_ptr и std::shared_ptr на языке C.
Читать дальше →
Total votes 19: ↑19 and ↓0 +19
Comments 5

Быстрый поиск файлов

Reading time 5 min
Views 6.5K
От переводчика: предлагаю вашему вниманию перевод очень старой статьи, опубликованной 15 января 1983 года. Несмотря на столь внушительный возраст, статья показалась мне интересной, и возможно, что она будет полезной для кого-то и сегодня. На эту статью, кстати, ссылается раздел справки man locate(1) на opennet.ru: https://www.opennet.ru/man.shtml?topic=locate.



Краткое содержание


Статья описывает механизм быстрого поиска файлов в UNIX. Он объединяет два метода компрессии данных с новой техникой поиска строк, и предназначен для быстрого поиска произвольных файлов. Код, интегрированный в стандартную утилиту find, производит поиск в предварительно созданной базе данных, обновляемой ежедневно. Это отличает его от обычного механизма поиска совпадений ключа с кандидатами, которые генерируются «на лету» из разбросанной (по диску) структуры директорий.

База данных путей к файлам является инкрементально-кодированным, отсортированным в лексикографическом порядке списком (иногда называемом «сжатым спереди» файлом), который также подвергнут обычному биграмному кодированию с целью получения эффективного сжатия. Коэффициент сжатия составляет от 5 до 6 по сравнению с обычным ASCII-представлением. Список сканируется с использованием модифицированного линейного поиска, специально приспособленного для инкрементального кодирования, при этом типичное время, затрачиваемое алгоритмом, на 40-50% меньше, чем обычный поиск.
Читать дальше →
Total votes 19: ↑19 and ↓0 +19
Comments 1

Программисты, давайте изучать исходники классических программ

Reading time 2 min
Views 53K
Современные программисты — счастливчики: мы живём в мире, в котором исторические и оказавшие существенное влияние программы имеют открытый код, доступный для изучения. Однако, многие программисты только учатся, и изучают те программы, над которыми работают сами. У нас редко находится время для изучения исторических работ, и курсы программирования редко тратят время на такие вещи.

Мы полагаем, что разработчикам следует изучать исходники программ, оказавших большое влияние, подобно тому, как архитекторы изучают здания, оказавшие влияние на архитектуру (и критикуют их). Чем повторять те же ошибки снова и снова, мы должны изучить большую работу, проделанную до нас, и вынести из неё уроки.
Читать дальше →
Total votes 74: ↑69 and ↓5 +64
Comments 68

Введение в ELF-файлы в Linux: понимание и анализ

Reading time 11 min
Views 87K
Есть в мире вещи, которые мы принимаем как нечто само собой разумеющееся, хотя они являются истинными шедеврами. Одними из таких вещей являются утилиты Linux, такие, как ls и ps. Хотя они обычно воспринимаются как простые, это оказывается далеко не так, если мы заглянем внутрь. И таким же оказывается ELF, Executable and Linkable Format. Формат файлов, который используется повсеместно, но мало кто его понимает. Это краткое руководство поможет вам достичь понимания.



Прочтя это руководство, вы изучите:

  • Зачем нужен формат ELF и для каких типов файлов он используется
  • Структуру файла ELF и детали его формата
  • Как читать и анализировать бинарное содержимое файла ELF
  • Какие инструменты используются для анализа бинарных файлов
Читать дальше →
Total votes 41: ↑37 and ↓4 +33
Comments 15

Что такое таблица виртуальных таблиц?

Reading time 7 min
Views 13K
Однажды в Slack я наткнулся на новый акроним для моего глоссария акронимов C++: “VTT.” Godbolt:

test.o: In function `MyClass':
test.cc:3: undefined reference to `VTT for MyClass'

“VTT” в данном контексте означает «таблица виртуальных таблиц» (virtual table table). Это вспомогательная структура данных, используемая (в Itanium C++ ABI) при создании некоторых базовых классов, которые сами унаследованы от виртуальных базовых классов. VTT следуют тем же правилам размещения, что и виртуальные таблицы (vtable) и информация о типе (typeinfo), так что если вы получили ошибку, приведённую выше, вы можете просто мысленно подставить «vtable» вместо «VTT», и начать отладку. (Скорее всего, вы оставили неопределённой ключевую функцию класса). Для того, чтобы увидеть, почему VTT, или аналогичная структура, необходима, начнём с основ.
Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Comments 2

Как LLVM оптимизирует функцию

Reading time 10 min
Views 9.7K
Оптимизирующий AOT-компилятор обычно структурирован так:

  1. фронтенд, преобразующий исходный код в промежуточное представление
  2. конвейер машинно-независимой оптимизации (IR): последовательность проходов, которые переписывают IR для устранения неэффективных участков и структур, которые не могут быть непосредственно преобразованы в машинный код. Иногда эту часть называют middle-end.
  3. Машинно-зависимый бэкенд для генерации ассемблерного кода или машинного кода.



В некоторых компиляторах формат IR остаётся неизменным на протяжении всего процесса оптимизации, в других его формат или семантика меняется. В LLVM формат и семантика фиксированы, и, следовательно, возможно запускать проходы в любой последовательности без риска неверной компиляции или аварийного завершения работы компилятора.
Читать дальше →
Total votes 39: ↑39 and ↓0 +39
Comments 12

Истории лунного компьютера. Часть 3

Reading time 10 min
Views 5.6K


Аполлон 11 на Луне

Через пять месяцев Аполло 12 выжил после удара молнии при разгоне и сел на Луну. Благодаря новому «существительному 69», которое мы добавили в программу для того, чтобы позволить команде изменять положение, основываясь на данных наземного слежения, астронавты Пит Конрад (Pete Conrad) и Алан Бин (Alan Bean) смогли посадить лунный модуль в шаговой доступности от беспилотного корабля Surveyor, который сел на Луну в апреле 1967. Точная посадка Аполлона 12 проложила дорогу для посадок на более сложный рельеф местности.
Читать дальше →
Total votes 32: ↑30 and ↓2 +28
Comments 3

Истории лунного компьютера. Часть 2

Reading time 13 min
Views 4.6K


Оборудование Hybrid Simulation Lab. На фото показана панель управления SDS 9300, который, совместно с несколькими аналоговыми компьютерами, отрабатывал симуляции командного модуля и лунного модуля.

За годы до появления Apollo 11, когда разрабатывалась система управления, о встроенном программном обеспечении думали как о чём-то таком, что можно сделать в последнюю очередь: «Хэл это сделает» — так они говорили. На самом деле этим занимались десятки людей, и сотни людей вспомогательного персонала, но Хэлу Лейнингу (Hal Laning) сначала пришлось разбираться, как организовать многочисленные функции ПО, чтобы они выполнялись практически одновременно в реальном времени на бортовом компьютере космического аппарата, имеющем ограниченные размер и быстродействие.
Читать дальше →
Total votes 29: ↑26 and ↓3 +23
Comments 1

Истории лунного компьютера. Часть 1

Reading time 15 min
Views 12K
Часть 2
Часть 3

Часть фотографий была взята с сайта Hack The Moon.

Статья была представлена на 27-й ежегодной конференции по навигации и управлению Американского Общества Астронавтики (AAS) в Брекенридже, штат Колорадо, 6 февраля 2004. Предлагаемая вам версия содержит дополнительные иллюстрации, комментарии и небольшие исправления.



ABSTRACT: Миссия Аполлон 11 совершила успешную посадку на Луну, несмотря на две проблемы с компьютером, повлиявшие на лунный модуль в период управляемой посадки. Неустранённая проблема в интерфейсе радара сближения отняла около 13% времени цикла бортового компьютера, приведя к пяти сбоям программы и перезагрузкам. Менее известная проблема была вызвана ошибочными данными, что привело к флуктуациям тяги двигателя посадки лунного модуля, так как алгоритм управления тягой находился на границе устойчивости. Объяснение этих проблем даёт возможность описать операционную систему бортового компьютера Аполлона и программу управления посадкой на Луну.
Читать дальше →
Total votes 38: ↑36 and ↓2 +34
Comments 2

О [[trivial_abi]] в Clang-е

Reading time 9 min
Views 3.7K
Наконец-то я написал пост про [[trivial_abi]]!

Это новая фирменная фича в транке Clang-а, новая по состоянию на февраль 2018. Это вендорское расширение языка C++, это не стандартный C++, она не поддерживается транком GCC, и нет активных предложений WG21 включить её в стандарт C++, насколько мне известно.



Я не принимал участие в реализации этой фичи. Я просто просматривал патчи в списке рассылки cfe-commits и тихо аплодировал про себя. Но это такая крутая фича, что я считаю, каждый должен про неё знать.
Читать дальше →
Total votes 15: ↑15 and ↓0 +15
Comments 0

Posit-арифметика: победа над floating point на его собственном поле. Часть 2

Reading time 12 min
Views 8K
Часть 1

4. Количественное сравнение числовых систем


4.1. Определение десятичной точности




Точность обратна ошибке. Если у нас есть пара чисел x и y (ненулевых и одного знака), расстояние между ними в порядках величин составляет $\mid log_{10}( x / y )\mid$ десятичных порядков, это та же самая мера, которая определяет динамический диапазон между самым маленьким и самым большим представимым положительным числом x и y. Идеальным распределением десяти чисел между 1 и 10 в вещественной системе счисления было бы не равномерное распределение чисел по порядку от 1 до 10, а экспоненциальное: $1, 10^{1/10}, 10^{2/10},..., 10^{9/10}, 10$. Это шкала децибел, долгое время используемая инженерами для выражения отношений, например, 10 децибел — это десятикратное отношение. 30db означает коэффициент $10^3=1000$. Отношение 1db — это коэффициент около 1,26, если вы знаете значение с точностью 1db, вы имеете точность 1 десятичный знак. Если вы знаете величину с точностью 0,1 db, это означает 2 знака точности, и т.п. Формула десятичной точности$log_{10}(1/\mid log_{10}(x/y)\mid)=-log_{10}(\mid log_{10}(x/y)\mid )$, где x и y — либо корректные значения, вычисленные с использованием систем округления, таких, какие используются в форматах float и posit, либо верхние и нижние границы, если используются строгие системы, использующие интервалы, или значения valid.
Читать дальше →
Total votes 30: ↑30 and ↓0 +30
Comments 16

Posit-арифметика: победа над floating point на его собственном поле. Часть 1

Reading time 12 min
Views 14K
Часть 2

От переводчика: Тема формата Posit уже была на хабре здесь, но без существенных технических подробностей. В этой публикации я предлагаю вашему вниманию перевод статьи Джона Густафсона (автора Posit) и Айзека Йонемото, посвящённой формату Posit.
Так как статья имеет большой объём, я разделил её на две части. Список ссылок находится в конце второй части.




Новый тип данных, называемый posit, разработан в качестве прямой замены чисел с плавающей точкой стандарта IEEE Standard 754. В отличие от ранней формы — арифметики универсальных чисел (unum), стандарт posit не требует использования интервальной арифметики или операндов переменного размера, и, как и float, числа posit округляются, если результат не может быть представлен точно. Они имеют неоспоримые преимущества над форматом float, включая больший динамический диапазон, большую точность, побитовое совпадение результатов вычислений на разных системах, более простое аппаратное обеспечение и более простую поддержку исключений. Числа posit не переполняются ни в сторону бесконечности, ни до нуля, и «нечисла» (Not aNumber, NaN) — это действия, а не битовые комбинации. Блок обработки posit имеет меньшую сложность, чем FPU стандарта IEEE. Он потребляет меньшую мощность, и занимает меньшую площадь кремния, таким образом, чип может выполнять существенно больше операций над числами posit в секунду, чем FLOPS, при тех же аппаратных ресурсах. GPU и процессоры глубокого обучения, в частности, могут выполнять больше операций на ватт потребляемой мощности, что позволит повысить качество их работы.
Читать дальше →
Total votes 30: ↑29 and ↓1 +28
Comments 17

Тирания позитивного мышления угрожает вашему здоровью и счастью

Reading time 7 min
Views 80K
Каждый слышал такое: «просто будь на светлой стороне!» или «счастье — это выбор, просто будь счастливым!». Бесконечные книги «помоги себе сам» или «как быть счастливым» заполняют полки книжных магазинов. Книга «Ни Сы» Джен Синсеро (приведено название русского издания, в оригинале «You Are a Badass», прим. перев.) была в списке бестселлеров Нью-Йорк Таймс в течение 32 недель, а «Сила позитивного мышления» Нормана Винсента Пила («The Power of Positive Thinking», Reverend Norman Vincent Peale), опубликованная в 1952 году и переведённая на 15 языков, до сих пор популярна. Идея того, что вы можете быть счастливым, если вы просто захотите этого, глубоко интегрирована в американскую армию, школу, и на рабочие места, и призвана улучшить производительность труда, душевное здоровье и способность справляться с жизненными трудностями.


Читать дальше →
Total votes 90: ↑83 and ↓7 +76
Comments 297

Information

Rating
Does not participate
Date of birth
Registered
Activity