Hacker News Digest

Тег: #kotlin

Постов: 14

A years-long Turkish alphabet bug in the Kotlin compiler (sam-cooper.medium.com)

В Kotlin-компиляторе скрыта ошибка, срабатывающая при сборке проекта в турецкой локали. Из-за неё при попытке скомпилировать код в турецкой локали возникает ошибка парсинга XML от компилятора: строчка var category: CompilerMessageSeverity? = CATEGORIES[qName.toLowerCase()] в функции CompilerOutputParser некорректно обрабатывает турецкий символ I (U+0049), который при приведении к нижнему регистру становится не i (U+0069), а ı (U+0131) — точкой надстрочного i без точки. Из-за этого ключ i не находится в словаре CATEGORIES, и код ошибочно считает, что это неизвестный тег, и выдаёт сообщение об ошибке.

Ошибка скрывалась в коде с 2016 по 2021 год, пока не была обнаружена и исправлена. Теперь код корректно использует локально-независимый toLowerCase(Locale.ROOT), и проблема решена. Это яркий пример того, как тонкости локализации могут вызывать ошибки в интернационализированном ПО, особенно при обработке текста.

by Bogdanp • 12 октября 2025 г. в 17:02 • 135 points

ОригиналHN

#kotlin#internationalization#localization#xml#compiler#medium

Комментарии (145)

  • Проблема "турецкое I" встречается везде, где не указывается локаль при работе со строками, и это приводит к багам, когда вместо "I" в турецкой локали превращается в "ı" (без точки) и наоборот.
  • Современные языки и фреймворки должны предоставлять единообразные и предсказуемые API, но вместо этого они вынуждают разработчиков указывать локаль каждый раз, что приводит к ошибкам.
  • Пользователи с турецкой локалью страдают от багов, которые не могут быть обнаружены автоматически, потому что большинство разработчиков тестируют только на английской локали.
  • Это также является примером более широкой проблемы: API-функции, которые не принимают Locale параметр, вместо этого полагаясь на дефолтной локали, что может привести к ошибкам.

Ask HN: Who is hiring? (October 2025) 💬 Длинная дискуссия

by whoishiring • 01 октября 2025 г. в 15:01 • 211 points

ОригиналHN

#python#kotlin#typescript#rust#aws#gcp#azure#mlops

Комментарии (282)

  • Компании ищут инженеров для работы с AI/ML, включая роли Senior Machine Learning Engineer, ML Scientist и разработчиков для создания AI-инструментов в различных областях, таких как биология, недвижимость и безопасность.
  • Предлагаются позиции в software development, включая Full Stack, Backend, Frontend и MLOps инженеров, с использованием технологий Python, Kotlin, TypeScript, Rust и других, для удаленной, гибридной или офисной работы.
  • Есть вакансии в сфере облачных технологий и инфраструктуры, такие как Cloud Engineer, SRE и DevOps, с фокусом на AWS, GCP, Azure и управление масштабируемыми системами.
  • Несколько ролей связаны с разработкой в нишевых областях: квантовые вычисления, 3D-моделирование, финансовые технологии (алготрейдинг), видеоигры и управление цепочками поставок.
  • Предложения включают позиции разного уровня, от начинающих до ведущих инженеров и архитекторов, с вариантами визовой поддержки, релокации и конкурентными зарплатами в диапазоне от $120k до $240k+ в зависимости от опыта и локации.

Comparing Rust to Carbon (lwn.net)

На RustConf 2025 обсуждалась совместимость Rust и C/C++, где Чендлер Каррут сравнил подходы Rust и экспериментального языка Carbon. Rust предлагает инструменты вроде bindgen и cxx для взаимодействия, но они слабо подходят для сложного legacy-кода C++ (brownfield), где тесные связи и большой API усложняют миграцию. Carbon же задуман как полностью совместимый с C++ язык, позволяющий постепенно переписывать проекты файл за файлом без смены компилятора, с акцентом на аннотации для безопасности памяти.

