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
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?
Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>То есть stackful coroutines в веб-браузере.
Вот только эти корутины по большому счету работают только в простейших случаях. Например emscripten падал при включенных исключениях ( -enable-emscripten-cxx-exceptions ) и коде чуть более сложном чем hello world. Не уверен, но вроде как до сих пор эту проблему не поправили. ( был какой-то pullrequest призванный решить эту багу, но его так и не замержили https://github.com/kripken/emscripten/pull/2772 )
Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
I>>пример с Qt не понял вообще, как они его перегнали, выкинули половину QtCore? EP>Видимо скомпилировали QT в JavaScript Наверное да, ненужное выкинули. Вот тут ещё QT примеры.
Здравствуйте, 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: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, kr510, Вы писали:
K>Круто! Только зачем?
* портирование готовых библиотек и приложений
* создание быстрого JS кода — там выходной JS получается со многими C++ оптимизациями, которые вручную выпиливать трудно и долго. Например недавно делал тест(1
): C++ -> JS оказался практически в два раза быстрее чем аналог на C#
* создание веб-приложений в которых и для клиентского и для серверного кода используется C++
* кросс-платформенные приложения работающие на десктопах, мобильных устройствах и веб
Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
Здравствуйте, 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[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[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, а не наоборот.
ЗЫ, как полигон для упражнений в программировании это направление класс! Нужно только придумать реальное использование.