WebAssembly for JVM

WebAssembly for JVM
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:10 dni
  • Postów:3561
0

Jakie technologie WebAssembly specyficzne dla JVM są na rynku?
Czy gdzieś tutaj wrzucone client-side rozwiązanie scalowe, to jest formalnie właśnie WebAssembly?

Właśnie do kawy jadę prezentacje Blazora dla .NET, i to się może podobać.

Skalowalność do miliona userów, ustabilizowane API nie są moimi wymaganiami.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 23 godziny
1

Scala-Native to WASM demo: https://github.com/shadaj/scala-native-wasm Scala-Native nadaje się do kompilowania do WebAssembly, bo używa LLVM pod spodem, a nie JVMa czy JSa.

http://teavm.org/

GraalVM posiada (aktualnie eksperymentalną) obsługę WebAssembly: https://www.graalvm.org/docs/reference-manual/languages/wasm/ GraalVM udostępnia Polyglot API, a więc można z poziomu WASM używać klas Javowych i vice versa. GraalVM i Polyglot API są tak skonstruowane, że jest jeden JIT do wszystkich języków i potrafi on robić np inlining między językami (np Ruby woła Javę, która woła WASM i JIT to spłaszcza do jednej metody bez wywołań funkcji/ metod/ etc).

Wideo na którym twórca Scala.js tłumaczy dlaczego nie zaimplementuje wsparcia dla WebAssembly (w obecnym jego stanie, czyli bez GC i innych bajerów) w Scala.js (ale nadal Scala-Native i TeaVM umożliwiają kompilację Scali do WASMa, przy czym TeaVM jest chyba bardziej sprawdzonym rozwiązaniem):

Trzeba też oczywiście wspomnieć o tym, że nie ma żadnego dowodu, że WebAssembly jest szybsze od JSa w kwestii obsługi GUI. Jeśli już to są dowody na tezę odwrotną: Rust skompilowany do WASMa jest wolniejszy od Vanilla.js w obsłudze HTMLowego GUI. Na https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts-results/table.html w "which frameworks" trzeba zaznaczyć vanilla (Vanilla.js) oraz wasm-bindgen (Rust skompilowany do WASMa). Właśnie zauważyłem, że do wyboru jest też blazor-wasm. blazor-wasm-v3.2.0-preview4.20210.8-keyed jest średnio 9x wolniejszy od vanilla.js, startuje ponad 13x dłużej i zabiera prawie 2.5x więcej pamięci. Niespecjalnie imponujące wyniki. binding.scala działa wielokrotnie szybciej chociaż zabiera trochę więcej pamięci. Implementacje można znaleźć tutaj: https://github.com/krausest/js-framework-benchmark/tree/master/frameworks/keyed

Nie należy też zapominać o https://en.wikipedia.org/wiki/Google_Web_Toolkit Co prawda nie kompiluje się do WebAssembly (gdy powstawał, to o WASMie w ogóle nie było mowy), a do JSa, ale jest sposobem na to, by pisać przeglądarkowe GUI w Javie, a nie JavaScripcie. W świecie Javy był na niego hype, tak jak teraz jest hype na Blazora w świecie C#.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 11x, ostatnio: Wibowit
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:10 dni
  • Postów:3561
0
Wibowit napisał(a):

Nie należy też zapominać o https://en.wikipedia.org/wiki/Google_Web_Toolkit Co prawda nie kompiluje się do WebAssembly (gdy powstawał, to o WASMie w ogóle nie było mowy), a do JSa, ale jest sposobem na to, by pisać przeglądarkowe GUI w Javie, a nie JavaScripcie. W świecie Javy był na niego hype, tak jak teraz jest hype na Blazora w świecie C#.

Myślałem, że skoro Java dawniej była w przeglądarce (jako Applet), że jest jakaś droga na skróty ;)
Oglądam, poczytałem materiały źródłowe o maszynie WebAssembly.
To rzeczywiście skomplikowane.

Są jeszcze jakieś inne środowiska z transpilerem JS, w stylu GWT - bo chyba tak trzeba by sklasyfikować ?
(wiem, ze Vaadin buduje nad GWT)


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 23 godziny
0

Myślałem, że skoro Java dawniej była w przeglądarce (jako Applet), że jest jakaś droga na skróty ;)

No niespecjalnie. Aplety były obsługiwane przez wtyczki, w niewielkim stopniu zintegrowane z przeglądarkami, podobnie jak Adobe Flash czy Microsoft Silverlight.

