Buenos Aires - Crystal Meetup #1
¿Por qué Crystal? Ary Borenszweig
aborenszweig@manas.com.ar
¿Por qué un lenguaje nuevo?
Poca ceremonia
# Crystal
puts “Hello world”
~~~
// Java
public class Main {
public static void main(String[] args) {
System.out.println(“Hola mundo!”);
}
}
Fácil de leer y escribir
Fácil de leer y escribir
def say_hello()
puts(“Hola mundo!”);
end
say_hello();
Fácil de leer y escribir
def say_hello()
puts(“Hola mundo!”)
end
say_hello()
Fácil de leer y escribir
def say_hello()
puts “Hola mundo!”
end
say_hello()
Fácil de leer y escribir
def say_hello
puts “Hola mundo!”
end
say_hello
Apariencia de un lenguaje dinámico
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(100_000)
Eficiente
Eficiente
Tiempo (s) Memoria (MB)
C++ 5.08 1.1
Crystal 6.97 1.3
Ruby 226.86 8.0
Brainfuck
https://github.com/kostya/benchmarks
Eficiente
Tiempo (s) Memoria (MB)
Crystal 15.87 398.1
C++ 17.72 174.5
Python 396.54 724.0
Havlak
https://github.com/kostya/benchmarks
Eficiente
Tiempo (s) Memoria (MB)
Crystal 0.59 3.3
Go 1.43 2.3
Erlang 1.89 17.1
Ruby 41.73 30.0
Threadring
https://github.com/kostya/crystal-benchmarks-game
Eficiente
Tiempo (relativo)
Java 1.8.0_66 1.00
Crystal 1.58
Ruby MRI 2.3 47.59
Are we fast yet?
http://stefan-marr.de/downloads/crystal.html
Chequeo de tipos
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(100_000)
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”)
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”) # Error: no overload matches
# `Int32#<` with type String
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”) # Error: no overload matches
# `Int32#<` with type String
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”) # Error: no overload matches
# `Int32#<` with type String
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(100_000)
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n : Int)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(100_000)
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n : Int)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”)
Chequeo de tipos
def prime?(n)
(2..n).all? { |i| n % i != 0 }
end
def sexy_primes(n : Int)
(9..n).map { |i| {i - 6, i} }
.select { |i| i.all? { prime?(i) } }
end
puts sexy_primes(“Ups”) # Error: no overload matches
# `sexy_primes` with type String
Alto nivel
numbers = [1, 2, 3, 4]
puts numbers.map { |x| x + 10 } # => [11, 12, 13, 14]
puts numbers[0] + numbers[-1] # => 5
phones = {
“Ary” => “15512312312”,
“Brian” => “1545645645”,
“Juan” => “1578978978”,
}
puts phones[“Brian”] # => “1545645645”
Bajo nivel
ptr = Pointer(UInt8).malloc(20)
ptr.value = 10_u8
puts ptr # => Pointer(UInt8)@0x109303e00
a = 1
ptr = pointerof(a)
ptr.value = 2
puts a # => 2
buffer = uninitialized UInt8[1024]
Bajo nivel
lib LibC
fun rand : LibC::Int
end
puts LibC.rand # => 16807
¿Por qué un lenguaje nuevo?
❖ Poca ceremonia
❖ Fácil de leer y escribir
❖ Apariencia de un lenguaje dinámico
❖ Eficiente
❖ Chequeo de tipos
❖ Alto y bajo nivel
❖ => Felicidad!
¿Para qué sirve?
Aplicaciones de consola
❖ tlcr: https://github.com/porras/tlcr
❖ crul: https://github.com/porras/crul
❖ vicr: https://github.com/veelenga/vicr
❖ shards: https://github.com/ysbaddaden/shards
Emuladores
❖ nes.cr: https://github.com/romeroadrian/nes.cr
❖ rcpu: https://github.com/ddfreyne/rcpu
Juegos
❖ crsfml: https://github.com/BlaXpirit/crsfml
❖ crystal-gl: https://github.com/ggiraldez/crystal-gl
Páginas web
❖ crystalshards: https://github.com/zamith/
crystalshards
❖ play.crystal-lang.org: https://github.com/jhass/carc.in
Bots IRC
❖ DeBot: https://github.com/jhass/DeBot
Compiladores
❖ Crystal: https://github.com/manastech/crystal
¡Gracias!
Ary Borenszweig
email: aborenszweig@manas.com.ar
@asteritetwitter:

