Pokazywanie postów oznaczonych etykietą Dart. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Dart. Pokaż wszystkie posty

niedziela, października 16, 2011

Poskramianie Darta ;-)

Chciałbym się móc pobawić Dartem, ale Google nie lubi Windowsa.
Nawet gdzieś mi po głowie chodzi by kupić sobie takiego małego niby ultrabooka (czy prawie, 13.1 cala, 4 albo 8 GB RAM, 500 GB HDD do tego około 8 godzin pracy na baterii, system to Win7, ale Ubuntu jakieś można pewnie postawić, szczególnie w wersji Wubi czy jak to to się zowie (taka, którą się instaluje z Windowsa)) by się na Linuksie pobawić Dartem. Zabawka to jakieś 3k, więc się da ;-)

Ale ktoś był miły i zrobił binarki dla Windowsa :-) [działają pod Win7, podobno pod XP nie], link pojawił się w dyskusji na General Dart Discussion w wątku Win32 Binaries].
Żeby było prościej tu linki do 2 najważniejszych plików:

http://www.kelleysoft.com/dart/dart.exe
http://www.kelleysoft.com/dart/libdart.dll

No i są problemy ;-) Uruchomienie mojego programu do testowania szybkości, tego od całkowania numerycznego trwa wieki, 1 iteracja w wersji skompilowanej do JavaScript'u i wykonywanej w Chrome to było około 2.8 ms, w przypadku użycia wirtualne maszyny Darta jest około 370 ms ;-)
Czyli wirtualna maszyna w wersji jaką mam jest 132 razy wolniejsza od skompilowanego Darta do JavaScript'u ;-)
Na 99% chodzi o brak optymalizacji, którą może i da się włączyć, ale nie znam magicznego przełącznika do tego.

Przy okazji odkryłem kilka ciekawostek w Dart'cie :-)
Po pierwsze Clock.now() nie zwraca czasu w milisekundach! Tzn. czasem zwraca ;-) ale tak naprawdę czas w sekundach to:
Clock.now()/Clock.frequency()
Po skompilowaniu do JavaScriptu Clock.frequency() zwraca 1000, co oznacza, że Clock.now() zwraca czas w milisekundach, w przypadku maszyny wirtualnej zwraca milion, czyli czas z Clock.now() to mikrosekundy :-) 
Po drugie, int w Darcie to odpowiednik Java'oweg BigDecimal :-) Nie ma ograniczeń innych niż rozmiar pamięci. Nie głupi pomysł.
Po trzecie, Dart daje możliwość używania "modułów" czy jak to nazwać ;-) Nie znam jeszcze wszystkich szczegółów, ale chcąc w 1 pliku Darta użyć rzeczy z innego wystarczy użyć na początku pliku dyrektywy #source("nazwaPliku") :-)

Szczerze już dawno żaden język mi się tak na dzień dobry nie spodobał. Stąd liczę, że jednak świat się do Darta przekona ;-)



Podobne postybeta
Całkujący Dart ;-)
Raspberry Pi to nie jest demon prędkości ;-)
Dart - się mnie podoba :-)
Koszmarek - Small Basic ;-)
Dart - to działa i ma sens :-)

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 ;-)

wtorek, października 11, 2011

Wyważanie otwartych drzwi

Po tym jak Google pokazało Darta zaczęło się najeżdżanie na Darta. Głównym zarzutem jest jak zauważyłem to, że Dart jest podobny do Java'y, bo Java to teraz zło....

Nie do końca wiem skąd takie przekonanie, bo wydaje mi się, że siłę języka powinno się mierzyć przy pomocy tego co w nim powstało. W przypadku Java'y jest tego trochę, a są nawet spektakularne "zdrady" w językach w stylu Ruby i powrót do brzydkiej Java'y [i nie jest to jako przytyk do Ruby, bo Ruby on Rails jest świetne do szybkiego developowania, ale jak pokazuje przykład Twittera w pewnym momencie istotniejsze staje się to by mieć architekturę która się ładnie skaluje, a tutaj RoR tak fajne nie jest, ale tu trzeba pamiętać, że dla większości projektów nigdy nie dochodzi do tego etapu gdy wydajność RoR jest zbyt mała, dla miłośników opowieści o technical debt to używając RoR czy innych "sexy" języków też się go zaciąga tylko spłacanie przychodzi w innym momencie].
Tak samo PHP ma za sobą dużo rzeczy, z najsłynniejszych chyba Facebooka.
C ma Uniksy, a teraz np. Linuksa i tak dalej.

Składnia C-like którą ma Dart wcale nie jest najlepsza, bo w przypadku składni języków programowania trudno mówić o "lepszości", ale jest bardziej "naturalna". Większość wiodących języków programowania to języki C-like i głupio by był wybierać inną składnię, która odrzucałaby developerów.
Tutaj trzeba zaznaczyć, że większość developerów na świecie jest "cicha", nie marnują czasu i energii na prowadzenie blogów czy udzielanie się na forach, oni po prostu używają języków by tworzyć oprogramowanie. Z obserwacji mogę wnosić, że wiele z tych osób lubi składnię C-like. Po co więc Google miałoby wywarzać otwarte drzwi i tworzyć nową składnię?
Google kocha Pythona, ale Python przez to, że nie "wygląda" jak C-like ma poważne problemy z przebiciem się przez pancerz ochronny wielu developerów.

Z tego co widać w Darcie poszli śladem Java'y (najpopularniejszego nadal języka wg. Tiobe) z wyrzuceniem z niego pewnych "ciężarów", np. do main nie przekazuje się niczego, nie ma statycznych rzeczy (chyba), private i public zostały wyrzucone z języka, i wszystko jest domyślnie publiczne, za wyjątkiem tego co zaczyna się od podkreślenie _, do tego deklaracje funkcji trochę pozwolili skrócić i np. nie trzeba pisać:

class Point {
var x, y;
Point(var x, var y) {
this.x = x;
this.y = y;
}
}

A wystarczy napisać:

class Point {
var x, y;
Point(this.x, this.y);
}

Niby nic, a ułatwi pisanie wielu rzeczy.
Do tego dodali wyrażenia lambda, jak się wydaje w składni podobnej do tego co ma być w Java 8 (czyli jest już w C#). I tak dalej.

Zamiast wyważać otwarte drzwi postanowili pójść znanym szlakiem i stworzyć język, który ułatwi i da trochę radości masom programistów, którzy znają języki takie jak Java czy C#.
I to jest wg. mnie dobra droga.

Co prawda Dart ma nikłe szanse na to by wejść do wszystkich przeglądarek, ale zrobienie go językiem "ewolucyjnym", a nie "rewolucyjnym" zwiększa jego szanse na to by ludzie go wybierali (czyli też na to by trafiał do przeglądarek). Po prostu może być tańszy w użyciu.


Podobne postybeta
IDE dla Go
Go dla Java'owca ;-) odcinek 1 "klasy"
Całkujący Dart ;-)
Sarkania na C++
Java, JavaScript, Python, C++, C#? co ma przyszłość? 7 lat później ;-)