1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
---
title: WebAssembly
slug: Web/JavaScript/Reference/Global_Objects/WebAssembly
translation_of: Web/JavaScript/Reference/Global_Objects/WebAssembly
---
<div>{{JSRef}}{{SeeCompatTable}}</div>
<p>Объект JavaScript <strong><code>WebAssembly</code></strong> действует как пространство имён для всего <a href="/en-US/docs/WebAssembly">WebAssembly</a>-связанной функциональности.</p>
<p>В отличие от большинства других глобальных объектов, <code>WebAssembly</code> не является конструктором (это не объект функции). Можно сравнить его с {{jsxref("Math")}}, который так же является пространством имён констант и функций, или {{jsxref("Intl")}}, который является пространством имён для конструкторов интернационализации и других языково-чувствительных функций.</p>
<h2 id="Описание">Описание</h2>
<p>Основное использование <code>WebAssembly</code> следующее:</p>
<ul>
<li>Загрузка кода WebAssembly, с помощью функции {{jsxref("WebAssembly.instantiate()")}}.</li>
<li>Создание новой памяти и таблицы экземпляров с помощью конструкторов {{jsxref("WebAssembly.Memory()")}}/{{jsxref("WebAssembly.Table()")}}.</li>
<li>Обеспечение возможности управлять ошибками, которые появляются в WebAssembly с помощью конструкторов {{jsxref("WebAssembly.CompileError()")}}/{{jsxref("WebAssembly.LinkError()")}}/{{jsxref("WebAssembly.RuntimeError()")}}.</li>
</ul>
<h2 id="Методы">Методы</h2>
<dl>
<dt>{{jsxref("WebAssembly.instantiate()")}}</dt>
<dd>Основное API для компиляции и создания экземпляра кода WebAssembly, возвращающее <code>Module</code> и его первый <code>Instance</code>.</dd>
<dt>{{jsxref("WebAssembly.compile()")}}</dt>
<dd>Компилирует {{jsxref("WebAssembly.Module")}} из бинарного кода WebAssembly, оставляя создание экземпляра отдельным шагом.</dd>
<dt>{{jsxref("WebAssembly.validate()")}}</dt>
<dd>Проверяет представленный типизированный массив бинарного кода WebAssembly, возвращая в зависимости от того были ли байты кода WebAssembly валидны (<code>true</code>) или (<code>false</code>).</dd>
</dl>
<h2 id="Конструкторы">Конструкторы</h2>
<dl>
<dt>{{jsxref("WebAssembly.Module()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>Module</code>.</dd>
<dt>{{jsxref("WebAssembly.Instance()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>Instance</code>.</dd>
<dt>{{jsxref("WebAssembly.Memory()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>Memory</code>.</dd>
<dt>{{jsxref("WebAssembly.Table()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>Table</code>.</dd>
<dt>{{jsxref("WebAssembly.CompileError()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>CompileError</code>.</dd>
<dt>{{jsxref("WebAssembly.LinkError()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>LinkError</code>.</dd>
<dt>{{jsxref("WebAssembly.RuntimeError()")}}</dt>
<dd>Создаёт новый объект WebAssembly <code>RuntimeError</code>.</dd>
</dl>
<h2 id="Примеры">Примеры</h2>
<p>После загрузки некоторого байт-кода WebAssembly с помощью fetch, мы компилируем и создаём экземпляр модуля с помощью функции {{jsxref("WebAssembly.instantiate()")}}, импортируя функции JavaScript в WebAssembly Module в процессе. Этот промис результирует в объект (<code>result</code>), содержащий скомпилированные <code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module">Module</a></code> и объекты <code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance">Instance</a></code>. Мы можем вызвать <a href="/en-US/docs/WebAssembly/Exported_functions">Exported WebAssembly function</a>, которая была экспортирована через <code>Instance</code>.</p>
<pre class="brush: js">var importObject = {
imports: {
imported_func: function(arg) {
console.log(arg);
}
}
};
fetch('simple.wasm').then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(result =>
result.instance.exports.exported_func()
);</pre>
<div class="note">
<p><strong>Note</strong>: Смотрите пример <a href="https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/index.html">index.html</a> на GitHub (<a href="https://mdn.github.io/webassembly-examples/js-api-examples/">view it live also</a>), который использует наши <code><a href="https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js#L1">fetchAndInstantiate()</a></code> библиотечные функции.</p>
</div>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Спецификация</th>
<th scope="col">Статус</th>
<th scope="col">Коммент</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('WebAssembly JS', '#the-webassembly-object', 'WebAssembly')}}</td>
<td>{{Spec2('WebAssembly JS')}}</td>
<td>Первоначальное определение проекта.</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">Поддержка браузерами</h2>
<div>{{CompatibilityTable}}</div>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Edge</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari (WebKit)</th>
</tr>
<tr>
<td>Basic support</td>
<td>57</td>
<td>15<sup>[2]</sup></td>
<td>{{CompatGeckoDesktop(52)}}<sup>[1]</sup></td>
<td>{{CompatNo}}</td>
<td>44</td>
<td>11</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome for Android</th>
<th>Android Webview</th>
<th>Edge Mobile</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Basic support</td>
<td>57</td>
<td>57</td>
<td>{{CompatNo}}</td>
<td>{{CompatGeckoMobile(52)}}<sup>[1]</sup></td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
<td>11</td>
</tr>
</tbody>
</table>
</div>
<p>[1] WebAssembly включён в Firefox 52+, хотя не валиден в <a href="https://www.mozilla.org/en-US/firefox/organizations/">Firefox 52 Extended Support Release</a> (ESR.)</p>
<p>[2] В настоящее время поддерживается флаг «Экспериментальные функции JavaScript». Для более подробной информации смотрите <a href="https://blogs.windows.com/msedgedev/2017/04/20/improved-javascript-performance-webassembly-shared-memory/">этот blog post</a>.</p>
<h2 id="Смотрите_также">Смотрите также</h2>
<ul>
<li><a href="/en-US/docs/WebAssembly">WebAssembly</a> обзорная страница</li>
<li><a href="/en-US/docs/WebAssembly/Concepts">WebAssembly концепции</a></li>
<li><a href="/en-US/docs/WebAssembly/Using_the_JavaScript_API">Использование WebAssembly JavaScript API</a></li>
</ul>
|