piątek, października 14, 2011

Całkujący Dart ;-)

Ponieważ pojawił* się nowy język, czyli Dart to wypadałoby wykorzystać go do tego niecnego celu do którego wykorzystuję wszystkie języki ;-)
Trzeba w nim napisać całkowanie numeryczne i sprawdzić jak szybko się wykona :-)
Oto program w Darcie:
var N=10000;
var M=1000;
num calc() {
var sum = 0.0;
for (var i=0; i<N; i++) {
var x = 20.0*i/N-10.0;
sum+=Math.pow(Math.E, -x*x)*(20.0/N);
}
return sum;
}
main() {
var s=0.0;
var start = Clock.now();
var time = Clock.now();
var m = 0;
while ((time-start)<5000) {
for (var i=0; i<100; i++) {
s+=calc();
}
m++;
time=Clock.now();
}
time = Clock.now()-start;
print(m);
print(time);
print(time/(m*100.0));
}


Jak też to to cudo działa można dowiedzieć się tutaj (w celu uruchomienia programu należy kliknąć na strzałkę nad kodem).

Sam program powstał w bardzo prosty sposób, wziąłem oryginał w Java'ie i dokonałem w nim drobnych zmian. Na pierwszy ogień poszło to, że usunąłem słowa public i private, następnie final i static, deklarację klasy owijającej kod i wyrzuciłem argumenty z main(). Do tego trzeba było zmienić wywołania metod z Java'owego System tak by odczytywać czas i móc wypisywać wyniki.... a i jeszcze trzeba było wyrzucić typ long i zmienić go na int.
Program działał, ale nie był zbyt szybki, więc kolejnym krokiem było wyrzucenie typów i zastąpienie ich słowem kluczowym var, które spowodowało, że kompilator sam sobie użył swoich typów (choć nie wiem do końca czy to tak działa, w każdym bądź razie programik przyśpieszył po tym zabiegu).

Teraz pytanie: jak to w ogóle działa?
Prosto :-) Do serwera wysyłany jest kod w Dart'cie, a serwer odsyła "kompilat" w JavaScripcie.
Przy okazji w sieci wiele osób przeżywa, że ten "kompilat" ma ponad 17 tysięcy linii i że to niby dowodzi jak jest słabo...... to radzę zajrzeć do środka ;-) większość z tych 17 tysięcy linii to elementy dodawane z automatu, jak rozumiem gdy Dart dojrzeje (albo jeśli dojrzeje) to w przypadku wykonywania nie wersji Dartowej, a tej skompilowanej do JS większość tego kodu będzie zaciągana raz i będzie mogła służyć wszystkim programom w Darcie.

Np. po skompilowaniu metoda calc() wygląda tak:

function tator89da13$calc$member(){
var tmp$0;
var sum = 0;
{
var i = 0;
for (; LT$operator(i, tator89da13$N$getter()); tmp$0 = i , (i = ADD$operator(tmp$0, 1) , tmp$0)) {
var x = SUB$operator(DIV$operator(MUL$operator(20, i), tator89da13$N$getter()), 10);
sum = ADD$operator(sum, MUL$operator(Math$Dart.pow$member(Math$Dart.E$getter(), MUL$operator(negate$operator(x), x)), DIV$operator(20, tator89da13$N$getter())));
}
}
return sum;
}

Prawie "słowo w słowo" jak oryginał w Dart'cie :-)

Co do czasu wykonania to nie jest za różowo, na moim laptopie to zwykle koło 2.8 ms (w Chrome, w Firefoksie 2.1-2.2 ms) na jedno wykonanie metody calc(). Dla porównaniu wersja w JavaScript'cie potrzebuje w Chrome 1.78 ms, a w Firefoksie 1.488 ms.

Teraz jestem ciekaw czy ewentualne dodanie Darta do Chrome będzie oznaczało dodanie wirtualnej maszyny dla Darta, czy raczej narzędzi do kompilacji do JavaScripta i późniejszym wykonywaniu takiego kodu w V8?
Szczerze to szczegół, niech po prostu dodadzą Darta :-)



* - słowo pojawił jest zbyt duże, pojawi się dopiero gdy będzie go można używać w przeglądarce, teraz się nie da, a nawet do końca nie wiadomo czy można się bawić samym Dartem pod Windows, bo trzeba go sobie samemu zbudować, a do tego jest potrzebne VisualStudio..... bo trzeba zbudować część Chrom by móc go użyć ;-)


Podobne postybeta
Raspberry Pi to nie jest demon prędkości ;-)
C# i Java okazały się szybsza od Pythona :-) [było Java okazała się szybsza od C# i Pythona]
Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]
Poskramianie Darta ;-)
Plus dla Scala, minus dla Groovy ;-)