Por qué Crystal? Why Crystal Language?

  • 1.
    Buenos Aires -Crystal Meetup #1 ¿Por qué Crystal? Ary Borenszweig aborenszweig@manas.com.ar
  • 2.
    ¿Por qué unlenguaje nuevo?
  • 3.
    Poca ceremonia # Crystal puts“Hello world” ~~~ // Java public class Main { public static void main(String[] args) { System.out.println(“Hola mundo!”); } }
  • 4.
    Fácil de leery escribir
  • 5.
    Fácil de leery escribir def say_hello() puts(“Hola mundo!”); end say_hello();
  • 6.
    Fácil de leery escribir def say_hello() puts(“Hola mundo!”) end say_hello()
  • 7.
    Fácil de leery escribir def say_hello() puts “Hola mundo!” end say_hello()
  • 8.
    Fácil de leery escribir def say_hello puts “Hola mundo!” end say_hello
  • 9.
    Apariencia de unlenguaje dinámico def prime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(100_000)
  • 10.
  • 11.
    Eficiente Tiempo (s) Memoria(MB) C++ 5.08 1.1 Crystal 6.97 1.3 Ruby 226.86 8.0 Brainfuck https://github.com/kostya/benchmarks
  • 12.
    Eficiente Tiempo (s) Memoria(MB) Crystal 15.87 398.1 C++ 17.72 174.5 Python 396.54 724.0 Havlak https://github.com/kostya/benchmarks
  • 13.
    Eficiente Tiempo (s) Memoria(MB) Crystal 0.59 3.3 Go 1.43 2.3 Erlang 1.89 17.1 Ruby 41.73 30.0 Threadring https://github.com/kostya/crystal-benchmarks-game
  • 14.
    Eficiente Tiempo (relativo) Java 1.8.0_661.00 Crystal 1.58 Ruby MRI 2.3 47.59 Are we fast yet? http://stefan-marr.de/downloads/crystal.html
  • 15.
  • 16.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(100_000)
  • 17.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”)
  • 18.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”) # Error: no overload matches # `Int32#<` with type String
  • 19.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”) # Error: no overload matches # `Int32#<` with type String
  • 20.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”) # Error: no overload matches # `Int32#<` with type String
  • 21.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(100_000)
  • 22.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(100_000)
  • 23.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”)
  • 24.
    Chequeo de tipos defprime?(n) (2..n).all? { |i| n % i != 0 } end def sexy_primes(n : Int) (9..n).map { |i| {i - 6, i} } .select { |i| i.all? { prime?(i) } } end puts sexy_primes(“Ups”) # Error: no overload matches # `sexy_primes` with type String
  • 25.
    Alto nivel numbers =[1, 2, 3, 4] puts numbers.map { |x| x + 10 } # => [11, 12, 13, 14] puts numbers[0] + numbers[-1] # => 5 phones = { “Ary” => “15512312312”, “Brian” => “1545645645”, “Juan” => “1578978978”, } puts phones[“Brian”] # => “1545645645”
  • 26.
    Bajo nivel ptr =Pointer(UInt8).malloc(20) ptr.value = 10_u8 puts ptr # => Pointer(UInt8)@0x109303e00 a = 1 ptr = pointerof(a) ptr.value = 2 puts a # => 2 buffer = uninitialized UInt8[1024]
  • 27.
    Bajo nivel lib LibC funrand : LibC::Int end puts LibC.rand # => 16807
  • 28.
    ¿Por qué unlenguaje nuevo? ❖ Poca ceremonia ❖ Fácil de leer y escribir ❖ Apariencia de un lenguaje dinámico ❖ Eficiente ❖ Chequeo de tipos ❖ Alto y bajo nivel ❖ => Felicidad!
  • 29.
  • 30.
    Aplicaciones de consola ❖tlcr: https://github.com/porras/tlcr ❖ crul: https://github.com/porras/crul ❖ vicr: https://github.com/veelenga/vicr ❖ shards: https://github.com/ysbaddaden/shards
  • 31.
  • 32.
    Juegos ❖ crsfml: https://github.com/BlaXpirit/crsfml ❖crystal-gl: https://github.com/ggiraldez/crystal-gl
  • 33.
    Páginas web ❖ crystalshards:https://github.com/zamith/ crystalshards ❖ play.crystal-lang.org: https://github.com/jhass/carc.in
  • 34.
    Bots IRC ❖ DeBot:https://github.com/jhass/DeBot
  • 35.
  • 36.