Spec-Zone.ru › Flow

Система типов

JavaScript: Хорошее и плохое

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

Однако, развитие и рост кодовой базы JavaScript известны своей сложностью. Разработчики не могут работать быстро, когда они ломают код. Они часто сталкиваются с перерывами, тратя много времени на отладку глупых ошибок, разбор предположений и гарантий, предоставляемых библиотеками, написанными другими людьми, и т.д.

В принципе, это дополнительное время можно уменьшить, добавив слой типов в кодовую базу и создав инструменты, использующие информацию о типах для решения вышеперечисленных проблем. Например, типы могут использоваться для выявления ошибок, документирования интерфейсов библиотек и так далее.

Идея использования типов для управления эволюцией и ростом кода на JavaScript (и родственных языках) не нова. На самом деле, в последние годы для JavaScript были созданы несколько полезных систем типов. Однако системы типов отличаются своими целями. С одной стороны спектра находятся разрешительные системы типов, предоставляющие некоторую степень проверки кода на возможные ошибки, без учёта правильности. С другой стороны спектра находятся жёсткие системы типов, которые могут гарантировать корректность статических оптимизаций кода, но при этом могут ограничивать совместимость. Ещё одна область, которая не получила много внимания, – это производительность самого проверки типов.

Flow: Цели

Flow – это статический проверяющий типов для JavaScript, который мы разработали в Facebook. Главная цель Flow – предоставить разработчикам JavaScript погруженный опыт разработки — быстрый цикл редактирования-перезагрузки — даже при эволюции и росте кодовой базы. В техническом плане мы определили две конкретные цели, которые важны для этой миссии: точность и скорость. Эти цели пронизывают дизайн и реализацию.

Точность

Ошибки в JavaScript могут иметь значительные последствия в Facebook. Разработчики хотят находить и исправлять как можно больше ошибок до выпуска кода в производство. Поэтому мы должны учитывать надёжность. В то же время мы должны также заботиться о том, чтобы не сообщать слишком много ложных ошибок, потому что низкий уровень «сигнала/шума» означает низкий уровень исправления ошибок.

Другими словами, мы хотим, чтобы анализ Flow был точным на практике – он должен точно моделировать основные характеристики языка, чтобы понимать разницу между идиоматическим кодом и случайными ошибками.

Точность также имеет другие желательные последствия. Когда типы надёжны, разработчики склонны полагаться на них для структурирования своего кода и его анализа, что приводит к более чистому и эффективному коду с меньшим количеством динамических проверок. Когда ошибки типов надёжны, разработчики могут сосредоточиться на том, что делает их код, а не на том, как переписать свой код, чтобы удовлетворить (или обойти) систему типов.

Наконец, точность позволяет создавать полезные инструменты для разработчиков. В частности, качество результатов, сообщаемых Flow, когда разработчик запрашивает тип выражения, определение, достигающее ссылки или набор возможных завершений в точке через IDE, коррелирует с точностью анализа Flow.

Скорость

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

Другими словами, мы должны разработать анализ Flow так, чтобы он был чрезвычайно быстрым – он должен реагировать на изменения кода без заметной задержки, оставаясь при этом достаточно точным на практике.

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

Что делает Flow точным?

Один из основных факторов точности Flow – чувствительность к пути: то, как типы взаимодействуют с проверками в режиме выполнения. Суть многих идиом JavaScript заключается в том, чтобы объединить наборы значений в режиме выполнения и разобрать их с помощью поверхностных проверок структурного (не)равенства. В Flow набор значений в режиме выполнения, которые может содержать переменная, описывается её типом, и проверка в режиме выполнения на этой переменной уточняет тип до меньшего набора. Эта способность на практике оказывается довольно мощной и универсальной.

Что делает Flow быстрым?

Ключ к скорости Flow – модульность: возможность разбить анализ на фрагменты размером с файл, которые можно собрать позже.

К счастью, JavaScript уже написан с использованием файлов в качестве модулей, поэтому мы модулируем наш анализ, просто попросив, чтобы модули имели явным образом типизированные подписи. (Мы всё ещё выводим типы для подавляющего большинства кода «локального» для модулей.) Случайно, разработчики считают эту практику хорошей практикой разработки программного обеспечения.

С помощью модульности мы можем агрессивно распараллелить наш анализ. Кроме того, при изменении файлов мы можем инкрементально анализировать только те файлы, которые зависят от изменённых файлов. Вместе эти решения помогли масштабировать анализ на миллионы строк кода.

Внутри Flow опирается на инфраструктуру систем с высокой пропускной способностью и низкой задержкой, которая позволяет распределять задачи между параллельными рабочими потоками и передавать результаты параллельно через общую память. В сочетании с архитектурой, где анализ кодовой базы автоматически обновляется в фоновом режиме при изменениях в файловой системе, Flow обеспечивает практически мгновенную обратную связь по мере редактирования и переработки кода разработчиком, даже в большом репозитории.

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/lang

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API