Каррут считает, что Rust не скоро решит проблему полной интероперабельности с C++, тогда как Carbon предлагает эволюционный путь, аналогичный переходу от JavaScript к TypeScript. Это даёт пространство для Carbon, особенно в крупных legacy-проектах, где полный переход на Rust непрактичен. Вывод: два языка могут сосуществовать, решая разные аспекты миграции к безопасным языкам.

by pykello • 25 сентября 2025 г. в 02:22 • 81 points

ОригиналHN

#rust#carbon#c++#c#kotlin#swift#linux#google#interoperability#legacy-code

Комментарии (30)

  • Обсуждается сложность и подходы к миграции с C/C++ на современные языки (Rust, Kotlin, Swift), включая инструменты для конвертации и постепенного перехода.
  • Поднимаются вопросы о важности качественной интероперабельности между языками и недостатках C как языка-«клея» из-за отсутствия современных функций безопасности.
  • Высказываются сомнения в универсальности Rust для полного переписывания из-за архитектурных несовпадений с идиоматическим C++.
  • Отмечается, что такие проекты, как Carbon, нацелены на крупные кодобазы (вроде Google) и инкрементальный рефакторинг без полного переписывания.
  • Упоминается, что принятие Rust в Linux пока ограничено (драйверы, отдельные подсистемы), а будущее Kotlin и Swift вне их экосистем (Android/Apple) остается под вопросом.

Rustroid, a Rust IDE for Android (rustroid.is-a.dev)

Разработка Rustroid началась с увлечения Minecraft в детстве, когда на мобильном телефоне пришлось создавать моды без нормальных инструментов — только базовый редактор JSON. Это выявило острую нехватку developer tools под Android. Позже автор экспериментировал с Java, портируя игры через приложение CodeAssist, и освоил основы Android SDK.

С появлением ПК интерес сместился на Rust из-за его целостного инструментария (Cargo) и популярности. Выбор пал на Rust IDE, а не Java, из-за отсутствия аналогов и личной симпатии к языку. Проект начался на Java, но быстро перешел на Kotlin и Jetpack Compose — это оказалось эффективнее. Rustroid работает локально на устройстве, используя встроенный компилятор и пакетный менеджер Rust.

by coolcoder613 • 25 сентября 2025 г. в 00:28 • 84 points

ОригиналHN

#rust#kotlin#java#jetpackcompose#android#ide#termux#vim

Комментарии (31)

  • Обсуждается возможность и опыт программирования на телефоне с использованием различных инструментов (Termux, tmux, vim, внешние клавиатуры) и IDE.
  • Отмечается, что кодинг на телефоне может быть актуален для пользователей без доступа к ПК, в поездках или в развивающихся странах.
  • Поднимаются технические вопросы о работе конкретных приложений, их офлайн-доступности и интеграции с периферией (DeX, внешние экраны).
  • Высказывается мнение, что рынок IDE для телефонов недостаточно развит, но имеет потенциал для быстрого прототипирования и работы "на ходу".
  • Участники дискутируют, является ли скорость печати (WPM) ключевым фактором продуктивности в программировании, особенно с учетом развития ИИ-инструментов.

Top Programming Languages 2025 (spectrum.ieee.org) 💬 Длинная дискуссия

Python сохраняет лидерство благодаря своей универсальности в машинном обучении и веб-разработке, а JavaScript остаётся незаменимым для фронтенда. Rust продолжает расти из-за акцента на безопасность и производительность, особенно в системном программировании. Go набирает популярность в облачных сервисах и микросервисной архитектуре благодаря простоте и эффективной параллельной обработке.

Стоит отметить рост TypeScript как более строгой альтернативы JavaScript, а также стабильное присутствие Java в корпоративных приложениях. Интерес к Julia увеличивается в научных вычислениях, а Kotlin укрепляет позиции в мобильной разработке под Android. Практический вывод: выбор языка всё больше зависит от конкретной области, а не только от общей популярности.

