Crystal est un langage de programmation orienté objet de haut niveau , à usage général , conçu et développé par Ary Borenszweig, Juan Wajnerman, Brian Cardiff et plus de 400 contributeurs. Avec une syntaxe inspirée du langage Ruby , c'est un langage compilé avec vérification de type statique , mais la spécification des types de variables ou des arguments de méthode n'est généralement pas nécessaire. Les types sont résolus par un algorithme avancé d'inférence de type global. Crystal est actuellement en développement actif. Il est publié en tant que logiciel libre et open source sous la licence Apache version 2.0.
Histoire
Les travaux sur le langage ont commencé en juin 2011, dans le but de fusionner l'élégance et la productivité de Ruby avec la vitesse, l'efficacité et la sécurité de type d'un langage compilé. Initialement nommé Joy , il a été rapidement renommé Crystal .
Le compilateur Crystal a d'abord été écrit en Ruby, mais réécrit plus tard en Crystal, devenant ainsi auto-hébergé , à partir de novembre 2013. [ La première version officielle a été publiée en juin 2014. En juillet 2016, Crystal a rejoint l' index TIOBE .
Description
Bien que ressemblant au langage Ruby dans la syntaxe, Crystal compile en code natif beaucoup plus efficace en utilisant un backend LLVM , au prix d'exclure les aspects dynamiques de Ruby. L'inférence de type globale avancée utilisée par le compilateur Crystal, combinée aux types d'union , lui donne plus l'impression d'être un langage de script de plus haut niveau que de nombreux autres langages de programmation comparables. Il dispose d'un ramasse-miettes automatisé et offre un collecteur Boehm . Crystal possède un système de macros et prend en charge les génériques ainsi que la surcharge des méthodes et des opérateurs. Son modèle de concurrence s'inspire des processus séquentiels communicants (CSP) et implémente des fibres et des canaux légers (pour la communication interfibres), inspirés de Go .
Exemples
Bonjour le monde
Voici la manière la plus simple d'écrire le programme Hello World dans Crystal :
met "Bonjour le monde !"
Le même que dans Ruby.
Ou en utilisant un style de programmation orienté objet :
classe Greeter def initialize ( @name : String ) fin def salute met "Bonjour #{ @name } !" fin fin g = Greeter . nouveau ( "monde" ) g . salute
Serveur HTTP
nécessite "http/server" server = HTTP :: Server . new do | context | context . response . content_type = "text/plain" context . response . print "Bonjour tout le monde ! L'heure est #{ Time . local } " end serveur . bind_tcp ( "0.0.0.0" , 8080 ) met "Écoute sur http://0.0.0.0:8080" serveur . écoute
Serveur d'écho TCP
nécessite "socket" def handle_client ( client ) message = client . obtient client . met message fin serveur = TCPServer.new ( " localhost " , 1234 ) tandis que client = serveur.accept ? spawn handle_client ( client ) fin
Inférence de type et types d'union
Le code suivant définit un tableau contenant différents types sans ancêtre commun utilisable. Crystal crée automatiquement un type d'union à partir des types des éléments individuels.
desired_things = [ :unicorns , "butterflies" , 1_000_000 ] p typeof ( desired_things . first ) # typeof renvoie le type au moment de la compilation, ici (Symbol | String | Int32) p desired_things . first . class # la méthode de classe renvoie le type d'exécution, ici Symbol
Concurrence
Les canaux peuvent être utilisés pour communiquer entre les fibres, qui sont initiées à l'aide du mot-clé spawn.
canal = Canal ( Int32 ) . nouveau spawn do met "Avant le premier envoi" channel . send ( 1 ) met "Avant le deuxième envoi" channel . send ( 2 ) end met la valeur "Avant la première réception" = canal . receive met la valeur # => 1 met la valeur "Avant la deuxième réception" = canal . receive met la valeur # => 2
Lectures complémentaires
- St. Laurent, Simon; Balbaert, Ivo (1er février 2019), Programming Crystal (éd. P1.0), Pragmatic Bookshelf , ISBN 978-1-68050-286-2
- Dietrich, George; Bernal, Guilherme (27 mai 2022), Programmation Crystal , Packt Publishing , ISBN 978-1801818674
- Wartala, Ramon (mars 2016), « Die Ruby-artige Programmiersprache Crystal » [Le langage de programmation de type Ruby Crystal], Linux Magazin (en allemand), n° 3/2016, ISSN 1432-640X