Инструментарий
Для иллюстрации рассматриваемых алгоритмов мы будем использовать т.н. «веб-технологии» — те средства, которые предоставляют веб-браузеры (которые уже весьма давно из средств отображения гипертекстовых документов превратились в почти полноценные операционные системы).
Язык 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 — неплохой (правда, малость многословный) учебник на русском языке
Также в следующем подразделе дана очень краткая справка по наиболее важным аспектам языка.