Если предпосылки слабой типизации в JavaScript были туманны, то решение сделать JavaScript динамическим языком было изначально. Это решение вдохновлено Self, Scheme и испытало на себе влияние Java, C.
Тяжело дать однозначное трактование динамической типизации, но можно через сравнение со статической. Переменные связываются с типов в момент объявления переменной - статическая типизация, при присваивании значения - динамическая типизация.
Говоря другими словами при динамической типизации у переменной нет типа, тип есть у значения этой переменной. Изменив значение переменной мы изменим ее тип.
Может наивно показаться, (я как-то попался на этом), что компилируемые языки это как правило статически типизированные, но это не так, пример тому язык Julia, julialang.org
У NodeJS (libuv + v8 - JS движок) есть возможность экспортировать созданный байт код при запуске скрипта. Не знаю можно ли встроенными средствами его снова запустить, но +1 один камень преткновения, чтобы поставить = м/у компилируемые и статическими ЯП
Динамическая типизация не заставляет думать разработчика о типах? И да и нет
Думают:
Опытные разработчики использующие динамически типизированные ЯП, документируют типы в сигнатурах функций. Явно имеют желание "статических типов".
В JavaScript - JSDoc jsdoc.app
JSDoc даже думали ввести на одних JavaScript курсах, чтобы подготовить морально/интеллектуально учащегося к статической типизации.
Минус динамической типизация, который также заставляет думать в сторону статической, это постоянная необходимость обладание контекстом о проекте, помнить что делает код. Приходится больше тратить времени, чтобы вкатиться в проект. Особенно с незнакомой доменной областью.
В своей книге "Типы в языках программирования" Бенджамин Пирс на первых страницах приводит доводы зачем нужны типы:
В JavaScript
- Выявление ошибок происходит в runtime
- ES6+ классы как какой-то способ описания абстракций в ЯП
- для документирования нужны как минимум сигнатуры функций, хотя бы на уровне JSDoc, а это сторонний инструмент
- эффективность - вопрос JS-движков, их обработки кода
Немного сравню JavaScript с TypeScript
Во втором после описания кода и запуска компилятор, тот начинает выводить типы (ru.wikipedia.org/wiki/Вывод_тип…), вывод типов гарантирует корректность программы.
Корректность во многом нас уберегла бы от ошибок типа undefined is not a function
Отсюда есть два разных по своей природе способа проверять корректность своих программ.
- покрывать код тестами:
для избежания runtime ошибок
- "покрывать код типами":
вывод типов сделает свою работу
На практике, конечно, лучше совмещать эти два подхода, не иначе
Про типы думают не только разработчики, которым без нее больно, но JavaScript-движки, например v8, который думает о типах постоянно.
Грубо говоря объекты с одной структурой, являются один классом
Тоесть с точки зрения v8: чем больше будет объектов с одинаковой структурой, тем производительней будет код.
Если в гонке за производительность, оперироваться исключительно на этот факт и ни на какой больше, то напрашивается использование статической типизации как решения
Те, кто глядя на JavaScript не думают о типах внутри этого ЯП, это те люди, кто серьезно занимаются Computer Science: динамически типизированные ЯП, особенно JavaScript, наименее интересны.
Для меня это было показательно при изучении вопроса полиморфизма medium.com/devschacht/pol…
За 30 лет с момента появления 1ого браузера многое изменилось. Браузеры сегодня это очень сложное прикладное ПО. Об этом можно даже судить в 1ом приближении по кол-ву строк кода
Ни для кого не станет открытием, если я напишу, что на текущий момент браузер Google Chrome, является самым популярным, более того, он занимает около 2/3 рынка.
Давайте попробуем старую практику как мир: лайк этому посту от вас, факт про эффектор, его историю и концепции от меня. Посмотрим насколько меня хватит!
Изначально effector был миддлварой для ридакса и разрабатывался для высоконагруженного клиента реалтайм чата, вроде Телеграм.
Пока флоу не умер, имелась его первоклассная поддержка. Сейчас типы затачиваются под TypeScript.
Каким боком @effectorjs помогает выстроить архитектуру приложений? Очень просто: он является языком описания бизнес-логики. А еще и помогает связать логику с представлением.
К чему мы привыкли? Встраиваем управление состоянием внутрь React. И после этого продолжаем называть REACT библиотекой, хотя он уже давно ФРЕЙМВОРК.
Мне не нравится такое положение. Из-за возраста React нам приходится очень долго ждать ConcurrentMode, терпеть издевательства StrictMode и наглости memo.
Давайте начнем с вопроса. Что такое архитектура фронтенда? Это как директории называются? Правила взаимного импорта? Какой стек используется?
Почему меня вообще беспокоит архитектура и структура проекта? Начну с того, что "хорошая" структура вносит ясность. Где искать конкретный код. Куда положить новый. Как писать код командой не внося изменения одновременно в один файл.
С архитектурой сложнее, ведь она про отношение сущностей вашего проекта. Как выстроить зависимости между сущностями и модулями так, чтобы добавление нового кода не требовало внесения изменений в существующий код.
Байка: когда-то я считал, что эти психологии - лишь выдумки соплежевателей, которые придумали себе что-то там. И проблемы бывают только объективные - ногу сломал, или отравился. Кстати, тогда я был бекендером, и считал фронтендеров соплежуями. Видимо это связано с типизацией 🤔
Это отлично укладывается в характеристику ригидной психики. Люди ригидного склада ума чётко знают, что и как происходит вокруг и с ними самими. Чаще всего это военные, немцы, бекендеры. И быть ригидным неплохо - меньше переживаешь, есть план и ты его придерживаешься
Но вот в случае непредвиденных обстоятельств, когда ваша картина мира рушится - трагедия, пандемия, или оказалось, что С++ не лучший в мире язык, а за JS платят больше - ригидным людям крайне тяжело подстроиться, они продолжают держаться за свои убеждения и планы. А мир в труху.