Są jeszcze jakieś inne środowiska z transpilerem JS, w stylu GWT - bo chyba tak trzeba by sklasyfikować ?

Nie siedzę w Kotlinie, ale jest Kotlin/JS i Kotlin/Native, chyba analogicznie jak w Scali.

https://kotlinlang.org/docs/reference/native-overview.html

Kotlin/Native supports the following platforms:

  • (...)
  • WebAssembly (wasm32)

.

(wiem, ze Vaadin buduje nad GWT)

Kiedyś Vaadin był oparty o GWT, ale od jakiegoś czasu już nie jest.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 10 godzin
  • Postów:5109
0

@Wibowit:

Jeśli już to są dowody na tezę odwrotną: Rust skompilowany do WASMa jest wolniejszy od Vanilla.js w obsłudze HTMLowego GUI. Na https://rawgit.com/krausest/j[...]bdriver-ts-results/table.html w "which frameworks" trzeba zaznaczyć vanilla (Vanilla.js) oraz wasm-bindgen (Rust skompilowany do WASMa). Właśnie zauważyłem, że do wyboru jest też blazor-wasm. blazor-wasm-v3.2.0-preview4.20210.8-keyed jest średnio 9x wolniejszy od vanilla.js, startuje ponad 13x dłużej i zabiera prawie 2.5x więcej pamięci. Niespecjalnie imponujące wyniki.

Niemniej jednak nie zapominajmy, że w przeciwieństwie do wasma(już nie mówiąc o blazorze), to silniki jsowe miały czas na performance tuning.

edytowany 2x, ostatnio: WeiXiao
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 23 godziny
1

Nie zgodzę się z tezą o WASMie w ogólności. Blazor jest jeszcze świeży, więc jest pewnie za wcześnie by o nim wyrokować (ale i tak na chwilę obecną jest ociężały), ale jeśli chodzi o same WebAssembly to:

  • prekursorem WASMa był asm.js, który jest z nami od roku 2013, a już w 2014 roku "Firefox with float32 optimizations can run all those benchmarks at around 1.5x slower than native, or better": https://hacks.mozilla.org/2013/12/gap-between-asm-js-and-native-performance-gets-even-narrower-with-float32-optimizations/
  • WASM jest trochę szybszy od asm.js, chyba z kilkanaście procent albo nawet trochę więcej, więc już teraz jego szybkość to powiedzmy jakieś 80% natywnego kodu w średnim przypadku. Na zrównanie nie ma co liczyć, bo WASM jest osandboxowany programowo (musi np sprawdzać czy wskaźniki nie wychodzą poza zaalokowane obszary pamięci).
  • Rustowy kod w wasm-bindgen jest zaledwie kilka procent wolniejszy od vanilla.js, podczas gdy Blazor WASM jest 9x wolniejszy

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 10 godzin
  • Postów:5109
0

@Wibowit:

prekursorem WASMa był asm.js, który jest z nami od roku 2013, a już w 2014 roku "Firefox with float32 optimizations can run all those benchmarks at around 1.5x slower than native, or better": https://hacks.mozilla.org/201[...]r-with-float32-optimizations/

No spoko i co? nadal na road mapie jest dużo "corowych" rzeczy

https://webassembly.org/docs/future-features/

Rustowy kod w wasm-bindgen jest zaledwie kilka procent wolniejszy od vanilla.js, podczas gdy Blazor WASM jest 9x wolniejszy

Co daje nadzieje na to, że Blazor w przyszłości będzie porównywalnie szybki względem pure js, ale na teraz to chyba trzeba było dowieźć featuresy i stabilność, bo zapowiadali się, że w maju 2020 będzie release.

edytowany 3x, ostatnio: WeiXiao
Zobacz pozostałe 7 komentarzy
KamilAdam
@WeiXiao: tak, problemem była osoba która wybrała powolny framework z fajnymi feature'ami
WeiXiao
ależ oczywiście, i są projekty w których fajne featuresy są bardziej atrakcyjne niż 50ms w operacji raz na minutę
Wibowit
50ms w operacji raz na minutę raczej nie skutkuje pytaniami Czemu to działa tak wolno?
WeiXiao
myślę, że @katelx by się z tobą nie zgodziła :-)
Wibowit
W takim razie Blazor jest D.O.A. Zdecyduj się czy ociężałość jest ważna czy nie.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)