SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
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:

Más contenido relacionado

Similar a Por qué Crystal? Why Crystal Language?

Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介
Wen-Tien Chang
 

Similar a Por qué Crystal? Why Crystal Language? (20)

Python slide
Python slidePython slide
Python slide
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Ruby on rails presentation
Ruby on rails presentationRuby on rails presentation
Ruby on rails presentation
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Python Basic
Python BasicPython Basic
Python Basic
 
Perl6 a whistle stop tour
Perl6 a whistle stop tourPerl6 a whistle stop tour
Perl6 a whistle stop tour
 
Perl6 a whistle stop tour
Perl6 a whistle stop tourPerl6 a whistle stop tour
Perl6 a whistle stop tour
 
Intermediate Swift Language by Apple
Intermediate Swift Language by AppleIntermediate Swift Language by Apple
Intermediate Swift Language by Apple
 
Retos de Programación en Python
Retos de Programación en PythonRetos de Programación en Python
Retos de Programación en Python
 
An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)
 
Bulletproofing your foot for Kotlin
Bulletproofing your foot for KotlinBulletproofing your foot for Kotlin
Bulletproofing your foot for Kotlin
 
Ruby Intro {spection}
Ruby Intro {spection}Ruby Intro {spection}
Ruby Intro {spection}
 
Swift School #1
Swift School #1Swift School #1
Swift School #1
 
Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介
 
2Bytesprog2 course_2014_c1_sets
2Bytesprog2 course_2014_c1_sets2Bytesprog2 course_2014_c1_sets
2Bytesprog2 course_2014_c1_sets
 
2Bytesprog2 course_2014_c1_sets
2Bytesprog2 course_2014_c1_sets2Bytesprog2 course_2014_c1_sets
2Bytesprog2 course_2014_c1_sets
 
Swift Study #7
Swift Study #7Swift Study #7
Swift Study #7
 
Introduction to Perl Best Practices
Introduction to Perl Best PracticesIntroduction to Perl Best Practices
Introduction to Perl Best Practices
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Último (20)

Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 

Por qué Crystal? Why Crystal Language?

  • 1. Buenos Aires - Crystal Meetup #1 ¿Por qué Crystal? Ary Borenszweig aborenszweig@manas.com.ar
  • 2. ¿Por qué un lenguaje 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 leer y escribir
  • 5. Fácil de leer y escribir def say_hello() puts(“Hola mundo!”); end say_hello();
  • 6. Fácil de leer y escribir def say_hello() puts(“Hola mundo!”) end say_hello()
  • 7. Fácil de leer y escribir def say_hello() puts “Hola mundo!” end say_hello()
  • 8. Fácil de leer y escribir def say_hello puts “Hola mundo!” end say_hello
  • 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)
  • 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_66 1.00 Crystal 1.58 Ruby MRI 2.3 47.59 Are we fast yet? http://stefan-marr.de/downloads/crystal.html
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 fun rand : LibC::Int end puts LibC.rand # => 16807
  • 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!
  • 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
  • 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