Я кодирую на Javascript каждый день. По крайней мере, около 9 часов в день, но чем больше я кодирую, тем больше я чувствую, что на самом деле не знаю, что делаю, лол. Я не знаю сути языка.

Поэтому у меня возникла идея начать серию статей, чтобы попытаться реорганизовать свое обучение. Идея названия пришла из книги Джереми Силмана «Как переоценить свои шахматы», в которой он в какой-то момент предлагает шахматистам начать с основ с другой точки зрения.

Я буду просто документировать свои исследования.

От дизайна языка Javascript до того, как он работает внутри, с акцентом на концепции и реализации движка Google V8.

Хватит говорить.

Итак… Что такое Javascript?

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

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

Javascript — это высокоуровневый, часто компилируемый язык Just-In-Time, который соответствует стандарту ECMAScript.

Это еще не все.

Javascript имеет динамическую типизацию, первоклассные функции, это объектно-ориентированный язык на основе прототипов, который также поддерживает другие парадигмы.

Много красивых слов.

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

Сначала мы определили Javascript как язык программирования высокого уровня.

Язык высокого уровня — это язык программирования с сильной абстракцией от низкоуровневой работы компьютера, на котором он работает.

Затем мы сказали Составлено точно в срок.

Javascript — это интерпретируемый язык. Это означает, что интерпретатор запускает программу строка за строкой, анализирует и выполняет каждую команду, тогда как скомпилированный язык (такой как C, C++, Rust, Go и т. д.) преобразуется непосредственно в машинный код на этапе «сборки». Эти накладные расходы делают интерпретируемые языки значительно медленнее, чем скомпилированные.

Ну, это до JIT-компиляции.

Что такое JIT-компиляция?

Этот тип компиляции пытается использовать преимущества как интерпретаторов, так и компиляторов. Мы можем определить JIT-компиляцию как компиляцию, выполняемую во время выполнения. Я расскажу об этом подробнее, когда буду углубляться в самый известный движок Javascript Google V8.

Вернемся к красивым словам…

Динамическая типизация. Интерпретатор присваивает переменным тип во время выполнения на основе значения переменной в данный момент. Таким образом, тип переменной может быть изменен на лету. Подробнее о приведении типов

  • В то время как языки со статической типизацией выполняют проверку типов во время компиляции.

error: assigning to 'char *' from incompatible type 'double’

Помните: Javascript имеет 7 примитивных типов (string, number, BigInt, boolean, undefined, Symbol и null)

Функции первого класса — Javascript может рассматривать функции как объекты первого класса. Это просто означает, что он позволяет передавать функции в качестве аргументов другим функциям или возвращать их как значения из других функций или даже сохранять их в структурах данных.

Хорошо, мы почти закончили…

…почти…

Ориентация объекта на основе прототипа и мультипарадигма

Прежде всего, давайте определим, что такое парадигмы.

Парадигмы — это просто разные способы или стили организации программы или языка программирования

Легкий…

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

Список выглядит следующим образом:

  • Императивный — программист указывает, что именно компьютер должен делать очень специфическим образом.
  • Процедурное — производное от императивного программирования, побуждающее программиста улучшать модульность кода с помощью функций.
  • Функциональный — улучшенная версия процедурной парадигмы с концепцией первоклассных функций (объяснено выше).
  • Декларативный — эта парадигма направлена ​​на то, чтобы скрыть сложность, выставляя синтаксис ближе к человеческому языку и мышлению.
  • Объектно-ориентированный — парадигма, которая организует программное обеспечение вокруг концепций классов и объектов.

Еще о парадигмах

Гибкость Javascript позволяет программисту структурировать и писать код в любой из вышеупомянутых парадигм, поэтому он называется мультипарадигмальным языком.

Список других мультипарадигмальных языков программирования

Круто, но что означает на основе прототипа?

Чтобы ответить на этот вопрос, нам нужно сначала выучить еще пару определений.

Классы и объекты

Мы узнали, что ООП (объектно-ориентированное программирование) — это парадигма, которая организует код вокруг концепций классов и объектов.

Класс— это своего рода план, определяющий все свойства и методы, характеризующие определенный набор объектов.

ОбъектObject — это экземпляр класса.

class Animal {} // class

return new Animal(); // object

Прохладный.

Наконец-то мы готовы приступить к определению того, что означает на основе прототипа.

ООП на основе прототипов — это просто еще один стиль этой парадигмы. Основное различие между языком, основанным на прототипах, и языком, основанным на классах, заключается в том, что в первом объекты являются первичными объектами, а дизайн фокусируется на том, что объекты делают, а не на том, чем они будут.

Классопределяет тип, экземпляр которого может быть создан,прототипсам по себе является экземпляром объекта.

Прототипы в Javascript — это механизм, который позволяет объектам наследовать друг друга.

Наследование — это один из четырех принципов, которые появление ООП привнесло в разработку лучшего модульного и многократно используемого кода.

  1. Абстракция — позволяет использовать простые классы для представления сложности. Гитаристу не обязательно знать, как устроена электрогитара, чтобы играть на ней.
  2. Инкапсуляция — скрывает внутреннюю реализацию внутри класса и скрывает внутренние данные внутри объектов.
  3. Полиморфизм — позволяет одному и тому же методу выполнять разные действия двумя способами.
  4. Наследование — позволяет передавать данные от родительских классов к дочерним. Дает программисту возможность определять общие родительские классы, а затем создавать дочерние классы по мере необходимости.

Классы наследуются от классов, создающих отношения подклассов

В прототипном наследовании объекты наследуются непосредственно от других объектов.

Javascript может достичь этого прототипного наследования двумя основными способами: делегирование прототипа и конкатенативное наследование.

  • Делегирование прототипа — каждый объект в Javascript имеет ссылку на прототип для делегирования. Если свойство не найдено в объекте, поиск начинает обращаться к каждому объекту в цепочке прототипов, пока не вернется к корневому делегату, Object.prototype.
  • Конкатенативное наследование — это процесс копирования свойств одного объекта в другой без сохранения ссылки между двумя объектами. Исходные прототипы обычно называются примесями.

Хотя цепочка прототипов, вероятно, является наиболее известным методом, наиболее часто используемым является конкатенативное наследование.

Как так?

Javascript дает нам возможность динамически расширять объект, также известный как Динамическое расширение объекта.

Динамическое расширение объекта — это идея о том, что объекты можно создавать, добавляя свойства к существующим экземплярам

Эта концепция была вдохновлена ​​языком самопрограммирования, и, поскольку динамическое расширение объекта до смешного распространено в Javascript, конкатенативное наследование является наиболее распространенной формой наследования в Javascript.

И люди этого даже не осознают. (например, используя Object.assign()).

Заключение

Я надеюсь, что это даст вам четкое определение того, что такое Javascript. Есть еще много чего сказать. Это далеко не полное объяснение, потому что каждую представленную тему можно значительно расширить, но я надеюсь, что только разжег ваше любопытство. Я оставляю несколько действительно замечательных статей, из которых вы можете узнать гораздо больше, в разделе ссылок. Увидимся в следующей статье.

Ссылки

  1. Композиция объекта
  2. Конкатенативное наследование
  3. Собеседование по изучению Javascript