by jnord • 23 сентября 2025 г. в 23:42 • 219 points

ОригиналHN

#python#javascript#rust#go#typescript#java#julia#kotlin#machine-learning#cloud-services

Комментарии (343)

  • Сомнения в методологии рейтинга языков программирования IEEE из-за использования ненадёжных источников (поисковые запросы, устаревающий StackOverflow), что может искажать реальную картину.
  • Удивление высокой позицией Java (2-е место), объясняемой её доминированием в enterprise-секторе (финансы, страхование, здравоохранение) и миграцией legacy-систем с COBOL.
  • Обсуждение искусственного завышения позиции Python из-за его популярности у новичков, в академических статьях и как основного языка вывода для LLM.
  • Предложение объединить рейтинги близких языков (JavaScript/TypeScript, Java/Kotlin, C/C++) для более точного отражения популярности экосистем.
  • Размышления о влиянии AI-ассистентов на будущее языков: возможная стагнация из-за зависимости LLM от популярных языков или, наоборот, упрощение изучения нишевых.

Pocket Casts, You Altered the Deal, So I Will Alter Your App (blog.matthewbrunelle.com)

Pocket Casts изначально был платным приложением с разовой оплатой, но после нескольких смен владельцев и перехода на модель подписки начал показывать рекламу даже пользователям, которые уже заплатили. Это вызвало недовольство, особенно учитывая, что в 2022 году приложение стало открытым исходным кодом. Автор статьи воспользовался этим, чтобы убрать рекламу через форк репозитория на GitHub, изменив флаги BANNER_ADS_PLAYER и BANNER_ADS_PODCASTS в коде на Kotlin.

В краткосрочной перспективной можно отключить рекламу через debug-сборку и встроенные переключатели функций, но в будущем это может стать сложнее из-за ужесточения политики безопасности Android. Ситуация напоминает 2020 год, когда NPR потеряла $800 тыс. на управлении приложением, что привело к продаже Automattic.

by ruph123 • 23 сентября 2025 г. в 02:56 • 87 points

ОригиналHN

#kotlin#android#github#open-source#pocket-casts#automattic#subscription-model

Комментарии (42)

  • Пользователи критикуют добавление рекламы в приложение Pocket Casts, нарушающее обещание "единоразовой оплаты навсегда"
  • Обсуждаются высокие эксплуатационные расходы сервиса и предполагаемая финансовая несостоятельность компании
  • Высказывается недовольство Automattic за изменение условий и неуважение к пользователям
  • Предлагаются альтернативные модели монетизации (подписка на новые функции) без ущерба для старых пользователей
  • Поднимается вопрос о необходимости соблюдения договоренностей и этичности ведения бизнеса

Playing “Minecraft” without Minecraft (2024) (lenowo.org)

Разработчики создали полностью свободную альтернативу Minecraft, используя три независимых проекта: сервер Cuberite, прокси ViaProxy и клиент Minosoft. Это позволяет играть в совместимую версию игры без использования оригинального кода Mojang, что особенно интересно для энтузиастов open-source и тех, кто хочет избежать лицензионных ограничений.

Для запуска требуется 64-битная система с 4 ГБ ОЗУ, Java 17 и OpenGL-совместимая видеокарта. Cuberite эмулирует версию 1.12.2 с поддержкой измерений, а ViaProxy решает проблему совместимости между версиями протокола. Minosoft, написанный на Kotlin, завершает цепочку, предоставляя клиент с открытым исходным кодом.

Такой подход не только демонстрирует мощь сообщества, но и поднимает вопросы о будущем игровых экосистем, построенных на обратной разработке.

by coolcoder613 • 19 сентября 2025 г. в 02:13 • 130 points

ОригиналHN

