diff --git a/files/ru/webassembly/exported_functions/index.html b/files/ru/webassembly/exported_functions/index.html index 1aa074e9c05730..8310034d128139 100644 --- a/files/ru/webassembly/exported_functions/index.html +++ b/files/ru/webassembly/exported_functions/index.html @@ -48,7 +48,7 @@

Пример

Чтобы доказать это, мы получаем ссылки на функции из таблицы otherTable и вызываем их. При выводе в консоль они дают такие же результаты.

-

Они являются настоящими функциями

+

Они являются настоящими функциями

В предыдущем примере возвращаемое значение каждого вызова Table.prototype.get() является экспортированной функцией WebAssembly — это именно то, о чем мы говорили.

diff --git a/files/ru/webassembly/index.html b/files/ru/webassembly/index.html index ba2f2a3e8b7978..d734056254ee32 100644 --- a/files/ru/webassembly/index.html +++ b/files/ru/webassembly/index.html @@ -76,7 +76,7 @@

Примеры

Спецификация

- +
diff --git a/files/ru/webassembly/loading_and_running/index.html b/files/ru/webassembly/loading_and_running/index.html index a330847d5f2ae0..819be4765f1b9d 100644 --- a/files/ru/webassembly/loading_and_running/index.html +++ b/files/ru/webassembly/loading_and_running/index.html @@ -15,26 +15,26 @@

Какие есть варианты?

-

WebAssembly ещё не интегрирована с <script type='module'> или ES2015 оператором import, поэтому не существует пути, позволяющего использовать модули загрузки браузера для использования импорта.

+

WebAssembly ещё не интегрирована с <script type='module'> или ES2015 оператором import, поэтому не существует пути, позволяющего использовать модули загрузки браузера для использования импорта.

-

Старые методы {{jsxref("WebAssembly.compile")}}/{{jsxref("WebAssembly.instantiate")}} требуют создания {{domxref("ArrayBuffer")}}, содержащего двоичный файл модуля WebAssembly после загрузки необработанных байтов, а затем скомпилировать/создать его экземпляр. Это аналог new Function(string), за исключением того, что мы заменяем строку символов (исходный код JavaScript) буфером байтов массива (исходный код WebAssembly).

+

Старые методы {{jsxref("WebAssembly.compile")}}/{{jsxref("WebAssembly.instantiate")}} требуют создания {{domxref("ArrayBuffer")}}, содержащего двоичный файл модуля WebAssembly после загрузки необработанных байтов, а затем скомпилировать/создать его экземпляр. Это аналог new Function(string), за исключением того, что мы заменяем строку символов (исходный код JavaScript) буфером байтов массива (исходный код WebAssembly).

-

Более новые методы {{jsxref("WebAssembly.compileStreaming")}}/{{jsxref("WebAssembly.instantiateStreaming")}} намного эффективнее - они выполняют свои действия непосредственно с необработанным потоком байтов, поступающих из сети, избавление от необходимости шага {{domxref("ArrayBuffer")}}.

+

Более новые методы {{jsxref("WebAssembly.compileStreaming")}}/{{jsxref("WebAssembly.instantiateStreaming")}} намного эффективнее - они выполняют свои действия непосредственно с необработанным потоком байтов, поступающих из сети, избавление от необходимости шага {{domxref("ArrayBuffer")}}.

Итак, как мы можем получить эти байты в буфер массива и скомпилировать? Следующие разделы объясняют.

Используя Fetch

-

Fetch - это удобный современный API для извлечения сетевых ресурсов.

+

Fetch - это удобный современный API для извлечения сетевых ресурсов.

-

Самый быстрый и эффективный способ получить модуль wasm - использовать более новый метод {{jsxref("WebAssembly.instantiateStreaming()")}}, который может принять вызов fetch() в качестве первого аргумента и будет обрабатывать загрузку, компиляцию и создание экземпляра модуля за один шаг, получая доступ к необработанному байтовому коду при его потоковой передаче с сервера:

+

Самый быстрый и эффективный способ получить модуль wasm - использовать более новый метод {{jsxref("WebAssembly.instantiateStreaming()")}}, который может принять вызов fetch() в качестве первого аргумента и будет обрабатывать загрузку, компиляцию и создание экземпляра модуля за один шаг, получая доступ к необработанному байтовому коду при его потоковой передаче с сервера:

WebAssembly.instantiateStreaming(fetch('simple.wasm'), importObject)
 .then(results => {
   // Do something with the results!
 });
-

Если бы мы использовали более старый метод {{jsxref("WebAssembly.instantiate()")}}, который не работает в прямом потоке, нам потребовался бы дополнительный шаг преобразования преобразованного байт-кода в {{domxref("ArrayBuffer")}}, вот так:

+

Если бы мы использовали более старый метод {{jsxref("WebAssembly.instantiate()")}}, который не работает в прямом потоке, нам потребовался бы дополнительный шаг преобразования преобразованного байт-кода в {{domxref("ArrayBuffer")}}, вот так:

fetch('module.wasm').then(response =>
   response.arrayBuffer()
@@ -46,9 +46,9 @@ 

Используя Fetch

-

Помимо перегрузок instantiate()

+

Помимо перегрузок instantiate()

-

Функция {{jsxref("WebAssembly.instantiate()")}} имеет две формы перегрузки - та, что показана выше, принимает байт-код для компиляции в качестве аргумента и возвращает Promise, которое разрешается для объекта, содержащего оба объекта скомпилированного модуля, и экземпляр этого. Объект выглядит так:

+

Функция {{jsxref("WebAssembly.instantiate()")}} имеет две формы перегрузки - та, что показана выше, принимает байт-код для компиляции в качестве аргумента и возвращает Promise, которое разрешается для объекта, содержащего оба объекта скомпилированного модуля, и экземпляр этого. Объект выглядит так:

{
   module : Module // The newly compiled WebAssembly.Module object,
@@ -56,16 +56,16 @@ 

-

Примечание: Обычно мы заботимся только об экземпляре, но полезно иметь модуль на тот случай, если мы хотим его кешировать, поделиться им с другим работником или окном через postMessage(), или просто создать больше экземпляров.

+

Примечание: Обычно мы заботимся только об экземпляре, но полезно иметь модуль на тот случай, если мы хотим его кешировать, поделиться им с другим работником или окном через postMessage(), или просто создать больше экземпляров.

-

Примечание: Вторая форма перегрузки принимает в качестве аргумента объект {{jsxref("WebAssembly.Module")}} и возвращает Promise, непосредственно содержащее объект экземпляра, в качестве результата. См. Второй пример перегрузки.

+

Примечание: Вторая форма перегрузки принимает в качестве аргумента объект {{jsxref("WebAssembly.Module")}} и возвращает Promise, непосредственно содержащее объект экземпляра, в качестве результата. См. Второй пример перегрузки.

Выполнение вашего кода WebAssembly

-

Когда у вас есть экземпляр WebAssembly, доступный в вашем JavaScript, вы можете начать использовать его возможности, которые были экспортированы через свойство {{jsxref("WebAssembly.Instance/exports", "WebAssembly.Instance.exports")}}. Ваш код может выглядеть примерно так:

+

Когда у вас есть экземпляр WebAssembly, доступный в вашем JavaScript, вы можете начать использовать его возможности, которые были экспортированы через свойство {{jsxref("WebAssembly.Instance/exports", "WebAssembly.Instance.exports")}}. Ваш код может выглядеть примерно так:

WebAssembly.instantiateStreaming(fetch('myModule.wasm'), importObject)
 .then(obj => {
@@ -81,18 +81,18 @@ 

Выполнен })

-

Примечание: Для получения дополнительной информации о том, как работает экспорт из модуля WebAssembly, ознакомьтесь с разделами Использование JavaScript API WebAssembly, и Понимание текстового формата WebAssembly.

+

Примечание: Для получения дополнительной информации о том, как работает экспорт из модуля WebAssembly, ознакомьтесь с разделами Использование JavaScript API WebAssembly, и Понимание текстового формата WebAssembly.

Используя XMLHttpRequest

-

XMLHttpRequest несколько старше, чем Fetch, но всё же может успешно использоваться для получения типизированного массива. Опять же, если предположить, что наш модуль называется simple.wasm:

+

XMLHttpRequest несколько старше, чем Fetch, но всё же может успешно использоваться для получения типизированного массива. Опять же, если предположить, что наш модуль называется simple.wasm:

    -
  1. Создайте новый экземпляр {{domxref("XMLHttpRequest()")}} и используйте его метод {{domxref("XMLHttpRequest.open","open()")}} для открытия запроса, задав для метода запроса значение GET и указав путь к файлу, который мы хотим получить.
  2. -
  3. Ключевой частью этого является установка типа ответа 'arraybuffer' с помощью свойства {{domxref("XMLHttpRequest.responseType","responseType")}}.
  4. -
  5. Затем отправьте запрос с помощью {{domxref("XMLHttpRequest.send()")}}.
  6. -
  7. Затем мы используем обработчик событий {{domxref("XMLHttpRequest.onload", "onload")}} для вызова функции после завершения загрузки ответа - в этой функции мы получаем буфер массива из {{domxref("XMLHttpRequest.response", "response")}} и затем передайте это в наш метод {{jsxref("WebAssembly.instantiate()")}}, как мы это делали с Fetch.
  8. +
  9. Создайте новый экземпляр {{domxref("XMLHttpRequest()")}} и используйте его метод {{domxref("XMLHttpRequest.open","open()")}} для открытия запроса, задав для метода запроса значение GET и указав путь к файлу, который мы хотим получить.
  10. +
  11. Ключевой частью этого является установка типа ответа 'arraybuffer' с помощью свойства {{domxref("XMLHttpRequest.responseType","responseType")}}.
  12. +
  13. Затем отправьте запрос с помощью {{domxref("XMLHttpRequest.send()")}}.
  14. +
  15. Затем мы используем обработчик событий {{domxref("XMLHttpRequest.onload", "onload")}} для вызова функции после завершения загрузки ответа - в этой функции мы получаем буфер массива из {{domxref("XMLHttpRequest.response", "response")}} и затем передайте это в наш метод {{jsxref("WebAssembly.instantiate()")}}, как мы это делали с Fetch.

Финальный код выглядит так:

diff --git a/files/ru/webassembly/rust_to_wasm/index.html b/files/ru/webassembly/rust_to_wasm/index.html index 8cd4fdaec717fe..cb20e64447678f 100644 --- a/files/ru/webassembly/rust_to_wasm/index.html +++ b/files/ru/webassembly/rust_to_wasm/index.html @@ -49,11 +49,11 @@

Дальше запустите в командой строке npm adduser:

-
> npm adduser
+
> npm adduser
 Username: yournpmusername
 Password:
 Email: (this IS public) you@example.com
-
+

Вам понадобится ввести своё пользовательское имя, пароль и email. Если все получится, вы увидите:

@@ -72,23 +72,23 @@

Создание WebAssem

Это создаст новую библиотеку в под-директории, называемой hello-wasm, со всем, что вам нужно:

-
+-- Cargo.toml
+
+-- Cargo.toml
 +-- src
     +-- lib.rs
-
+

Для начала, у нас есть Cargo.toml; с его помощью мы можем сконфигурировать наш билд. Если вы пользуетесь Gemfile из Bundler или package.json из npm, то вы почувствуете себя, как дома; Cargo работает аналогично обоим.

Дальше, Cargo сгенерировал кое-какой код для нас на Rust в src/lib.rs:

-
#[cfg(test)]
+
#[cfg(test)]
 mod tests {
     #[test]
     fn it_works() {
         assert_eq!(2 + 2, 4);
     }
 }
-
+

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

@@ -96,7 +96,7 @@

Давайте

Вместо этого поместите этот код в src/lib.rs:

-
extern crate wasm_bindgen;
+
extern crate wasm_bindgen;
 
 use wasm_bindgen::prelude::*;
 
@@ -109,7 +109,7 @@ 

Давайте pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); } -

