Wydano język programowania Crystal 1.0. Wydanie to jest uznawane za pierwszy znaczący krok, podsumowujący 8 lat pracy oraz oznaczający stabilizację języka i jego gotowość do użycia w projektach roboczych. W gałęzi 1.x zapewniana będzie wsteczna kompatybilność oraz gwarancja braku zmian w języku i standardowej bibliotece, które mogłyby negatywnie wpłynąć na kompilację i działanie istniejącego kodu.
Wydania 1.0.y będą obejmować jedynie poprawki błędów, natomiast wersje 1.x.0 będą oferować nową funkcjonalność oraz istotne zmiany, zachowując jednocześnie kompatybilność z kodem. Nowe pomysły oraz potencjalnie niekompatybilne zmiany będą rozwijane w osobnej gałęzi, na podstawie której zostanie w przyszłości utworzone wydanie Crystal 2.0. Niektóre możliwości Crystal 1.0 ogłoszone zostały jako wstępne i mimo że są dostępne w gałęzi 1.0, nie są objęte oficjalnym wsparciem. Wśród tych możliwości znajdują się jednowątkowość, praca na platformie Windows oraz użycie na systemach z procesorami ARM.
Przypomnijmy, że twórcy Crystal starają się połączyć wygodę tworzenia w języku Ruby z wysoką wydajnością aplikacji charakterystyczną dla języka C. Składnia Crystal jest podobna do języka Ruby, lecz nie jest w pełni z nim kompatybilna, mimo że niektóre programy ruby działają bez przekształceń. Kod kompilatora napisany jest w języku Crystal i jest rozpowszechniany na licencji Apache 2.0.
W języku zastosowano statyczne sprawdzanie typów, realizowane bez konieczności jawnego wskazywania typów zmiennych oraz argumentów metod w kodzie. Programy w Crystal kompilowane są do plików wykonywalnych, przy obliczaniu makr i generacji kodu w trakcie kompilacji. W programach w języku Crystal możliwe jest dołączenie bindów napisanych w języku C. Równoległe wykonywanie kodu odbywa się za pomocą słowa kluczowego „spawn”, które pozwala na uruchomienie zadania w tle w trybie asynchronicznym, nie blokując głównego wątku, w postaci lekkich wątków, nazywanych fibrami (Fiber).
Standardowa biblioteka oferuje szeroki zestaw typowych funkcji, w tym narzędzia do przetwarzania CSV, YAML i JSON, komponenty do tworzenia serwerów HTTP oraz wsparcie dla WebSocket. W procesie rozwoju wygodnie jest korzystać z polecenia „crystal play”, które generuje interfejs webowy (domyślnie localhost:8080) do interaktywnego wykonywania kodu w języku Crystal.
Główne zmiany:
- W krotkach dozwolone jest indeksowane odwoływanie się do elementów różnych typów, ponieważ kompilator ma informacje o tym, jakiego typu jest każdy element. Na przykład: tuple = {1, „hello”, ‘x’} v = tuple[0..1] # zwróci {1, „hello”} typeof(v) # => Tuple(Int32, String)
- W literałach łańcuchowych i znakowych zabronione jest użycie skrótów zastępczych w sekwencjach ucieczki Unicode, takich jak „\uD834”. Do kodowania dowolnych wartości należy używać notacji „\x”.
- W standardowej bibliotece usunięto dużą liczbę definicji, makr i metod, które wcześniej były oznaczone jako przestarzałe. W tym metody Set, StaticArray#[], YAML.new, HTTP::Request, HTTP::WebSocket, Hash#delete_if, Process#kill itp.
- W makrach getter i property teraz wymagane jest wskazanie zwracanego typu.
- Domyślna metoda zaokrąglania została zmieniona na TIES_EVEN („zaokrąglanie bankierskie”, do najbliższej liczby całkowitej, a w przypadku równorzędnych sytuacji do najbliższej liczby parzystej). Do Number#round dodano parametr RoundingMode, który pozwala wybrać metodę zaokrąglania. Wśród dostępnych metod znajduje się: TIES_EVEN, TIES_AWAY, TO_ZERO, TO_POSITIVE, TO_NEGATIVE.
- W kolekcjach zapewniono działanie Enumerable#flat_map i Iterator#flat_map z elementami mieszanych typów.
- Podczas serializacji sekwencji Enum teraz używane jest przedstawienie w formie łańcuchów ze znakiem podkreślenia.
- Typy zdefiniowane w module XML zostały przetłumaczone z użycia struct na class.
- Z względów bezpieczeństwa zaprzestano dekodowania nazw Cookie oraz kodowania i dekodowania wartości Cookie (przekodowanie spoczywa na ramionach frameworków i aplikacji). Metoda HTTP::Cookies.from_headers została podzielona na dwie wersje dla serwerów i klientów.
Źródło: opennet.ru
