Pull to refresh
26
0.7

Пользователь

Send message

Компилятор за выходные: синтаксические деревья

Level of difficulty Medium
Reading time 11 min
Views 24K

Вам когда-нибудь приходилось задаваться вопросом, как работает компилятор, но так руки и не дошли разобраться? Тогда этот текст для вас. Мне тоже не доводилось заглядывать под капот, но тут так случилось, что мне нужно прочитать курс лекций о компиляторах местным третьекурсникам. Кто встречался с некомпетентными преподавателями? Здравствуйте, это я :)

Итак, чтобы самому разобраться в теме, я собираюсь написать транслятор с эзотерического языка программирования wend (сокращение от week-end), который я только что сам придумал, в обычный ассемблер. Задача уложиться в несколько сотен строк питоновского кода. Основной репозиторий живёт на гитхабе (не забудьте заглянуть в мой профиль и посмотреть другие tiny* репозитории).

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

Оптика в техническом зрении. Лекция 2: Аберрации

Level of difficulty Medium
Reading time 17 min
Views 8.8K

Привет, Хабр!

Меня зовут Андрей, я – специалист по оптическим системам, оптик и инженер-конструктор в одном лице.

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

Текущая лекция – не обязательная. Она не предлагает конкретных формул и способов решения, но даёт лучшее понимание того, как именно складывается изображение после объектива. Соприкасающимся с оптикой людям рекомендую ей прочитать. Более короткого и наглядного описания аберраций в русскоязычном интернете нет.

Читать далее
Total votes 42: ↑41 and ↓1 +40
Comments 39

Бардак в идеальном мире. Часть 2

Level of difficulty Medium
Reading time 31 min
Views 9.1K

Современная теория хаоса — это большая и хорошо разработанная область математики, уже прочно вошедшая в набор современных инструментов естествознания. Многие результаты теории динамического хаоса, такие как странные аттракторы, бифуркационные диаграммы, фрактальные области притяжения, разобраны популяризаторами математики на плакаты, мемы и открытки. В этой мини‑серии статей я хочу копнуть немного глубже стандартных введений и «альбомов» с симпатичными картинками и дать пример разбора одной несложной, но ещё не «заезженной» механической системы, которая демонстрирует механизмы возникновения хаоса в гамильтоновых системах.

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

Читать далее
Total votes 69: ↑68 and ↓1 +67
Comments 9

My4TH — домашний компьютер без процессора

Level of difficulty Medium
Reading time 14 min
Views 17K

Этот обзор посвящен открытому проекту компьютера My4TH по информации от разработчика: Авторский сайт проекта:

My4TH (произносится как "мой четвертый") - это четвертый домашний компьютер без процессора после MyCPU, MyNOR и TraNOR. Автор хотел и построил максимально простой компьютер с дискретным процессором, использующим как можно меньше элементов и компонентов, под управлением операционной системы Forth.

Смотреть обзор
Total votes 68: ↑67 and ↓1 +66
Comments 21

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

Level of difficulty Medium
Reading time 9 min
Views 16K

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

Коротко обо мне. Меня зовут Макс, и так получилось, что я вот уже 10 лет, почти с самого начала своей карьеры, занимаюсь оптимизирующими компиляторами. Я начинал в Intel, потом перешёл в Azul Systems, год провёл в Cadence и вернулся обратно, всё это время занимаясь компиляторными оптимизациями для Java, C++ и нейросетевых моделей. На момент написания статьи у меня чуть за 900 патчей в LLVM, большинство из них посвящено цикловым оптимизациям.

За это время я провёл десятки собеседований на позиции как интернов, так и инженеров сеньорного уровня, и довольно часто люди, приходя на эти собеседования, многих вещей не знают или знают поверхностно. И я подумал: а мог бы я написать такой цикл статей, чтобы человек, прочитав их, узнал бы всю ту базу, которая, на мой собственный взгляд, необходимо начинающему компиляторному инженеру? Очень бы хотелось, чтобы новичку в этой области можно бы было дать один (относительно небольшой по объёму) набор текстов, чтобы он получил оттуда всё необходимое для старта. Это не перевод, текст оригинальный, поэтому в нём могут быть ошибки и неточности, которые я буду рад исправить, если вы мне их укажете.

Итак, поехали.

Погрузиться
Total votes 121: ↑119 and ↓2 +117
Comments 58

О спинорах человеческим языком

Level of difficulty Hard
Reading time 7 min
Views 11K

