Suicide
28.03.2019, 19:19
Разработчики Mozilla представили (https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/) проект WASI (https://wasi.dev/) (WebAssembly System Interface), в рамках которого ведётся работа по определению программных интерфейсов, которые можно использовать для организации взаимодействия приложений, поставляемых в формате WebAssembly (http://webassembly.org/), с операционной системой. Целью проекта является предоставление API, расширяющего область использования WebAssembly и позволяющего создавать на базе данной технологии обычные программы, выполняемые вне браузера, переносимые на любые платформы и демонстрирующие высокий уровень безопасности.
WASI даёт возможность (https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-overview.md) из окружения для выполнения WebAssembly получить доступ к предоставляемым операционной системой функциям, таким как файлы, файловая система, сетевые сокеты, таймеры и генераторы случайных чисел. API WASI изначально развивается как не привязанный к браузерам и независящий от JavaScript/Web API, но при этом обеспечивающий должный уровень изоляции от основной системы (приложения запускаются в sandbox) и позволяющий явно определять предоставляемые приложению полномочия в стиле CloudABI (https://cloudabi.org/) и Capsicum (https://www.opennet.ru/opennews/art.shtml?num=40110).
В WASI применяется модель безопасности на основе управления возможностями (https://en.wikipedia.org/wiki/Capability-based_security), в рамках которой программа может выполнять только заведомо разрешённые действия. По аналогии с тем, как WebAssembly ограничивает доступ на уровне импорта функций, в WASI осуществляется контроль доступа к системным возможностям. Файлы, каталоги, сокеты и другие ресурсы ассоциируются со специальным типом файловых дескрипторов (capability), а для выполнения действия с каждым из ресурсов приложению должны быть даны полномочия. Полномочия обрабатываются иерархически, т.е. предоставив доступ к каталогу, автоматически открывается и доступ ко всем файлам в нём.
Так как WebAssembly является платформонезависимым вариантом языка Ассемблер, благодаря применению JIT можно добиться уровня производительности близкого к нативному коду, сохранив при этом возможность выполнения на различных аппаратных платформах и операционных системах. В настоящее время проектом предоставляется модуль wasi-core с реализацией базовых POSIX API (файлы, сокеты и т.п.), в котором пока отсутствует поддержка блокировок и асинхронного ввода/вывода. В дальнейшем планируется создание модулей с реализацией API для выполнения криптографических операций, работы с 3D-графикой, взаимодействия с датчиками, операциями с процессами (пока не поддерживается вызов fork) и обработки мультимедийных данных.
В настоящее время уже доступны для тестирования прототипы следующих компонентов:
wasmtime (https://github.com/CraneStation/wasmtime/) - runtime для выполнения WebAssembly-приложений с расширениями WASI как обычных обособленных приложений. Поддерживается как запуск байткода WebAssembly при помощи специальной утилиты командной строки, так и компоновка готовых исполняемых файлов (wasmtime встраивается в приложение как библиотека). Для достижения должного уровня производительности применяется JIT-компилятор на базе генератора кода cranelift (https://github.com/CraneStation/cranelift);
Lucet (https://github.com/fastly/lucet/) - другой вариант runtime от проекта Fastly (код планируется опубликовать сегодня или завтра);
WASI SDK (https://github.com/CraneStation/wasi-sdk) - инструментарий для компиляции приложений C/C++ в формат WebAssembly, использующий Clang 8.0 (https://www.opennet.ru/opennews/art.shtml?num=50360);
Сборочная цель (https://github.com/alexcrichton/rust/tree/wasi) с поддержкой WASI для языка Rust, позволяющая компилировать код Rust в WebAssembly. В начале апреля поддержку WASI планируется интегрировать в основную кодовую базу и начать тестирование в ночных сборках;
wasi-sysroot (https://github.com/CraneStation/wasi-sysroot/) - реализация стандартной библиотеки libc для WASI, основанная на коде musl (http://www.musl-libc.org/), а также runtime-прослойка для трансляции предоставляемых библиотекой функций в системные вызовы различных операционных систем для достижения возможности выполнения одного WASI-приложения в разных ОС. https://www.opennet.ru/opennews/pics_base/0_1553766424.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-01-portability-1.png)https://www.opennet.ru/opennews/pics_base/0_1553766401.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-02-portability-1.png)
Проектом также развивается JavaScript-библиотека polyfill (https://github.com/CraneStation/wasmtime-wasi/tree/wasi/lib/wasi/sandboxed-system-primitives/polyfill) с реализацией WASI для выполнения приложений внутри браузера (демонстрация (https://wasi.dev/polyfill/)), позволяющая применить к выполняемому в браузере коду модель разграничения доступа на основе "capabilities". Из планов упоминается создание на базе WASI системы модулей для интеграции в приложения изолированных плагинов с дополнительной функциональностью, поставляемой в формате WebAssembly.
https://www.opennet.ru/opennews/pics_base/0_1553764118.png (https://raw.githubusercontent.com/CraneStation/wasmtime/master/docs/wasi-software-architecture.png) Напомним, WebAssembly во многом напоминает Asm.js, но отличается (https://www.opennet.ru/opennews/art.shtml?num=46117) тем, что является бинарным форматом, не завязанным на JavaScript и позволяющим выполнять в браузере низкоуровневый промежуточный код, скомпилированный из различных языков программирования. Среди основных задач WebAssembly выделяется обеспечение переносимости, предсказуемость поведения и идентичности выполнения кода на разных платформах. По сравнению с JavaScript использование WebAssembly также позволяет существенно сократить размер приложений, благодаря компактному промежуточному коду, и увеличить скорость декодирования. В WebAssembly не требуется применение сборщика мусора, так как применяется явное управление памятью.
28.03.2019
http://www.opennet.ru/opennews/art.shtml?num=50406
WASI даёт возможность (https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-overview.md) из окружения для выполнения WebAssembly получить доступ к предоставляемым операционной системой функциям, таким как файлы, файловая система, сетевые сокеты, таймеры и генераторы случайных чисел. API WASI изначально развивается как не привязанный к браузерам и независящий от JavaScript/Web API, но при этом обеспечивающий должный уровень изоляции от основной системы (приложения запускаются в sandbox) и позволяющий явно определять предоставляемые приложению полномочия в стиле CloudABI (https://cloudabi.org/) и Capsicum (https://www.opennet.ru/opennews/art.shtml?num=40110).
В WASI применяется модель безопасности на основе управления возможностями (https://en.wikipedia.org/wiki/Capability-based_security), в рамках которой программа может выполнять только заведомо разрешённые действия. По аналогии с тем, как WebAssembly ограничивает доступ на уровне импорта функций, в WASI осуществляется контроль доступа к системным возможностям. Файлы, каталоги, сокеты и другие ресурсы ассоциируются со специальным типом файловых дескрипторов (capability), а для выполнения действия с каждым из ресурсов приложению должны быть даны полномочия. Полномочия обрабатываются иерархически, т.е. предоставив доступ к каталогу, автоматически открывается и доступ ко всем файлам в нём.
Так как WebAssembly является платформонезависимым вариантом языка Ассемблер, благодаря применению JIT можно добиться уровня производительности близкого к нативному коду, сохранив при этом возможность выполнения на различных аппаратных платформах и операционных системах. В настоящее время проектом предоставляется модуль wasi-core с реализацией базовых POSIX API (файлы, сокеты и т.п.), в котором пока отсутствует поддержка блокировок и асинхронного ввода/вывода. В дальнейшем планируется создание модулей с реализацией API для выполнения криптографических операций, работы с 3D-графикой, взаимодействия с датчиками, операциями с процессами (пока не поддерживается вызов fork) и обработки мультимедийных данных.
В настоящее время уже доступны для тестирования прототипы следующих компонентов:
wasmtime (https://github.com/CraneStation/wasmtime/) - runtime для выполнения WebAssembly-приложений с расширениями WASI как обычных обособленных приложений. Поддерживается как запуск байткода WebAssembly при помощи специальной утилиты командной строки, так и компоновка готовых исполняемых файлов (wasmtime встраивается в приложение как библиотека). Для достижения должного уровня производительности применяется JIT-компилятор на базе генератора кода cranelift (https://github.com/CraneStation/cranelift);
Lucet (https://github.com/fastly/lucet/) - другой вариант runtime от проекта Fastly (код планируется опубликовать сегодня или завтра);
WASI SDK (https://github.com/CraneStation/wasi-sdk) - инструментарий для компиляции приложений C/C++ в формат WebAssembly, использующий Clang 8.0 (https://www.opennet.ru/opennews/art.shtml?num=50360);
Сборочная цель (https://github.com/alexcrichton/rust/tree/wasi) с поддержкой WASI для языка Rust, позволяющая компилировать код Rust в WebAssembly. В начале апреля поддержку WASI планируется интегрировать в основную кодовую базу и начать тестирование в ночных сборках;
wasi-sysroot (https://github.com/CraneStation/wasi-sysroot/) - реализация стандартной библиотеки libc для WASI, основанная на коде musl (http://www.musl-libc.org/), а также runtime-прослойка для трансляции предоставляемых библиотекой функций в системные вызовы различных операционных систем для достижения возможности выполнения одного WASI-приложения в разных ОС. https://www.opennet.ru/opennews/pics_base/0_1553766424.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-01-portability-1.png)https://www.opennet.ru/opennews/pics_base/0_1553766401.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-02-portability-1.png)
Проектом также развивается JavaScript-библиотека polyfill (https://github.com/CraneStation/wasmtime-wasi/tree/wasi/lib/wasi/sandboxed-system-primitives/polyfill) с реализацией WASI для выполнения приложений внутри браузера (демонстрация (https://wasi.dev/polyfill/)), позволяющая применить к выполняемому в браузере коду модель разграничения доступа на основе "capabilities". Из планов упоминается создание на базе WASI системы модулей для интеграции в приложения изолированных плагинов с дополнительной функциональностью, поставляемой в формате WebAssembly.
https://www.opennet.ru/opennews/pics_base/0_1553764118.png (https://raw.githubusercontent.com/CraneStation/wasmtime/master/docs/wasi-software-architecture.png) Напомним, WebAssembly во многом напоминает Asm.js, но отличается (https://www.opennet.ru/opennews/art.shtml?num=46117) тем, что является бинарным форматом, не завязанным на JavaScript и позволяющим выполнять в браузере низкоуровневый промежуточный код, скомпилированный из различных языков программирования. Среди основных задач WebAssembly выделяется обеспечение переносимости, предсказуемость поведения и идентичности выполнения кода на разных платформах. По сравнению с JavaScript использование WebAssembly также позволяет существенно сократить размер приложений, благодаря компактному промежуточному коду, и увеличить скорость декодирования. В WebAssembly не требуется применение сборщика мусора, так как применяется явное управление памятью.
28.03.2019
http://www.opennet.ru/opennews/art.shtml?num=50406