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, а о том, что они не были дотянут
I'm working on implementing a programming language all my own
Я пишу свой язык Baba Yaga — чисто из любви к эстетике кода. Рабочий интерпретатор есть, но полноценной среды пока нет; планирую браузерный «бесконечный холст» в духе Smalltalk.
Язык — эксперимент ради удовольствия: неизменяемость, функциональный стиль, минимальный синтаксис, базовые «батарейки». Это Toki Pona для Haskell.
Синтаксис и типы
Объявления переменных и функций одинаковы; скобки не нужны, каррирование бесплатно.
transport : "Chicken House"
add : x y -> x + y
add5 : add 5
Базовые неизменяемые типы: Int, Float, String, Bool, List, Table.
numbers : [1, 2, 3]
person : {name: "Lucy", age: 23}
Типы можно указать явно; без аннотаций всё проверяется только во время вызова.
Управление потоком
Единственный способ — when (pattern matching). Нет if/else или switch.
describe : x ->
when x is
0 then "Zero"
_ then "Something else"
processUser : user ->
when user is
{name: n, age: a, active: true} -> "Adult: " .. n
_ -> "Unknown"
Пример: жизнь Конвея уже работает.
Комментарии (36)
- Участники делятся опытом создания языков: @codr7 показал фреймворк Shi, @aldousd666 рассказал о своих интерпретаторах, начавшихся в 2006-м.
- Разгорелся спор о синтаксисе: одни хвалят «:» для присваивания, другие защищают «=» как уже устоявшийся символ.
- Кто-то предлагает отказаться от точек с запятой, кто-то считает их полезным разделителем.
- Обсуждаются математические корни обозначений: одни считают «=» сравнением, другие — утверждением.
- Предлагаются альтернативы: «:=», «<-», «=>», а также идея вызывать функции в порядке чтения.
Crimes with Python's Pattern Matching (2022)
Python 3.10 добавил сопоставление с образцом, которое использует isinstance.
ABC с __subclasshook__ могут подменять проверку типа, поэтому:
class NotIterable(ABC):
@classmethod
def __subclasshook__(cls, C):
return not hasattr(C, "__iter__")
match x:
case NotIterable(): ...
работает — 10 считается NotIterable, строки и списки — нет.
Аналогично можно «матчить» по наличию атрибутов:
class DistanceMetric(ABC):
@classmethod
def __subclasshook__(cls, C):
return hasattr(C, "distance")
и деструктурировать:
match x:
case DistanceMetric(distance=d): ...
Динамически создаём комбинаторы:
def Not(cls):
class _Not(ABC):
@classmethod
def __subclasshook__(_, C):
return not issubclass(C, cls)
return _Not
n = Not(DistanceMetric)
match x:
case n(): ...
Синтаксис не позволяет писать Not(DistanceMetric)() прямо в case, но сохранив сгенерированный ABC в переменную, обходим ограничение.
Комментарии (99)
- btown показал «трюк» с rrshift, позволяющий делать цепочки вида x >> f >> g без изменения левой части.
- Большинство участников критикуют реализацию pattern matching: неочевидное поведение имен-констант, лишняя сложность, отсутствие общих константных паттернов.
- Некоторые считают match-case полезным для структурной проверки типов, но просят линтеры/semgrep-правила, чтобы запретить его в кодовой базе.
- Обсуждаются и другие «преступления»: предложение {/} для пустого множества, метаклассы, меняющие isinstance, и «goto-подобная» неявность.
Gleam v1.12
-
Исправления
- Уточнено сообщение об ошибке с некорректной терминологией. (Louis Pilfold)
- JS: устранён сбой при использовании echo в модуле с функцией process. (Peter Saxton)
- Форматер: не переносит комментарий перед assert за него; корректно форматирует сообщения после echo/panic/todo/assert/let assert с комментарием перед ними; компилятор не генерирует неверный код для assert с пайпами на JS. (Giacomo Cavalieri)
-
Форматирование битовых массивов
- Трейлинг-Запятая управляет разбиением: с запятой — много строк; без — в одну строку.
- Если несколько сегментов на строке и убрана завершающая запятая, форматер сохраняет сегменты по одному на строку. (Giacomo Cavalieri)
-
Компилятор и генерация кода
- echo поддерживает пользовательское сообщение: echo 11 as "lucky number" печатает контекст и значение в stderr. (Giacomo Cavalieri)
- В сгенерированном JS doc-комментарии превращаются в JSDoc. (Giacomo Cavalieri)
- Уменьшен размер кода case на JS. (Surya Rose)
- Удаление неиспользуемого кода на этапе генерации (usage-based DCE). (Louis Pilfold)
- Улучшена поддержка echo для списков символов, ошибок и циклических ссылок JS. (Louis Pilfold)
- Улучшен внешний вид ошибок и предупреждений: контекстные метки выделяются иначе, чем источник проблемы. (Giacomo Cavalieri)
- Подсказка при импорте с точкой вместо слеша, с примерами корректного синтаксиса. (Zij-IT)
- Предупреждение при затенении импортированного имени верхнеуровневой константой/функцией. (Aayush Tripathi)
- Улучшено сообщение об неизвестной переменной, если, вероятно, имелась в виду проигнорированная (_x → x), с подсказкой. (Giacomo Cavalieri)
- Оптимизирован матчинг-паттернов на JS.
Комментарии (80)
- Обсуждение посвящено релизу Gleam: многие хвалят дизайн языка, читаемость, статическую типизацию и паттерн-матчинг; приводят пример кода и делятся позитивным опытом использования в проектах.
- Есть ссылки на пост о версии 1.12.0 и доклад на YouTube; некоторые ждут дальнейшего созревания экосистемы и возможности шаринга кода между фронтендом и бэкендом.
- Критика: отсутствие интерфейсов/тайпклассов и оператора композиции; кому-то синтаксис и «Error -> Error» кажутся неэлегантными; snake_case непривычен после TypeScript.
- В ответ отмечают осознанную простоту языка и официальную позицию Gleam по отказу от тайпклассов.
- Существенная часть треда уходит в спор о «идеологичном» футере сайта (инклюзивность, антинацистская позиция, права транс-людей): часть считает это лишним, другие — важным для безопасности и качества сообщества.
- Подчеркивается, что Gleam — это не только язык, но и сообщество с явным кодексом поведения; отсутствие позиции тоже является позицией.
- Некоторые участники призывают вернуться к техническим темам релиза, чтобы не повторять одни и те же дискуссии.