Одной из самых больших сложностей в осознании квантовой механики для меня стали спиноры. Действительно, откройте любое популярное изложение, и вам навешают лапшу на уши о то что "спинор - это такой объект, который при повороте на 360 градусов превращается в свою противоположность". Полезное определение? Кажется не очень.

Ну хорошо, черт с ними с популярными изложениями. Откроем учебник физики. Представление векторов как матриц (почему, откуда?), их разложения по столбцам и строкам, какие-то стрелочки \left| \uparrow \right>, \left| \downarrow \right>, матрицы Паули, Гамма-матрицы, вся эта дичь вроде работает и ее можно использовать для решения уравнения Дирака, но выглядит ли это разумным человеческим языком?

Дело в том, что матрицы очень хорошо выполняют одну роль - роль представления разнообразных геометрических структур. Линейные операторы? Пожалуйста. Элементы алгебры Ли? Вот вам матрицы! Графы - матрицы смежности! Веса соединений нейросетей, и так далее, тысячи применений им! Однако же, глядя на матрицу вы ровным счетом ничего не можете сказать о той структуре, которую она представляет. И именно поэтому изложение спиноров в подавляющем большинстве литературы для меня выглядело какой-то взятой с потолка чепухой.

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

Читать далее
Total votes 26: ↑24 and ↓2 +22
Comments 17

6 Устойчивость систем автоматического регулирования. Теоремы Ляпунова. Критерий устойчивости Гурвица

Reading time 9 min
Views 23K

Продолжаем лекции по управлению в технических системах предыдущие части:

1. Введение в теорию автоматического управления.2. Математическое описание систем автоматического управления 2.1 — 2.32.3 — 2.82.9 — 2.13.

3. ЧАСТОТНЫЕ ХАРАКТЕРИСТИКИ ЗВЕНЬЕВ И СИСТЕМ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ РЕГУЛИРОВАНИЯ. 3.1. Амплитудно-фазовая частотная характеристика: годограф, АФЧХ, ЛАХ, ФЧХ3.2. Типовые звенья систем автоматического управления регулирования. Классификация типовых звеньев. Простейшие типовые звенья3.3. Апериодическое звено 1–го порядка инерционное звено. На примере входной камеры ядерного реактора3.4. Апериодическое звено 2-го порядка3.5. Колебательное звено3.6. Инерционно-дифференцирующее звено3.7. Форсирующее звено.  3.8. Инерционно-интегрирующее звено (интегрирующее звено с замедлением)3.9. Изодромное звено (изодром)3.10 Минимально-фазовые и не минимально-фазовые звенья3.11 Математическая модель кинетики нейтронов в «точечном» реакторе «нулевой» мощности.

4. Структурные преобразования систем автоматического регулирования.

5. Передаточные функции и уравнения динамики замкнутых систем автоматического регулирования (САР).

Теперь перейдем к устойчивости!

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

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

Reading time 23 min
Views 227K

Я люблю давать простые задачки студентам на лекции. Во-первых, понятно, скольких мы потеряли, во-вторых, это переключение из режима потребления информации в режим выдачи результатов, в третьих — возможность проявить себя для шустрых. Сплошные плюсы!

Одна из простых задач звучит так: «При переводе картинки из цветового пространства RGB в YUV мы выполняем прореживание, то есть выкидываем каждый четный столбец и каждую четную строку в компонентах U и V (все компоненты пикселя по 1 байту). Вопрос: во сколько раз меньше данных у нас стало?» Эта операция называется chroma subsampling и широко используется при сжатии видео, например.

Забавно, что когда-то давно, когда винчестеры были меньше, а дискеты больше, студенты реально отвечали на этот вопрос быстро. А в последние годы регулярно народ в ступор впадает. Приходится разбирать по частям: «Если выкинуть каждую четную строку и каждый четный столбец, во сколько раз меньше данных будет у компоненты?» Почти хором: «В четыре». Начинаю подкалывать: «Отлично! У нас было 3 яблока, первое осталось как есть, а от второго и третьего осталось по четвертинке. Во сколько раз меньше яблок у нас стало?» Народ ржет, но, наконец-то, дает правильный ответ (заметим, не все). 

Это было бы смешно, если бы от способности быстро в уме прикинуть результат не зависела способность быстрее создавать сложные алгоритмы. 

