Go, golang, go...
poniedziałek, 11 października 2010
Zbyt często pisanie programu przypomina mozolne wypełnianie jakiegoś podania, które może zostać odrzucone przy najdrobniejszym błędzie formalnym. Jednak tak wcale nie musi być…
Kilka dni temu eksperymentowałem z językiem Go. Inspiracją był tekst Go dla Java'owca ;-).Artykuł jest wart polecenia, z dwóch powodów
- To chyba pierwszy polski tekst opisujący ten język,
- oraz, kładzie nacisk na programowanie obiektowe.
Dziś, chciał bym się podzielić wnioskami z nauki nowego narzędzia…
Parę słów o…
Inicjatorami powstania języka Go, są twórcy systemów Unix, Plan9, języka B, a take twórca kompilatora JavaScript V8. Ich autorytet, oraz poparcie tak dużej firmy jak Google (na liście autorów jest już prawie setka ludzi), wydają się być nieomal gwarancją sukcesu.
Pierwszym wrażeniem, jest poczucie wszechobecnego minimalizmu (i humoru) typowego dla systemu Plan9. Go bezpośrednio wywodzi się z języków B i C. Nie ma w nim naleciałości z C++, czy Java. Natomiast wszelkie odwołania do nich w dokumentacji, wynikają raczej z faktu że mamy tu do czynienia bezpośrednią konkurencją.
O przeznaczeniu języka najlepiej świadczy dobór standardowych bibliotek. Obok typowych funkcji, można tu znaleźć kompresję, szyfrowanie i kodowanie plików, obsługę wielowątkowości i połączeń sieciowych a nawet kompletny serwer http w postaci zestawu „zrób to sam”.
Pierwsze kroki
Pierwsze kroki można postawić wchodząc na stronę golang.org, gdzie na „dzień dobry” można rozpocząć eksperymenty z językiem.
Zakładając że na komputerze znajduje się zestaw podstawowych narzędzi programistycznych, instalacja kompilatora jest nieomal równie prosta. Wystarczą polecenia:
hg clone -r release https://go.googlecode.com/hg/ go cd go/src all.bash
To jest typowe dla środowiska związanego z tym językiem. Żadnej partyzantki, wszystkie biblioteki i narzędzia są instalowane, a następnie aktualizowane, z użyciem mercurial lub git.
Użytkownikom jedynie słusznych edytorów, takich jak Vim, lub Emacs, sugeruję zajrzeć do katalogu misc. Znajdą tam coś dla siebie. (no, dobrze użytkownicy innych edytorów też mogą tam coś znaleźć)
Warto także skorzystać z programu godoc, by ułatwić sobie dostęp do dokumentacji. (polecam również lekturę kodów źródłowych).
godoc -http=:6060
Zamiast Hello World
Nie. Nie zamierzam zamieszczać Hello World. Tym bardziej że jest to pierwsza rzecz, którą można zobaczyć na stronie projektu. Taki przykład i tak zupełnie nie oddaje natury języka. Zamiast tego wypunktuję małe co nieco:
- Dowolnemu typowi danych można przypisać metody. Co ważniejsze nie ogranicza się to do struktur. W ten sposób Go staje się prawdziwie obiektowym językiem, a C++ i inne wyglądają przy nim jak podróbki.
- Kluczem do elastyczności języka są interfejsy. To one nadają mu jego dynamiczną naturę.
- Domknięcia (closure), są teraz podstawowym typem danych
- Podobnie jak string, oraz tablice i mapy
- Odwróceniu uległ zapis deklaracji zmiennych. Teraz jest to
nazwa typ
. Pozytywnie wpłynęło to na czytelność kodu. Podczas gdy w C trzeba było krążyć w kółko by poprawnie odczytać definicję, tutaj całość czyta się od lewej do prawej. - Poprawiono wiele konstrukcji zepsutych w C i przez lata bezmyślnie kopiowanych do innych języków. Na przykład switch, dotychczas jedynie ładnie opakowane goto, zmieniło się w rozbudowaną instrukcję if
- Zlikwidowano arytmetykę wskaźników. Kontrowersyjny element który przez lata skutecznie utrudniający weryfikację programów i będący źródłem złej sławy wskaźników jako takich.
- Zunifikowano instrukcje pętli. Teraz jest jedna: for
- Dodano możliwość deklaracji zmiennych we wszystkich na wzór for
- Znikły nawiasy i średniki, a przynajmniej stały się nieobowiązkowe. W C istniała jedynie możliwość pominięcia nawiasów klamrowych — co zazwyczaj było złym pomysłem. Jakoś nikt wtedy nie pomyślał o usunięciu nawiasów okrągłych na przykład z wyrażenia warunkowego.
- Obsługa wielowątkowości i ipc stanowi obecnie część definicji języka (nawet nie bibliotek).
- Standardowe biblioteki zawierają obsługę sieci.
- ach, i był bym zapomniał, pojawił się garbage collector, co pewnie nie każdemu się spodoba, ale z pewnością jest krokiem w dobrym kierunku.
Czy jest coś co mi się nie podoba? Tak, dotychczas trafiłem na dwa problemy
- Konwencja wymagająca pisania licznych nazw z dużej litery.
Zwyczajnie mi się nie podoba. Ciągłe naciskanie przycisku shift, to najkrótsza droga do RSI - Deklaracja nie używanej zmiennej, jest błędem przerywającym kompilację.
Poważnie utrudnia to testowanie kodu. By sprowokować błąd, wystarczy wy-komentować fragment korzystający z danej zmiennej lub biblioteki. Zmusza to do ustawicznego skakania na początek kodu w celu usuwania, a później ponownego dodawania deklaracji.
Makefile
To taka mała definicja, pozwalająca nauczyć program make, jak kompilować programy w Go. Napisałem ją zanim odkryłem że w dystrybucji znajduje się skrypt gomake, realizujący podobne zadanie
%.8: %.go 8g $< %: %.8 8l -o $@ $<
W ten sposób, aby skompilować helloworld.go, wystarczy napisać make helloworld
Na dziś to wszystko. Jak tylko znajdę chwilę, to postaram się zaprezentować jakiś ciekawszy przykład.
Aktualizacja
- (2010-10-15) Zapraszam do drugiej części, z obiecanym przykładem (Golang, Serwer HTTP)
Etykiety: go, google, linux, programowanie
Red 01:04
Prześlij komentarz