Crystal is a
high-level general-purpose,
object-oriented programming
Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impl ...
language, designed and developed by Ary Borenszweig, Juan Wajnerman, Brian Cardiff and more than 400 contributors.
With syntax inspired by the language
Ruby
Ruby is a pinkish-red-to-blood-red-colored gemstone, a variety of the mineral corundum ( aluminium oxide). Ruby is one of the most popular traditional jewelry gems and is very durable. Other varieties of gem-quality corundum are called sapph ...
,
it is a
compiled language
Compiled language categorizes a programming language as used with a compiler and generally implies not used with an interpreter. But, since any language can theoretically be compiled or interpreted the term lacks clarity. In practice, for some lan ...
with
static type-checking, but specifying the types of variables or method arguments is generally unneeded. Types are resolved by an advanced global
type inference
Type inference, sometimes called type reconstruction, refers to the automatic detection of the type of an expression in a formal language. These include programming languages and mathematical type systems, but also natural languages in some bran ...
algorithm.
Crystal
is currently in active development. It is released as
free and open-source software
Free and open-source software (FOSS) is software available under a license that grants users the right to use, modify, and distribute the software modified or not to everyone free of charge. FOSS is an inclusive umbrella term encompassing free ...
under the
Apache License
The Apache License is a permissive free software license written by the Apache Software Foundation (ASF). It allows users to use the software for any purpose, to distribute it, to modify it, and to distribute modified versions of the software ...
version 2.0.
History
Work on the language began in June 2011,
with the aim of merging the elegance and productivity of Ruby with the speed, efficiency, and type safety of a compiled language.
Initially named ''Joy'', it was quickly renamed to ''Crystal''.
The Crystal compiler was first written in Ruby, but later rewritten in Crystal, thus becoming
self-hosting, .
The first official version was released in June 2014.
In July 2016, Crystal joined the
TIOBE index.
Description
Although resembling the Ruby language in syntax, Crystal compiles to much more efficient native code using an
LLVM
LLVM, also called LLVM Core, is a target-independent optimizer and code generator. It can be used to develop a Compiler#Front end, frontend for any programming language and a Compiler#Back end, backend for any instruction set architecture. LLVM i ...
backend, at the cost of precluding the dynamic aspects of Ruby. The advanced global type inference used by the Crystal compiler, combined with
union types, gives it more the feel of a higher-level scripting language than many other comparable programming languages. It has automated garbage collection and offers a
Boehm collector. Crystal possesses a macro system and supports generics as well as method and operator overloading. Its concurrency model is inspired by
communicating sequential processes
In computer science, communicating sequential processes (CSP) is a formal language for describing patterns of interaction in concurrent systems. It is a member of the family of mathematical theories of concurrency known as process algebras, or p ...
(CSP) and implements lightweight fibers and channels (for interfiber communication), inspired by
Go.
Examples
Hello World
This is the simplest way to write the
Hello World program in Crystal:
puts "Hello World!"
The same as in Ruby.
Or using an
object-oriented programming
Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impl ...
style:
class Greeter
def initialize(@name : String)
end
def salute
puts "Hello #!"
end
end
g = Greeter.new("world")
g.salute
HTTP server
require "http/server"
server = HTTP::Server.new do , context,
context.response.content_type = "text/plain"
context.response.print "Hello world! The time is #"
end
server.bind_tcp("0.0.0.0", 8080)
puts "Listening on http://0.0.0.0:8080"
server.listen
TCP echo server
require "socket"
def handle_client(client)
message = client.gets
client.puts message
end
server = TCPServer.new("localhost", 1234)
while client = server.accept?
spawn handle_client(client)
end
Type inference and union types
The following code defines an array containing different types with no usable common ancestor. Crystal automatically creates a union type out of the types of the individual items.
desired_things = unicorns, "butterflies", 1_000_000p typeof(desired_things.first) # typeof returns the compile time type, here (Symbol , String , Int32)
p desired_things.first.class # the class method returns the runtime type, here Symbol
Concurrency
Channels can be used to communicate between fibers, which are initiated using the keyword
spawn
.
channel = Channel(Int32).new
spawn do
puts "Before first send"
channel.send(1)
puts "Before second send"
channel.send(2)
end
puts "Before first receive"
value = channel.receive
puts value # => 1
puts "Before second receive"
value = channel.receive
puts value # => 2
Adoption
In 2020, it was reported that the infotainment units in vehicles produced by
Nikola Corporation were written in Crystal. Much of the backend of the
Kagi search engine is written with Crystal.
Further reading
*
*
*
References
External links
*
Documentation* {{Github, crystal-lang
/r/crystal_programming subredditCrystal Announcements
Programming languages
Multi-paradigm programming languages
Object-oriented programming languages
Concurrent programming languages
Statically typed programming languages
Cross-platform free software
Cross-platform software
Free and open source compilers
Software using the Apache license
Programming languages created in 2014
2014 software