+

Это содержимое нашего проекта на Rust. У него есть три основные части, давайте пройдёмся по ним по очереди. Мы дадим здесь обобщённое пояснение и поясним некоторые детали; чтобы узнать больше о Rust, пожалуйста, просмотрите бесплатную online-книгу The Rust Programming Language.

@@ -117,12 +117,12 @@

extern crate wasm_bindgen; +
extern crate wasm_bindgen;
 
 use wasm_bindgen::prelude::*;
 
-

Первая строка гласит: "эй, Rust, мы используем библиотеку, называемую wasm_bindgen." Библиотеки в Rust называются "crates" (контейнеры), а так как мы используем внешнюю, то "extern".

+

Первая строка гласит: "эй, Rust, мы используем библиотеку, называемую wasm_bindgen." Библиотеки в Rust называются "crates" (контейнеры), а так как мы используем внешнюю, то "extern".

Поняли? Cargo поставляет контейнеры.

@@ -138,11 +138,11 @@

Вызо

Следующая часть выглядит так:

-
#[wasm_bindgen]
+
#[wasm_bindgen]
 extern {
     pub fn alert(s: &str);
 }
-
+

Частичка внутри #[] называется "атрибутом", и она кое-как модифицирует следующее за ней утверждение. В нашем случае, это утверждение extern, которое говорит Rust-у, что мы хотим вызвать некоторую функцию, определённую во внешнем пространстве. Атрибут говорит: "wasm-bindgen знает, как найти эти функции".

@@ -156,11 +156,11 @@

#[wasm_bindgen] +
#[wasm_bindgen]
 pub fn greet(name: &str) {
     alert(&format!("Hello, {}!", name));
 }
-
+

