Poznaj Crystal - brata bliźniaka Ruby'ego
Poznajcie Crystal - kompilowany język programowania podobny do Ruby’ego, który dotarł właśnie do wydania 1.0. Pomimo że technologia ta była już w obiegu od kilku lat (powstało kilka wcześniejszych wydań), to najnowsza wersja jest pierwszą, która została uznana za dojrzałą. Co więcej, twórcy chcą, aby ich język był z każdą wersją 1.x stabilny oraz kompatybilny wstecznie - tak żeby nie było żadnych zmian, które mogą ewentualnie popsuć istniejący kod. Ci, którzy będą korzystać z przyszłych wersji Crystala, mogą być również pewni, że ich obecny kod będzie się bez problemu kompilował na produkcji przy kolejnych wersjach. Twórcy nie zamierzają również zmieniać, ani wyrzucać żadnych bibliotek, a standardowa biblioteka będzie ulepszana z myślą o kompatybilności wstecznej.
Crystal 1.0 jest open-source i znajduje się na GitHubie. Warto również zapoznać się z instrukcjami dotyczącymi instalacji, które możecie znaleźć tutaj.
A teraz postaramy się przybliżyć Wam najważniejsze cechy tego języka. Zaczynajmy!
Składnia i system typów
Jak możemy przeczytać na stronie Crystala, jego składnia jest bardzo mocno oparta na składni Ruby’ego - łatwo się więc tam pisze i czyta. Co więcej, jak twierdzą twórcy nowego języka, dodatkową korzyścią będzie fakt, że programiści Ruby’ego będą mieli naprawdę niski próg wejścia.
A oto przykład kodu napisanego w Crystal:
# A very basic HTTP server
require "http/server"
server = HTTP::Server.new do |context|
context.response.content_type = "text/plain"
context.response.print "Hello world, got #{context.request.path}!"
end
puts "Listening on http://127.0.0.1:8080"
server.listen(8080)
Jeśli chodzi o system typów, to Crystal korzysta ze statycznego sprawdzania typów. Oznacza to, że istnieje duża szansa, iż błędy zostaną wyłapane przez kompilator i nie dostaną się do danego programu podczas jego uruchamiania.
Jak możemy przeczytać na stronie języka, Crystal ma też wbudowaną inferencję typów - pozwala to według twórców na utrzymanie porządku w kodzie i eliminuje potrzebę adnotacji typów.
Spójrzcie na następujący przykład:
def shout(x)
# Notice that both Int32 and String respond_to `to_s`
x.to_s.upcase
end
foo = ENV["FOO"]? || 10
typeof(foo) # => (Int32 | String)
typeof(shout(foo)) # => String
Więcej o systemie typów Crystala możecie dowiedzieć się tutaj.
Sprawdzanie null reference i makra
Typy w Crystal nie mogą mieć wartości null. Zmienne, które mogą być nullami, zostały zaprezentowane jako unia typu z nullem. Kompilator poszuka więc automatycznie wszystkich pustych referencji podczas kompilacji.
Nowy język posiada również całkiem mocny system makr, który pozwala m.in. na tworzenie szablonów oraz inspekcję AST. Dzięki niemu możemy również uruchamiać zewnętrzne programy.
Oto przykład ze strony Crystal:
class Object
def has_instance_var?(name) : Bool
{{ @type.instance_vars.map &.name.stringify }}.includes? name
end
end
person = Person.new "John", 30
person.has_instance_var?("name") #=> true
person.has_instance_var?("birthday") #=> false
Współbieżność i zależności
Według twórców Crystal daje nam wątki, które określamy mianem włókien - pomagają one uzyskać współbieżność. Włókna komunikują się ze sobą przy pomocy kanałów (podobnie jest w Go oraz w Clojure) i nie muszą zwracać się ku współdzielonej pamięci.
Wspominając o Go, warto też zauważyć, że wydajność Crystala jest w wielu standardowych benchmarkach na poziomie podobnym do Go.
Jeśli chodzi o zależności, to biblioteki Crystal są spakowane w coś, co określamy jako odłamki (ang. shards). Są one rozprowadzane przy pomocy Gita i nie ma potrzeby tworzenia centralnego repozytorium. Wbudowane komendy ułatwiają z kolei określanie zależności przy pomocy YAML. Można je też łatwo wydobyć z ich repozytoriów.
Oto przykładowy kod:
name: my-project
version: 0.1
license: MIT
crystal: 0.21.0
dependencies:
mysql:
github: crystal-lang/crystal-mysql
version: ~> 0.3.1
Podsumowanie
Z jednej strony wydaje się, że Crystal to ciekawa propozycja, szczególnie dla osób znających Ruby. Z drugiej ciężko może być mu się przebić do głównego nurtu i zyskać znaczący udział na rynku.
Przede wszystkim dlatego, że w obecnych czasach o sile języka programowania decyduje w dużej mierze ekosystem wokół niego.
W przypadku Crystala nie można mówić o wsparciu dużych organizacji, a raczej stosunkowo niedużej grupie zapaleńców. Na tym etapie ekosystem jest w powijakach, gdy porównamy go do bardziej rozwiniętej konkurencji. Dlatego przed Crystalem ciężkie zadanie.