È stato rilasciato il linguaggio di programmazione Crystal 1.0. Questa versione è segnata come il primo rilascio significativo che riassume otto anni di lavoro e segna la stabilizzazione del linguaggio, rendendolo pronto per l'uso in progetti reali. Nella branch 1.x verrà mantenuta la retrocompatibilità e si garantisce l'assenza di modifiche al linguaggio e alla libreria standard che possano influenzare negativamente la compilazione e il funzionamento del codice esistente.
Le versioni 1.0.y includeranno solo correzioni e versioni 1.x.0 offriranno nuove funzionalità e cambiamenti significativi, mantenendo la compatibilità con il codice esistente. Nuove idee e potenziali modifiche non compatibili verranno sviluppate in una branch separata, dalla quale in seguito sarà formato il rilascio di Crystal 2.0. Alcune funzionalità di Crystal 1.0 sono dichiarate come preliminari e, nonostante siano presenti nella branch 1.0, non sono sotto supporto ufficiale. Tra queste funzionalità ci sono la monothreading, l'operatività sulla piattaforma Windows, e l'uso su sistemi con processori ARM.
Ricordiamo che gli sviluppatori di Crystal cercano di unire la facilità di sviluppo del linguaggio Ruby con l'alta performance delle applicazioni tipica del linguaggio C. La sintassi di Crystal è simile a quella di Ruby, ma non completamente compatibile; alcune applicazioni scritte in Ruby possono essere eseguite senza modifiche. Il codice del compilatore è scritto in Crystal e distribuito con licenza Apache 2.0.
Il linguaggio utilizza un controllo statico dei tipi, implementato senza necessità di specificare esplicitamente i tipi delle variabili e degli argomenti dei metodi nel codice. I programmi in Crystal vengono compilati in file eseguibili, con calcolo di macro e generazione di codice durante la compilazione. Nei programmi scritti in Crystal è possibile collegare binding scritti in C. La parallelizzazione dell'esecuzione del codice viene realizzata tramite la parola chiave «spawn», che consente di avviare un'attività in background in modalità asincrona, senza bloccare il thread principale, sotto forma di thread leggeri noti come fiber.
La libreria standard offre un ampio set di funzioni comuni, inclusi strumenti per la gestione di CSV, YAML e JSON, componenti per la creazione di server HTTP e supporto WebSocket. Durante lo sviluppo, è utile utilizzare il comando «crystal play» che crea un'interfaccia web (per impostazione predefinita localhost:8080) per l'esecuzione interattiva del codice in Crystal.
Principali modifiche:
- Nei tuple è consentito l'accesso indicizzato a elementi di tipi diversi, poiché il compilatore ha informazioni sul tipo di ciascun elemento. Ad esempio: tuple = {1, "hello", 'x'} v = tuple[0..1] # restituirà {1, "hello"} typeof(v) # => Tuple(Int32, String)
- Negli string e character literals è vietato l'uso di abbreviazioni surrogati nelle sequenze di escape Unicode, come «\uD834». Per codificare valori arbitrari, utilizzare la notazione «\x».
- Nella libreria standard è stata rimossa una grande quantità di definizioni, macro e metodi precedentemente contrassegnati come deprecati. Inclusi i metodi Set, StaticArray#[], YAML.new, HTTP::Request, HTTP::WebSocket, Hash#delete_if, Process#kill, ecc.
- Nei getter e nelle property delle macro è ora obbligatorio specificare il tipo di ritorno.
- Il metodo di arrotondamento predefinito è stato cambiato in TIES_EVEN ("arrotondamento del banchiere", al numero intero più vicino, e nei casi di confine al numero pari più vicino). È stato aggiunto il parametro RoundingMode a Number#round, che consente di scegliere il metodo di arrotondamento. I metodi disponibili includono: TIES_EVEN, TIES_AWAY, TO_ZERO, TO_POSITIVE, TO_NEGATIVE.
- Nelle collezioni è garantito il funzionamento di Enumerable#flat_map e Iterator#flat_map con elementi di tipi misti.
- Nella serializzazione delle sequenze Enum ora viene utilizzata la rappresentazione in forma di stringhe con sottolineatura.
- I tipi definiti nel modulo XML sono stati convertiti da struct a class.
- Per motivi di sicurezza, la decodifica dei nomi dei Cookie è stata interrotta, così come la codifica e decodifica dei valori dei Cookie (la ricodifica è ora responsabilità dei framework e delle applicazioni). Il metodo HTTP::Cookies.from_headers è stato diviso in due varianti per server e clienti.
Fonte: opennet.ru