Ещё раз, мы видим #[wasm_bindgen] атрибут. В этом случае, он модифицирует не блок extern, а fn; это значит, что мы хотим, чтобы эта функция на Rust была доступна для JavaScript. Прямо противоположно extern: это не те функции, которые нам нужны, а те, что мы предоставляем миру!

@@ -208,7 +208,7 @@

Сборка пакета

  1. Компилирует ваш Rust-код в WebAssembly.
  2. -
  3. Запускает wasm-bindgen с этим WebAssembly, генерируя JavaScript файл, который оборачивает WebAssembly файл в модуль. который может понять npm.
  4. +
  5. Запускает wasm-bindgen с этим WebAssembly, генерируя JavaScript файл, который оборачивает WebAssembly файл в модуль. который может понять npm.
  6. Создаёт папку pkg, куда перемещает этот JavaScript файл и ваш код WebAssembly.
  7. Читает ваш Cargo.toml и создаёт эквивалентный package.json.
  8. Копирует ваш README.md (если есть) в пакет.
  9. diff --git a/files/ru/webassembly/understanding_the_text_format/index.html b/files/ru/webassembly/understanding_the_text_format/index.html index df9722060823a6..e70d4ccdafd13f 100644 --- a/files/ru/webassembly/understanding_the_text_format/index.html +++ b/files/ru/webassembly/understanding_the_text_format/index.html @@ -55,12 +55,8 @@

    Сигнатуры и пара

    Сигнатура - это последовательность объявлений типов параметров, за которыми следует список объявлений возвращаемых типов. Здесь стоит отметить, что:

      -
    • -

      Отсутствие возвращаемого типа (result) означает, что функция ничего не возвращает.

      -
    • -
    • -

      В текущей версии WebAssembly может быть не более 1 возвращаемого типа, но позже это значение будет изменено на любое число.

      -
    • +
    • Отсутствие возвращаемого типа (result) означает, что функция ничего не возвращает.
    • +
    • В текущей версии WebAssembly может быть не более 1 возвращаемого типа, но позже это значение будет изменено на любое число.

    Каждый параметр имеет явно объявленный тип; у wasm в настоящее время есть четыре доступных типа:

    diff --git a/files/ru/webassembly/using_the_javascript_api/index.html b/files/ru/webassembly/using_the_javascript_api/index.html index 4113d6170c0b15..73ca81e34876fc 100644 --- a/files/ru/webassembly/using_the_javascript_api/index.html +++ b/files/ru/webassembly/using_the_javascript_api/index.html @@ -81,7 +81,7 @@

    -

    В ближайших версиях в Firefox, в дополнении к просмотру wasm-кода как текста, разработчики будут иметь возможность отлаживать wasm используя текстовый формат (устанавливать точки останова, изучать стек вызовов, построчно переходить, и.т.д). См. WebAssembly debugging with Firefox DevTools в видео-анонсе.

    +

    В ближайших версиях в Firefox, в дополнении к просмотру wasm-кода как текста, разработчики будут иметь возможность отлаживать wasm используя текстовый формат (устанавливать точки останова, изучать стек вызовов, построчно переходить, и.т.д). См. WebAssembly debugging with Firefox DevTools в видео-анонсе.

    Память

    @@ -185,7 +185,7 @@

    Таблицы

    Ссылки на функции необходимы для компиляции в таких языках как C/C++, которые имеют указатели на функции. В родной реализации C/C++, указатель на функцию представлен прямым адресом на код функции в виртуальном адресном пространстве процесса, и потому для ранее упомянутой безопасности, они не могут быть размещены прямо в линейной памяти. Вместо этого ссылки на функции размещаются в таблице, а её индексы, которые являются целыми числами могут быть размещены в линейной памяти и переданы куда угодно.

    -

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

    +

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

    Таблицы могут изменятся с помощью метода Table.prototype.set(), который обновляет одно из значений в таблице, и метода Table.prototype.grow(), который увеличивает количество значений, которое может быть размещено в таблице. Это позволяет этому "непрямо-вызываемому набору функций" изменяться со временем, что необходимо для техник динамического связывания. Изменения немедленно становятся доступными с помощью метода Table.prototype.get() в JavaScript-коде и wasm-модулях.

    @@ -291,7 +291,7 @@

    Множественность

    Резюме

    -

    В этой статье-путеводителе по основам WebAssembly JavaScript API вы включали модули WebAssembly в среду JavaScript, использовали их функции, объекты памяти, таблицы и глобальные переменные. Мы также затронули концепцию множественности.

    +

    В этой статье-путеводителе по основам WebAssembly JavaScript API вы включали модули WebAssembly в среду JavaScript, использовали их функции, объекты памяти, таблицы и глобальные переменные. Мы также затронули концепцию множественности.

    Смотрите также

Specification