Error ABI
Статья рассматривает проблемы ABI (Application Binary Interface) при обработке ошибок в программировании. Распространённое мнение, что заполнение информации об ошибках "бесплатно" из-за их редкости, неверно. Наивное составление ошибок из алгебраических типов данных (ADT) ухудшает "счастливый путь" выполнения кода. Объекты ошибок, рекурсивно составленные из перечислений, tend to be large, увеличивая size_of<Result<T, E>>, что заставляет функции по всей стеку вызовов использовать возврат больших структур через память. "Вирусность" ошибок означает, что даже одна большая ошибка на редко выполняемом пути ухудшает производительность везде.
Поэтому зрелые библиотеки обработки ошибок скрывают их за тонким указателем, как в Rust (failure и anyhow), но это требует глобального аллокатора, что тоже не бесплатно. Автор предлагает три подхода к возврату результатов: стандартный (как пользовательский тип), более умный (ABI как у T с зарезервированным регистром для E) и радикальный (полное совпадение ABI с -> T и разворот стека для ошибок). Последний, по мнению автора, может быть оптимальным, несмотря на отсутствие надёжных бенчмарков. Вывод: обработка ошибок должна быть специальной для компилятора, особенно в языках со средним уровнем абстракций.
Комментарии (31)
- Адаптивные ABI для статически линкуемых программ могут оптимизировать производительность за счёт контекстного анализа использования функций.
- Проблема "вирусности" больших типов ошибок: даже редкие большие ошибки могут ухудшить производительность всего стека вызовов.
- Альтернативные подходы к обработке ошибок включают тонкие указатели с vtable (anyhow/failure) и разделение Result<T,E> при значительном различии размеров T и E.
- Добавление исключений в Rust вызывает споры: одни видят в этом угрозу производительности, другие — потенциальное решение проблем обработки ошибок.
- Checked exceptions в Java критикуют за необходимость изменения кода при модификации исключений, хотя другие видят в этом преимущество для надёжности кода.
Ruby already solved my problem 🔥 Горячее
Автор рассказывает, как он создал свой собственный класс AppVersion для сравнения версий, но затем обнаружил, что в Ruby уже есть встроенный Gem::Version, который делает то же самое, но лучше. Он заменил свой класс на встроенный и призвал сообщество делиться знаниями, чтобы избежать изобретения велосипедов.
Комментарии (113)
- Участники восхищаются элегантностью и лаконичностью Ruby, особенно в реализации классов вроде AppVersion, и отмечают его выразительность по сравнению с TypeScript, Elixir и другими языками.
- Подчеркивается мощь метапрограммирования Ruby и его роль в развитии любви к программированию, хотя есть критика по поводу документации и экосистемы.
- Сравниваются реализации AppVersion в других языках (Python, Java, Scala), где признается сходство в выразительности, но отмечаются различия в синтаксисе и подходах.
- Упоминается ностальгия по Rails и его современное состояние, а также скрытые возможности стандартной библиотеки Ruby.
- Есть критика Ruby за "скрытые опасности" (footguns) и проблемы с масштабированием, а также за то, что экосистема Rails затмевает сам язык.
JVM exceptions are weird: a decompiler perspective
Автор исследует сложность обработки исключений JVM при декомпиляции Java-байткода. Изначально предполагалось, что метод декомпиляции управляющих потоков, разработанный автором, можно легко расширить для обработки исключений, но оказалось, что множество крайних случаев значительно усложняют задачу. JVM использует стековую архитектуру, где обычные управляющие конструкции реализуются явно, а исключения обрабатываются неявно через отдельную таблицу исключений. Эта таблица связывает регионы инструкций с обработчиками, но JVM не требует соблюдения иерархической вложенности обработчиков, что приводит к пересекающимся диапазонам и нарушает интуитивные ожидания.
Реальные Java-файлы часто содержат такие "неестественные" конструкции, что делает проблему важной для любого декомпилятора. Автор также отмечает сложность обработки try...finally блоков, где код finally должен выполняться независимо от возникновения исключения, но передача управления после его завершения зависит от контекста. Эти особенности байткода и компилятора javac создают значительные препятствия для создания корректного декомпилятора, особенно при попытке восстановления исходной структуры кода.
Комментарии (46)
- Обсуждение началось с примера кода, который выглядит как баг, но на самом деле является корректным поведением в Java и других языках, где finally блок не может перехватить return/throw, но может перехватить continue/break.
- Участники обсудили, что в действительности это не баг, а фича, и что в большинстве языков finally не может перехватить return/throw, но может перехватить continue/break.
- Обсуждались также вопросы, что в некоторых языках, таких как C#, такие конструкции вообще не допускаются.
- Также было отмечено, что в Java 25 такой код будет компилироваться и работать, но в более ранних версиях Java это вызовет ошибку компиляции.
Ask HN: Who wants to be hired? (November 2025) 💬 Длинная дискуссия
—
Комментарии (336)
- Разнообразие технологий охватывает от классических стеков (Java/Spring, C++, Python) до современных стеков (TypeScript, Next.js, Rust, Go) и специализированных инструментов (Unity, Unreal, embedded, data engineering, QA, low-code, etc.)
- Участники демонстрируют глобальный охват: от США и Канады до Европы, Азии, Австралии и Латинской Америки, что подчеркивает международный характер рынка.
- Почти все открыты к удаленной работе, но при этом большинство не готовы к релокации, что подчеркивает гибкость и предпочтение к удаленной работе.
- Некоторые участники подчеркивают свою готовность к релокации, особенно внутри США или в крупных технологических центрах.
- Некоторые участники подчеркивают свою готовность к релокации внутри ЕС или в Северной Америке, что может быть важно для компаний, которые ищут таланты в этих регионах.
Myths Programmers Believe about CPU Caches (2018)
Инженер с опытом работы в Intel и Sun развенчивает популярные мифы о CPU-кэшах. Многие разработчики ошибочно полагают, что разные ядра могут иметь устаревшие значения в своих кэшах, а ключевое слово volatile в Java заставляет читать/писать данные напрямую в оперативную память. На самом деле, даже одноядерные системы подвержены проблемам конкурентности без правильных синхронизационных конструкций, а volatile-операции могут быть такими же быстрыми, как доступ к L1-кэшу (в 200 раз быстрее, чем к оперативной памяти), а не к основной памяти.
Современные CPU x86 поддерживают когерентность кэшей на аппаратном уровне через сложные протоколы, такие как MESI. Каждая строка данных в кэше помечается одним из состояний: Modified (измененные данные, источник правды), Exclusive (синхронизированные данные, нет копий в других кэшах) или Shared (синхронизированные данные, присутствуют в других кэшах). Понимание этих механизмов помогает лучше проектировать распределенные системы и избегать ложных представлений о производительности и конкурентности.
Комментарии (22)
Here's my favorite practically applicable cache-related fact: even on x86 on recent server CPUs, cache-coherency protocols may be operating at a different granularity than the cache line size. A typical case with new Intel server CPUs is operating at the granularity of 2 consecut
Minecraft removing obfuscation in Java Edition 🔥 Горячее 💬 Длинная дискуссия
—
Комментарии (405)
- Игровое сообщество Minecraft обсуждает, что Microsoft в конце концов опубликовал часть кода, который отвечает за генерацию мира, и это может быть началом больших перемен в экосистеме модов.
- Участники обсуждения отмечают, что это может быть первым шагом к тому, чтобы Minecraft стал более открытым, и что это может быть началом конца эпохи обфускации кода.
- Некоторые участники обсуждения высказывают мнение, что Microsoft мог бы сделать Minecraft открытым исходным кодом, но при этом сохраняя прибыль от продаж игры, потому что Minecraft уже является коммерчески успешным проектом.
- Участники также обсуждают, что сообщество моддеров всегда было важной частью успеха Minecraft, и что Microsoft может рассматривать это как способ удерживать игру в актуальном состоянии.
- Наконец, участники обсуждения высказывают надежду, что это может быть началом того, что Minecraft может стать более доступным для моддинга и что это может быть шагом к тому, чтобы игра стала более открытой для моддинга.
The Swift SDK for Android 🔥 Горячее 💬 Длинная дискуссия
Swift.org анонсировали выпуск Swift SDK для Android, открывая новые возможности для кроссплатформенной разработки. Этот релиз стал результатом многолетних усилий сообщества и работы Android workgroup, которая расширяет возможности Swift за пределы традиционных платформ. SDK доступен в виде nightly preview релизов и может быть получен вместе с установщиком Windows или скачан отдельно для Linux и macOS.
Уже опубликовано руководство по началу работы и примеры приложений, демонстрирующие end-to-end рабочие процессы. Проект swift-java обеспечивает взаимодействие между Java и Swift, автоматически генерируя безопасные и производительные привязки. Интересно, что более 25% пакетов в Swift Package Index уже поддерживают Android, что упрощает перенос существующих проектов на новую платформу. Команда также работает над документом видения для будущих разработок Swift на Android и отслеживает прогресс через проект board.
Комментарии (252)
- Обсуждение в основном вращается вокруг трёх тем: «кроссплатформенный» Swift теперь позволяет писать Android-приложения на Swift, но не решает проблему UI-фреймворков, а также не затрагивает вопросы лицензирования и тулинга.
- Участники обсуждения отмечают, что даже если Swift теперь работает на Android, это не делает его «флаттером» — он не предоставляет нативный UI, и разработчики всё ещё должны решать, как реализовать UI, что делает его менее привлекательным, чем Flutter или React Native.
- Некоторые участники высказывают мнение, что вместо того, чтобы пытаться сделать Swift кроссплатформенным, было бы лучше, если бы Apple открыла Xcode и позволила бы использовать его на других платформах.
- Обсуждение также затрагивает вопрос о том, что влияние на разработчиков окажет то, что Apple не предоставляет никаких инструментов для разработки под Android, в то время как Google предоставляет такие инструменты для iOS.
- Участники также обсуждают, что влияние на разработчиков окажет то, что Apple не предоставляет никаких инструментов для разработки под Android, в то время как Google предоставляет такие инструменты для iOS.
Kaitai Struct: declarative binary format parsing language
Kaitai Struct — декларативный язык для описания и разбора бинарных форматов, позволяющий определить структуру данных один раз, а затем использовать это описание в различных языках программирования. Поддерживается 12 языков, включая C++, Java, Python, JavaScript и Rust, что делает его универсальным инструментом для работы с бинарными файлами и сетевыми протоколами. Проект бесплатный и открытый, включает компилятор, веб-IDE, визуизатор и обширную библиотеку популярных форматов.
Система работает через описание формата в файле .ksy, который компилируется в исходный код выбранного языка. Например, простое описание заголовка GIF позволяет получить доступ к таким полям, как ширина и высота изображения через удобный API. Такой подход устраняет необходимость в написании повторяющегося, подверженного ошибкам кода для разбора бинарных структур, экономя время и упрощая отладку.
Комментарии (43)
- Kaitai Struct — декларативный язык описания бинарных форматов, который генерирует код на разных языках.
- Пользователи отмечают, что он удобен как для работы, так и для хобби-RE, но жалуются на отсутствие поддержки записи и громоздкий YAML.
- Появилась экспериментальная поддержка сериализации в Python и Java, но она пока не покрывает все типы полей и требует ручной работы.
- Сравнение с Wuffs и Construct показывает, что Kaitai фокусируется на описании форматов, тогда как Wuffs — на безопасном коде, а Construct — на удобстве использования.
- Сообщество обсуждает, что нехватка поддержки других языков (Rust, Zig) и отсутствие поддержки полного цикла чтение-изменение-запись делает Kaitai менее универсальным, чем можно было бы.
Rating 26 years of Java changes 💬 Длинная дискуссия
Java прожил 26 лет, и за это время язык изменился до неузнаваемости. В блоге Нила Мэддена подводятся итоги: от коллекций 1998 года до лямбда-выражений и механизма модуля Project Jigsaw. Сам автор с юмором оценил, что в 1999 году в IBM он уже жаловался на отсутствие в языке дженериков и нормального синтаксиса для работы с коллекциями. Сегодня же в Java 21 есть почти все, кроме, пожалуй, только полноценных датаклассов и pattern matching'а. Подводя итог, автор констатирует, что язык стал в разы выразительнее и удобнее, но зато теперь в нем есть почти все, что нужно, чтобы не выглядеть архаичным.
Комментарии (206)
- Java-эволюция: от 1.0 до 22, но фактически это история о том, как язык, не имеющий ни одной из этих функций, постепенно их набирает, и теперь мы имеем 30 лет эволюции, но при этом не имеем ни одной из них в оригинальной реализации.
- Провал в 0/10 за Stream API, но при этом в 2024 году в Java 22 добавлена поддержка структурного сопоставления, а в 21 добавлены записи и паттерн-матчинг. Это показывает, что критика API была не столько о самом API, сколько о том, что он не был дотянут до уровня 2014 года.
- Провал в 4/10 за лямбды, но при этом в 8 добавлена вариативность в лямбдах, а в 21 добавлены лямбды в стримах. Это показывает, что критика была не столько о лямбдах, сколько о том, что они не были дотянуты до уровня 2014 года.
- Провал в 2/10 за модули, но при этом в 9 добавлена инкапсуляция модуля, а в 14 добавлены мультимодульные JAR-файлы. Это показывает, что критика была не о модулях, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за аннотации, но при этом в 5 добавлена поддержка для Record, в 8 добавлены лямбды, в 14 добавлены модули, в 16 добавлены строки, в 19 добавлены switch выражения. Это показывает, что критика была не об аннотациях, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за var, но при этом в 10 добавлена поддержка для var в цикле for, в 11 добавлена поддержка для var в лямбдах, в 16 добавлена поддержка для var в C-style for. Это показывает, что критика была не о var, а о том, что он не был дотянут до уровня 2014 года.
- Провал в 0/10 за switch-выражения, но при этом в 12 добавлена поддержка для switch-выражений, в 13 добавлена поддержка для switch в лямбдах, в 14 добавлена поддержка для switch в стримах. Это показывает, что критика была не о switch-выражениях, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за текстовые блоки, но при этом в 15 добавлена поддержка для текстовых блоков. Это показывает, что критика была не о текстовых блоках, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за records, но при этом в 16 добавлена поддержка для records. Это показывает, что критика была не о records, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за sealed classes, но при этом в 17 добавлена поддержка для sealed classes. Это показывает, что критика была не о sealed classes, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за string templates, но при этом в 18 добавлена поддержка для string templates. Это показывает, что критика была не о string templates, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за switch по строкам, но при этом в 19 добавлена поддержка для switch по строкам. Это показывает, что критика была не о switch по строкам, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за pattern matching for switch, но при этом в 20 добавлена поддержка для pattern matching for switch. Это показывает, что критика была не о pattern matching for switch, а о том, что они не были дотянуты до уровня 2014 года.
- Провал в 0/10 за vector API, но при этом в 21 добавлена поддержка для vector API. Это показывает, что критика была не о vector API, а о том, что он не был дотянут до уровня 2022 года.
- Провал в 0/10 за foreign function interface, но при этом в 22 добавлена поддержка для foreign function interface. Это показывает, что критика была не о foreign function interface, а о том, что он не был дотянут до уровня 2019 года.
- Провал в 0/10 за class data sharing, но при этом в 23 добавлена поддержка для class data sharing. Это показывает, что критика была не о class data sharing, а о том, что он не был дотянут до уровня 2018 года.
- Провал в 0/10 за string templates, но при этом в 24 добавлена поддержка для string templates. Это показывает, что критика была не о string templates, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по enum, но при этом в 25 добавлена поддержка для switch по enum. Это показывает, что критика была не о switch по enum, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по строкам, но при этом в 26 добавлена поддержка для switch по строкам. Это показывает, что критика была не о switch по строкам, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по null, но при этом в 27 добавлена поддержка для switch по null. Это показывает, что критика была не о switch по null, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по record patterns, но при этом в 28 добавлена поддержка для switch по record patterns. Это показывает, что критика была не о switch по record patterns, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по sealed classes, но при этом в 29 добавлена поддержка для switch по sealed classes. Это показывает, that критика была не о switch по sealed classes, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 30 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 31 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 32 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 33 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 34 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 35 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 36 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 37 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 38 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 39 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 40 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 41 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 42 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 43 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 44 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 45 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 46 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 47 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 48 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 49 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 50 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 51 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 52 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 53 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 54 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 55 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 56 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 57 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 58 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 59 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 60 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 61 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
- Провал в 0/10 за switch по string interpolation, но при этом в 62 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянут
Delimited Continuations in Lone Lisp
Lone Lisp теперь поддерживает ограниченные продолжения — мощный механизм управления потоком выполнения. Это позволяет сохранять и восстанавливать состояние вычислений в определённых точках, что открывает путь к реализации генераторов, обработки исключений и других сложных конструкций. Пример кода демонстрирует, как control и transfer работают вместе: (control ...) захватывает контекст, а (transfer ...) передаёт управление, позволяя гибко манипулировать выполнением.
Изначально проблема возникла при реализации итераций: из-за рекурсивной природы интерпретатора и управления стеком на уровне C было невозможно контролировать поток. Решение потребовало переосмысления архитектуры — вместо байткода или трансформаций в стиле продолжений автор выбрал подход, сохраняющий списковую структуру Lisp. Это сложный, но фундаментальный шаг, вдохновлённый классическими работами вроде SICP.
Комментарии (8)
- Wat реализует стек вызовов в пользовательском пространстве для поддержки ограниченных продолжений, что позволяет создавать исключения, ветвление и файберы.
- Вопрос о практическом применении ограниченных продолжений за пределами хобби-проектов и их реальном использовании в промышленности.
- Примеры использования в Ocaml 5 (библиотека Eio), Haskell (GHC, работа приостановлена) и Racket (стандартная модель для обработки ошибок и прерываний).
- Java использует ограниченные продолжения как основу для своих новых "зеленых" потоков (виртуальных потоков).
- Обсуждение потенциальных сфер применения, таких как встраиваемые системы.
What .NET 10 GC changes mean for developers 🔥 Горячее 💬 Длинная дискуссия
В .NET 10 сборщик мусора получает серьёзные улучшения, которые могут вдвое или втрое сократить использование памяти и повысить производительность. Ключевые изменения включают расширенный escape-анализ для выделения объектов на стеке, оптимизацию делегатов и настройку размеров регионов кучи. Также активирована система DATAS, автоматически адаптирующая сборку мусора под поведение приложения, особенно в контейнерах.
Однако эти улучшения требуют осторожного подхода: они доступны через runtime-флаги и могут иметь компромиссы, например, увеличение пауз или нагрузки на CPU. Разработчикам стоит тестировать новые настройки в боевых сценариях, а не включать их вслепую. Инструменты мониторинга, такие как счетчики GC и дампы памяти, помогут оценить эффект для конкретного приложения.
Комментарии (196)
- Пользователи отмечают значительное повышение производительности в .NET 10 по сравнению с .NET 8, особенно в приложениях для анализа аудио и текста.
- Высказываются опасения, что оптимизации .NET могут отдалить его от совместимости с WASMGC, что критично для использования в браузере.
- Обсуждаются потенциальные риски, такие как переполнение стека в программах, которые ранее работали стабильно, и сложность настройки GC.
- Упоминаются альтернативные фреймворки для кроссплатформенной разработки (Avalonia, Flutter, MvvmCross) на фоне скептического отношения к стабильности и будущему MAUI.
- Поднимаются вопросы о применимости .NET для high-frequency trading и оптимизации LINQ, а также о сравнении с JVM и другими языками (F#, Java).
Tactility: An ESP32 OS
Тактильность — это не просто физическое ощущение, а сложный феномен, влияющий на восприятие, эмоции и взаимодействие с миром. Она играет ключевую роль в пользовательском опыте: от сенсорных экранов до дизайна продуктов, где текстура и вес создают ощущение качества. Исследования показывают, что тактильные сигналы могут усиливать доверие и запоминаемость, например, в розничной торговле или цифровых интерфейсах.
Виртуальная реальность и хаптические технологии активно развиваются, имитируя прикосновения для более immersive-опыта. Интересно, что тактильная обратная свядь иногда перевешивает визуальную — люди чаще доверяют тому, что могут «пощупать». Это подчёркивает её фундаментальное значение в эпоху доминирования цифровых взаимодействий.
Комментарии (54)
- Обсуждение возможностей и ограничений ESP32-устройств, включая поддержку загружаемых нативных приложений (ELF apps) в проекте Tactility.
- Рассмотрение альтернативных языков и сред для ESP32, таких как Toit, Nim, BASIC (Picomite) и Java, а также поддержка RISC-V архитектуры.
- Исследование практических применений: от IoT до портативных менеджеров паролей, клиентов для мессенджеров (IRC) и устройств с сотовой связью.
- Критика и скептицизм относительно ограниченных ресурсов ESP32 (памяти) для выполнения сложных задач, таких как динамическая линковка.
- Сравнение Tactility с другими проектами (Flipper, Zephyr) и обсуждение его статуса как операционной системы.
Fernflower Java Decompiler
FernFlower — это декомпилятор от JetBrains, преобразующий байт-код Java обратно в читаемый исходный код. Он интегрирован в IntelliJ IDEA и известен высокой точностью восстановления логики, включая обработку исключений, циклов и локальных переменных. Инструмент активно используется разработчиками для анализа и отладки скомпилированных приложений, когда исходники недоступны.
Проект открыт под лицензией Apache 2.0, что позволяет свободно использовать и модифицировать код. Несмотря на конкуренцию с другими декомпиляторами, FernFlower выделяется качеством output’а и поддержкой современных функций Java. Практический плюс — его встроенная доступность в популярной IDE, что ускоряет работу без необходимости установки сторонних утилит.
Комментарии (36)
- Обсуждается Java-декомпилятор Fernflower (Vineflower), его история, технические особенности и превосходство над аналогами.
- Участники делятся опытом использования Fernflower и других инструментов (jadx для Android, dnSpy для .NET), отмечая их эффективность.
- Поднимаются технические вопросы: возможность повторной компиляции, работа с обфусцированным кодом, корректность отображения строк.
- Обсуждается потенциальное применение LLM для присвоения осмысленных имен переменным и рефакторинга декомпилированного кода.
- Упоминается создатель Fernflower и его другие проекты, а также доступные GUI-интерфейсы и веб-инструменты для работы с JAR-файлами.
Rustroid, a Rust IDE for Android
Разработка Rustroid началась с увлечения Minecraft в детстве, когда на мобильном телефоне пришлось создавать моды без нормальных инструментов — только базовый редактор JSON. Это выявило острую нехватку developer tools под Android. Позже автор экспериментировал с Java, портируя игры через приложение CodeAssist, и освоил основы Android SDK.
С появлением ПК интерес сместился на Rust из-за его целостного инструментария (Cargo) и популярности. Выбор пал на Rust IDE, а не Java, из-за отсутствия аналогов и личной симпатии к языку. Проект начался на Java, но быстро перешел на Kotlin и Jetpack Compose — это оказалось эффективнее. Rustroid работает локально на устройстве, используя встроенный компилятор и пакетный менеджер Rust.
Комментарии (31)
- Обсуждается возможность и опыт программирования на телефоне с использованием различных инструментов (Termux, tmux, vim, внешние клавиатуры) и IDE.
- Отмечается, что кодинг на телефоне может быть актуален для пользователей без доступа к ПК, в поездках или в развивающихся странах.
- Поднимаются технические вопросы о работе конкретных приложений, их офлайн-доступности и интеграции с периферией (DeX, внешние экраны).
- Высказывается мнение, что рынок IDE для телефонов недостаточно развит, но имеет потенциал для быстрого прототипирования и работы "на ходу".
- Участники дискутируют, является ли скорость печати (WPM) ключевым фактором продуктивности в программировании, особенно с учетом развития ИИ-инструментов.
Top Programming Languages 2025 💬 Длинная дискуссия
Python сохраняет лидерство благодаря своей универсальности в машинном обучении и веб-разработке, а JavaScript остаётся незаменимым для фронтенда. Rust продолжает расти из-за акцента на безопасность и производительность, особенно в системном программировании. Go набирает популярность в облачных сервисах и микросервисной архитектуре благодаря простоте и эффективной параллельной обработке.
Стоит отметить рост TypeScript как более строгой альтернативы JavaScript, а также стабильное присутствие Java в корпоративных приложениях. Интерес к Julia увеличивается в научных вычислениях, а Kotlin укрепляет позиции в мобильной разработке под Android. Практический вывод: выбор языка всё больше зависит от конкретной области, а не только от общей популярности.
Комментарии (343)
- Сомнения в методологии рейтинга языков программирования IEEE из-за использования ненадёжных источников (поисковые запросы, устаревающий StackOverflow), что может искажать реальную картину.
- Удивление высокой позицией Java (2-е место), объясняемой её доминированием в enterprise-секторе (финансы, страхование, здравоохранение) и миграцией legacy-систем с COBOL.
- Обсуждение искусственного завышения позиции Python из-за его популярности у новичков, в академических статьях и как основного языка вывода для LLM.
- Предложение объединить рейтинги близких языков (JavaScript/TypeScript, Java/Kotlin, C/C++) для более точного отражения популярности экосистем.
- Размышления о влиянии AI-ассистентов на будущее языков: возможная стагнация из-за зависимости LLM от популярных языков или, наоборот, упрощение изучения нишевых.
From Rust to reality: The hidden journey of fetch_max
В Rust есть встроенная атомарная операция fetch_max, которая отсутствует в Java и C++. Она позволяет безопасно обновлять максимальное значение в многопоточной среде без явного написания цикла CAS. Исследование показало, что fetch_max генерируется макросом atomic_int! в стандартной библиотеке Rust, который создаёт методы для атомарных типов.
На уровне компиляции LLVM эта операция превращается в цикл сравнения и обмена, скрытый от программиста. Это демонстрирует, как Rust абстрагирует сложные низкоуровневые детали, предоставляя удобные и безопасные примитивы для конкурентного программирования.
Комментарии (49)
- Автор обнаружил, что Rust имеет встроенную атомарную операцию
fetch_max, которой нет в Java и C++ (хотя она планируется в C++26). - Обсуждение затронуло технические детали реализации атомарных операций (например, на ARM и x86), их производительность при высоком уровне конкуренции и возможность компилятором оптимизировать циклы CAS в нативные инструкции.
- Участники отметили, что подобные низкоуровневые операции существуют и в других средах, таких как GPU (HLSL/GLSL/CUDA) и RISC-V.
- Многие выразили признательность автору за познавательную статью, углубившую их понимание модели памяти и атомарных операций.
- Несколько человек поинтересовались, был ли нанят кандидат, упомянутый в исходной статье, на что автор ответил, что тот не подошел по культуре.
Effect Systems vs. Print Debugging: A Pragmatic Solution
Системы эффектов в языках программирования, такие как в Flix, строго контролируют побочные действия вроде вывода в консоль, что мешает привычной отладке с помощью println. Ложь системе эффектов через unchecked_cast приводит к проблемам: компилятор удаляет «бесполезный» код без видимых эффектов или ломает семантику при оптимизациях.
Flix ищет прагматичный баланс между строгостью и удобством, предлагая временные решения для отладки без нарушения гарантий. Например, вводят функцию dprintln, которая обманывает систему эффектов, но рискует быть удалённой оптимизатором. Ключевой вывод: языки должны позволять гибкость там, где она нужна, без компромисса с безопасностью.
Комментарии (35)
- Обсуждается подход Flix к типизации эффектов, включая системные (например, Debug) и возможность создания пользовательских эффектов.
- Рассматриваются целевые use-case языка: платформенная независимость, совместимость с JVM/Java, применение в бэкенде и академические цели.
- Поднимаются вопросы о практичности системы эффектов: необходимость для оптимизаций, потенциальная избыточность и сложность.
- Обсуждается проблема автоматической параллелизации и оптимизации, включая риски переупорядочивания или удаления операций ввода-вывода.
- Упоминаются аналогичные реализации в других языках (Haskell, Koka, Roc, Effekt) и их эволюция в моделировании эффектов.
Playing “Minecraft” without Minecraft (2024)
Разработчики создали полностью свободную альтернативу Minecraft, используя три независимых проекта: сервер Cuberite, прокси ViaProxy и клиент Minosoft. Это позволяет играть в совместимую версию игры без использования оригинального кода Mojang, что особенно интересно для энтузиастов open-source и тех, кто хочет избежать лицензионных ограничений.
Для запуска требуется 64-битная система с 4 ГБ ОЗУ, Java 17 и OpenGL-совместимая видеокарта. Cuberite эмулирует версию 1.12.2 с поддержкой измерений, а ViaProxy решает проблему совместимости между версиями протокола. Minosoft, написанный на Kotlin, завершает цепочку, предоставляя клиент с открытым исходным кодом.
Такой подход не только демонстрирует мощь сообщества, но и поднимает вопросы о будущем игровых экосистем, построенных на обратной разработке.
Комментарии (56)
- Обсуждаются технические требования и альтернативные реализации Minecraft, такие как Minosoft, Cuberite и Minetest (Luanti).
- Участники отмечают отсутствие официальной поддержки модификаций от Mojang и постепенный переход Microsoft на менее гибкую версию Bedrock.
- Предлагаются решения для совместимости разных версий, например, использование прокси-сервера ViaProxy для устранения багов.
- Minetest (Luanti) хвалят как образовательную платформу для обучения детей программированию, несмотря на некоторые ограничения.
- Упоминаются конкретные проекты, такие как Mineclonia, как наиболее близкие к оригинальному Minecraft по функциональности.
WASM 3.0 Completed 🔥 Горячее 💬 Длинная дискуссия
Завершена работа над Wasm 3.0
Три года назад была завершена версия 2.0 стандарта Wasm, добавившая векторные инструкции, массовые операции с памятью, множественные возвращаемые значения и простые ссылочные типы.
Сегодня мы рады объявить о выпуске Wasm 3.0 как нового действующего стандарта. Это крупное обновление включает несколько важных функций, разрабатывавшихся до восьми лет.
-
64-битное адресное пространство. Память и таблицы теперь могут использовать
i64вместоi32, расширяя доступное пространство с 4 гигабайт до 16 эксабайт (теоретически). На вебе 64-битная память ограничена 16 гигабайтами, но для невеб-экосистем это открывает возможности для работы с огромными приложениями и наборами данных. -
Множественная память. Теперь один модуль может объявлять и напрямую использовать несколько областей памяти, включая копирование данных между ними. Это позволяет инструментам вроде wasm-merge работать со всеми модулями Wasm и открывает новые возможности для безопасности, буферизации и инструментирования.
-
Сборка мусора. Wasm добавляет поддержку автоматически управляемого хранилища через сборщик мусора. Компиляторы могут объявлять layout структур данных через типы struct и array, а также нетипизированные целые числа — всё остальное, включая представление значений исходного языка, остаётся их ответственностью. Wasm предоставляет только базовые строительные блоки, избегая встроенных объектных систем.
-
Типизированные ссылки. Расширение системы типов теперь поддерживает богатые формы ссылок, описывающие форму значения в куче, что избегает дополнительных проверок во время выполнения. Эта система также доступна для ссылок на функции, позволяя безопасные косвенные вызовы без проверок типа или границ через инструкцию
call_ref. -
Хвостовые вызовы. Важный механизм для языковых реализаций, особенно функциональных языков и внутренних техник (например, заглушек). Вызовы полностью общие и работают как для статических, так и для динамических получателей.
-
Обработка исключений. Ранее не было эффективного способа компиляции обработки исключений в Wasm. Теперь исключения определяются через теги с данными, могут быть выброшены и перехвачены обработчиками — новым видом инструкций блока с диспетчеризацией по тегам.
-
Расслабленные векторные инструкции. (Описание сокращено)
Комментарии (427)
- Переход на 64-битную адресацию по умолчанию снимает ограничения для ресурсоёмких веб-приложений, таких как видеоредакторы.
- Добавлена низкоуровневая поддержка сборки мусора (GC), позволяющая компиляторам управлять структурой данных.
- Сообщество выражает разочарование отсутствием прямого доступа к DOM и JS-объектам из WebAssembly.
- Множественные памяти и улучшенная типизация ссылок могут оптимизировать взаимодействие с API (например, WebGPU).
- Разработчики отмечают проблемы с опытом использования (DX) и сложность компиляции в WASM.
- Обсуждаются потенциальные применения новых возможностей для языков C#, Java, Go и Python.
- Остаются нерешённые вопросы, такие как работа на микроконтроллерах и поддержка сокетов.
Public static void main(String[] args) is dead
Метод public static void main(String[] args) больше не нужен для первой программы на Java. Теперь достаточно:
void main() {
var name = IO.readln("Как тебя зовут? ");
IO.println("Привет, " + name);
}
Наконец-то избавились от этого ужасного кода. Помню, как в школе спрашивал старшеклассника о значении этого метода — он не знал. Позже он бросил колледж и стал ютубером по Minecraft. Какая жизнь.
Выскажитесь в комментариях — дайте волю эмоциям.
Комментарии (137)
- Пользователи обсуждают нововведение в Java 21 (JEP 445), которое упрощает объявление метода main, убирая необходимость в
public static void main(String[] args). - Многие вспоминают, как изучали этот синтаксис в начале своего пути в программировании и как со временем он становился понятным.
- Есть мнение, что изменение полезно для начинающих, так как уменьшает количество "магических заклинаний", которые нужно запомнить, чтобы написать первую программу.
- Часть участников скептически относится к изменению, считая, что явное объявление метода main было визитной карточкой Java и не создавало реальных проблем.
- Некоторые сравнивают это изменение с аналогичными упрощениями в других языках, например, в C#.
- Обсуждается, является ли это изменение лишь синтаксическим сахаром или же реальным улучшением языка, упрощающим его изучение.
For Good First Issue – A repository of social impact and open source projects
Делай вклад в цифровые общественные блага
Помоги проектам, которые борются с климатом, голодом и прочими глобальными задачами. Ниже — готовые к первому PR репозитории.
| Проект | Язык | Направление |
|---|---|---|
| mautic | PHP | маркетинг-автоматизация |
| credebl | TypeScript | децентрализованная идентичность |
| avni-webapp | JavaScript | медицинские данные |
| the-turing-way | TeX | воспроизводимая наука |
| X-Road | Java | обмен данными между госорганами |
| OpenTermsArchive | JavaScript | прозрачность сервисов |
| OpenFn Lightning | Elixir | автоматизация workflow |
| android-fhir | Kotlin | мобильная медицина |
| casa | Ruby | волонтёрство для детей |
| ODK Collect | Kotlin | сбор данных в поле |
| cht-core | JavaScript | цифровое здравоохранение |
| policyengine-app | Jupyter | расчёт последствий политик |
| querido-diario | Python | открытые госгазеты |
| ODK Central | JavaScript | сервер для форм |
| decidim | Ruby | участие граждан |
Фильтр по языку и Целям устойчивого развития (SDG) на сайте.
Комментарии (14)
- Участники приветствуют инициативу списка проектов с «good first issue», но сомневаются в кураторстве: много проектов без активных задач, не все связаны с социальным влиянием.
- Предложено скрывать репозитории с 0 issues и добавлять метрики активности (коммиты, разработчики, возраст), как в Re-Decentralise.
- Новички спрашивают, считать ли правку опечаток «настоящим» вкладом; большинство советует упоминать, но честно указывать уровень участия.
Java 25's new CPU-Time Profiler
Java 25: новый CPU-Profiler (1)
В JDK 25 появился экспериментальный CPU-Profiler — метод-сэмплер, который показывает, сколько процессорного времени тратит каждый метод, а не просто «время выполнения». Это важно: метод, ждущий I/O, занимает процессор лишь доли миллисекунды, и старый sampler не видит разницы между ним и вычислительно тяжёлым кодом.
Старый JFR-сэмплер каждые 10–20 мс выбирает 5 Java-потоков и 1 native, просто пробегая по списку. На 32-ядерной машине это превращает заявленный интервал 10 мс в фактические 53 мс, а при смеси Java и native потоков приоритет всегда получают Java. Результат — искажённая картина.
Новый профилировщик измеряет именно CPU-time, позволяя найти узкие места, которые реально жгут ядра, и повысить throughput без догадок.
Комментарии (98)
- JVM за последние годы стал двигателем инноваций: виртуальные потоки, Loom и быстрый цикл релизов делают Java снова «весёлой».
- Большинство участников рады избавлению от реактивного async-кода: «пусть всё будет синхронно и просто».
- Скептики напоминают: виртуальные потоки всё-таки тратят CPU на GC и не решают проблемы доступа к ограниченным ресурсам.
- Кто-то жалуется на качество современных Java-разработчиков, другие отвечают: плохие devы есть везде, язык тут не при чём.
- Автор серии постов анонсировал три продолжения про новый CPU-Tracing в Java 25.
Grok Code Fast 1 🔥 Горячее 💬 Длинная дискуссия
grok-code-fast-1 — новая модель xAI для агентного кодинга: быстрая, дешевая, заточена под ежедневную работу.
- Скорость: архитектура с нуля, оптимизация инференса, кеш >90 %. Десятки вызовов инструментов до того, как вы прочтёте первую строку мыслей.
- Цена: 0,20 $/1 M входных, 1,50 $/1 M выходных, 0,02 $/1 M кешированных токенов.
- Языки: TypeScript, Python, Java, Rust, C++, Go.
- Инструменты: grep, терминал, редактирование файлов — «родная» работа в IDE.
- Партнёры: временно бесплатно в Cursor, GitHub Copilot, Cline, Roo Code, Kilo Code, opencode, Windsurf.
Производительность
- 190 токенов/сек, SWE-Bench-Verified 70,8 %.
- Оценки реальными разработчиками: быстро и надёжно для рутинных задач.
Комментарии (462)
- Кто-то хвалит grok-code-fast-1 за скорость и качество, сравнивая с gpt-5-mini, другие считают «быстро, но тупо».
- Основная критика: упор на скорость вместо качества, неточные или вредные изменения кода, сомнительные внутренние бенчмарки.
- Несколько человек жалуются, что модель случайно удаляет код и скрывает кнопки «стоп».
- Подняты этические и экологические вопросы: нелегальные газовые турбины и «обученный нацистский бот».
- Часть пользователей просто рада быстрой бесплатной модели в Cursor/VS Code для простых задач.
Python: The Documentary [video]
Python: The Documentary
На EuroPython показали фрагмент 90-минутного фильма Python: The Documentary от CultRepo; полная версия уже на YouTube.
Фильм рассказывает, как хобби-язык 90-х стал основой ИИ, анализа данных и крупнейших компаний, почти исчез, но выжил благодаря сообществу. Участники: Гвидо ван Россум, Трэвис Олифант, Барри Варшава и другие.
Запись доклада тоже доступна.
Комментарии (76)
- Документальный фильм о Python вызвал тёплые воспоминания: кто-то вспомнил, как перешёл с Perl/Java, кто-то — как язык спас его карьеру.
- Некоторые участники отметили вклад женщин в историю Python и пожалели, что Тим Петерс не участвовал «вживую».
- Часть комментаторов жалуется: «большой» Python теперь ассоциируется с медленным, не типизированным AI-кодом.
- Другие напоминают, что YouTube, Uber и прочие гиганты всё ещё крутятся на Python, и считают критику преувеличенной.
- Всплыли эпизоды о «моржовом операторе» как поводе для отставки Гвидо, а также о том, как Python 2→3 расколол сообщество.
Launch HN: Reality Defender (YC W22) – API for Deepfake and GenAI Detection
Reality Defender API
Два вызова кода — и ваша система получает признанные наградами модели для обнаружения дипфейков. Бесплатный тариф: 50 проверок аудио/изображений в месяц.
Почему Reality Defender API
- Простота — загрузка файла и получение результата.
- Гибкость — SDK на Python, TypeScript, Java, Go, Rust.
- Прозрачность — исходники открыты.
- Доступность — 50 сканов/мес без карты.
Тарифы
| План | Цена | Включено |
|---|---|---|
| Free | $0 | 50 сканов/мес, аудио+изображение, 1 пользователь |
| Growth | от $399/мес | 50+ сканов, аудио+изображение+видео, чат |
| Enterprise | по запросу | неограниченный объём, мультисид, видео+текст, стриминг, интеграции Zoom/Teams/Webex, расширение Chrome, персональная поддержка |
Где применять
- Верификация личности (KYC, безопасный доступ)
- Мошенничество (имперсонация, соц-инженерия)
- Модерация контента
- Анализ СМИ и факт-чекинг
- Исследования и тесты
Поддерживаемые форматы
Аудио (до 100 МБ, 12 с – 5 мин): wav, flac, mp3, m4a, aac, ogg, opus; 8 языков.
Изображения (до 10 МБ): jpg, jpeg, png, gif, webp.
Видео (до 250 МБ): mp4, mov; аудио как выше.
Комментарии (42)
- Участники сомневаются в надёжности «детекторов ИИ» и предсказывают бесконечную «кошку-мышь» между генераторами и детекторами.
- Предлагают альтернативу: криптографическую подпись контента, но признают, что добровольные стандарты легко обходятся.
- Основатели Reality Defender отвечают: ансамбль моделей выдаёт лишь вероятность 1-99 %, API закрыт, таргетинг по паттернам и лимит 50 бесплатных сканов мешают злоупотреблениям.
- Уже используется крупными банками и корпорациями для проверки подлинности медиа и документов.
Dyna – Logic Programming for Machine Learning
Dyna — декларативный логический язык с весами для исследователей машинного обучения.
Он позволяет описывать что вычислять, не заботясь о как. Примеры:
c(I,K) += a(I,J) * b(J,K). % умножение матриц
fib(N) := fib(N-1)+fib(N-2). % числа Фибоначчи
phrase(X,I,K) max= phrase(Y,I,J)*phrase(Z,J,K)*rule(X,Y,Z). % CKY-разбор
История: проект начат в 2004 для сокращения разрыва между математикой и кодом.
- Dyna 1.0 добавил произвольные полукольца к Datalog.
- Dyna 2.0 убрал ограничение на единое полукольцо, разрешил свободные переменные, ленивые и энергичные вычисления, наследование через dynabases.
Актуальные исследования
- Реализация через реляционную алгебру и перезапись термов.
- Использование обучения с подкреплением для выбора оптимального порядка вычислений.
Ключевые статьи
- PhD M. Francis-Landau «Declarative Programming Via Term Rewriting» (2024).
Комментарии (15)
- Автор рад, что его PhD-исследование (язык Dyna3) попало на Hacker News.
- Dyna3 — это кложурная реализация Dyna, JIT-компилятор и «артефакт из будущего» по ощущениям читателей.
- Язык обобщает Datalog на произвольные полукольца, позволяя вероятностные выводы и динамическое программирование; схож со Scallop, но Scallop ориентирован на дифференцируемость и интеграцию с нейросетями.
- Пользователи спрашивают про «max=», «*» и связь с Prolog-грамматиками; Dyna использует переписывание термов с весами.
- Есть Python-, Clojure- и Java-API, но для продакшена нужны дополнительные годы разработки.
Traps to Developers
-
CSS
min-width: auto(по умолчанию) имеет приоритет надflex-shrink,overflow: hidden,width: 0; задайтеmin-width: 0.- Горизонталь и вертикаль различаются:
width: autoрастягивается,height: autoпо содержимому;margin: 0 autoцентрирует по горизонтали, но не по вертикали (вflex-direction: columnработает). - BFC (
display: flow-root) предотвращает схлопывание margin и «обнуление» высоты родителя с float-потомками. - Новый stacking context создают
transform,filter,opacity,position: fixed/sticky,z-index+absolute/relativeи др.;z-indexдействует только внутри контекста. - На мобильных
100vhвключает скрытые панели; используйте100dvh. position: absoluteориентируется на ближайший «positioned» ancestor, а не на родителя.floatне работает внутри flex/grid-родителя.- Процентные
width/heightне работают, если размер родителя не задан. display: inlineигнорируетwidth,height, вертикальныеmargin.- Пробелы между
inline-blockэлементами рендерятся; в flex/grid — нет. box-sizing: content-box(по умолчанию) не включает padding/border; включитеborder-box.- Указывайте
width/heightу<img>для предотвращения CLS. - Загрузка файлов не показывается в DevTools; используйте
chrome://net-export/. - Внутри
<script>строка</script>ломает парсинг.
-
Unicode
- Отличайте code point и grapheme cluster (последнее — то, что видит пользователь).
Комментарии (100)
- Маршрутизаторы могут тихо обрывать простаивающие TCP-соединения; настройте TCP-keepalive или HTTP-заголовки.
- Возвращать
nullизOptional<T>— антипаттерн; Kotlin и аннотации уже решают это. - UTF-16 в Java/C#/JS — деталь реализации; в Go строки — просто байты.
min-width: autoработает не везде; CSS-свойства нельзя читать изолированно.- Регексы, YAML, LF/CRLF,
rm -rf $DIR/— каждый язык/платформа имеет свои подводные камни.
Making reliable distributed systems in the presence of software errors (2003) [pdf]
%PDF-1.3
5 0 obj
<< /Length 737 /Filter /FlateDecode >>
stream
xڵUKO0WHc;>@b% eiEд;~4PV\\V=رy|̸0q"e\\%\*H-YD 9Ze2& Őg¨Ҡ3D=>mErX\\/ )=9>8IrA3H³J>\['\[R{89CRԿ8EXDMkUĿKRcRIX|m8vcM"mc-jjb|4ӍYJ+{A=4e16}{gρ\`sa(w 1}@+\\\\pȜc5AKt!}'n\\\[M8pe$ZQdP\`N\]͚Lۛ쨣Hg6GsBxfܱ ?jQ<ߵT{P̯?c)n\[y%̲OprN5~qxvHrz:T:vT7Q Iɩw4fQ+8V\[ %ͅt-x^\]z\]>ä́^ukK!zvXh#O&gCT fqkk5
endstream
endobj
4 0 obj
<< /Type /Page /Contents 5 0 R /Resources 3 0 R /MediaBox \[0 0 595.276 841.89\] /Parent 12 0 R >>
endobj
1 0 obj
<< /Type /XObject /Subtype /Form /FormType 1 /Matrix \[1 0 0 1 0 0\] /BBox \[0 0 143 73\] /Resources << /ProcSet \[ /PDF \] /ExtGState << /R8 13 0 R /R4 14 0 R >> >> /Length 15 0 R /Filter /FlateDecode >>
stream
xYn-;mVzn2#m@sǀ\\R#E?ſ߿GJm>k?kZ\_cߏҾv>K~Rr~>8J?3x>jK\_cxy+e\*o뫔/|篲g=|jv~PUOWW9K<+;><c϶\_kQZag<xk쉳q?(w ֝ Ip\_\`; }T?q\_ugnkQy߹uei<qw;a=pL\]'j\*#@=k5BLv~&4<yyZ:1y!&F|@yQU,8} 7q=6Aݶ\*g95\]\\T7Ky1PO9yb~nw.ڸQ~QzP· DZs«rUC\] 0C!K83{0\\ЮѪ\]C!S s+B/qҺsCrvks6}MYX=HPпC<Ӈs3?3Ϸa!9OM·ΎXŞ8|h'湻.3>-C @:k1>@y˹C\*X>p"ۂ @owԩv!X8a5-z-:Ʋyӛ2=;d\*繲9oAkY\_;,,=ᰐ3>R;"8l=ׄ>@>xݞ\\FyV!vY\]1w1ޘML9JJv9&#qzGmr>9E/ϓdྟ\_ov9, \]:$玚"#jyH灈Dsd@f"T~Gf\[tV">ƟWћňq\[qJ\[$V,KD)Q!xg\\ܚtpv7ҘBudm.$0#HKg8G V5lC/u9 l{ihs9C ;ajB٪> t|^P4vfAu$F0P ʥ.hDA9GyhȑtR 7 ښ^՟66:lĕb<Ү.$Jɻ(Ʋ~hAόBs~Q^|j9Xꂥ.~u:,%MT(zϰL:"(:t4݇/vk|eQq}t%I9jBY9L9\]N& #QK;bggwcYjUh\\PM8-Z%d3x~خ"+,Π£n zo~?^'-BZ}C0^bUq\[$"Jދ鳣&mu(0AP/dm{ę3>rP1-$$2đ7;TƃAg\\R$1#) mh 3~.b8fK'C/x9#\*N,}v89\`sb3\`8 \[S\*7g,v?3?ܷ ʾJ \[A?tSKBs\`y$Xu4ٟ|HdoܥfaDX%39.L=a\*0 #RnI0葡L&u;Ce+JMI\_Z^8tT0wJ#g|q2!3mԹ3"O~e;,D)Rı΅P# \[@y/.ϹG6s:t? eMf,\_B;PAXHG뇫b/+D<cflI.:eLט/l'B-HR \]$agra;{9rrs;UPymX4)iEf㕇qjS(;bedȑLtˆ &>߫HŖ)8퇀ˡeGA 9ݹ.\_U(61,%#t$gC&ʄ+SA)SHݍ\_NE%d̨RZpf ?dAH,͜c\*g(|@'13sdg\]\[Lw"{"hx<.#ob@E4$ i=ǃ4#{,<Y f^a&mVFS$dG2 hAB:Z{Q\_F т1>P$9PA<X{TdMBt=\\{9=CvOtO&E^JwM6'\]!9V|rɟTEyQX/> -|0&u$)i5,yץ}ceCGw\_ړm$)5 |>s"dؒdthjziYF%\\~ˤyKΈ+bK0g\\qtOT%,\*\_\\~9pϊBpCkB+@$\_s}Op^5efJDM\]-n. p)Rd7>Od0 \`J7Dmbs}t|)\`n3h\[V!ueX Cװd\`~>G:EͰ6q@cvKl |6\`ldwBÉo T=Iiw#Ar#tV:ܒA\`;\_J\`樼:4{OSH!H8!c3vavg{rmS<3,r8!UD0^0 1\`\`Nz\`{ſb$R\`wZ5~9kf\*OpZ |=,w$M x%;L%6R\_ :BYqOHRŬ.sw5g+(%h1y6\*kyVES\]@E,;DFxKY1oEnSeKz&Ƙ':rxwEb1\\!^pX\]=}2x7\_^v+\*~EU;A9-IIKTP,c(0v4@,8f qIwy-<@!Yg Վ.S4 2E\]AgG<dXY3<9\_5U>2|kӏ4^\[Gbڗa@h<)Y&\*bpG'td:\*o}탌Otda 2hyL\\Xdif\\ۀ-ZS#2 &h\\Yo~!7z8 LuÅCP\]k?}C0 F>Jз;,) Qb\[:ӬT\_n@@!=\`5^/Ed/pveU&lB>TVD-r3: \]pLE@lvIMd5Q{yœܰ'T~a >x @u\\8qhjqc 7 E \*\]Jʭ\`(2/ W%Wi:=PRB,+$ >;9HR\[,fßfRDʽdmܺ/<yE%<{8@Hшxvi}ό\_HEE-"-XJt6m}Fn{~gӼgŌ0~s|kW|b4wH5ﱥמo ڵ7JH@~(abe3Ы-nWNjNR1,dg|LBq+&\*BWiƥԕBJiʲcؽkl➱7&x\\B 5q.9:\]mRף>aFybU{r@aR=B~Q2p\\kRgƻ}2aax\`5Vq4\[0?&G'K$\[TѸQv&xZ Y/ឨ {^zVE\\̵Pp\] O;5k-5C+ 1.p{|do@սV,L>{X&ևɓB|CR/\*3>.sMX!G!P(8Z/ o}X< K)!?'Jx-->c TAi\_""GAyK~yw낇35>yR#?Grig\\3 ·0\\,sE 'Ss,GP83nbby@zqy\[@gL>+?O(hX={UL;m dI! FMV70\[w\_fW+E1sxbP,#\[BWpo\*I\[b"kD,?zoqr{BC-礌\*Y!Ԫ\*96͑k.?Ŕ(%z,MJйL0A:/{<+b<,@W>PmEkxX<bLqSDZMY=êbOÚֈsAe8CTuvYq\]Ѷ7pp 4' =LLo@xĸ?AӝEVXEaԲ5
Комментарии (16)
- Участники вспоминают Джо Армстронга и его ссылки на работу Джима Грея о Tandem.
- Отмечают, что Erlang/Elixir были технологически опережающими, но не стали массовыми.
- Идеи Erlang постепенно проникают в .NET и Java через Akka и Orleans.
- Удивляются, почему Erlang не используется даже в новых коммутаторах Ericsson, хотя был создан для них.
- Считают, что полное внедрение Erlang угрожает существующим бизнесам и рабочим местам, а рынок предпочитает «хуже, но дешевле».
Build durable workflows with Postgres
-
Выбор хранилища метаданных рабочих процессов оказался ключевым. Нужно было простое: чекпойнт состояния и восстановление после сбоя. Postgres выбрали за технические возможности, а не только за популярность и 40-летнюю проверку временем.
-
Масштабируемые очереди
Классическая таблица-очередь страдает от конкуренции: все воркеры пытаются взять одни и те же задачи. Postgres решает это черезFOR UPDATE SKIP LOCKED: строки блокируются и пропускаются, если уже захвачены. Воркеры без конфликтов берут следующие N записей, позволяя обрабатывать десятки тысяч задач в секунду. -
Наблюдаемость
Каждый шаг сохраняется, поэтому можно строить дашборды и фильтры. SQL позволяет писать сложные запросы напрямую; индексы поcreated_at,executor_id,statusускоряют выборки из миллионов записей без лишних затрат. -
Exactly-once для шагов с БД
Обычно гарантируется «по крайней мере один раз», но если шаг меняет данные в той же транзакции, что и чекпойнт, Postgres обеспечит, что изменения зафиксируются ровно один раз даже после перезапуска.
Комментарии (49)
- Пользователи хвалят DBOS за простоту миграции с graphile-worker и отсутствие необходимости менять инфраструктуру.
- Сравнения с Temporal, Azure Durable Functions, Inngest, Restate и Cloudflare: DBOS выглядит проще и легче, но Temporal/Cloudflare критикуют за сложность самостоятельного хостинга и высокую цену.
- Некоторые жалуются, что «сервер» DBOS (Conductor) не open-source, что ограничивает самостоятельное развёртывание.
- Планы по добавлению Java, C#, Go и поддержке сообщества уже анонсированы; Python и TypeScript уже поддерживаются.
- Отмечена возможность комбинировать DBOS с Dagster/Oban/pgflow для более сложной оркестрации.
Byte Buddy is a code generation and manipulation library for Java
Byte Buddy — библиотека для генерации Java-классов во время выполнения без компилятора. В отличие от встроенных средств, она позволяет создавать произвольные классы, а не только прокси по интерфейсам.
Поддержка
- Коммерческая: обучение, консультации, разработка — пишите rafael.wth@gmail.com.
- Общие вопросы: задавайте на Stack Overflow с тегом
byte-buddy; для неформатных тем — рассылка. - Баги и фичи: issue tracker; пришлите пример кода и версию Java.
- Разработка: делайте pull-request; крупные фичи обсудите заранее в рассылке.
Проект ведёт Rafael Winterhalter с 2014 г.
Комментарии (27)
- В обсуждении сравнивают новый стандартный API для генерации байт-кода в JDK 24 (JEP 484) и старое решение ByteBuddy.
- Упоминают JavaPoet (теперь форк от Palantir) как удобный инструмент для генерации кода на уровне исходников.
- Micronaut показан примером фреймворка, избегающего runtime-генерации, делая всё во время компиляции.
- Поднимаются вечные споры «Java vs Kotlin»: кто-то считает Java «C для JVM», кто-то предпочитает Kotlin, а LLM якобы лучше понимают Java.
PHP compile time generics: yay or nay?
Кратко:
PHP-фонд предлагает реализовать только компиляторные обобщения (generics) для интерфейсов и абстрактных классов.
Синтаксис:
interface Repository<Item> {
public function find(int $id): Item;
}
class UserRepo implements Repository<User> { … }
- Все проверки типов происходят на этапе компиляции.
- Ошибки ловятся до запуска кода.
new Repository<User>()по-прежнему невозможно, но и не усложняется.
Почему не полные обобщения?
Полноценные runtime-generics требуют сложного вывода типов и резко замедляют работу, особенно при объединённых типах и массивах.
Откуда идея?
- 2023-2024: эксперименты Arnaud Le Blanc показали, что 80 % пользы можно получить без 80 % сложностей.
- 2025: Gina Banyard разрабатывала «ассоциированные типы» и поняла, что их легко переформулировать как ограниченные обобщения.
Вопрос сообществу:
Поддержите ли вы такой вариант и проголосуете ли «за»?
Комментарии (50)
- В обсуждении разбираются плюсы и минусы добавления дженериков в PHP.
- Участники спорят, не приведёт ли это к «размагничиванию» типов, и объясняют разницу между reified (типы сохраняются в рантайме, как в C#) и erased (типы стираются, как в Java) дженериками.
- Поднимается вопрос: почему
class Repo<T> {}труднее реализовать, чемclass BlogPostRepo extends BaseRepo<BlogPost> {}. - Многие разработчики просят хотя бы строго типизированные массивы, считая их более полезными, чем полноценные дженерики.
- Часть команды уже использует PHPStan и strict_types, считая этого достаточным без изменений ядра языка.
We shouldn't have needed lockfiles 💬 Длинная дискуссия
Представьте, вы пишете проект и вам нужна библиотека — назовем ее libpupa.
Вы находите текущую версию 1.2.3 и добавляете в зависимости: "libpupa": "1.2.3" Автор libpupa 1.2.3 в свою очередь зависел от liblupa версии 0.7.8 и записал это: "liblupa": "0.7.8" То есть libpupa 1.2.3 навсегда зависит от liblupa 0.7.8. Алгоритм разрешения зависимостей простой и детерминированный: берем версии верхнего уровня, затем версии их зависимостей, и так далее. Достаточно указать только верхние уровни — транзитивные получатся одинаковыми всегда. Зачем отдельный lockfile?
Но люди изобрели lockfile из‑за диапазонов версий. Диапазоны делают сборку зависимой от времени: сегодня вы получите liblupa 0.7.8, через 10 минут — 0.7.9. Это определяется не при публикации, а при сборке: вы можете подтянуть версию, которой не существовало на момент выпуска libpupa 1.2.3. Откуда автор libpupa знает, что будущая 0.7.9 не сломает его код? Семантическое версионирование — это лишь намек, не гарантия.
И смешно то, что эти диапазоны все равно «замораживают» в lockfile, и вы не получаете предполагаемой пользы. «Перегенерируй lockfile и обновись» — это ничем не отличается от обновления верхнеуровневых зависимостей. «Lockfile решает конфликты версий?» — нет: библиотека либо работает с новой версией, либо нет; запись «0.7.*» не помогает — все равно нужно выбрать рабочую версию.
«Но раз lockfile существует, значит, нужен!» — не обязательно. Пример: Maven. Экосистема Java 20 лет обходится без lockfile, при этом тянет сотни библиотек — и все детерминировано.
Вывод: lockfile усложняет без достаточных причин. Менеджеры зависимостей могут работать без него.
UPD: В Maven при конфликте транзитивных зависимостей выбирается версия, ближайшая к корню. Это детерминированно и позволяет переопределять версии. Если вышла d 2.1 с патчами безопасности, добавьте ее в корень — она и будет выбрана, не дожидаясь обновлений у всех. Если автоматически брать самую большую версию, вы потеряете возможность переопределения.
Комментарии (267)
- Обсуждение крутится вокруг необходимости lock-файлов и версионирования: одни считают, что фиксированные версии и детерминированные алгоритмы достаточно, другие настаивают, что lock-файлы критичны для воспроизводимости и безопасности.
- Приводят примеры из экосистем Maven/Java, Go (MVS), Cargo/Rust, .NET, Scala: у каждого свои компромиссы; даже при детерминированном резолве сеть/репозитории делают сборки недетерминированными без lock-файлов и хэшей.
- Аргументы за версии-диапазоны: автоматическое получение патчей безопасности без вмешательства авторов верхнеуровневых библиотек; но это ломается при конфликтующих транзитивных зависимостях и несовместимых API/ABI.
- Много комментариев о том, что lock-файлы особенно нужны приложениям (прод, стейджинг, аудит), а для библиотек — меньше, но всё равно полезны из-за пересборок и целостности (хэши артефактов).
- Подчёркивают проблемы разных языков: в компилируемых — типы из разных версий несовместимы; в JS Node могут сосуществовать несколько версий, но это не решает безопасность/детерминизм.
- Некоторые отмечают, что главная путаница — не в lock-файлах, а в культуре семвера, централизованных репозиториях и UX инструментов; предлагают BOM/snapshot-подходы и периодические обновления с тестами/реновейтом.
- Отдельная ветка критикует дизайн сайта с анимированными иконками, мешающими чтению.