Emscripten is an LLVM to JavaScript compiler. It takes LLVM bitcode (which can be generated from C/C++ using Clang, or any other language that can be converted into LLVM bitcode) and compiles that into JavaScript, which can be run on the web (or anywhere else JavaScript can run).
Using Emscripten, you can
Compile C and C++ code into JavaScript and run that on the web
Run code in languages like Python as well, by compiling CPython from C to JavaScript and interpreting code in that on the web
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, kr510, Вы писали:
K>>Круто! Только зачем?
EP>* портирование готовых библиотек и приложений EP>* создание веб-приложений в которых и для клиентского и для серверного кода используется C++
Техническая сторона понятна, но по прежнему не понятно в чем "business case". На JS масса билиотек и фрейморков для написания UI, зачем еще надо вставлять в него C++.
Люди пишут на С++, чтобы оптимизировать приложение для платформы. Как раз для того, чтобы сократить время загрузки runtime, убрать микро лаг при обработки событий и уменьшить потребляемую память. Всё это вернётся при конвертации.
EP>* создание быстрого JS кода — там выходной JS получается со многими C++ оптимизациями
В это не верится совсем. Есть код на C++ скомпилированный в машинный код, теперь его конвертируешь в JS и интерпретируешь браузером. Странно очень звучит, что JS-посредником исполнение будет быстрее. Вероятно, это ошибка измерения.
EP>* кросс-платформенные приложения работающие на десктопах, мобильных устройствах и веб
Это громкое заявление. На мобильных устройствах использование HTML5+JS чтобы запускать конвертируемый C++ не сработает. Просто HTML5+JS — это тормоза и тупо проигрывает нейтив коду (ObjectiveC, Java). Не шансов что производительность HTML5+JS смогут подтянуть и это еще не считая интерпретатора C++ сверху всего.
Re[2]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>То есть stackful coroutines в веб-браузере.
Вот только эти корутины по большому счету работают только в простейших случаях. Например emscripten падал при включенных исключениях ( -enable-emscripten-cxx-exceptions ) и коде чуть более сложном чем hello world. Не уверен, но вроде как до сих пор эту проблему не поправили. ( был какой-то pullrequest призванный решить эту багу, но его так и не замержили https://github.com/kripken/emscripten/pull/2772 )
Re[6]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали:
DM>>В моем случае сгенерированный из Haxe, но там практически один в один с оригиналом, т.е. все равно что ручной.
EP>А что там в ручном коде, какого он типа, какого уровня? ФВП/Замыкания есть?
Довольно невысокого уровня, без ФВП и замыканий, но с объектами.
EP>Как я понял — там распаковка растрового изображения. Например как там представлено изображение — безликий массив скаляров или матрица пикселей? Какие массивы используются — "статически типизированные" или нет?
Все на типизированных массивах. Картинка — массив байт.
I>>пример с Qt не понял вообще, как они его перегнали, выкинули половину QtCore? EP>Видимо скомпилировали QT в JavaScript Наверное да, ненужное выкинули. Вот тут ещё QT примеры.
Здравствуйте, Nikе, Вы писали:
N>Попробую наш графический проектик запустить А кто-нибудь его практически пробовал?
Я немного пробовал. Получается большой объем, медленная загрузка, скорость чуть лучше простого JS в Firefox'e и слегка или даже сильно хуже в других браузерах.
N>А тексты там чем можно растеризовать?
Там у тебя есть фактически просто кусок памяти, дальше делаешь в нем что хошь. Надо рисовать или растеризовать — тяни библиотеки, умеющие это в памяти делать.
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, kr510, Вы писали:
K>Круто! Только зачем?
* портирование готовых библиотек и приложений
* создание быстрого JS кода — там выходной JS получается со многими C++ оптимизациями, которые вручную выпиливать трудно и долго. Например недавно делал тест(1
): C++ -> JS оказался практически в два раза быстрее чем аналог на C#
* создание веб-приложений в которых и для клиентского и для серверного кода используется C++
* кросс-платформенные приложения работающие на десктопах, мобильных устройствах и веб
Re[5]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
EP>Чтобы получить доступ к ещё большему колличеству библиотек. Например.
JS — свой, законченный, мир. Здесь нужно реально доказать, что еще одна библиотека будет нужна. Что касается unity3d, ну в JS есть WebGL.
EP>Я не сказал что C++ -> JS работает быстрее native C++. EP>Я говорю что JS -> C++ получается очень быстрым, быстрее чем ручной JS, и даже быстрее чем C#.
Это возможно, но как я понимаю, речь идет о C++ -> JS, а не наоборот.
ЗЫ, как полигон для упражнений в программировании это направление класс! Нужно только придумать реальное использование.
Re[7]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Klikujiskaaan, Вы писали:
EP>>>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++. K>>Даже небо, даже Аллах! K>>Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...
EP>Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2
2 примера из миллиона.
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Today Leaning Technologies Ltd. releases duetto, a compiler designed to develop integrated (backend and frontend) web applications in C++. duetto is now available to the public as FOSS here, and will be offered in a commercial package with closed-source-friendly licensing soon.
[...]
We present duetto, our C++ compiler for the Web, which is now available to the public. Our solution integrates and surpasses features of existing tools, and allows to program both the frontend and the backend of a Web application in an integrated C++ codebase, compiling them respectively to JavaScript and native code.
Duetto combines the advantages of emscripten and node.js by allowing the programmer to:
write web applications in C++, reusing existing code and making porting of whole applications and games to the browser plausible.
code both the frontend and the backend of a web application in the same language and codebase.
[...]
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
v1.22.2: 8/19/2014
— Added new functions emscripten_yield, emscripten_coroutine_create and emscripten_coroutine_next which implement coroutines when building with the -s ASYNCIFY=1 option.
То есть stackful coroutines в веб-браузере.
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Например: EP>JS Python interpreter EP>QT Demo: chip
Интересно как они пример Qt сделали, выкинули половину QtCore?
Здравствуйте, Voivoid, Вы писали:
V>Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>>То есть stackful coroutines в веб-браузере. V>Вот только эти корутины по большому счету работают только в простейших случаях.
Технически вполне реализуемо — там же у них свой стэк в ArrayBuffer.
V>Например emscripten падал при включенных исключениях ( -enable-emscripten-cxx-exceptions ) и коде чуть более сложном чем hello world. Не уверен, но вроде как до сих пор эту проблему не поправили.
А где именно была проблема? При вылете исключения наружу? Или при исключении внутри? Или проблемы были даже без throw?
Re[4]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>А где именно была проблема? При вылете исключения наружу? Или при исключении внутри? Или проблемы были даже без throw?
При сборке. На простых примерчиках все работало, но когда я попробовал добавить корутины в достаточно большую кодовую базу, то оказалось, что emcc просто падает в процессе сборки. Вот нашел сейчас похожий issue — https://github.com/kripken/emscripten/issues/2663 . Правда человек там в конце пишет, что в какой-то версии у него все вроде заработало, но мне переход на эту версию в свое время не помог.
Re[4]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, kr510, Вы писали:
K>>>Круто! Только зачем? EP>>* портирование готовых библиотек и приложений EP>>* создание веб-приложений в которых и для клиентского и для серверного кода используется C++ K>Техническая сторона понятна, но по прежнему не понятно в чем "business case". На JS масса билиотек и фрейморков для написания UI, зачем еще надо вставлять в него C++.
Чтобы получить доступ к ещё большему колличеству библиотек. Например.
K>Люди пишут на С++, чтобы оптимизировать приложение для платформы.
Не только. Иногда это просто кросс-платформенность.
K>Как раз для того, чтобы сократить время загрузки runtime, убрать микро лаг при обработки событий и уменьшить потребляемую память. Всё это вернётся при конвертации.
Ты думаешь JS->C++ (UPD: опечатка, должно быть "C++ -> JS") будет хуже чем ручной JS?
EP>>* создание быстрого JS кода — там выходной JS получается со многими C++ оптимизациями K>В это не верится совсем. Есть код на C++ скомпилированный в машинный код, теперь его конвертируешь в JS и интерпретируешь браузером. Странно очень звучит, что JS-посредником исполнение будет быстрее. Вероятно, это ошибка измерения.
Я не сказал что C++ -> JS работает быстрее native C++.
Я говорю что JS -> C++ (UPD: опечатка, должно быть "C++ -> JS") получается очень быстрым, быстрее чем ручной JS, и даже быстрее чем C#.
EP>>* кросс-платформенные приложения работающие на десктопах, мобильных устройствах и веб K>Это громкое заявление. На мобильных устройствах использование HTML5+JS чтобы запускать конвертируемый C++ не сработает. Просто HTML5+JS — это тормоза и тупо проигрывает нейтив коду (ObjectiveC, Java). Не шансов что производительность HTML5+JS смогут подтянуть и это еще не считая интерпретатора C++ сверху всего.
Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
K>>Это громкое заявление. На мобильных устройствах использование HTML5+JS чтобы запускать конвертируемый C++ не сработает. Просто HTML5+JS — это тормоза и тупо проигрывает нейтив коду (ObjectiveC, Java). Не шансов что производительность HTML5+JS смогут подтянуть и это еще не считая интерпретатора C++ сверху всего.
EP>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++.
Даже небо, даже Аллах!
Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...
Здравствуйте, Klikujiskaaan, Вы писали:
EP>>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++. K>Даже небо, даже Аллах! K>Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...
Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2
Re[7]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
EP>Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2
Да, но они хотят получить выигрыш в производительности от прямого взаимодействия с железом через с++. Зачем им еще надо JS если можно (а с их ресурсами точно можно) прямо на с++ писать? Они наоборот хотят уйти от всех языков посредников.
Re[6]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, kr510, Вы писали:
EP>>Чтобы получить доступ к ещё большему колличеству библиотек. Например. K>JS — свой, законченный, мир. Здесь нужно реально доказать, что еще одна библиотека будет нужна.
Вот например делаю я какое-то JS приложение, и нужной JS библиотеки нет, зато есть библиотека С++ — кому тут что нужно доказывать?
K>Что касается unity3d, ну в JS есть WebGL.
1. Уровень WebGL намного ниже чем уровень игрового движка.
2. Emscripten как раз и переводит OpenGL вызовы в WebGL.
EP>>Я не сказал что C++ -> JS работает быстрее native C++. EP>>Я говорю что JS -> C++ получается очень быстрым, быстрее чем ручной JS, и даже быстрее чем C#. K>Это возможно, но как я понимаю, речь идет о C++ -> JS, а не наоборот.
Опечатка. В обоих случаях должно быть "C++ -> JS".
K>ЗЫ, как полигон для упражнений в программировании это направление класс! Нужно только придумать реальное использование.
Здравствуйте, kr510, Вы писали:
EP>>Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2 K>Да, но они хотят получить выигрыш в производительности от прямого взаимодействия с железом через с++.
1. С каким железом? С памятью и процессором?
2. Среди их целей в том числе и кроссплатформенность — одно ядро для разных платформ. Что ты предлагаешь взамен?
K>Зачем им еще надо JS если можно (а с их ресурсами точно можно) прямо на с++ писать? Они наоборот хотят уйти от всех языков посредников.
интересно насколько хороши эти оптимизаторы в LLVM... может имеет смысл пилить JS → JS %)
типа был руками написаный JS код, хотим посмотреть как сделать его более оптимальным %)
Re[2]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, zaufi, Вы писали:
Z>интересно насколько хороши эти оптимизаторы в LLVM... может имеет смысл пилить JS → JS %) Z>типа был руками написаный JS код, хотим посмотреть как сделать его более оптимальным %)
В Facebook использовали компилятор PHP -> C++. Возможно и тут можно сделать JS -> C++ -> JS.
Но, это всё же будет медленнее чем более-менее нормальный код на C++ транслированный в JS. Так как в C++ из коробки есть статический полиморфизм, структуры и т.п., а для JS (в случае JS -> C++) это всё должен выводить компилятор, при этом сохраняя старую семантику.
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, D. Mon, Вы писали:
DM>Там у тебя есть фактически просто кусок памяти, дальше делаешь в нем что хошь. Надо рисовать или растеризовать — тяни библиотеки, умеющие это в памяти делать.
Какой-нибудь Pango тащить мне кажется дороговато при таком подходе
Нужно разобрать угил.
Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, D. Mon, Вы писали:
N>>Попробую наш графический проектик запустить А кто-нибудь его практически пробовал? DM>Я немного пробовал. Получается большой объем
Насколько я понял, там большой объём либо из-за стандартной библиотеки, либо рантайма — то есть это своего рода стартовый размер, то чего достаточно в одном экземпляре на всё приложение. Пользовательский код там получается относительно небольшой
Здравствуйте, D. Mon, Вы писали:
DM>Там у тебя есть фактически просто кусок памяти, дальше делаешь в нем что хошь. Надо рисовать или растеризовать — тяни библиотеки, умеющие это в памяти делать.
В поставке emscripten идёт уже несколько готовых C/C++ библиотек, а не только библиотека языка. Например там с ходу (даже как-то подключать не надо) работает SDL, а это считай уже огромное количество кода для рисования заработает сразу.
Кроме этого видел там в каталоге opengl/openal, glfw, glut и т.п. Плюс ещё взгляд зацепился за библиотеки с названиями типа browser, html5 и т.п. — я таких не знаю, но подозреваю, что они обеспечивают визуализацию средствами DOM.
Re[4]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, D. Mon, Вы писали:
DM>>>скорость чуть лучше простого JS в Firefox'e EP>>"простой JS" — это ручной? Или сгенерированный? DM>В моем случае сгенерированный из Haxe, но там практически один в один с оригиналом, т.е. все равно что ручной.
А что там в ручном коде, какого он типа, какого уровня? ФВП/Замыкания есть?
Как я понял — там распаковка растрового изображения. Например как там представлено изображение — безликий массив скаляров или матрица пикселей? Какие массивы используются — "статически типизированные" или нет?
Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Emscripten
(эмоциональное)
Вот за 15 лет, что я работаю программистом, из Web не пришло ничего хорошего. В web ушло много хороших технологий, и там и остались, тут да.
А вот обратно... Именно в web, по причине, видимо, рыночной потребности, самозародились люди, считающие PHP и JS языками программирования (формально они ими являются, но программировать на PHP/JS?.. ORLY? "Налабать сайт" != "программиировать").
Современный Web представляет собой колосса из велосипедов на костылях, и имя этим костылям — JS в первую очередь (особенно после появления уродств типа JQuery), и PHP — во вторую. Потом однобитные "программисты", освоившие JS, решили его и на сервер перетащить.
Считаю, что JavaScript должен быть засунут в ту дыру, из которой он вылез — формочки обрабатывать.
Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Klikujiskaaan, Вы писали:
K>Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...
Это божет работать offline...
Например словарь, приезжаешь в другую страну, а там дорогущий роуминг.. Упс?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Klikujiskaaan, Вы писали:
K>>Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него... E>Это божет работать offline... E>Например словарь, приезжаешь в другую страну, а там дорогущий роуминг.. Упс?
Веб сайт работающий оффлайн? Ну ок.
Re[8]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, Erop, Вы писали:
E>почему сайт, а не локальный клиент?
EP>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++.
К тому же пример со словарем — хреновый, там узким местом будет не язык, а база данных, имхо.
Re[7]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, D. Mon, Вы писали:
EP>>Как я понял — там распаковка растрового изображения. Например как там представлено изображение — безликий массив скаляров или матрица пикселей? Какие массивы используются — "статически типизированные" или нет? DM>Все на типизированных массивах. Картинка — массив байт. DM>Исходники теста тут: DM>http://data.infognition.com/spbench/haxe_asmjs_src.zip
1. Там ведь разный код — например в C++ версии пиксель это не очень удобные 3 байта, в версии Haxe — пиксель это Int32.
В C++ версии переход на следующий пиксель это (могло быть замыканием, кстати):
#define GO_NEXT_PIXEL lasti = i; \
x++; i += 3; \
if (x>=X) { \
x = 0; y++; \
i = y*stride; \
}
А в Haxe это просто di++ плюс иногда lasti = di — 1.
2. Код действительно очень низкого уровня — там фактически ручная нарезка на структуры, ручной инлайнинг и т.п. То есть это не "простой JS", а полностью вручную оптимизированный.
При этом в C++ версии можно подняться на более высокий уровень, ничего при этом не потеряв в скорости. Если же поднимать уровень в JS — то будут неизбежные тормоза.