Por qué Crystal? Why Crystal Language?

1,031 views

Published on

Ary Borenszweig, uno de los creadores de Crystal, presenta una introducción a este nuevo lenguaje, usos y aplicaciones.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,031
On SlideShare
0
From Embeds
0
Number of Embeds
831
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Por qué Crystal? Why Crystal Language?

  1. 1. Buenos Aires - Crystal Meetup #1 ¿Por qué Crystal? Ary Borenszweig aborenszweig@manas.com.ar
  2. 2. ¿Por qué un lenguaje nuevo?
  3. 3. Poca ceremonia # Crystal puts “Hello world” ~~~ // Java public class Main { public static void main(String[] args) { System.out.println(“Hola mundo!”); } }
  4. 4. Fácil de leer y escribir
  5. 5. Fácil de leer y escribir def say_hello() puts(“Hola mundo!”); end say_hello();
  6. 6. Fácil de leer y escribir def say_hello() puts(“Hola mundo!”) end say_hello()
  7. 7. Fácil de leer y escribir def say_hello() puts “Hola mundo!” end say_hello()
  8. 8. Fácil de leer y escribir def say_hello puts “Hola mundo!” end say_hello
  9. 9. 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)
  10. 10. Eficiente
  11. 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. 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. 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. 14. 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
  15. 15. Chequeo de tipos
  16. 16. 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)
  17. 17. 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”)
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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)
  22. 22. 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)
  23. 23. 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”)
  24. 24. 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
  25. 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. 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. 27. Bajo nivel lib LibC fun rand : LibC::Int end puts LibC.rand # => 16807
  28. 28. ¿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!
  29. 29. ¿Para qué sirve?
  30. 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. 31. Emuladores ❖ nes.cr: https://github.com/romeroadrian/nes.cr ❖ rcpu: https://github.com/ddfreyne/rcpu
  32. 32. Juegos ❖ crsfml: https://github.com/BlaXpirit/crsfml ❖ crystal-gl: https://github.com/ggiraldez/crystal-gl
  33. 33. Páginas web ❖ crystalshards: https://github.com/zamith/ crystalshards ❖ play.crystal-lang.org: https://github.com/jhass/carc.in
  34. 34. Bots IRC ❖ DeBot: https://github.com/jhass/DeBot
  35. 35. Compiladores ❖ Crystal: https://github.com/manastech/crystal
  36. 36. ¡Gracias! Ary Borenszweig email: aborenszweig@manas.com.ar @asteritetwitter:

×