#minecraft#cuberite#viaproxy#minosoft#kotlin#java#open-source#opengl#minetest#reverse-engineering

Комментарии (56)

  • Обсуждаются технические требования и альтернативные реализации Minecraft, такие как Minosoft, Cuberite и Minetest (Luanti).
  • Участники отмечают отсутствие официальной поддержки модификаций от Mojang и постепенный переход Microsoft на менее гибкую версию Bedrock.
  • Предлагаются решения для совместимости разных версий, например, использование прокси-сервера ViaProxy для устранения багов.
  • Minetest (Luanti) хвалят как образовательную платформу для обучения детей программированию, несмотря на некоторые ограничения.
  • Упоминаются конкретные проекты, такие как Mineclonia, как наиболее близкие к оригинальному Minecraft по функциональности.

Configuration files are user interfaces (ochagavia.nl)

Файлы конфигурации — это пользовательские интерфейсы. Мы часто сталкиваемся с ситуацией, когда растущее ПО требует настройки, но полноценный графический интерфейс кажется избыточным. Прагматичное решение — текстовый файл конфигурации, который легко версионировать и который оставляет возможность для будущего развития.

Выбор языка для конфигурации — непростая задача. JSON кажется слишком техническим, TOML — слишком минималистичным. И тут возникает соблазн использовать YAML: он приятен глазу и популярен. Однако за кажущейся простотой скрываются pitfalls, как показывает печально известный «документ из ада». Со временем даже небольшой YAML-файл может превратиться в кошмар поддержки.

Корень проблемы не в выборе языка (YAML vs. альтернативы), а в том, что мы недооцениваем конфигурационные файлы как пользовательские интерфейсы. Они должны обеспечивать отличный UX: предотвращать ошибки, вести пользователя к успеху и работать как «велосипед для ума».

Пример реализации такого подхода — проект KSON, который позиционируется как более эффективная альтернатива YAML/JSON/TOML. KSON является верифицированным надмножеством JSON, поддерживает JSON Schema и предлагает инструменты для улучшения работы с конфигурациями.

by todsacerdoti • 18 сентября 2025 г. в 16:43 • 141 points

ОригиналHN

#json#yaml#toml#kson#configuration-files#kotlin#python#rust#json-schema#hjson

Комментарии (81)

  • Критика KSON за отсутствие чувствительности к пробелам, что может приводить к неочевидным ошибкам парсинга, как в примере с вложенным списком портов.
  • Обеспокоенность рисками безопасности из-за единственной реализации на Kotlin и сложностей сборки для других языков, таких как Python и Rust.
  • Предложение использовать полноценные языки программирования (например, Python) для конфигурации вместо специализированных форматов, чтобы дать пользователям больше инструментов.
  • Аргумент в пользу того, что конфигурационные форматы должны быть выразительными, но ограниченными (как Cue, Starlark или Dhall), а не просто данными, как JSON или YAML.
  • Подчёркивание различия между форматами для людей (конфигурация) и для компьютеров (данные), и критика попыток совместить их в одном формате.
  • Замечание, что сложная конфигурация часто указывает на проблемы в дизайне ПО, и что лучше предоставить пользовательский интерфейс вместо сложных файлов.
  • Упоминание альтернатив, таких как TOML, HJSON, HOCON, KDL и Jsonnet, с различными подходами к простоте, выразительности и проверке типов.

For Good First Issue – A repository of social impact and open source projects (forgoodfirstissue.github.com)

Делай вклад в цифровые общественные блага

Помоги проектам, которые борются с климатом, голодом и прочими глобальными задачами. Ниже — готовые к первому 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) на сайте.

by Brysonbw • 15 сентября 2025 г. в 02:02 • 90 points

ОригиналHN

#php#typescript#javascript#tex#java#elixir#kotlin#ruby#python#jupyter