И хорошо видно, как эта способность в широких массах студентов заметно плавно падает. Причем не только в нашей стране. Придуман даже специальный термин: «цифровое слабоумие» ("digital dementia") — снижение когнитивных способностей, достаточно серьезное, чтобы повлиять на повседневную деятельность человека. 

Кому интересно как теряют мозг студенты масштабы бедствия и что с этим делать — добро пожаловать под кат!

Читать далее
Total votes 411: ↑395 and ↓16 +379
Comments 795

Еще один пересказ «туториала» Джека Креншоу

Reading time 5 min
Views 3.6K
Иногда более-менее не тривиальную задачку приятно решить с чувством легкого базиса под ногами. Базис как бы уже есть, и мы как нечто среднее между художником и архитектором, ловим себя (в данный момент времени) на перекладывании пустого в порожнее, готовя нечто яркое и крепкое (почти как красное полусухое 🙂. Яркое — потому что без йоты красоты легко сойти на полпути, а крепкое — профессия обязывает. Чтобы было еще ярче, призовем в помощь замечательные серии Jack Crenshaw compilers.iecc.com/crenshaw (non-technical introduction to compiler construction) и начнем, пожалуй, с построения маленького, но вполне достойного линтера en.wikipedia.org/wiki/Lint_(software) (Честно говоря, так как ниже будет имплементен разбор яваскрипт кода, вполне допустимо, но только временно, переименовать линтер в парсер и думать дальше в новых терминах)

Сначала хотелось продекларировать базис как есть, но подумав немного, можно неутешительно прийти к выводу — что четко определенный базис не будет иметь всякого смысла, так как находясь в данной точке пространства, в данный момент времени будущее, как и прошлое, весьма туманны.
Читать дальше →
Total votes 4: ↑3 and ↓1 +2
Comments 1

Способы хранения графа в памяти компьютера

Reading time 4 min
Views 28K

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

Читать далее
Total votes 48: ↑45 and ↓3 +42
Comments 19

О глупости «программирования на естественном языке»

Reading time 4 min
Views 22K

От переводчиков. Хотя Эдсгер Дейкстра — одна из главных личностей в истории IT, эта его коротенькая публикация ранее не попадала на Хабр, да и сами мы узнали о ней лишь благодаря докладу на нашей конференции. Но при этом она выглядит очень любопытным документом эпохи, показывая, что ещё несколько десятилетий назад люди думали о перспективе писать программы на «обычном языке». Поэтому мы решили восполнить пробел и перевести.

С первых же дней появления автоматических вычислительных машин были люди, которые считали недостатком тот факт, что программирование требует внимательности и точности, свойственных любому формального символизму. Они критиковали механического слугу за то неукоснительное выполнение данных ему инструкций, когда достаточно было бы поразмышлять мгновение, чтобы заметить, что в этих инструкциях есть очевидная ошибка. «Но мгновение — это долго, а размышлять — болезненный процесс». (А. Э. Хаусман). Они страстно надеялись и ждали появления более разумных машин, которые отказались бы приступать к таким бессмысленным действиям, какие в то время вызывались банальной опечаткой.

Читать далее
Total votes 68: ↑65 and ↓3 +62
Comments 66

Асинхронная обработка данных (асинхронные вычисления). Анализ поведения

Reading time 43 min
Views 4.9K
На первый взгляд кажется, что в асинхронном дизайне обработки данных изобрести что-либо новое маловероятно. Действительно, все возможные приемы и компоненты синтеза уже давно известны: и кодирование, и многофазность, и индикация, и хэндшейк, и С-элементы, и пороговые элементы… Но, в отношении практически любого метода асинхронной обработки данных можно достаточно уверенно утверждать: все они заведомо избыточны. Причина такого положения видится в несколько поверхностном понимании различий между асинхронными и синхронными схемами. Принято считать, что асинхронной является такая схема, в которой отсутствует тактовый сигнал. Отсюда вытекает и решение: достаточно взять за основу архитектуру синхронного дизайна (комбинационную логику, регистры), а тактовый сигнал заменить какой-то управляющей схемой. Таким подходом в той или иной мере грешит практически любой метод. Блочный синтез — идея более оригинальная, но от этого не менее избыточная.

Однако различие меду синхронными и асинхронными схемами носит более существенный характер. Синхронные схемы отличаются наличием временных интервалов, маскируемых тактовым сигналом. И эти временные интервалы включают все переходные процессы. То есть синхронные схемы не рассматривают переходные процессы и имеют дело только с результатами переходных процессов. Таким образом синхронная схема по сути представляет собой причинно-следственные отношения на множестве состояний. Асинхронные же схемы рассматривают как результат переходного процесса, так и сам процесс. Говорить в этом случае о состояниях можно лишь с большой долей условности. Переходный процесс и его результат описываются таким явлением, как событие (переключение сигнала). И асинхронная схема представляет собой те же причинно-следственные отношения только на множестве событий.
Читать дальше →
Total votes 4: ↑3 and ↓1 +2
Comments 10

Абстрактная алгебра в действии

Reading time 6 min
Views 25K

В последнее время всё чаще я ощущаю математическое веяние в программировании. Нет, это не про интегралы с производными, а про что-то абстрактное, другое. Про то, что было всегда у нас под носом, но оставалось незамеченным. Наступит день - про это будут говорить на каждом углу. Но не сегодня. Сегодня мы с этим познакомимся.

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

Мемоизация в compile time вычислениях в C++

Reading time 7 min
Views 8.6K

Программистам на C++ хорошо (надеюсь!) известно, что во время компиляции можно производить разнообразные вычисления. Лишь бы эти вычисления были "чистыми", без побочных эффектов. Это делается на шаблонах и на constexpr функциях.

Чистое выражение означает, что, сколько бы раз мы его ни попытались вычислить, мы получим один и тот же результат. Поэтому из соображений эффективности результат желательно мемоизировать, чтобы второй раз не делать ту же работу. Но насколько хорошо это умеет делать компилятор?

Для стресс-тестирования возьмём наивную формулу чисел Фибоначчи:

f(n) = (n < 2) ? 1 : f(n-1) + f(n-2)

Читать далее
Total votes 29: ↑28 and ↓1 +27
Comments 13

Как измерить количество информации?

Reading time 16 min
Views 30K

Мы ежедневно работаем с информацией из разных источников и поэтому имеем интуитивные представления о том, что означает, когда один источник является более информативным, чем другой. Однако далеко не всегда понятно, как это правильно определить формально. Не всегда большое количество текста означает большое количество информации. Например, среди СМИ распространена практика, когда короткое сообщение из ленты информационного агентства переписывают в большую новость, но при этом не добавляют никакой «новой информации». Или другой пример: рассмотрим текстовый файл с романом «Война и мир» в кодировке UTF-8. Его размер — 3.2 Мб. Сколько информации содержится в этом файле? Изменится ли это количество, если файл перекодировать в другую кодировку? А если заархивировать? Сколько информации вы получите, если прочитаете этот файл? А если прочитаете его второй раз?

По мотивам открытой лекции для Computer Science центра рассказываю о том, как можно математически подойти к определению понятия "количество информации".

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

Три архитектуры эльфам, семь гномам, девять людям… где же искать ту, что объединит их все?

Reading time 60 min
Views 29K

Проводится сеанс разоблачения магии (CISC, RISC, OoO, VLIW, EPIC, ...).
Без традиционной рубрики “а что, если” тоже не обошлось.

Добро пожаловать под кат, правда, лёгкого чтения ожидать не стоит.

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

А вы знаете, где сейчас используется Лисп?

Reading time 5 min
Views 32K

Введение


Лисп — второй по старшинству из ныне живых высокоуровневых языков программирования (после Fortran) и первый функциональный язык. Он был разработан в 1958 году и сильно изменился с тех пор, породив множество диалектов и оказав значительное влияние на развитие других языков. На данный момент наиболее известные диалекты: Common Lisp, Scheme, Racket и Clojure.



Слева: Лисп-машина в музее MIT.
Справа: Лисп-машина Symbolics 3640, фото Michael L. Umbricht и Carl R. Friend (Retro-Computing Society of RI)


Лисп стал “первооткрывателем” многих идей, нашедших применение в современных языках программирования: древовидные структуры, динамическая типизация, функции высшего порядка и многое другое. В этом посте мы не будем углубляться во вклад Лиспа в теорию, а сосредоточимся на практической пользе.


Изначально Лисп предназначался для работ в области искусственного интеллекта, в частности как представление математической нотации для символьных вычислений. Но насколько широко диалекты Лиспа используются сейчас и в каких областях применяются?


Мы в Typeable любим и применяем функциональное программирование, а влияние Лиспа на функциональные языки всё ещё сильно, поэтому нам стало интересно разобраться в этом вопросе.

Читать дальше →
Total votes 48: ↑46 and ↓2 +44
Comments 48

Information

Rating
1,481-st
Registered
Activity