diff options
author | Yana Klose-Ivanova <75987641+captainspring@users.noreply.github.com> | 2021-04-06 01:25:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-06 05:25:36 +0700 |
commit | 6b6d1022a4bbd2c8ce809e85e12dbcb6cc9ee2c2 (patch) | |
tree | ab0f52853ecc83d089e360373d1c4e4f9992517c /files/ru/web/javascript/reference/global_objects | |
parent | 64f66071f5e7234a297e50e3d68d28b8f10b49a2 (diff) | |
download | translated-content-6b6d1022a4bbd2c8ce809e85e12dbcb6cc9ee2c2.tar.gz translated-content-6b6d1022a4bbd2c8ce809e85e12dbcb6cc9ee2c2.tar.bz2 translated-content-6b6d1022a4bbd2c8ce809e85e12dbcb6cc9ee2c2.zip |
Update SharedArrayBuffer ru-translation (#375)
* Update translation
Related to #329
* Fix translation after review
Diffstat (limited to 'files/ru/web/javascript/reference/global_objects')
-rw-r--r-- | files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html | 227 |
1 files changed, 83 insertions, 144 deletions
diff --git a/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html b/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html index f35e32c051..77c19a0897 100644 --- a/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html +++ b/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html @@ -2,54 +2,71 @@ title: SharedArrayBuffer slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer +tags: + - Класс + - JavaScript + - Разделяемая память + - SharedArrayBuffer + - TypedArrays --- <div>{{JSRef}}</div> -<p>Объект <strong><code>SharedArrayBuffer</code></strong> используется для создания разделённого буфера фиксированной длины для хранения примитивных бинарных данных, подобно объекту {{jsxref("ArrayBuffer")}}, но могут быть использованы для создания обзора на разделённую память. В отличие от <code>ArrayBuffer</code>, <code>SharedArrayBuffer</code> не может быть отсоединён.</p> - -<h2 id="Синтаксис">Синтаксис</h2> - -<pre class="syntaxbox">new SharedArrayBuffer(length) -</pre> - -<h3 id="Параметры">Параметры</h3> - -<dl> - <dt><code>length</code></dt> - <dd>Размер, в байтах, для создания буферного массива.</dd> -</dl> - -<h3 id="Возвращаемое_значение">Возвращаемое значение</h3> - -<p>Новый объект <code>SharedArrayBuffer</code> указанной длины. Его содержимое после инициализации равно 0.</p> +<p>Объект <strong><code>SharedArrayBuffer</code></strong> подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличие <code>SharedArrayBuffer</code> от <code>ArrayBuffer</code> заключается в том, что он используется для создания разделяемой области памяти. В отличие от <code>ArrayBuffer</code> <code>SharedArrayBuffer</code> не может быть откреплён от соответствующей ему области памяти.</p> <h2 id="Описание">Описание</h2> -<h3 id="Распределение_и_разделение_память">Распределение и разделение память</h3> +<h3 id="Выделение_и_совместное_использование_памяти">Выделение и совместное использование памяти</h3> -<p>Для разделения памяти с помощью объекта {{jsxref("SharedArrayBuffer")}} между одним агентом в кластере и другим (агент может быть как основной программой web-страницы, так и одним из web-workers), используются <code><a href="/en-US/docs/Web/API/Worker/postMessage">postMessage</a></code> и <a href="/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm">structured cloning</a>.</p> +<p>Для совместного использования памяти с помощью объекта {{jsxref("SharedArrayBuffer")}} между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используются <code><a href="/ru/docs/Web/API/Worker/postMessage">postMessage</a></code> и <a href="/ru/docs/Web/API/Web_Workers_API/Structured_clone_algorithm">алгоритм структурированного клонирования</a>.</p> -<p>Алгоритм структурированного клонирования принимает <code>SharedArrayBuffers</code> и <code>TypedArrays,</code> отображённый в <code>SharedArrayBuffers</code>. В обоих случаях, объект <code>SharedArrayBuffer</code> передаётся получателю, результируя в новый, приватный объект SharedArrayBuffer внутри агента-получателя (так же как для {{jsxref("ArrayBuffer")}}). Однако, блок общих данных, на который ссылаются оба объекта <code>SharedArrayBuffer, </code>это один и тот же блок данных, и сторонние эффекты в блоке в одном из агентов в итоге станут заметны в другом агенте.</p> +<p>Алгоритм структурированного клонирования принимает <code>SharedArrayBuffers</code> и <code>TypedArrays</code>, отображённый в <code>SharedArrayBuffers</code>. В обоих случаях объект <code>SharedArrayBuffer</code> передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как для {{jsxref("ArrayBuffer")}}). Оба объекта <code>SharedArrayBuffer</code> ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.</p> <pre class="brush: js">var sab = new SharedArrayBuffer(1024); worker.postMessage(sab); </pre> -<h3 id="Обновление_и_синхронизация_разделённой_памяти_с_помощью_Атомарных_операций">Обновление и синхронизация разделённой памяти с помощью Атомарных операций</h3> +<h3 id="Обновление_и_синхронизация_разделяемой_памяти_с_помощью_атомарных_операций">Обновление и синхронизация разделяемой памяти с помощью атомарных операций</h3> -<p>Разделённая память может быть создана и изменена одновременно в workers или основном потоке. В зависимости от системы (ЦПУ, ОС, браузер) может уйти время пока изменения будут распространены по всем контекстам. Для синхронизации необходимы {{jsxref("Атомарные", "атомарные", "", 1)}} операции .</p> +<p>Разделяемую память можно создавать и изменять одновременно в воркерах или основном потоке. В зависимости от системы (ЦПУ, ОС, браузера), распространение изменений по всем контекстам может занять некоторое время. Для синхронизации необходимы {{jsxref("Атомарные", "атомарные", "", 1)}} операции .</p> <h3 id="API_принимающие_объекты_SharedArrayBuffer">API, принимающие объекты <code>SharedArrayBuffer</code></h3> <ul> - <li>{{domxref("WebGLRenderingContext.bufferData()")}}</li> - <li>{{domxref("WebGLRenderingContext.bufferSubData()")}}</li> - <li>{{domxref("WebGL2RenderingContext.getBufferSubData()")}}</li> + <li><a href="/en-US/docs/Web/API/WebGLRenderingContext/bufferData" title="Метод WebGLRenderingContext.bufferData() WebGL API инициализирует и создает хранилище данных буферного объекта."><code>WebGLRenderingContext.bufferData()</code></a></li> + <li><a href="/en-US/docs/Web/API/WebGLRenderingContext/bufferSubData" title="Метод WebGLRenderingContext.bufferSubData() WebGL API обновляет подмножество хранилища данных буферного объекта."><code>WebGLRenderingContext.bufferSubData()</code></a></li> + <li><a href="/en-US/docs/Web/API/WebGL2RenderingContext/getBufferSubData" title="Метод WebGL2RenderingContext.getBufferSubData() WebGL 2 API считывает данные из привязанной точки буфера и записывает их в ArrayBuffer или SharedArrayBuffer."><code>WebGL2RenderingContext.getBufferSubData()</code></a></li> </ul> -<h3 id="Конструкции_требуют_оператор_new">Конструкции требуют оператор <code>new</code></h3> +<h3 id="Требования_безопасности">Требования безопасности</h3> + +<p>Разделяемая память и таймеры высокого разрешения были <a href="https://blog.mozilla.org/security/2018/01/03/mitigations-landing-new-class-timing-attack/">отключены в начале 2018 года</a> из-за атаки <a href="https://ru.wikipedia.org/wiki/Spectre_(%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C)">Spectre</a>. В 2020 году был стандартизирован новый, безопасный подход, чтобы включить разделяемую память обратно. При следовании следующим мерам безопасности <code><a href="/ru/docs/Web/API/Window/postMessage">postMessage()</a> не будет выкидывать исключение для <code>SharedArrayBuffer</code>, и разделяемая память будет доступна в разных потоках.</p> -<p>Конструкторы <code>SharedArrayBuffer</code> необходимо вызывать с помощью оператора {{jsxref("Operators/new", "new")}}. Вызов конструктора <code>SharedArrayBuffer</code> как функции без указания <code>new</code>, вызовет ошибку {{jsxref("TypeError")}}.</p> +<p>Основное требование — ваш документ должен находиться в <a href="/en-US/docs/Web/Security/Secure_Contexts">безопасном контексте</a></p> + +<p>Для документов верхнего уровня нужно устновить два заголовка, чтобы изолировать ваш сайт от других источников (cross-origin):</p> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy"><code>Cross-Origin-Opener-Policy</code></a> со значением <code>same-origin</code> (защищает ваш источник от атаки)</li> + <li><a href="/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy"><code>Cross-Origin-Embedder-Policy</code></a> со значением <code>require-corp</code> (защищает жертв от вашего источника)</li> +</ul> + +<pre class="brush: plain">Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +</pre> + +<p>Чтобы проверить, что изоляция от других источников прошла успешно, протестируйте свойство <code><a href="/en-US/docs/Web/API/WindowOrWorkerGlobalScope/crossOriginIsolated">crossOriginIsolated</a></code>, доступное для контекстов окна и воркера:</p> + +<pre class="brush: js">if (crossOriginIsolated) { + // Начни работу с SharedArrayBuffer +} else { + // Сделай что-то другое +}</pre> + +<p>Ознакомьтесь с <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/Planned_changes">планируемыми изменениями разделяемой памяти</a>, которые начинают внедряться в браузерах (например, в Firefox 79).</p> + +<h3 id="Всегда_используйте_оператор_new_для_создания_SharedArrayBuffer">Всегда используйте оператор new для создания SharedArrayBuffer</h3> + +<p>Конструкторы <code>SharedArrayBuffer</code> необходимо вызывать с помощью оператора {{jsxref("Operators/new", "new")}}. Вызов конструктора <code>SharedArrayBuffer</code> как функции без указания <code>new</code> вызовет ошибку {{jsxref("TypeError")}}.</p> <pre class="brush: js example-bad">var sab = SharedArrayBuffer(1024); // TypeError: вызов встроенного конструктора SharedArrayBuffer @@ -57,153 +74,75 @@ worker.postMessage(sab); <pre class="brush: js example-good">var sab = new SharedArrayBuffer(1024);</pre> -<h2 id="Свойства">Свойства</h2> +<h2 id="Конструктор">Конструктор</h2> <dl> - <dt><code>SharedArrayBuffer.length</code></dt> - <dd>Длина конструктора <code>SharedArrayBuffer,</code> чьё значение равно 1.</dd> - <dt>{{jsxref("SharedArrayBuffer.prototype")}}</dt> - <dd>Позволяет дополнительные свойства для всех объектов <code>SharedArrayBuffer</code>.</dd> + <dt><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/SharedArrayBuffer"><code>SharedArrayBuffer()</code></a></dt> + <dd>Создаёт новый объект <code>SharedArrayBuffer</code>.</dd> </dl> -<h2 id="SharedArrayBuffer_объект_prototype"><code>SharedArrayBuffer</code> объект prototype</h2> +<h3 id="Свойства">Свойства</h3> -<p>Все экземпляры <code>SharedArrayBuffer</code> наследуются от {{jsxref("SharedArrayBuffer.prototype")}}.</p> +<dl> + <dt>{{jsxref("SharedArrayBuffer.prototype.byteLength")}}</dt> + <dd>Размер буферного массива в байтах. Задаётся при создании массива и не может быть изменён. <strong>Только для чтения.</strong></dd> +</dl> -<h3 id="Свойства_2">Свойства</h3> +<h2 id="Методы">Методы</h2> -<p>{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Properties')}}</p> +<dl> + <dt>{{jsxref("SharedArrayBuffer.slice", "SharedArrayBuffer.prototype.slice(begin, end)")}}</dt> + <dd>Возвращает новый <code>SharedArrayBuffer</code>, чьё содержимое — копия байтов изначального <code>SharedArrayBuffer</code> с <code>begin</code> (начала) включительно до <code>end</code> (конца), но не включая его. Если параметры <code>begin</code> или <code>end</code> отрицательны, метод обращается к индексу массива, начиная с конца, а не с начала.</dd> +</dl> -<h3 id="Методы">Методы</h3> +<h2 id="Примеры">Примеры</h2> -<p>{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Methods')}}</p> +<h3 id="Создание_нового_SharedArrayBuffer">Создание нового SharedArrayBuffer</h3> -<h2 id="Спецификации">Спецификации</h2> +<pre class="brush: js">var sab = new SharedArrayBuffer(1024);</pre> -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td>Initial definition in ES2017.</td> - </tr> - <tr> - <td>{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td> - <td>{{Spec2('ES8')}}</td> - <td> </td> - </tr> - </tbody> -</table> +<h3 id="Нарезание_SharedArrayBuffer">Нарезание SharedArrayBuffer</h3> -<h2 id="Поддержка_браузерами">Поддержка браузерами</h2> +<pre class="brush: js">sab.slice(); // SharedArrayBuffer { byteLength: 1024 } +sab.slice(2); // SharedArrayBuffer { byteLength: 1022 } +sab.slice(-2); // SharedArrayBuffer { byteLength: 2 } +sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }</pre> -<p>{{CompatibilityTable}}</p> +<h3 id="Использование_в_буфере_WebGL">Использование в буфере WebGL</h3> -<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</th> - </tr> - <tr> - <td>Basic support</td> - <td>{{CompatNo}} [2]</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoDesktop("55")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> - </tr> - <tr> - <td><code>slice()</code></td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoDesktop("52")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> - </tr> - <tr> - <td>SAB in DataView</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoDesktop("53")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> - </tr> - </tbody> -</table> -</div> +<pre class="brush: js">const canvas = document.querySelector('canvas'); +const gl = canvas.getContext('webgl'); +const buffer = gl.createBuffer(); +gl.bindBuffer(gl.ARRAY_BUFFER, buffer); +gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);</pre> + +<h2 id="Спецификации">Спецификации</h2> -<div id="compat-mobile"> -<table class="compat-table"> +<table class="standard-table"> <tbody> <tr> - <th>Feature</th> - <th>Android</th> - <th>Chrome for Android</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>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoMobile("55")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> + <th scope="col">Спецификация</th> </tr> <tr> - <td><code>slice()</code></td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoMobile("52")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> - </tr> - <tr> - <td>SAB in DataView</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatGeckoMobile("53")}} [1]</td> - <td>{{CompatNo}}</td> - <td>{{CompatNo}}</td> - <td>{{CompatSafari("10.1")}}</td> + <td>{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td> </tr> </tbody> </table> -</div> -<p>[1] Enabled by default in Firefox 55. In Firefox version 46 until version 54, this feature is disabled by a preference setting (in about:config, set <code>javascript.options.shared_memory</code> to <code>true</code>). </p> +<h2 id="Поддержка_браузерами">Поддержка браузерами</h2> -<p>[2] The implementation is under development and needs these runtime flags: <code>--js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer</code></p> +<p>{{Compat("javascript.builtins.SharedArrayBuffer")}}</p> <h2 id="Смотрите_также">Смотрите также</h2> <ul> <li>{{jsxref("Atomics")}}</li> <li>{{jsxref("ArrayBuffer")}}</li> - <li><a href="/en-US/docs/Web/JavaScript/Typed_arrays">JavaScript typed arrays</a></li> - <li><a href="/en-US/docs/Web/API/Web_Workers_API">Web Workers</a></li> - <li><a href="https://github.com/lars-t-hansen/parlib-simple">parlib-simple </a>– a simple library providing synchronization and work distribution abstractions.</li> - <li><a href="https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md">Shared Memory – a brief tutorial</a></li> + <li><a href="/ru/docs/Web/JavaScript/Typed_arrays">Типизированные массивы JavaScript</a></li> + <li><a href="/ru/docs/Web/API/Web_Workers_API">Веб-воркеры</a></li> + <li><a href="https://github.com/lars-t-hansen/parlib-simple">parlib-simple</a> — простая библиотека, предоставляющая синхронизацию и абстракции для распределённых работ.</li> + <li><a href="https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md">Разделяемая память — краткая инструкция</a></li> <li> - <p><a href="https://hacks.mozilla.org/2016/05/a-taste-of-javascripts-new-parallel-primitives/">A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks</a></p> + <p><a href="https://hacks.mozilla.org/2016/05/a-taste-of-javascripts-new-parallel-primitives/">Немного о новых примитивах JavaScript для параллелизации работ – Mozilla Hacks</a></p> </li> </ul> |