Javascript необязательный тип подсказки

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

Я полагаю, что ES4 ввел необязательный тип подсказки (из того, что я понимаю, Adobe сыграла огромную роль в разработке своей спецификации из-за actioncript). Javascript официально поддерживает хинтинг типа в результате? Будет ли ES6 поддерживать необязательные подсказки типов для собственных переменных?

Если Javascript поддерживает подсказки типов, есть ли какие-либо тесты, показывающие, как это окупается с точки зрения производительности? Я еще не видел, чтобы проект с открытым исходным кодом использовал это.

5 ответов

Решение

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

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

function Point(x, y) {
  this.x = x;
  this.y = y;
}

Все объекты, сделанные из "Точки", будут иметь одинаковую "форму", и более новые внутренние движки Javascript могут делать некоторые модные игры для более быстрого поиска.

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

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

Вы полуправильны, хотя. Тип подсказки является частью ActionScript 3 которая является производной от ECMAScript - но намеки никогда не превращали это в стандарт. AFAIK, за пределами желаемого мышления, это не обсуждалось.

Это видео описывает вещи гораздо более подробно: http://www.youtube.com/watch?v=FrufJFBSoQY

Я опоздал, но так как никто не ответил на ваши вопросы относительно стандартов, я прыгну.

Да, подсказка типов обсуждалась как часть ECMAScript 4, и казалось, что это будет будущее JavaScript... до тех пор, пока ES4 не погубит пыль. ECMAScript 4 был заброшен и никогда не завершался. ECMAScript 5 (текущий стандарт) не содержал многих вещей, которые были запланированы для ECMAScript 4 (включая подсказки типов), и на самом деле был просто быстро улучшенной версией черновика ECMAScript 3.1 - чтобы получить некоторые полезные функции за дверью после безвременной кончины ES4.

Как вы упомянули, сейчас они работают над созданием ECMAScript 6 (который имеет некоторые совершенно потрясающие функции!), Но не ожидаем увидеть подсказки типов. Ребята из Adobe, в некоторой степени, расстались с комитетом ECMAScript, и комитет ES не заинтересован в его возвращении (я думаю, на это есть веские причины).

Если это то, что вы хотите, вы можете проверить TypeScript. Это совершенно новый проект Microsoft, который, по сути, является попыткой быть типом ES6+. Это расширенный набор JavaScript (практически идентичный, за исключением включения типов), и он компилируется в работающий JavaScript.

ES7 (не скоро) имеет новую функцию, которая называется guard, возможно, та, которую вы запрашиваете. Синтаксис теперь немного похож на ES4 и TypeScript. Все используют : и добавьте тип к переменной. Но его не подтверждают синтаксис.

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

Удивительно, но аннотации типов в ActionScript иногда замедляют скомпилированный код, требуя проверки типа (или неявного преобразования), когда значение передается из нетипизированного кода в типизированный код.

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

Javascript основан на прототипах, поэтому "тип" объекта является полностью динамическим и может меняться в течение всего времени жизни.

Посмотрите на выводы Бена Фиршмана о производительности Javascript в отношении типов объектов - http://jsconf.eu/2010/speaker/lessons_learnt_pushing_browser.html

Другие вопросы по тегам