Бабушка, смотри, я сделал двач! Войти !bnw Сегодня Клубы

Кто-нибудь ковырялся с Emscripten?

В общем "Здравствуй, мир!" оно компилит хорошо.

А как с чем-нибудь посложнее?

#include <stdio.h>

int main()
{
    char name[10];
    printf("1: ");
    scanf("%9s", name);
    printf("1. Is instruction ordering ok, <%s>?\n", name);
    printf("2: ");
    scanf("%9s", name);
    printf("2. Still ok, <%s>? =)\n", name);
    return 0;
}

А так: выдаётся JavaScript, который сперва всё печатает, а потом радостно спрашивает то, что его попросили в scanf, причём один раз.

Разумно предположить, что это у меня руки кривые и я как-то неправильно Emscripten поставил ил запускаю. Ок, генерю LLVM-код при помощи CLang:

; ModuleID = 'test.c'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
target triple = "i386-pc-cygwin"

@.str = private unnamed_addr constant [4 x i8] c"1: \00", align 1
@.str1 = private unnamed_addr constant [4 x i8] c"%9s\00", align 1
@.str2 = private unnamed_addr constant [38 x i8] c"1. Is instruction ordering ok, <%s>?\0A\00", align 1
@.str3 = private unnamed_addr constant [4 x i8] c"2: \00", align 1
@.str4 = private unnamed_addr constant [23 x i8] c"2. Still ok, <%s>? =)\0A\00", align 1

define i32 @main() nounwind {
  %1 = alloca i32, align 4
  %name = alloca [10 x i8], align 1
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0))
  %3 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
  %4 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %3)
  %5 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
  %6 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([38 x i8]* @.str2, i32 0, i32 0), i8* %5)
  %7 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str3, i32 0, i32 0))
  %8 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
  %9 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %8)
  %10 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
  %11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str4, i32 0, i32 0), i8* %10)
  ret i32 0
}

declare i32 @printf(i8*, ...)

declare i32 @scanf(i8*, ...)

Код нормально работает при помощи lli, компилится в нормальный ассемблер при помощи llc, в общем код ок.

Запускаю его при помощи вот этой демо-странички от Emscripten. Получаю, что характерно, аналогичную кривость, но почти наоборот, попробуйте сами.

ЧЯДНТ?

Рекомендовали: @kerrigan @o01eg
#9ESVPY / @dluciv / 3817 дней назад

лан
#9ESVPY/1QB / @krkm / 3817 дней назад
>Кто-нибудь ковырялся с Emscripten? ну вот я гост через него компилил. нормально https://github.com/dstucrypt/em-gost
#9ESVPY/9XK / @muromec / 3817 дней назад
ну вот я посмотрел, что эта хуйня генерит на выходе function _main() { var $0 = 0, $name = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer11 = 0, $vararg_buffer3 = 0, $vararg_buffer6 = 0, $vararg_buffer8 = 0, label = 0, sp = 0; sp = STACKTOP; STACKTOP = STACKTOP + 64|0; $vararg_buffer11 = sp + 40|0; $vararg_buffer8 = sp + 24|0; $vararg_buffer6 = sp + 32|0; $vararg_buffer3 = sp + 16|0; $vararg_buffer1 = sp; $vararg_buffer = sp + 8|0; $name = sp + 48|0; $0 = 0; (_printf((8|0),($vararg_buffer|0))|0); HEAP32[$vararg_buffer1>>2] = $name; (_scanf((16|0),($vararg_buffer1|0))|0); HEAP32[$vararg_buffer3>>2] = $name; (_printf((24|0),($vararg_buffer3|0))|0); (_printf((64|0),($vararg_buffer6|0))|0); HEAP32[$vararg_buffer8>>2] = $name; (_scanf((16|0),($vararg_buffer8|0))|0); HEAP32[$vararg_buffer11>>2] = $name; (_printf((72|0),($vararg_buffer11|0))|0); STACKTOP = sp;return 0; }
#9ESVPY/RMF / @muromec / 3817 дней назад
@muromec Моя генерит сходное. Тут-то чисто всё. Вопрос, как потом эти `printf` и `scanf` работают. Или не работают.
#9ESVPY/5ST / @dluciv --> #9ESVPY/RMF / 3817 дней назад
@dluciv ну сканф скорее всего криво сделан и всем похуй. потомучто там где нужен емскриптен, там консоли нету.
#9ESVPY/7EF / @muromec --> #9ESVPY/5ST / 3817 дней назад
#9ESVPY/M00 / @krkm --> #9ESVPY/7EF / 3817 дней назад
@krkm съеби
#9ESVPY/0FV / @muromec --> #9ESVPY/M00 / 3817 дней назад
@muromec охуел так базарить? давай пояснять за консоль, а то в ебло щас отхватишь
#9ESVPY/S4X / @krkm --> #9ESVPY/0FV / 3817 дней назад
УМВР. ЧЯДНТ?
#9ESVPY/E1M / @anonymous / 3817 дней назад
@anonymous Где можно посмотреть?
#9ESVPY/5FU / @dluciv --> #9ESVPY/E1M / 3817 дней назад
@muromec На самом деле делать блокирующий ввод-вывод на JavaScript затрахаешься, по крайней мере в браузере. Но автор мог бы честно об этом написать, и написать, что ни хера не работает не потому что глючит, а потому, что под это дело надо генерить continuation passing style в коде и т.д., а ему не приспичило этим заниматься, так как Emscripten вообще не для этого. Вместо этого автор говорит, что есть scanf. И gets. Которых на самом деле нет ни хрена, а вместо них какая-то сплошная попа без дырки.
#9ESVPY/Q7U / @dluciv --> #9ESVPY/7EF / 3817 дней назад
@dluciv Вообще, 1: выводится после первого ввода, но это и в сишечке же было бы нормально, потому что оно не флашится.
#9ESVPY/5WO / @anonymous --> #9ESVPY/5FU / 3817 дней назад
@dluciv в брузере как раз есть блокирующий [prompt](https://developer.mozilla.org/en-US/docs/Web/API/Window.prompt)
#9ESVPY/PON / @krkm --> #9ESVPY/Q7U / 3817 дней назад
@krkm Ну он слишком уж блокирующий. Если пустить его в цикле, то придётся как минимум вкладку со страничкой закрывать. При этом Хром и Осёл вообще кажут модальные окна, хром с галочкой "больше не разрешать диалоги", а Осёл даже без неё. Осёл в итоге реально после этого только целиком закрыть =). Кстати Emscripten им и пользуется, похоже, только через жопу. А может быть запускать весь Emscripten через вебворкер в отдельном потоке?..
#9ESVPY/I1I / @dluciv --> #9ESVPY/PON / 3817 дней назад
@dluciv не тыкал вебворкеры еще, хуй знает чо там
#9ESVPY/QK7 / @krkm --> #9ESVPY/I1I / 3817 дней назад
@krkm А кстати тоже не так всё просто. Вебворкеры просто реагируют на сообщения в отдельных потоках. Заставить их крутиться на фоне и периодически чего-то ждать убьёшься. Т.е. для нормального юзания в браузере похоже весь компилятор надо перехреначить, а автор в гробу видал это делать, я полагаю.
#9ESVPY/EXP / @dluciv --> #9ESVPY/QK7 / 3817 дней назад
@dluciv Надо же, мне не первому в голову это всё пришло. Какая неожиданность! https://github.com/kripken/emscripten/issues/23#issuecomment-1397818
#9ESVPY/P16 / @dluciv --> #9ESVPY/EXP / 3817 дней назад
@dluciv Мужики, а ведь это типа должно спасти: http://syzygy.st/javascript-coroutines/index.html Сопроцедуры всегда спасают. Сопроцедуры -- наши лучшие друзья!
#9ESVPY/YA6 / @dluciv --> #9ESVPY/P16 / 3817 дней назад
@anonymous Угу, флашить пробовал, да вот только скомпилить не получается, поскольку флаш у емскриптена не реализован...
#9ESVPY/BKE / @dluciv --> #9ESVPY/5WO / 3817 дней назад
@dluciv Фак. yield нельзя говорить во вложенных функциях. Только одномерно. Засада...
#9ESVPY/PK2 / @dluciv --> #9ESVPY/YA6 / 3817 дней назад
@dluciv http://sharpc.livejournal.com/75856.html *После завершения первой недели декомпиляции я вдруг сообразил, что у меня в руках почти 200 килобайт синхронного кода, в котором вызываются ReadKey, что не очень совместимо с асинхронной событийной моделью JavaScript. triampurum предложил переписать это с использованием Continuation-Passing Style, но 124 точки асинхронности и 150 функций меня от этого отговорили.* И внезапно там написано, как. Мне стало ещё страшнее.
#9ESVPY/IGZ / @dluciv --> #9ESVPY/PK2 / 3816 дней назад
@dluciv Ох. Он там делает вообще жесть: запускает программу, по ReadKey() выдаёт исключение и выходит в идл. А затем, получив кнопку, проигрывает программу с начала. Со всеми уже нажатыми кнопками и одной новой. С самого начала блядь! И, что самое ужасное, говорит, что мощности современных браузеров на это хватает.
#9ESVPY/6ZU / @dluciv --> #9ESVPY/IGZ / 3816 дней назад
@dluciv А на самом деле у меня грабли кривые и в браузере флашится. А вот в ноде таки нет.
#9ESVPY/4JJ / @dluciv --> #9ESVPY/BKE / 3815 дней назад
Однако вот эта хренотень может очень даже помочь https://github.com/BYVoid/continuation
#9ESVPY/JKP / @dluciv / 3815 дней назад
@dluciv есть же async.js без всяких кампеляторов, хули ты выебываешься
#9ESVPY/Z55 / @krkm --> #9ESVPY/385 / 3815 дней назад
@krkm Ога, можно вместо несуществующих асинхронных управляющих конструкций забацать функции, которым будут передаваться другие функции. Код с использованием async.js такой вербозный и скучный, как будто он написан на Java. Отстой, ну нафиг.
#9ESVPY/U17 / @dluciv --> #9ESVPY/Z55 / 3815 дней назад
@dluciv какая разница хардкод конструкция или внешняя библиотека, если они один хер транслируются примерно в одинаковый код и представляют тебе как пользователю примерно одинаковый интерфейс? ну кроме того, что хардкод лишен участи конкуренции и вся надежда на то, что сильная рука сделает идеальный вариант
#9ESVPY/PPO / @krkm --> #9ESVPY/U17 / 3815 дней назад
@krkm Такая, что за меня будет хардкодить компилятор. А я буду писать, как 20 лет назад на Си и Бейсике, и радоваться этому.
#9ESVPY/PNF / @dluciv --> #9ESVPY/PPO / 3815 дней назад
@dluciv тут за тебя хардкодит библиотека, какая тебе разница-то?
#9ESVPY/3JA / @krkm --> #9ESVPY/PNF / 3815 дней назад
@krkm Вербозно слишком. На плюсах тоже была возможность давным-давно задавать всякие хитрые фильтры для колекций типа std::not<...>(std::all<...>(...)). Однако несколько приятнее вместо вырисовывания этого дерева руками написать его на том языке, на котором пишешь всю остальную логику.
#9ESVPY/30D / @dluciv --> #9ESVPY/3JA / 3815 дней назад
@dluciv ну чисто синтаксисодрочь, но у жс бойлерплейт в этом плане минимальный
#9ESVPY/3NG / @krkm --> #9ESVPY/30D / 3815 дней назад
@krkm А у этой фигни вообще нулевой бойлерплейт. Она автономный жс выкакивает =P. Алсо надо писать на гомоиконных языках типа ЛИСПа, тогда всем будет счастье -- и синтаксис, и семантика ок.
#9ESVPY/8V3 / @dluciv --> #9ESVPY/3NG / 3815 дней назад
@dluciv > надо писать на гомоиконных языках типа ЛИСПа ну пока не придумали достаточно коммерчески успешных, пишем на том что есть
#9ESVPY/GPX / @krkm --> #9ESVPY/8V3 / 3815 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.