Bylo zveřejněno vydání programovacího jazyka Crystal 1.5, jehož vývojáři se snaží spojit pohodlí vývoje v jazyce Ruby s vysokým aplikačním výkonem charakteristickým pro jazyk C. Syntaxe Crystal je blízká, ale není plně kompatibilní s Ruby, ačkoli některé Ruby programy běží bez úprav. Kód kompilátoru je napsán v Crystal a distribuován pod licencí Apache 2.0.
Jazyk používá statickou kontrolu typu, implementovanou bez nutnosti explicitně specifikovat typy proměnných a argumenty metod v kódu. Programy Crystal jsou kompilovány do spustitelných souborů, přičemž makra jsou vyhodnocována a kód je generován v době kompilace. V programech Crystal je možné propojit vazby napsané v C. Paralelizace spouštění kódu se provádí pomocí klíčového slova „spawn“, které umožňuje spouštět úlohu na pozadí asynchronně, bez blokování hlavního vlákna, ve formě odlehčených vláken nazývaných vlákna.
Standardní knihovna poskytuje velkou sadu běžných funkcí, včetně nástrojů pro zpracování CSV, YAML a JSON, komponent pro vytváření HTTP serverů a podpory WebSocket. Při vývoji je vhodné použít příkaz „crystal play“, který vygeneruje webové rozhraní (standardně localhost:8080) pro interaktivní spouštění kódu v jazyce Crystal.
Hlavní změny:
- Kompilátor nyní kontroluje, zda se názvy argumentů v implementaci a definici abstraktní metody shodují. Pokud se názvy neshodují, vydá se varování: abstract class FooAbstract abstract def foo(number : Int32) : Nil end class Foo < FooAbstract def foo(name : Int32) : Nil p name end end 6 | def foo(name : Int32) : Nil ^— Varování: poziční parametr 'name' odpovídá parametru 'number' přepsané metody FooAbstract#foo(number : Int32), která má jiný název a může ovlivnit předávání pojmenovaných argumentů.
- Při přiřazování proměnné argumentu netypované metody je argument nyní omezen na typ této proměnné. class Foo @x : Int64 def initialize(x) @x = x # parametr x bude nabídnut typu @x end end
- Anotace lze přidat k parametrům metody nebo makra. def foo(@[MaybeUnused] x); end # OK
- Přidána podpora pro použití konstant jako indexů a názvů v n-ticích. KEY = "s" foo = {s: "String", n: 0} puts foo[KEY].size
- Rozhraní File API bylo aktualizováno o nové metody File#delete? a Dir#delete? pro mazání souborů a adresářů. Tyto metody vracejí hodnotu false, pokud soubor nebo adresář neexistuje.
- Metoda File.tempfile byla posílena, aby se zabránilo přítomnosti znaků null v řetězcích tvořících název souboru.
- Přidána proměnná prostředí NO_COLOR, která zakazuje zvýrazňování barev ve výstupu kompilátoru a interpretu.
- Výrazně vylepšený výkon v režimu tlumočníka.
Zdroj: opennet.ru
