Ответ на вопрос @ crystal-miller о возрождении этого вопроса: я не знаю ни одного PHP-порта для NaCl, но существует множество портов для других языков, поэтому следующая информация должна указать вам верное направление, если вы хотите порт PHP (или любой другой язык) на NaCl.
Команда NaCl хранит список проверенных регрессией портов в naclports . Все они достаточно современны, иногда содержат небольшой патч, примененный к вышестоящему проекту (хотя команда пытается передать эти патчи вверх по течению), и имеют правильное значение make
для построения для различных целей NaCl и PNaCl (portable, x86) -32, x86-64, ARM, статическое связывание, динамическое связывание, ...).
Вы можете начать с naclports , чтобы увидеть, есть ли ваш проект там. Если у вас работает PHP, я предлагаю связаться со списком рассылки и внести ваши изменения.
Следующий хитрый момент - хотите ли вы запустить язык:
- В браузере Chrome, в открытом Интернете.
- Как расширение Chrome или app .
- На машине, например сервер.
Основной подход к компиляции будет таким же, но то, как приложение взаимодействует с внешним миром, будет совершенно другим: песочница предоставляет механизмы связи для взаимодействия с процессами вне песочницы.
На стороне компиляции вы можете выбрать между таргетингом на сам NaCl (который зависит от архитектуры: x86-32 / x86-64 / ARM / MIPS) или PNaCl (независимость от архитектуры). Оба являются независимыми от ОС и могут выполняться как расширение / приложение или на сервере, но только PNaCl может выполняться в открытой сети. Набор инструментов NaCl основан на GCC (на момент написания 4.4 x86, 4.9 для ARM), тогда как набор инструментов PNaCl основан на LLVM 3.5 (который скоро станет верхушкой дерева). Цепочка инструментов PNaCl также может быть использована для нацеливания на NaCl, на данный момент это несколько сложно, но скоро станет намного лучше с nacl-clang . Набор инструментов NaCl поддерживает статическое и динамическое связывание (посредством newlib или glibc), а также обработку исключений C ++ с нулевой стоимостью, в то время как набор инструментов PNaCl в настоящее время поддерживает только статическое связывание ( в процессе добавления динамического связывания ) и SJLJ обработка исключений на основе (нулевая стоимость, чтобы прибыть позже).
Это звучит сложно, но в целом это всего лишь компилятор с большим количеством ручек: для распространения в сети требуется скорость и переносимость.
Следует помнить одну вещь: NaCl поддерживает ограниченную динамическую генерацию кода (например, существует моно-порт , использующий JIT-компиляцию), но PNaCl в настоящее время не поддерживает. Это означает, что переводчики намного проще переносить (даже V8 работает в NaCl таким образом). Некоторые языки, такие как Halide, Rust или Julia, генерируют битовый код LLVM, и этот битовый код можно передать в PNaCl, но на момент написания этого документа иногда бывает сложно, следите за обновлениями этого списка рассылки (некоторые люди заставили их работать). Однако можно динамически генерировать файлы PNaCl .pexe
, сохранять их в локальной файловой системе и выполнять их, а с помощью динамического связывания вы сможете сделать то же самое с .pso
.
При выполнении в составе Chrome (открытый веб-сайт, расширение или приложение) есть API для связи с остальной частью Chrome . Некоторые из API-интерфейсов требуют привилегий, некоторые ограничены расширениями / приложениями (потому что они не соответствуют модели Интернета), а некоторые требуют, чтобы пользователь зарегистрировался.
В качестве части Chrome вы также можете использовать nacl_io , который эмулирует еще большее поведение POSIX и позволяет вам, например, смонтировать файловую систему HTML5, а затем просто использовать обычные API POSIX.
При работе в качестве сервера все становится сложнее: вы должны выяснить, как взаимодействовать с внешним миром, а NaCl не имеет API по умолчанию. Это возможно, однако: Google использует NaCl для внутреннего использования, и есть проекты, такие как ZeroVM и Ripple Lab Codius Smart Contracts , которые делают это. В этих обстоятельствах вы можете использовать NaCl sel_ldr
или sel_ldr_seccomp
для выполнения файлов NaCl .nexe
(версия seccomp
устанавливает изолированную программную среду на основе seccomp вокруг обычной изолированной программной среды NaCl для фильтрации syscall, я рекомендую занимаюсь этим тоже). Собственные тестовые наборы NaCl и PNaCl используют sel_ldr
для проведения регрессионного тестирования.
Имея это в виду, я думаю, что у вас есть указатели на всю информацию, необходимую для начала работы в любом направлении!