Компиляция Assemblyscript в Wasm, производительность

Я видел, что уже есть компилятор для компиляции TypeScript в WebAssembly (Wasm), Ссылка здесь.

Я также слышал из множества источников, что компиляция JS в Wasm неосуществима из-за динамической природы и динамических типов JavaScript.

Однако TypeScript предлагает типизированные переменные, которых нет в JavaScript. А в будущем Wasm сможет даже взаимодействовать с DOM / взаимодействовать с другим веб-API.

Вопрос:

Будет ли написание приложений на TypeScript и его компиляция в Wasm давать какие-либо преимущества в производительности по сравнению с написанием веб-приложения на JavaScript?

Я думаю, вам следует заменить TypeScript на AssemblyScript, чтобы избежать путаницы.

Jonas Wilms 19.08.2018 16:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
2 299
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы можете скомпилировать определенную функциональность Javascript до Wasm, вероятно будет работать быстрее. JavaScript работает очень быстро по сравнению с другими динамическими языками, поскольку (большинство) браузеров компилируют его до байт-кода низкого уровня, который очень быстро интерпретируется (или даже выполняется изначально). Wasm спроектирован так, чтобы быть очень близким к байт-коду, поэтому в лучшем случае JS и «подмножество JS с типами, скомпилированными в Wasm» работают с одинаковой скоростью (если оба компилятора хорошо справляются со своей задачей). Но:

1) Исходный код JS, вероятно, больше, чем код Wasm, поэтому его загрузка с сервера занимает больше времени (время запуска)

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

Тем не менее, вы не можете просто превратить большую часть JavaScript или TypeScript в Wasm (вот почему AssemblyScript является подмножеством TS) по разным причинам:

1) eval, with или просто for(const el of [1, "seven", null]) убивают производительность в JS, но их невозможно скомпилировать в Wasm (потому что они убивают производительность).

2) В JavaScript есть сборка мусора.

Не уверен, откуда вы взяли, что Wasm разработан так, чтобы быть близким к байтовому коду JS. Это неверно на нескольких уровнях. Во-первых, Wasm спроектирован так, чтобы быть близким к машинному коду оборудования и не иметь никакого отношения к JS. Вот почему это быстро. Во-вторых, движки JavaScript также не запускают оптимизированный JS как байтовый код, а компилируют его в собственный код.

Andreas Rossberg 20.08.2018 15:19

@andreas medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775, насколько я понимаю, v8 компилирует только горячие функции в собственный код. Поэтому термин «компиляция» здесь немного ошибочен, поэтому он смешан с термином «интерпретируемый», чтобы отличить его от реального скомпилированного кода. Что касается части Wasm, я полагаю, вы правы и изменили "этот байт-код" на "байт-код".

Jonas Wilms 20.08.2018 15:30

Конечно, но V8 не использовал байтовый код до прошлого года, его введение в качестве первого уровня - недавнее изменение. Этот байт-код предназначен исключительно для JS и не имеет ничего общего с Wasm. Кроме того, он намного медленнее, поэтому не используется для быстрого выполнения.

Andreas Rossberg 20.08.2018 18:43

@andreas да, но моя точка зрения все еще остается в силе. Если вы пишете код более высокого уровня, неважно, будет ли он скомпилирован в Wasm раньше или будет скомпилирован интерпретатором JS, вы получите почти тот же байт-код, поэтому он будет работать одинаково быстро.

Jonas Wilms 20.08.2018 19:44

Я не уверен, что ты имеешь в виду. Wasm не компилируется до байтового кода, поэтому код, скомпилированный с помощью Wasm, не может «закончиться байтовым кодом». Оба пути могут закончиться собственным кодом, но даже это будет выглядеть очень по-разному между ними.

Andreas Rossberg 20.08.2018 21:41

@andreas, но можно сказать, что Wasm и JS, выполняющие разумные задачи, могут работать с одинаковой скоростью, верно?

Jonas Wilms 20.08.2018 21:45

Ну да, но это гипотетическое утверждение, верное для любых двух языков. На практике это маловероятно для нетривиального кода JS и Wasm.

Andreas Rossberg 21.08.2018 08:45

Реальный ответ: нет. Есть несколько распространенных заблуждений по поводу TypeScript. Во-первых, он менее динамичен, чем JavaScript. Это неправда, на самом деле он настолько же динамичен, как JS, потому что он охватывает всю семантику JavaScript (включая все безумные угловые случаи), а его система типов слишком слабая и ненадежная, чтобы гарантировать, что обычный автономный компилятор может использовать для статической оптимизации. В лучшем случае типы могут использоваться как подсказки, которые динамическая виртуальная машина может сначала попытаться оптимизировать, зная, что они могут оказаться неверными.

(Кроме того, я не знаю компилятора TypeScript-to-Wasm. Вы, вероятно, думаете об AssemblyScript, но, хотя он повторно использует синтаксис TypeScript, его семантика сильно отличается.)

Итак, этот компилятор github.com/AssemblyScript/assemblyscript не компилирует TS в WASM? А скрипт сборки для WASM?

Willem van der Veen 19.08.2018 16:38

Вы указали AssemblyScript в своем вопросе. Сценарий сборки - это чрезвычайно строгий набор машинописных текстов. Не путайте это с самим машинописным текстом. Большая разница в том, что Typescript включает в себя все динамические атрибуты, которые мы все знаем и любим (ненавидим) в Javascript. AssemblyScript, с другой стороны, этого не делает.

Примеры пары больших различий: в AssemblyScript у вас не может быть закрытий. У вас также не может быть типов объединения.

Отсутствие закрытий или дискриминируемых союзов - временное ограничение. Есть PR для реализации закрытия например: github.com/AssemblyScript/assemblyscript/pull/1240

MaxGraey 14.05.2020 14:41

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