Specification |
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 @@ Выполнен
})
Используя XMLHttpRequest
-XMLHttpRequest
несколько старше, чем Fetch, но всё же может успешно использоваться для получения типизированного массива. Опять же, если предположить, что наш модуль называется simple.wasm
:
+XMLHttpRequest
несколько старше, чем Fetch, но всё же может успешно использоваться для получения типизированного массива. Опять же, если предположить, что наш модуль называется simple.wasm
:
- - Создайте новый экземпляр {{domxref("XMLHttpRequest()")}} и используйте его метод {{domxref("XMLHttpRequest.open","open()")}} для открытия запроса, задав для метода запроса значение
GET
и указав путь к файлу, который мы хотим получить.
- - Ключевой частью этого является установка типа ответа
'arraybuffer'
с помощью свойства {{domxref("XMLHttpRequest.responseType","responseType")}}.
- - Затем отправьте запрос с помощью {{domxref("XMLHttpRequest.send()")}}.
- - Затем мы используем обработчик событий {{domxref("XMLHttpRequest.onload", "onload")}} для вызова функции после завершения загрузки ответа - в этой функции мы получаем буфер массива из {{domxref("XMLHttpRequest.response", "response")}} и затем передайте это в наш метод {{jsxref("WebAssembly.instantiate()")}}, как мы это делали с Fetch.
+ - Создайте новый экземпляр {{domxref("XMLHttpRequest()")}} и используйте его метод {{domxref("XMLHttpRequest.open","open()")}} для открытия запроса, задав для метода запроса значение
GET
и указав путь к файлу, который мы хотим получить.
+ - Ключевой частью этого является установка типа ответа
'arraybuffer'
с помощью свойства {{domxref("XMLHttpRequest.responseType","responseType")}}.
+ - Затем отправьте запрос с помощью {{domxref("XMLHttpRequest.send()")}}.
+ - Затем мы используем обработчик событий {{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 @@ Сборка пакета
- Компилирует ваш Rust-код в WebAssembly.
- Запускает wasm-bindgen
с этим WebAssembly, генерируя JavaScript файл, который оборачивает WebAssembly файл в модуль. который может понять npm.
+ Запускает wasm-bindgen
с этим WebAssembly, генерируя JavaScript файл, который оборачивает WebAssembly файл в модуль. который может понять npm.
- Создаёт папку
pkg
, куда перемещает этот JavaScript файл и ваш код WebAssembly.
- Читает ваш
Cargo.toml
и создаёт эквивалентный package.json
.
- Копирует ваш
README.md
(если есть) в пакет.
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, использовали их функции, объекты памяти, таблицы и глобальные переменные. Мы также затронули концепцию множественности.
Смотрите также