Por qué Crystal? Why Crystal Language?

Post on 11-Jan-2017

1.026 views 0 download

Transcript of Por qué Crystal? Why Crystal Language?

Buenos Aires - Crystal Meetup #1

¿Por qué Crystal? Ary Borenszweigaborenszweig@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ámicodef 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

Brainfuckhttps://github.com/kostya/benchmarks

Eficiente

Tiempo (s) Memoria (MB)

Crystal 15.87 398.1

C++ 17.72 174.5

Python 396.54 724.0

Havlakhttps://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

Threadringhttps://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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 tiposdef 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 nivelnumbers = [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 nivelptr = 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: