WebAssembly
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 18.06.15 02:57
Оценка: 219 (11) +2
То, о чем так долго говорили большевики, свершается: кроссбраузерный байткод, чтобы разные языки компилировать в него, а не в JS.

http://techcrunch.com/2015/06/17/google-microsoft-mozilla-and-others-team-up-to-launch-webassembly-a-new-binary-format-for-the-web/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md
https://github.com/WebAssembly/design/blob/master/UseCases.md
Отредактировано 18.06.2015 3:25 D. Mon . Предыдущая версия .
Re: WebAssembly
От: wildwind Россия  
Дата: 18.06.15 05:42
Оценка: +1 -1
Здравствуйте, D. Mon, Вы писали:

Хм. Идея-то неплоха, но вбухивать тонны человеко-часов в еще одну VM — overkill по мне. И все из-за гипотетической патентной угрозы со стороны владельцев Java или .NET? Или есть другие веские причины?
avalon/1.0.442
Re: WebAssembly
От: WolfHound  
Дата: 19.06.15 18:33
Оценка: +1 -1
Здравствуйте, D. Mon, Вы писали:

Читал https://github.com/WebAssembly/v8-native-prototype/blob/master/src/wasm/wasm-opcodes.h
Плакал кровавыми слезами.
Очередную уродливую ВМ делают.
.НЕТа с жабой им мало.
Почему вот это опкоды?
  Скрытый текст
// Integer binops.
#define FOREACH_I_II_OPCODE(V) \
  V(Int32Add, 0x20)            \
  V(Int32Sub, 0x21)            \
  V(Int32Mul, 0x22)            \
  V(Int32SDiv, 0x23)           \
  V(Int32UDiv, 0x24)           \
  V(Int32SMod, 0x25)           \
  V(Int32UMod, 0x26)           \
  V(Int32And, 0x27)            \
  V(Int32Ior, 0x28)            \
  V(Int32Xor, 0x29)            \
  V(Int32Shl, 0x2a)            \
  V(Int32Shr, 0x2b)            \
  V(Int32Sar, 0x2c)            \
  V(Int32Eq, 0x2d)             \
  V(Int32Slt, 0x2e)            \
  V(Int32Sle, 0x2f)            \
  V(Int32Ult, 0x30)            \
  V(Int32Ule, 0x31)

// Float64 binops that produce float64.
#define FOREACH_D_DD_OPCODE(V) \
  V(Float64Add, 0x40)          \
  V(Float64Sub, 0x41)          \
  V(Float64Mul, 0x42)          \
  V(Float64Div, 0x43)          \
  V(Float64Mod, 0x44)

// Float64 binops that produce int32.
#define FOREACH_I_DD_OPCODE(V) \
  V(Float64Eq, 0x45)           \
  V(Float64Lt, 0x46)           \
  V(Float64Le, 0x47)

// Float32 binops that produce float32.
#define FOREACH_F_FF_OPCODE(V) \
  V(Float32Add, 0x50)          \
  V(Float32Sub, 0x51)          \
  V(Float32Mul, 0x52)          \
  V(Float32Div, 0x53)          \
  V(Float32Mod, 0x54)

// Float32 binops that produce int32.
#define FOREACH_I_FF_OPCODE(V) \
  V(Float32Eq, 0x55)           \
  V(Float32Lt, 0x56)           \
  V(Float32Le, 0x57)

// Conversions between primitive types.
#define FOREACH_CONVERSION_OPCODE(V) \
  V(Int32FromFloat32, 0x60)          \
  V(Int32FromFloat64, 0x61)          \
  V(Uint32FromFloat32, 0x62)         \
  V(Uint32FromFloat64, 0x63)         \
  V(Float64FromSInt32, 0x64)         \
  V(Float64FromUInt32, 0x65)         \
  V(Float64FromFloat32, 0x66)        \
  V(Float32FromSInt32, 0x67)         \
  V(Float32FromUInt32, 0x68)         \
  V(Float32FromFloat64, 0x69)

Это всё должно быть обычными функциями.

Глядя на остальные опкоды тоже плакать хочется.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: WebAssembly
От: novitk США  
Дата: 19.06.15 19:17
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, D. Mon, Вы писали:


W>Хм. Идея-то неплоха, но вбухивать тонны человеко-часов в еще одну VM — overkill по мне. И все из-за гипотетической патентной угрозы со стороны владельцев Java или .NET? Или есть другие веские причины?


Java/.NET — слишком высокий уровень (ГЦ, классы). Это скорее ближе к LLVM. Чем им LLVM не подошел, я .
Re[2]: WebAssembly
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.06.15 23:08
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Почему вот это опкоды?

Потому что они потом хотят это в asm\машинный код превращать. С функциями сложнее. Ну и оптимизация ложится на компилятор, а не на рантайм.

WH>Это всё должно быть обычными функциями.

Кому должно?
Re[3]: WebAssembly
От: WolfHound  
Дата: 19.06.15 23:47
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Потому что они потом хотят это в asm\машинный код превращать. С функциями сложнее. Ну и оптимизация ложится на компилятор, а не на рантайм.

1)Компилятор может провести ровно те же оптимизации.
2)Рантайму (который на самом деле тоже компилятор) всё равно, что знать в лицо. Опкод или функцию из стандартной библиотеки. Разница в несколько машинных тактов при парсинге кода.

WH>>Это всё должно быть обычными функциями.

G>Кому должно?
Здравому смыслу.
Вон мелкософты захардкодили те же опкоды в MSIL, а когда потом начали делать генерики, случился большой ой.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: WebAssembly
От: s22  
Дата: 20.06.15 04:39
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, gandjustas, Вы писали:


G>>Потому что они потом хотят это в asm\машинный код превращать. С функциями сложнее. Ну и оптимизация ложится на компилятор, а не на рантайм.

WH>1)Компилятор может провести ровно те же оптимизации.
WH>2)Рантайму (который на самом деле тоже компилятор) всё равно, что знать в лицо. Опкод или функцию из стандартной библиотеки. Разница в несколько машинных тактов при парсинге кода.

WH>>>Это всё должно быть обычными функциями.

G>>Кому должно?
WH>Здравому смыслу.
WH>Вон мелкософты захардкодили те же опкоды в MSIL, а когда потом начали делать генерики, случился большой ой.

Тут не будет дженерков.
Дженерики поддержваются языком, а тут уровень машинного кода без возможности декомпиляции.
Избаловало вас НЕТ возможность посмотреть исходник скомпилированного кода.....
Re[5]: WebAssembly
От: WolfHound  
Дата: 20.06.15 12:43
Оценка:
Здравствуйте, s22, Вы писали:

s22>Тут не будет дженерков.

s22>Дженерики поддержваются языком, а тут уровень машинного кода без возможности декомпиляции.
s22>Избаловало вас НЕТ возможность посмотреть исходник скомпилированного кода.....
Не пори чушь. Ей больно.
Они АСТ сериализуют. Сделать для этого дела декомпилятор проще чем для .НЕТ.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: WebAssembly
От: WolfHound  
Дата: 20.06.15 13:34
Оценка: 4 (1) :)
Здравствуйте, WolfHound, Вы писали:

Прочитал https://github.com/WebAssembly/design/blob/master/AstSemantics.md
Ох, как мне это развидеть?

1)Local and Memory types
https://github.com/WebAssembly/design/blob/master/AstSemantics.md#local-and-memory-types

Loads convert Memory types to Local types according to the following rules:

Тут явно торчат уши текущей реализации.
Когда реализация протекает в модель пиши пропало.

Если хочется проводить эти конвертации нужно делать это на этапе загрузки байткода.
В самом же байткоде должны быть совершенно конкретные типы.

2)Control flow structures
https://github.com/WebAssembly/design/blob/master/AstSemantics.md#control-flow-structures
Опять протечка реализации в модель.
Только в значительно более тяжёлой форме.
Данные извращения нужны исключительно для компиляции в жабаскрипт. И только по тому, что жабаскрипт не умеет goto.

Break and continue statements can only target blocks or loops in which they are nested. This guarantees that all resulting control flow graphs are reducible, which leads to the following advantages:

1)Simple and size-efficient binary encoding and compilation.

Грамотная стековая машина как минимум не хуже.
При этом гораздо гибче.

2)Any control flow—even irreducible—can be transformed into structured control flow with the Relooper algorithm, with guaranteed low code size overhead, and typically minimal throughput overhead (except for pathological cases of irreducible control flow). Alternative approaches can generate reducible control flow via node splitting, which can reduce throughput overhead, at the cost of increasing code size (potentially very significantly in pathological cases).

3)The signature-restricted proper tail-call feature would allow efficient compilation of arbitrary irreducible control flow.

Они эти пляски с бубном записали в преимущества?
Почему разработчики компиляторов должны выпиливать для своего кода всякие релуперы?
При том, что такая модель поможет только при начальной реализации, которая транслирует этот кода в жабаскрипт, а когда у них будет нормальный компилятор на клиенте, всё это будет не нужно. На все разработчики компиляторов до скончания веков будут вынуждены тратить уйму времени для того чтобы запихнуть свой код в эту модель.

По ссылке на signature-restricted proper tail-call таких слов нет. Хотя я, конечно, понял, что они пытаются этим сказать.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: WebAssembly
От: 0BD11A0D  
Дата: 22.06.15 00:22
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>То, о чем так долго говорили большевики, свершается: кроссбраузерный байткод, чтобы разные языки компилировать в него, а не в JS.


DM>http://techcrunch.com/2015/06/17/google-microsoft-mozilla-and-others-team-up-to-launch-webassembly-a-new-binary-format-for-the-web/

DM>https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

DM>https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md

DM>https://github.com/WebAssembly/design/blob/master/UseCases.md

Интересно, как это скажется на приватности, рекламе и безопасности вообще.

Сейчас получить JS-подмес в http без s не просто, а очень просто. В метро хоть проехаться, а есть еще и провайдеры, отмороженность которых только растет. Подмесы находят обычные люди путем несложного анализа. Что будет, когда все это дело начнет байткодиться?

Кроме того, типичная страница в интернете сейчас содержит десяток трекеров, благодаря чему вся история вашего браузинга идет прямиков в закрома ФСБуку, Яндексу, Гуглу и далее по списку. Есть Ghostery, который выкусывает все трекеры по базе, во что эта база превратится с байткодом?

Короче, сдается мне, вся эта история закончится левой рекламой, от которой не избавиться, и окончательной потерей приватности. Рад буду ошибиться.
Re[3]: WebAssembly
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.06.15 06:58
Оценка: :)))
Здравствуйте, WolfHound, Вы писали:

WH>При том, что такая модель поможет только при начальной реализации, которая транслирует этот кода в жабаскрипт, а когда у них будет нормальный компилятор на клиенте, всё это будет не нужно. На все разработчики компиляторов до скончания веков будут вынуждены тратить уйму времени для того чтобы запихнуть свой код в эту модель.


"когда у них будет нормальный компилятор на клиенте" — сейчас на джаваскрипте написаны вагоны кода, больше, чем на любом другом ЯП. Т.е. технология взлетит/невзлетит в зависимости от того, какой профит будет на JS.
Просто прийти и сказать, вот, можно писать на С++ — это так себе. Те, кто может и умеет UI, уже давно пишут на чем то другом. А те, кто пишут на С++, уже давно ушли в дрова и числодробилки.
Re[4]: WebAssembly
От: WolfHound  
Дата: 22.06.15 16:11
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>"когда у них будет нормальный компилятор на клиенте" — сейчас на джаваскрипте написаны вагоны кода, больше, чем на любом другом ЯП. Т.е. технология взлетит/невзлетит в зависимости от того, какой профит будет на JS.

I>Просто прийти и сказать, вот, можно писать на С++ — это так себе. Те, кто может и умеет UI, уже давно пишут на чем то другом. А те, кто пишут на С++, уже давно ушли в дрова и числодробилки.
Ты не понял ни что ни зачем делают разработчики WebAssembly.
Ни моих претензий к ним.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: WebAssembly
От: s22  
Дата: 22.06.15 18:04
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, WolfHound, Вы писали:



WH>Loads convert Memory types to Local types according to the following rules:

WH>Тут явно торчат уши текущей реализации.
WH>Когда реализация протекает в модель пиши пропало.

WH>Если хочется проводить эти конвертации нужно делать это на этапе загрузки байткода.

WH>В самом же байткоде должны быть совершенно конкретные типы.

тут совершенно конкретные типы, возможно ты не понял
фактически тут сказано, что регистр может быть int32 или int64, а данные в памяти 8,16,32,64 соответственно знаковые и беззнаковые....
вообщем прямо ложиться на команды ассемблера x86

WH>2)Control flow structures

WH>https://github.com/WebAssembly/design/blob/master/AstSemantics.md#control-flow-structures
WH>Опять протечка реализации в модель.
WH>Только в значительно более тяжёлой форме.
WH>Данные извращения нужны исключительно для компиляции в жабаскрипт. И только по тому, что жабаскрипт не умеет goto.

No action, while and switch combined with jump-threading are enough.
Just add goto (direct and indirect).
Add new control-flow primitives that address common patterns.
Add signature-restricted Proper Tail Calls.
Add proper tail call, expanding upon signature-restricted proper tail calls, and making it easier to support other languages, especially functional programming languages.

WH>3)The signature-restricted proper tail-call feature would allow efficient compilation of arbitrary irreducible control flow.

WH>[/q]
WH>Они эти пляски с бубном записали в преимущества?
WH>Почему разработчики компиляторов должны выпиливать для своего кода всякие релуперы?
WH>При том, что такая модель поможет только при начальной реализации, которая транслирует этот кода в жабаскрипт, а когда у них будет нормальный компилятор на клиенте, всё это будет не нужно. На все разработчики компиляторов до скончания веков будут вынуждены тратить уйму времени для того чтобы запихнуть свой код в эту модель.

не понял, что тут....
Re[4]: WebAssembly
От: WolfHound  
Дата: 22.06.15 18:15
Оценка:
Здравствуйте, s22, Вы писали:

s22>тут совершенно конкретные типы, возможно ты не понял

s22>фактически тут сказано, что регистр может быть int32 или int64, а данные в памяти 8,16,32,64 соответственно знаковые и беззнаковые....
Я всё понял. И то, что они делают не правильно.

s22>вообщем прямо ложиться на команды ассемблера x86

Это вообще к делу не относится. Ну и 8 и 16 битные регистры в x86 тоже есть.

s22>No action, while and switch combined with jump-threading are enough.

s22>Just add goto (direct and indirect).
s22>Add new control-flow primitives that address common patterns.
s22>Add signature-restricted Proper Tail Calls.
s22>Add proper tail call, expanding upon signature-restricted proper tail calls, and making it easier to support other languages, especially functional programming languages.
У тебя есть ужасная привычка давать цитаты без ссылок.
Исправляйся. Ибо очень раздражает.

s22>не понял, что тут....

Ну, вот есть у тебя конечный автомат, реализованный при помощи goto.
Теперь попробуй скомпилировать его в предложенный формат.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: WebAssembly
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 23.06.15 13:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

s22>>не понял, что тут....

WH>Ну, вот есть у тебя конечный автомат, реализованный при помощи goto.
WH>Теперь попробуй скомпилировать его в предложенный формат.

Да скомпилить-то можно, только... Это будет либо релупер, которой поддерживает неприводимые графы потока управления (irreducible flowgraphs), либо алгоритм наподобие тех, что используются в декомпиляторах. Во втором случае неприводимые графы можно скомпилить только если предварительно конвертнуть их приводимые методом копирования целых кусков автомата. Это при том, что до сих пор неизвестен алгоритм, который порождает минимальное количество копий. А существующие эвристические подходы ещё и не слишком шустро работают. На выходе JIT всё равно генерит машинный код, на который никаких подобных ограничений не накладывается, поэтому странно, что нельзя просто так взять и скомпилить конечный автомат. Это при том, что компиляция конечного автомата напрямую в x86, ну или хотя бы в LLVM — это час работы.
Re[6]: WebAssembly
От: WolfHound  
Дата: 23.06.15 15:48
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Да скомпилить-то можно, только...

Я знаю что можно. Просто предлагаю s22 на своей шкуре почувствовать, чего это стоит.

K>поэтому странно, что нельзя просто так взять и скомпилить конечный автомат.

Судя по всему они тупо решили срезать углы при начальной реализации, а на то что из-за этого потом будут страдать разработчики компиляторов им пофигу.

K>Это при том, что компиляция конечного автомата напрямую в x86, ну или хотя бы в LLVM — это час работы.

Да во что угодно, где goto есть.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: WebAssembly
От: Abyx Россия  
Дата: 23.06.15 16:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Читал https://github.com/WebAssembly/v8-native-prototype/blob/master/src/wasm/wasm-opcodes.h

WH>Плакал кровавыми слезами.
WH>Очередную уродливую ВМ делают.
WH>.НЕТа с жабой им мало.

всетаки они делают IR а не VM.
и транслировать будут тибо в asm.js, либо сразу в нативный асм.

WH>Почему вот это опкоды?

> Int32Add
WH>Это всё должно быть обычными функциями.

да, может показаться что дженерики, где типы подставляется в рантайме,
эффективнее шаблонов, где может создаваться много копий одного кода с разными типами.

однако,

во-первых размер бинарника с "push arg1/push arg2/call add" больше "add32 arg1 arg2".
у шаблона может быть всего одна инстанциация.
с шаблоном компилятор может сделать больше оптимизаций и выкинуть/свернуть много кода, в итоге размер бинарника будет меньше чем с дженериком.

во-вторых на компиляцию дженериков уходит больше ресурсов, это важно — если клиент это мобильник с батарейкой.
In Zen We Trust
Re[3]: WebAssembly
От: WolfHound  
Дата: 23.06.15 17:13
Оценка:
Здравствуйте, Abyx, Вы писали:

A>всетаки они делают IR а не VM.

Один чёрт.

A>и транслировать будут тибо в asm.js, либо сразу в нативный асм.

Незначительные детали реализации.

A>да, может показаться что дженерики, где типы подставляется в рантайме,

A>эффективнее шаблонов, где может создаваться много копий одного кода с разными типами.
Причём тут шаблоны? Я про них вообще ничего не говорил.

A>во-первых размер бинарника с "push arg1/push arg2/call add" больше "add32 arg1 arg2".

Не правда.
Стековое представление самое компактное.
В прочем у них тут тоже практически стековое представление. Так что будет паритет.
Только с кучей не нужных ограничений.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: WebAssembly
От: Mamut Швеция http://dmitriid.com
Дата: 23.06.15 17:15
Оценка: +1
DM>То, о чем так долго говорили большевики, свершается: кроссбраузерный байткод, чтобы разные языки компилировать в него, а не в JS.

DM>http://techcrunch.com/2015/06/17/google-microsoft-mozilla-and-others-team-up-to-launch-webassembly-a-new-binary-format-for-the-web/


Сейчас мы находимся в благословенный период, когда все основные вендоры НАКОНЕЦ-то нормально научились договариваться друг с другом о фичах. Так что все может получиться.

Главные но:
— в списке разработчиков нет Apple'а. Думаю, они подтянутся. Скорее всего где-то в рамках https://trac.webkit.org/wiki/FTLJIT
— Путь лежит через первоначальную обратную совместимость с asm.js. Это, имхо, может народить в проекте ужасных костылей.

Главные «ну наконец-то»:
— Ну наконец-то!




ЗЫ. Оффтоп. Ну и вдогонку к тому, что сказал c-smile, у меня есть два текста на английском:
https://medium.com/@dmitriid/w3c-and-whatwg-should-die-a-quick-and-horrible-death-a7cff5e1da8f
https://medium.com/@dmitriid/ok-w3c-and-whatwg-dont-die-but-7952221fcbe4


dmitriid.comGitHubLinkedIn
Re[2]: WebAssembly
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 24.06.15 04:09
Оценка: 21 (1)
Здравствуйте, Mamut, Вы писали:

M>Сейчас мы находимся в благословенный период, когда все основные вендоры НАКОНЕЦ-то нормально научились договариваться друг с другом о фичах. Так что все может получиться.


Люди, следившие за их рассылкой, говорят, что те пока только договорились, что надо договориться, но дальше этого — о фичах — пока не очень еще договорились.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.