Проект Emscripten (http://emscripten.org/), в рамках которого развивается компилятор, способный преобразовать биткод LLVM (http://llvm.org/) в представление на языке JavaScript, подвергся (http://mozakai.blogspot.ru/2012/11/emscripten-compiler-upgra...) значительной архитектурной переработке, что позволило обеспечить возможность собственной пересборки и заметно подняло производительность как самого компилятора, так и генерируемого им JavaScript-кода. Возможность пересобрать самого себя является важной ступенью в развитии компиляторов, демонстрирующую его зрелость и функциональность.
Не менее впечатляет работа по повышению производительности. В частности, удалось реализовать распараллеливание выполнения оптимизатора, что позволило добиться практически линейного роста производительности при увеличении числа процессорных ядер. Дополнительно проведена работа и по добавлении паралеллизации работы компилятора - в коде преобразования LLVM IR в JavaScript обеспечена возможность распараллеливания выполнения фазы обработки функций, которая занимает 95% времени работы компилятора.
Кроме того, в Emscripten удалось интегрировать систему устранения избыточных переменных (например,
комбинация "var x = f(a); var y = x + g(b);" будет сведена к "var y = f(a) + g(b);"), что позволило заметно сократить размер результирующего кода и увеличить его производительность за счёт сокращения числа операций. Также была добавлена новая реализация алгоритма оптимизации Relooper (https://github.com/kripken/Relooper), работающего на стадии генерации кода и позволяющего формировать оптимальные для движков JavaScript циклы и условные переходы. Переработка Relooper позволила добиться ускорения работы примерно на 20%. Новый код Relooper написан на языке C++, перед использованием в Emscripten код Relooper компилируется из С++ в JavaScript.Основной целью развития проекта Emscripten является создание инструмента, который бы позволил выполнять в Web код независимо от языка программирования, на котором данный код написан. Emscripten позволяет осуществить компиляцию биткода LLVM (http://llvm.org/docs/BitCodeFormat.html) в скрипт на языке JavaScript, который может быть выполнен внутри web-браузера, используя только штатный JavaScript-движок, без необходимости задействования дополнительных плагинов. Биткод LLVM может быть сгенерирован из исходных текстов на Cи/Си++ при помощи компиляторов lvm-gcc и clang, а также из кода на любом другом языке программирования для которого имеется LLVM-фронтэнд. Emscripten поддерживает трансляцию вывода библиотеки SDL через canvas, а также предоставляет поддержку OpenGL через WebGL. Среди проектов, которые удалось успешно пересборать для работы в браузере, можно отметить ядро NetBSD, интерпретаторы CPython, Ruby и Lua, PDF-просмотрщик Poppler, систему рендеринга TrueType-шрифтов FreeType, декодировщик видео H.264, игру Doom.
URL: http://mozakai.blogspot.ru/2012/11/emscripten-compiler-upgra...
Новость: http://www.opennet.me/opennews/art.shtml?num=35313
Во, теперь интересующимся парням проще будет портировать операционки в браузер! :)
А как он сам себя пересобирает? Вот gcc из исходников собирает gcc, который может из исходников собрать gcc. А эта штука из исходников собирается с помощью gcc, а потом из своих исходников генерит JavaScript, а этот JavaScript может из исходников компилятора собрать опять JavaScript в браузере?
> А как он сам себя пересобирает?google://bootstrap :)
Compileception.
вооооот оно! скоро машины пересоберут себя, поумнеют и захватят мир!
Мы уже это сделали ;)
А дату запуска ядерных ракет правильно предсказали? Кажется мне уже пора рыть бункер :)
кажется уже даже поздно
Скорей бы!!!
Какой-то полный абсурд.
Вы просто читаете перевод. Что какбэ намекает.
http://mozakai.blogspot.ru/2012/11/emscripten-compiler-upgra... , например
Да нет, сама идея перевода из байт-кода в Ява-Скрипт для выполнения на компьютере кажется абсурдной. Ну это как брать программу в маш. кодах, переводить её на C++ и интерпретировать в ROOT. ;-)Я понимаю, зачем нужны дизассемблеры и т.д. - для чтения и модификации программы человеком. Но не компьютером же!
> Да нет, сама идея перевода из байт-кода в Ява-Скрипт...отлично иллюстрирует мысль про то что все ЯП эквивалентны. Хоть это и дикое извращение, конечно.
С другой стороны, граждане без плагинов и костылей запустили таким макаром достаточно серьезный 3D двигун (через webGL). Даже в принципе работает вполне себе - https://developer.mozilla.org/ru/demos/detail/bananabread
Побегал, попалил. FPS конечно раза в три ниже нативного кода, но для вебни - довольно убедительно.
На самом деле из браузеров нужно JavaScript выпиливать, заменяя его на LLVM. А не наоборот. :-)
> На самом деле из браузеров нужно JavaScript выпиливать, заменяя его на LLVM. А не наоборот. :-)точно!
так и напичать надо в W3C-документах!
а реализация -- на усмотрения разработчиков браузеров...
..вот например в Mozilla -- могут всунуть реализацию на Javascript :)
> На самом деле из браузеров нужно JavaScript выпиливать, заменяя его на LLVM.На самом деле - спорный вопрос.
- С точки зрения перфоманса - да.
- С точки зрения вгрузки сайтом неизвестного троянского буллшита делающего фиг знает что - не факт, не факт.
> С точки зрения вгрузки сайтом неизвестного троянского буллшита делающего фиг знает что - не факт, не факт.Жабаскрипт отлично обфусцируется, и в таком случае понять его не легче, чем байткод. До сих пор с жабаскриптом как-то жили же - остается заменить его на LLVM, по возможности не меняя все остальное
> Жабаскрипт отлично обфусцируется,Тем хуже для вас: я просто не буду его запускать априори посчитав его трояном. Ну как я априори считал в свое время заведомо подозрительными любой packed/crypted EXE и обнаружив что код засран просто стирал файл без дальнейших разбирательств (ибо тогда виртуалки для исследования сомнительной дряни были не особо развиты еще).
> и в таком случае понять его не легче, чем байткод.
Я и не собираюсь этого делать - за меня его поймет NoScript. Который просто гасит по дефолту любую интерактивность. А там уже я разбираюсь что и нафига. Если я понимаю зачем это надо - могу разрещить. Не понимаю -> идет в сад.
Дык это... Emscripten вряд ли будет генерировать понятный код
> Дык это... Emscripten вряд ли будет генерировать понятный кодДык это, я его и запускать буду в сильно эксклюзивных случаях. В общем случае такой сайт залетит в untrusted и больше никогда ничего не сможет выполнять из веба на моем компьютере.
> Тем хуже для вас: я просто не буду его запускать априори посчитав
> его трояном.а ничего, что все современные js-движки всё равно компилируют в «родной» код? тебе реально не всё равно, будет этим заниматься v8, ягерманки или llvm? ну, кроме того, что ты вместо компрессировано-обфусцированого js (нечитабельного, неисправляемого) получишь компрессированно-обфусцированый байткод (нечитабельный, неисправляемый, но меньше и без стадии достаточно сложного синтаксического разбора)?
> - С точки зрения вгрузки сайтом неизвестного троянского буллшита делающего фиг знает что - не факт, не факт.Я сильно сомневаюсь, что можно понять JS код, полученный в результате этой компиляции. :-)
> Я сильно сомневаюсь, что можно понять JS код, полученный в результате этой
> компиляции. :-)Да, это так. Зато можно понять обычный код. И это в том числе роялит при принятии решения - разрешить вот это вот или в треш. А блобики все на вид одинаковые. Что хуже в этом плане.
> Да, это так.Дык, поэтому уж лучше гонять в LLVM машине, оно хоть быстрее будет.
> Дык, поэтому уж лучше гонять в LLVM машине, оно хоть быстрее будет.Сложнее понять что делает -> проще вообще не гонять. Я запускаю только то в чем понимаю необходимость и уверен в легитимности.
Но вообще да, бинарное представление может быть шустрее, компактнее и не навязывать конкретный ЯП. Правда для вебпрограммеров нужда компилить скрипты вызовет выс@р кирпичей.
Вот сижу я в линуксе, который запущен в браузере, который запущен в линуксе, который....
> Вот сижу я в линуксе, который запущен в браузере, который запущен в
> линуксе, который....Ага. А давайте в браузере запустим линукс в котором запустим виртуализатор, в котором запустим линукс, в котором запустим браузер.
Как это выглядит? Достаточно направить камеру подключенную к компьютеру на его монитор :)
>можно отметить ядро NetBSDТостеры, браузеры. Развивается проект, однако :)
Помнится, чтобы поставить NetBSD на тостер, пришлось взять плату промышленного компа с линуксом, стереть оттуда линукс, записать NetBSD, и потом прикрутить саморезами к тостеру.
Возможно, с браузером та же фигня :)