Emscripten: LLVM to JavaScript compiler (C++ to JS)
От: Evgeny.Panasyuk Россия  
Дата: 22.03.13 15:44
Оценка: 42 (8)
Emscripten

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

  • Например:
  • JS Python interpreter
  • QT Demo: chip
  • Отредактировано 23.06.2015 10:24 Evgeny.Panasyuk . Предыдущая версия .
    Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 30.04.13 16:38
    Оценка:
    Слайды: <b>C++ on the Web: Run Your Big 3D Game in the Browser!</b>
    Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 01.11.13 12:32
    Оценка:
    <b>Duetto</b>: a C++ compiler for the Web going beyond emscripten and node.js:

    Today Lean­ing Tech­nolo­gies Ltd. releases duetto, a com­piler designed to develop inte­grated (back­end and fron­tend) web appli­ca­tions in C++. duetto is now avail­able to the pub­lic as FOSS here, and will be offered in a com­mer­cial pack­age with closed-source-friendly licens­ing soon.
    [...]
    We present duetto, our C++ com­piler for the Web, which is now avail­able to the pub­lic. Our solu­tion inte­grates and sur­passes fea­tures of exist­ing tools, and allows to pro­gram both the fron­tend and the back­end of a Web appli­ca­tion in an inte­grated C++ code­base, com­pil­ing them respec­tively to JavaScript and native code.
    Duetto com­bines the advan­tages of emscripten and node.js by allow­ing the pro­gram­mer to:

  • write web appli­ca­tions in C++, reusing exist­ing code and mak­ing port­ing of whole appli­ca­tions and games to the browser plausible.
  • code both the fron­tend and the back­end of a web appli­ca­tion in the same lan­guage and codebase.
    [...]

  • Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 06.02.14 11:36
    Оценка:
    Сравнение Emscripten, Mandreel, and now Duetto.
    Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 19.06.15 13:33
    Оценка:
    https://kripken.github.io/emscripten-site/docs/introducing_emscripten/release_notes.html

    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)
    От: Igore Россия  
    Дата: 19.06.15 13:44
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:

    EP>Например:

    EP>JS Python interpreter
    EP>QT Demo: chip
    Интересно как они пример Qt сделали, выкинули половину QtCore?
    Отредактировано 19.06.2015 13:53 Igore . Предыдущая версия . Еще …
    Отредактировано 19.06.2015 13:52 Igore . Предыдущая версия .
    Re[2]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 19.06.15 13:55
    Оценка:
    Здравствуйте, Igore, Вы писали:

    I>Не могу найти про ограничения, файлы, и т.д.,


    API Limitations

    I>пример с Qt не понял вообще, как они его перегнали, выкинули половину QtCore?


    Видимо скомпилировали QT в JavaScript Наверное да, ненужное выкинули. Вот тут ещё QT примеры.

    А вот пример портирования Unreal Engine в JavaScript с помощью Emscripten — пишут что за четыре дня управились
    http://www.youtube.com/watch?v=BV32Cs_CMqo
    Re[2]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Voivoid Россия  
    Дата: 19.06.15 13:58
    Оценка: 8 (1)
    Здравствуйте, 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)
    От: Evgeny.Panasyuk Россия  
    Дата: 19.06.15 14:03
    Оценка: 6 (1)
    I>>пример с Qt не понял вообще, как они его перегнали, выкинули половину QtCore?
    EP>Видимо скомпилировали QT в JavaScript Наверное да, ненужное выкинули. Вот тут ещё QT примеры.

    Вот тут описание как собирать:
    http://vps2.etotheipiplusone.com:30176/redmine/projects/emscripten-qt/wiki
    Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 19.06.15 14:08
    Оценка:
    Здравствуйте, 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)
    От: Voivoid Россия  
    Дата: 19.06.15 14:18
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:
    EP>А где именно была проблема? При вылете исключения наружу? Или при исключении внутри? Или проблемы были даже без throw?
    При сборке. На простых примерчиках все работало, но когда я попробовал добавить корутины в достаточно большую кодовую базу, то оказалось, что emcc просто падает в процессе сборки. Вот нашел сейчас похожий issue — https://github.com/kripken/emscripten/issues/2663 . Правда человек там в конце пишет, что в какой-то версии у него все вроде заработало, но мне переход на эту версию в свое время не помог.
    Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Went  
    Дата: 20.06.15 09:53
    Оценка: +1
    Здравствуйте, Evgeny.Panasyuk, Вы писали:

    EP>Using Emscripten, you can...


    Впечатляет. Я знал, я верил что С++ всех победит
    Отредактировано 20.06.2015 9:54 Went . Предыдущая версия .
    Re: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: kr510  
    Дата: 20.06.15 18:23
    Оценка: +2
    Круто! Только зачем?
    Re[2]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 20.06.15 20:57
    Оценка: +1
    Здравствуйте, kr510, Вы писали:

    K>Круто! Только зачем?


    * портирование готовых библиотек и приложений
    * создание быстрого JS кода — там выходной JS получается со многими C++ оптимизациями, которые вручную выпиливать трудно и долго. Например недавно делал тест(1
    Автор: Evgeny.Panasyuk
    Дата: 07.06.15
    , 2
    Автор: Evgeny.Panasyuk
    Дата: 20.06.15
    ): C++ -> JS оказался практически в два раза быстрее чем аналог на C#
    * создание веб-приложений в которых и для клиентского и для серверного кода используется C++
    * кросс-платформенные приложения работающие на десктопах, мобильных устройствах и веб
    Re[3]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: kr510  
    Дата: 21.06.15 04:15
    Оценка: +1 :)
    Здравствуйте, 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)
    От: Evgeny.Panasyuk Россия  
    Дата: 21.06.15 09:47
    Оценка:
    Здравствуйте, 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++.
    Отредактировано 26.06.2015 19:58 Evgeny.Panasyuk . Предыдущая версия . Еще …
    Отредактировано 21.06.2015 11:20 Evgeny.Panasyuk . Предыдущая версия .
    Re[5]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Klikujiskaaan КНДР  
    Дата: 21.06.15 10:24
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:

    K>>Это громкое заявление. На мобильных устройствах использование HTML5+JS чтобы запускать конвертируемый C++ не сработает. Просто HTML5+JS — это тормоза и тупо проигрывает нейтив коду (ObjectiveC, Java). Не шансов что производительность HTML5+JS смогут подтянуть и это еще не считая интерпретатора C++ сверху всего.


    EP>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++.


    Даже небо, даже Аллах!
    Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...
    Отредактировано 21.06.2015 10:25 Klikujiskaaan . Предыдущая версия . Еще …
    Отредактировано 21.06.2015 10:24 Klikujiskaaan . Предыдущая версия .
    Re[6]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: Evgeny.Panasyuk Россия  
    Дата: 21.06.15 10:28
    Оценка:
    Здравствуйте, Klikujiskaaan, Вы писали:

    EP>>Я имел в виду использование C++ как ядра приложения. То есть будет отдельно web-приложение, отдельно приложение для мобильных устройств (не-web), отдельно для десктопа. И везде ядро на C++.

    K>Даже небо, даже Аллах!
    K>Но зачем такое убожество нужно? Проще и понятнее сделать веб-сервис и все кому надо будут подсасывать данные с него...

    Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2
    Re[7]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: kr510  
    Дата: 21.06.15 10:32
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:


    EP>Facebook и Dropbox делают ядро кроссплатформенных мобильных приложений на C++: 1, 2



    Да, но они хотят получить выигрыш в производительности от прямого взаимодействия с железом через с++. Зачем им еще надо JS если можно (а с их ресурсами точно можно) прямо на с++ писать? Они наоборот хотят уйти от всех языков посредников.
    Re[5]: Emscripten: LLVM to JavaScript compiler (C++ to JS)
    От: kr510  
    Дата: 21.06.15 10:37
    Оценка: :)
    EP>Чтобы получить доступ к ещё большему колличеству библиотек. Например.

    JS — свой, законченный, мир. Здесь нужно реально доказать, что еще одна библиотека будет нужна. Что касается unity3d, ну в JS есть WebGL.

    EP>Я не сказал что C++ -> JS работает быстрее native C++.

    EP>Я говорю что JS -> C++ получается очень быстрым, быстрее чем ручной JS, и даже быстрее чем C#.

    Это возможно, но как я понимаю, речь идет о C++ -> JS, а не наоборот.


    ЗЫ, как полигон для упражнений в программировании это направление класс! Нужно только придумать реальное использование.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.