JavaScript emscripten ada идея asmjs
Ada/Em — компилятор/интерпретатор на базе
Ada/Ed
Ada/Ed — это компилятор/интерпретатор Ada 83, самый первый, прошедший проверку на соответствие стандарту по тестам Ada Compiler Validation Suite на IBM PC. Так как это интерпретатор, а Ada мыслится как язык, прежде всего компилируемый в машинные коды, да и стандарт хотелось бы не меньше 95–го, то долгое время до него почти никому не было дела, и в июле 2012 его сорцы (на C) выложили в открытый доступ.
Предъистория вопроса: есть у нас доступный в куче браузеров и этим интересный JavaScript, но вот есть у него один большой недостаток: надо время от времени возвращать управление. Программисту, чтобы не свихнуться, проще писать в синхронном стиле, а браузер выполняет только асинхронный код. Это решается часто просто использованием CPS (continuation-passing style). Теоретически можно любую синхронную программу переделать в асинхронную с помощью CPS. Везде, где я смотрел, это сделано руками, как–то все уже попривыкли. Но есть и парсеры/трансляторы, такие, как
Wind.js, которые автоматически могут разрезать синхронную программу по швам и превратить в асинхронную CPS–лапшу.
Далее, вот есть у нас Asm.js, чрезвычайно оптимизируемое подмножество JavaScript. Если браузер поддерживает Asm.js и распознал специально помеченный кусок JavaScript кода как соответствующий всем требованиям модуль Asm.js, то генерируется быстрый машинный код. Однако, при написании программ, транслируемых в быстрый машинный код, есть один недостаток. Да всё тот же. Необходимость время от времени возвращать управление на самый верх, к браузеру. Через стек функций, через обработчики исключений — на самый верх. И тоже есть автоматические способы разпилить программу по швам и превратить в лапшу, но не CPS. Wind.js тут сработает, но требования Asm.js будут нарушены применением CPS, зато для Asm.js есть свой аналог:
asincify. На его странице так и написано:
Другие возможные реализации
Closures (ломают asm.js)
Далее, читаем
сравнение с asincify на странице emterpreter:
ASYNCIFY has a bad worst-case of large code size: If it needs to modify many methods, it can grow code size very significantly (even 10x more was seen).
То есть, подход asyncify может настолько значительно раздувать код, что становится оправданным применение интерпретатора emterpreter.
Далее, читаем статью
Почему мобильные web–приложения медленные. Одна из главных идей — не пользоваться сборщиком мусора, особенно в мобильных приложениях. Применительно к JavaScript это значит — применять Asm.js, а не обычный JavaScript, который безальтернативно со сборщиком мусора.
Вот именно такого сравнения не видел, но, когда смотрю на графики в статье, напрашивается предположение, что код, работающий на интерпретаторе в Asm.js, может работать даже быстрее, чем его CPS–аналог на JavaScript, за счёт того, что не вызывает сборку мусора так часто.
И в этот момент мы вспоминаем, что старый забытый Ada/Ed как раз уже устроен таким способом, который, так уж вышло, наилучший для браузеров. Написан на C, интерпретируемый. Так как в MS-DOS не было потоков операционной системы, Ada/Ed приходится содержать в своём составе многозадачный планировщик. В
#2785610 я всё думал, где бы мне многозадачный планировщик для Asm.js взять. Вот, нашёл!
Так что берём Ada/Ed, компилируем его интерпретатор или даже компилятор emscripten, и вот она — радость! Пишем код для браузера в синхронном стиле, не сходим с ума от CPS–лапши, и с учётом архитектуры браузеров, работает это наилучшим образом, даже на мобильных устройствах. Для полного счастья нам понадобится мост между emterpreter и интерпретатором Ada/Ed. А то, что получилось, так и напрашивается быть названным Ada/Em.