Динамическое поведение Javascript

Динамическое поведение программы JavaScript — CentoCode.com

Аналитика динамического поведения программ с использованием специальной методики

Для вычислений общего назначения JavaScript является объектно-ориентированным и широко используемым языком программирования. В отличие от более традиционных языков, таких как C#, Java не имеет классов и не поддерживает инкапсуляцию или структурированное программирование. Вместо JavaScript стремится к максимальной гибкости. Давайте посмотрим, как работает динамическое поведение javascript-программы.

JavaScript стал универсальной вычислительной платформой с офисными приложениями, браузерами и средами разработки. Это дублированная версия «языка ассемблера» в Интернете, на которую нацелены генераторы кода, такие как java и Scheme. В этом ответе он начал привлекать внимание и уважение.

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

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

Некоторые предположения о динамическом поведении JavaScript -

1. Иерархия прототипа неизменна

Любая модификация иерархии прототипов потенциально может повлиять на граф потока управления приложения, а также на типы затрагиваемых объектов.

2. Свойства добавляются при инициализации объекта

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

3. Свойства редко удаляются

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

4. Использование eval нечасто и не влияет на семантику

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

5. Низкая динамика сайта вызова

Огромная реализация JavaScript, такая как движок Chrome V8, опирается на программы javascript, такие как создание классов для объектов и встроенных кешей.

6. Во времени выполнения преобладают горячие циклы

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

7. Отраслевой эталон демонстрирует мощь JavaScript

Стандартная реализация вроде Spider, Dromaeo использует реализацию JavaScript и точность статической аналитики.

Инфраструктура отслеживания и анализа:

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

WebKit: ua.indexOf('AppleWebKit/') > -1

Затем он использует эту проверку для создания различных реализаций setOpacity, getRootElement, shouldUseXPath и других функций, поведение которых может зависеть от браузера.

Измерение динамизма программы -

1. Динамичность сайта вызова

Главной особенностью объектно-ориентированного программирования является динамическое связывание.

Пример — for (...) { ... = { f : function (x) { return x; } }; }

Следующая фрагментация кода создаст множество объектов, каждый из которых имеет метод f(), но каждый из них имеет другой объект функции, привязанный к f. Наивно можно считать вызовы x.f() с разными получателями полиморфными. Мы утверждаем, что для наших целей предпочтительнее считать сайт вызова полиморфным только в том случае, если он вызывает функцию с другим телом, т. е.
вызовы клонов следует считать мономорфными.

2. Вариабельность функций

Вызывающая сторона не обязана уважать арность функции в JavaScript. Если предоставлено слишком мало аргументов, значение аргументов значения будет установлено на undefine. Если любую функцию можно вызвать с произвольным количеством аргументов и произвольным контекстом, используя встроенную функцию, объявите ее как вариативную.

3. Динамика объектного протокола

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



4. Полиморфизм конструктора

Механизм создания объектов в JavaScript более динамичен, чем в языках, основанных на классах, потому что конструктор — это просто функция, которая программно инициализирует поля.

Пример — function C(b) { if(b) this.y = 0; else this.x = 0; }

Он возвращает new c(true) и new c(false) — разные наборы свойств. Большинство конструкторов всегда возвращают один и тот же набор свойств.

Конечно, полиморфизм может возникать по множеству причин, но общей является динамичность JavaScript, позволяющая абстрагироваться от деталей реализации иерархии объектов. Простая функция из библиотеки прототипов -

function C(b) { if(b) this.y = 0; else this.x = 0; }

5. Влияние библиотек JavaScript

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



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

Пожалуйста, дайте мне знать ваши мысли в качестве ответа.

Первоначально опубликовано на https://centocode.com 31 января 2021 г.