5 komentarzy:

  1. Ściągnąłem źródełka i bawiłem się zmodyfikowanym silnikiem V8 (nazywa się a jakże d8)

    Jest tam też zmodyfikowany silnik Rhino, zapewne na użytek AppEngine.

    Trochę trudno się zorientować w całości, bo przy okazji zaciągnęła mi się połowa Chromium... Stąd ten tryb przypuszczający ;)

    Osobiście wolał bym aby zaproponowane rozwiązania trafiły do JavaScript niż tworzenie nowego języka... Może tak się to skończy?

    OdpowiedzUsuń
  2. @Red - czyli wygląda, że co najmniej na razie będzie to działało tak, że Dart będzie tłumaczony do JavaScripta i wykonywać go będzie V8.... coś mi świta, że gdzieś była mowa o tym, że V8 ma być modyfikowany tak by był maszyną dla JavaScriptu i Darta, ale mogło mi się to wymyślić po prostu ;-)

    JavaScript ma swoje za uszami, trzeba by było zabić wsteczną kompatybilność, a to by było złe. Google, jak wynikało z ich wewnętrznego memo, które wyciekło jakiś miesiąc temu, chce iść dwiema drogami, modyfikować JavaScript by stawał się coraz lepszy, ze świadomością, że pewne decyzje projektowe w JavaScript powodują, że nie będą w stanie np. mieć dobrej kontroli typów czy dobrych narzędzi do refaktoryzacji i podobnych spraw, drugą drogą ma być Dart, który ma dać język z wszystkim czego nie ma JavaScript.
    Do tego JavaScript jest o wiele bardziej podobny do Java'y, a to też plus dla Google, bo u nich to jeden z najważniejszych języków.

    Ja bym wolał by to Dart wyparł JS, wiem, że nawet w najbardziej optymistycznej wersji to zajmie najmniej 10 lat, ale liczę na to :-)
    JavaScript jest fajny, ale Dart fajniejszy :-)

    OdpowiedzUsuń
  3. To czym się bawiłem to była ewidentnie zmodyfikowana wersja v8, raczej bez pośrednich faz. Więc wspomniana maszyna wirtualna już istnieje.

    Z tego co czytałem, w v8 jest za dużo tuningu - dla tego nie są chętni wprowadzaniu licznych eksperymentalnych cech języka znanych z Spidermonkey i Rhino...

    Dart to ugrzeczniony, uczesany i ubrany w ładny garniturek Javascript.

    Z pewnością jest lepszy do pracy w większym zespole. Jednak coś za coś, Javascript jest znacznie bardziej elastyczny.

    Są rzeczy które mi się podobają: Klasyczna składnia klas, przeciążanie operatorów i gettery. Niestety odejście od prototypów na rzecz dziedziczenia jest krokiem wstecz.

    Zależność od JS jest widoczna na każdym kroku. Brakuje mi tu znaczącego kroku na przód. Nie myślę tu o składni... Dla przykładu brak wzmianki o tail recursion. Tylko dla tego że JS tego nie ma, nie będzie mieć tego Dart.

    OdpowiedzUsuń
  4. @Red - to by mnie cieszyło :-) Czyli D8 wykonuje kod Darta, bez kroku pośredniego? Super, super :-)

    Nie do końca się zgodzę z tym, że Dart to ugrzeczniony JavaScript, raczej lżejsza Java. Teraz co może dziwne, najbardziej podobnym "dużym" językiem do JavaScript jest chyba C#, programy w Java'ie da się konwertować do JavaScript'u ale jakby coraz trudniej. Za to z Java'y do Darta daje się to zrobić bardzo szybko, nawet nazwy klas zostały wyniesione z Java'y :-) tak jak składnia tworzenia klas czy metod (to też z C/C++).

    A na czym polega ta większa elastyczność JavaScript'u?

    Nie zgodzę się, wolę dziedziczenie niż prototypy, tzn. czasem prototypy mają swoje plusy, ale dziedziczenie sprawia wg. mnie, że w kodzie panuje zasada najmniejszego zdziwienia ;-) przez co np. IDE podpawiadające dla Darta będzie miało prościej.

    Co do tail recursion się nie wypowiadam, nie jestem przekonany co do przydatności/nieprzydatności :-)

    OdpowiedzUsuń
  5. Mając prototypy możesz z łatwością zaimplementować dziedziczenie. Mając dziedziczenie prototypów nie wprowadzisz - ta droga w Dart już jest zamknięta.

    Przykładem elastyczności JS niech będzie wprowadzenie obsługi map i reduce do tablic. Przez wiele lat pewna znana przeglądarka nie miała tych prostych funkcji. Bez elastyczności JS, w ogóle nie było by ich w standardzie, a gwarantuję Ci że znacznie poprawiają czytelność kodu.

    Nadal podtrzymuję opinię że Dart to ugrzeczniony Javascript. Zauważ że obecnie istniejące silniki wywodzą się z JS lub działają w oparciu o ten język. Co ważniejsze, gdy pominąć składnię, Dart nie posiada nawet jednej cechy której nie miał by JS.

    Wszystko co oglądasz w Dart, miało znaleźć się w JS kilka lat temu. Wtedy jednak MS, zablokował nowy standard, ze szkodą dla rozwoju całego języka.

    Zaciekawiło mnie to że postrzegasz Dart jako lżejszą Javę. W sumie to dobrze wróży przyszłości tego języka.

    OdpowiedzUsuń