Комментарии (14)

  • Участники приветствуют инициативу списка проектов с «good first issue», но сомневаются в кураторстве: много проектов без активных задач, не все связаны с социальным влиянием.
  • Предложено скрывать репозитории с 0 issues и добавлять метрики активности (коммиты, разработчики, возраст), как в Re-Decentralise.
  • Новички спрашивают, считать ли правку опечаток «настоящим» вкладом; большинство советует упоминать, но честно указывать уровень участия.

MapLibre Tile: A next generation geospatial format optimized for rendering (arxiv.org)

MapLibre Tile — новый формат векторных тайлов, призванный заменить Mapbox Vector Tile (MVT).
Основные цели:

  • меньше размер (до 50 % экономии);
  • быстрее парсинг (до 2× ускорения);
  • простота реализации без внешних зависимостей.

Ключевые улучшения

  • FlatBuffers вместо Protocol Buffers → компактнее и без распаковки.
  • структурированные слои: геометрия, атрибуты, индексы — отдельные буферы, что ускоряет выборку.
  • delta-кодирование координат и ID → ещё меньше байт.
  • встроенный R-tree для быстрого поиска объектов в тайле.

Совместимость

  • Поддержка JS, C++, Swift, Kotlin.
  • Рендерится в MapLibre GL JS ≥ 5.0 без изменений API.
  • Обратная совместимость: конвертер MVT → MLT доступен.

Roadmap
Q4 2024 — стабильная спецификация, конвертеры, примеры.

by mtremmel • 18 августа 2025 г. в 11:28 • 129 points

ОригиналHN

#maplibre#flatbuffers#protocol-buffers#mvt#geospatial#javascript#c++#swift#kotlin#arxiv

Комментарии (11)

  • Участники рады ускорению декодирования и уменьшению размера тайлов, но опасаются сложности внедрения вне MapLibre.
  • Некоторые считают, что узкое место не в загрузке/декодировании, а в памяти и рантайме при множестве слоёв.
  • Уже ведётся работа над MapLibre GL JS/Native (Java, JS, Rust, TS); CLI-кодировщик почти готов.
  • Ожидается интеграция с Planetiler и, возможно, форк tippecanoe; документация и анонсы через новостную рассылку MapLibre.

Traps to Developers (qouteall.fun)

  • 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 (последнее — то, что видит пользователь).

by qouteall • 16 августа 2025 г. в 10:34 • 232 points

ОригиналHN

#css#flexbox#html#tcp#kotlin#javascript#java#go#unicode#regex

