Изначально я хотел поныть про переписывание компилятора TypeScript’а на Go, как уже ныл в комментах под новостью, но вместо решил чуть более рационально подойти к вопросу «Что вам дает типизация?». И если в случае с JavaScript’ом все понятно: надежда только на дисциплину разработчиков, вместо помощи от типов, привела к печальному состоянию многие кодовые базы (прикиньте, полное отсутствие комментов и доки в легаси - т.е. нет вообще какой-либо мета инфы, и типчики тут лучше, чем ничего). То вот зачем другим экосистемам и языкам типы? Что они дают нам, разрабам?
Оговорюсь сразу, что дальше речь только про типы, доступные на этапе работы с кодом или компиляции, и пока не про рантайм типы.
Так что дает типизация? Надежность? Сама по себе нет. Перформанс в рантайме? Не совсем. Подерживаемость кода? Без дисциплины все равно ситуация не сильно лучше. Это все спорные вопросы.
Но вот с чем сложно поспорить:
➡️ Улучшение Developer Experience в виде помощи IDE, LSP и иногда хоть какой-то документации, хотя бы для LLM’ок
➡️ Как инструмент для дизайна. Иногда просто круто начать с типчаков, принести их команде на обсуждение, обложиться тестами и потом уже имплементировать.
➡️ Как доказательство корректности. Тема очень интересная и перспективная для некоторых областей, но не доступная для большинства мейнстримных «статически типизированных» языков
В замен мы платим большим кол-вом кода (иногда), не возможностью сделать какие-то выкрутасы (назовем это гибкостью), сложностью инструментария.
🔔С этими в голове у появилась очевидная мысль, что не все системы типов себя стоят и иногда ваш компилятор просто тупой или ленивый. И обычно тупость компилятора историческая (раньше вывод по ХМ был чисто игрушкой теоретиков), либо скрывается за попытками авторов ускорить компилятор за счет вашего удобства.
Типы действительно имеют эти преимущества, когда вы: дизайните с их помощью (ADT, либо костыли вокруг классов), функции пишите почти без описания типов (есть система вывода типов), на основании типов действительно можно верить в корректность программы во время испольнения (лайфтаймы в расте против висящих указателей, отсутствие NPE, даже деление на ноль или док-ва, что массив не пустой). И это не какой-то идеальный мир. Это реальность: плодотворная работа теоретиков и практиков над языками программирования.
И от компилятора TypeScript'а хотелось бы таких же гарантий. И чтобы TypeScript сам был написан с использованием этих гарантий. А не на криво-косо сделанной системе типов Go с
interface{}, на котором половина стандартной библиотеки зиждится. И чтобы TS спеку получил в одном из мажоров и чтобы соблюдение этой спеки тоже выводилась системой типов. Но мы уже знаем, что команде TypeScript'а важно другое. А кто хочет этого - пишите на чем-нибудь другом.Да и в целом, вокруг получающих системы типов, других, ранее чисто динамических языков программирования, строятся интересные научные работы. И постепенное типизирование с gradual typing, например, Elixir’а - выглядит многообещающе, правда там это не приоритет. Да и то, что входит в мейнстрим (PHP, Python) все равно выглядит криво-косо. Но оно пока в процессе - дальше может будет получше.
Ну и в коменты скинул пару достаточно свежих папир с исследованиями, которыми я на эту тему вдохновился 😊.