Ruby 3.0 Preview z nowymi funkcjami i lepszą wydajnością
Ruby powstał w 1993 roku, obecnie jest rozwijany jako projekt open source. Korzysta z niego wielu programistów na całym świecie, przede wszystkim do tworzenia stron internetowych. Wrzesień zakończył się ważnymi informacjami dla nich. Twórcy tego języka wydali pierwszą wersję Ruby 3.0 Preview, a także przedstawili informację o planowanym wydaniu oficjalnej wersji w grudniu. Wersja Preview posiada wiele nowych funkcji i ulepszeń wydajności. Jej celem jest większa szybkość, poprawność oraz współbieżność. I od tego zaczniemy.
Ractor – “rubinowy aktor”
Ractor to model-aktor, podobny do współbieżnej abstrakcji. W Ruby 3.0 Preview jest w fazie eksperymentalnej, więc przy tworzeniu Ractora pojawi się ostrzeżenie. Ractor zapewnia wykonywanie równoległe, jednak bez obaw o bezpieczeństwo wątków. Są one bezpieczne, ponieważ ractory nie mogą wspólnie korzystać z normalnych obiektów.
Ograniczenie współużytkowania obiektów jest możliwe przez wprowadzenie do składni Ruby kilku uwag. Ponadto komunikację Ractorów wspiera przekazywanie wiadomości. Poniżej znajduje się przykładowy program, obliczający równolegle liczby pierwsze. Warto zauważyć, że posiada ona dwa Ractory, a także daje wynik nawet dwa razy szybciej od programu sekwencyjnego.
require 'prime' # n.prime? with sent integers in r1, r2 run in parallel r1, r2 = *(1..2).map do Ractor.new do n = Ractor.recv n.prime? end end # send parameters r1.send 2**61 - 1 r2.send 2**61 + 15 # wait for the results of expr1, expr2 p r1.take #=> true p r2.take #=> true
RBS w Ruby 3.0 Preview
Przede wszystkim RBS jest językiem opisującym strukturę programów Ruby. Opisuje typy i definicje klas, a także ich metody, zmienne instancji czy relacje dziedziczenia / mieszania. Celem RBS jest wspieranie typowych wzorców w programach Ruby. Ponadto zezwala na pisanie zaawansowanych typów jak np. metody przeciążenia.
Ruby 3.0 Preview dostarcza specjalny gem rbs, dzięki któremu prostsza jest analiza i przetwarzanie definicji typów napisanych w RBS. Kompilator Just In-Time zwiększa prędkość kompilacji programu o 50 – 500% , w zależności od obciążenia.
Pozostałe nowe funkcje
Wśród innych funkcji, na które warto zwrócić uwagę, jest:
- przypisanie w prawo
fib(10) => x p x #=> 55
- znajdź wzorzec
case ["a", 1, "b", "c", 2, "d", "e", "f", 3] in [*pre, String => x, String => y, *post] p pre #=> ["a", 1] p x #=> "b" p y #=> "c" p post #=> [2, "d", "e", "f", 3] end
- definicja nieskończonej metody.
def square(x) = x * x
- wbudowano Hash#except
h = { a: 1, b: 2, c: 3 } p h.except(:a) #=> {:b=>2, :c=>3}
- Widok pamięci – funkcja eksperymentalna – nowy zestaw C-API do wymiany nieprzetworzonego obszaru pamięci (tablica numeryczna czy obraz bitmapowy) między bibliotekami rozszerzeń.
Co dalej, w Ruby 3.0 Preview 2?
W kolejnym wydaniu wersji preview twórcy chcą włączyć profilowanie typów. Jest to statyczna funkcja analizy typów. W teorii Profiler ma wykonywać dany program, a następnie obserwować jakie typy są przekazywane i zwracane przez metody.