Комментарии (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/ — каждый язык/платформа имеет свои подводные камни.

Zig's Lovely Syntax (matklad.github.io) 💬 Длинная дискуссия

Zig выглядит почти как Rust, но делает синтаксис ещё приятнее за счёт более простой семантики и ряда изящных решений.

Числа
Литералы 92 всегда имеют тип comptime_int; при присваивании они неявно приводятся к нужному типу. Суффиксов нет.

Строки
Многострочные «сырые» строки пишутся через \\ в начале каждой строки; \ не экранируется, отступы не портятся, а лексер работает построчно.

Структуры
.{ .x = 1, .y = 2 } — запись поля через .x = совпадает с присваиванием, что позволяет грепом находить именно записи, а не чтения.

Типы
Все типы префиксные: u32, [3]u32, ?[3]u32, *const ?[3]u32. Разыменование постфиксное: ptr.*.

Идентификаторы
Синтаксис @"имя с пробелом" позволяет обходить ключевые слова и экспортировать любые имена.

Функции
fn add(x: i32, y: i32) i32 — без стрелки ->, так как лямбд нет, а возвращаемый тип всегда обязателен. pub fn main() void {}.

Переменные
const и var; часто используемое const короче, чем в Rust, но всё же длиннее Kotlin-овского val.

by Bogdanp • 10 августа 2025 г. в 15:33 • 157 points

ОригиналHN

#zig#rust#kotlin#csharp#go#dlang

Комментарии (156)

  • Обсуждение разделилось: кому-то синтаксис Zig кажется «прекрасным» минимализмом, другим — «шумным» и «капризным».
  • Спор о порядке «имя: тип» vs «тип имя»: одни хотят видеть тип первым, другие — имя.
  • Критика деталей: @-префиксы, .{}, отсутствие лямбд, перенос строк, orelse без пробела.
  • Плюсы: raw-строки Zig решают проблему отступов; обработка ошибок через try нравится многим.
  • Сравнения: Kotlin, C#, Go, Rust, D — каждый считает «своё» лучше.
  • Итог: «красота» синтаксиса субъективна и во многом привычна; после практики Zig начинает нравиться.

An AI-first program synthesis framework built around a new programming language (queue.acm.org)

Universalis: язык, который читают эксперты, а пишут LLM
Автор: Erik Meijer

  • Цель — дать знатокам предметной области возможность формулировать задачи естественным языком и получать готовые программы без участия разработчиков.
  • Средство — язык Universalis (в честь Лейбница), исполняемый нейро-компьютером Automind. Код похож на Excel-формулы, обёрнутые в «живые» описания.

Пример
Вопрос: «Алиса купила килограмм яблок за @B и продала за @S. Какой процент прибыли @P?»
Ответ-Universalis:

[@D is (@S-@B)]  
[@P is (@D/@B)*100]

Вводим @B=10, @S=17 → @P=70 %.

Особенности

  • Синтаксис максимально приближен к естественному языку.
  • Внутри — логические предикаты Prolog.
  • Поддержка пред-/пост-условий для валидации данных.
  • Среда «живого программирования» наподобие электронной таблицы: переключение между формулами и значениями.

by tosh • 09 августа 2025 г. в 15:36 • 98 points

ОригиналHN

#universalis#prolog#kotlin#dataframes#llm#programming-languages

Комментарии (14)

  • Критика: статья расплывчата, синтаксис «языка» меняется, управляющие конструкции описаны прозой, примеры сводятся к «сделай всё за меня».
  • Сомнения: это реальный язык или фантазия LLM?
  • Опасения: упрощение ведёт к потоку «мусорного» кода.
  • Технические детали: под капотом Kotlin DataFrames, возможна ad-hoc типизация.
  • ACM Queue обвиняют в рекламе без упоминания ограничений.
  • Перспектива: рано или поздно придётся заново изобретать модули, типы, ошибки, параллелизм и т.д.

Byte Buddy is a code generation and manipulation library for Java (bytebuddy.net)

Byte Buddy — библиотека для генерации Java-классов во время выполнения без компилятора. В отличие от встроенных средств, она позволяет создавать произвольные классы, а не только прокси по интерфейсам.


Поддержка

  • Коммерческая: обучение, консультации, разработка — пишите rafael.wth@gmail.com.
  • Общие вопросы: задавайте на Stack Overflow с тегом byte-buddy; для неформатных тем — рассылка.
  • Баги и фичи: issue tracker; пришлите пример кода и версию Java.
  • Разработка: делайте pull-request; крупные фичи обсудите заранее в рассылке.

Проект ведёт Rafael Winterhalter с 2014 г.

by mooreds • 08 августа 2025 г. в 17:25 • 80 points

ОригиналHN

#java#bytebuddy#code-generation#kotlin#micronaut#jep-484

Комментарии (27)

  • В обсуждении сравнивают новый стандартный API для генерации байт-кода в JDK 24 (JEP 484) и старое решение ByteBuddy.
  • Упоминают JavaPoet (теперь форк от Palantir) как удобный инструмент для генерации кода на уровне исходников.
  • Micronaut показан примером фреймворка, избегающего runtime-генерации, делая всё во время компиляции.
  • Поднимаются вечные споры «Java vs Kotlin»: кто-то считает Java «C для JVM», кто-то предпочитает Kotlin, а LLM якобы лучше понимают Java.