Инструментарий

Для иллюстрации рассматриваемых алгоритмов мы будем использовать т.н. «веб-технологии» — те средства, которые предоставляют веб-браузеры (которые уже весьма давно из средств отображения гипертекстовых документов превратились в почти полноценные операционные системы).

Язык Javascript

Родным языком программирования (родным в том смысле, в котором таковыми являются разнообразные «ассемблеры» для реальных CPU) для браузеров является Javascript.

Javascript является типичным процедурно-ориентированным скриптовым языком. Его семантика, например, весьма близка таким языкам как Python, PHP, Lua.

Впрочем, у Javascript есть несколько уникальных особенностей, о которых следует упомянуть.

Реактивная модель исполнения

Обычно языки программирования работают по императивной модели: один (или несколько) исполнитель последовательно выполняет команды, из которых состоит программа. Когда команды закончились, программа завершается.

Для Javascript ситуация несколько иная:

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

По похожей реактивной модели работают центральные процессоры за тем исключением, что в них либо нет никакой «очереди событий», либо же она максимально примитивна и сильно ограничена в размере.

Отсутствие стандартного окружения

В Javascript есть минимальный набор стандартных средств для работы со встроенными в язык типами данных. Весь же набор средств для общения со внешним миров не стандартизирован и определяется конкретной реализацией языка.

Тем не менее, в подавляющем большинстве случаев используется одно из двух «окружений»:

  • «браузерное»
  • «серверное»

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

Второе — это проект Node.js, позволяющий использовать Javascript как язык для управления ОС.

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

Упор на функциональное программирование

Несмотря на то, что Javascript копирует синтаксис языков C, C++, Java и им подобных, а семантикой очень напоминает Python, типичные методологии программирования на нём существенно отличаются от таковых для тех самых C, C++, Java, Python и т.п.

Например, Javascript был одним из первых языков программирования, впитавших монадный подход к асинхронному программированию (пришедший из экосистемы языка Haskell). И вообще изначально задумывался как язык семейства ЛИСП с джаваподобным синтаксисом.

Как следствие, программы на Javascript очень активно используют функции, которые получают на вход другие функции и собирают из них какие-то ещё функции. Более того, в лучших традициях функциональных языков программирования функции в Javascript используются не только как средство изоляции блоков кода, но и как средство модуляризации программы (полноценная стандартизированная поддержка модулей появилась в языке не так давно, и до сих пор многие библиотеки ей не пользуются; кроме того, стандартные модули не являются «объектами первого класса» в отличие от функциональных).

Где почитать подробнее про язык

Рекомендуем два источника:

  • MDN — справочник не только по Javascript, но и вообще по всем веб-технологиям
  • learn.javascript.ru — неплохой (правда, малость многословный) учебник на русском языке

Также в следующем подразделе дана очень краткая справка по наиболее важным аспектам языка.