Upload
eduardo-diaz
View
156
Download
1
Embed Size (px)
Citation preview
Esos Raros Lenguajes Nuevos
9 Desafíos en 9 Lenguajes de Programación Primer Avance
9D9L
https://github.com/lnds/9d9l
http://www.lnds.net/blog/lnds/2016/1/9/esos-raros-lenguajes-nuevos
¿Por qué?
“Y si trabajas al pedoy estás haciendo algo nuevo, adelante!”
“For many developers, the one-language notion is a sign of lack of professionalism […] The point here is that programming languages do affect the way you think about programming, and learning new languages can do a lot to help you think about solving problems in different ways” — Martin Fowler
“Temo al hombre de un sólo
lenguaje de programación”
Santo Tomás de Aquino
1252 DC
El programador políglota
Todos somos programadores políglotas
Java Script
SQL
HTML
XML
JAVA
Alan Perlis
When Someone says, “I want a programming language in which I need only say what I want done”, give him a lollipop.
Perlis Languages
A language that doesn’t affect the way you think about programming is not
worth knowing. — Alan Perlis
Cómo aprender un lenguaje de
programación
ZX-81 Basic 1981
10 PRINT “INGRESE TEMPERATURA EN CELSIUS:” 20 INPUT C 30 LET F = (C * 9.0/5.0) + 32 40 PRINT “LA TEMPERATURA EN FARENHEIT ES:"+F
KRUN
Todo programa arranca con
bugshttp://www.worldofspectrum.org/
ZX81BasicProgramming/
ZX81-FORTH BY DAVID HUSBAND COPYRIGHT (c) 1983
: CTOF 9 * 5 / 32 + . ; OK
: FTOC 32 - 5 * 9 / . ; OK
77 FTOC
25 OK
FORTH
Reflection
Extensibility and Modularity
Concatenative Programming (Monoid)
Symetry (Invariance):
Everything is a Word
Word Executes
Word receives parameters exactly the same way another word
1985 Raftor
Programación Estructurada
Basado en FORTRAN
Nadie más en el mundo usa esto
PLP/PLOM
Pascal
Modula-2
Scheme
C
Prolog
Assembler IBM 360!
Ejemplo 1
How to solve it
“In order to translate a sentence from English into French two things are necessary. First, we must understand thoroughly the English sentence. Second, we must be familiar with the forms of expression peculiar to the French language.
The situation is very similar when we attempt to express in mathematical symbols a condition proposed in words. First, we must understand thoroughly the condition. Second, we must be familiar with the forms of mathematical expression.”
— G. Polya
¿Cómo aprender a programar?
PROGRAMANDO
Project EulerMatemáticas y Programación
"Project Euler exists to encourage, challenge, and
develop the skills and enjoyment of anyone with an
interest in the fascinating world of mathematics."
https://projecteuler.net
Problemas Project Euler
Multiplos de 3 y 5: Encontrar la suma de todos los múltiplos de 3 y 5 menores a 1.000
Encuentre la suma de los números de Fibonacci pares que no excedan los 4.000.000
¿Cuál es el número primo 10.001?
Mi Desafío Personal
Mi Desafío Personal
«Estos son los mejores tiempos para ser desarrollador, pero también son los peores tiempos para ser desarrollador. Como dice Jano González, parece que tenemos un nuevo paradigma: "Hacker News Driven Development".
Todas las semanas, o quizás todos los días aparecen nuevos Frameworks, Lenguajes de Programación, Tecnologías en Hacker News y las nuevas generaciones de desarrolladores, afectadas por el síndrome de déficit atencional corren a re implementar su último proyecto con la herramienta que tenga más likes.»
Mi Desafío Personal
«Pero, como dice Charly:
ya no quiero criticar,sólo quiero ser un enfermero
Así que me propongo aliviar un poco esa angustia de algunos desarrolladores que nos saben si vale la pena aprender alguno de esos nuevos lenguajes que están apareciendo o re apareciendo por todos lados.
Voy a asumir el siguiente desafío, voy a resolver 9 desafíos de programación en 9 lenguajes de programación.»
Los 9 (+1) Lenguajes
CLOJURE
ERLANG
(ELIXIR)
F#
GO
HASKELL
KOTLIN
RUST
SCALA
SWIFT
Motivaciones
Programación de Sistemas: Go y Rust
La JVM: Scala, Clojure y Kotlin
Programación funcional: F# y Haskell
Apple Fanboy: Swift
Actores y Whatsapp: Erlang (y Elixir)
Taxonomía
Lenguajes Tipo D
Estructurados
Imperativos (Cómo)
Mutabilidad de estados
Programación de Sistemas
Cercanos a la máquina
Lenguajes Tipo D
Go
Kotlin
Rust
Swift
Ejemplo 2
Go: un lenguaje tipo D
Lenguajes Tipo M
Funcionales
Declarativos (Qué)
Inmutabilidad de estado
Composición
Orientados al dato
Lenguajes Tipo M
Clojure
Haskell
Erlang
Elixir
Ejemplo 3
Clojure: un lenguaje tipo M
Lenguajes tipo O
Múltiples Paradigmas
Orientación a Objetos
Funcionales
Imperativos
Funciones <-> Objetos
Lenguajes tipo O
Scala
F#
Swift
Rust
Kotlin
Ejemplo 4
Scala: un lenguaje tipo O
Mi Desafío Personal
«La idea es crear desafíos que permitan destacar las bondades de algunos lenguajes y que sean prácticos, que muestren situaciones similares a problemas que uno enfrenta en el "mundo real”.»
¿y cómo vamos?
3 Desafíos completados
Repositorio GitHub: https://github.com/lnds/9d9l
2.600 lineas de código aproximadamente
108 Horas en 12 meses
Desafío 1: 24 horas
Desafío 2: 32 horas
Desafío 3: 52 horas
3 Desafíos completados
Desafío 1: Toque y Fama
Un juego interactivo usando la consola
Desafío 2: Weather Report
Reporte de tiempo usando paralelismo simple, invocando API Web XML
Desafío 3: Vectores
Procesar un archivo de 1 millón de vectores numeréicos ordenando y clasificando en el menor tiempo posible
Esos Raros Lenguajes Nuevos…
ClojureRich Hickey
2007
10 años
Versión Estable: 1.8
JVM, JS, CLR, Dinámico, Strong Typing Licencia Eclipse
Clojure
(def edc {:nombre “Eduardo”, :apellido “Diaz”, :nick @LNDS})
(println “Hola” (:nombre persona) “ alias ” (persona :nick))
Clojure
(defn div-by? [n m] (zero? (mod n m))
(defn div-by-3-or-5? [n] (or (div-by? n 3) (div-by? n 5)))
(—> (range 1000) (filter div-by-3-or-5?) (reduce +))
ErlangJoe Armstrong
1986
37 años
Versión Estable: 19.2
Dinámico, Strong Typing, BEAM
Apache License 2.0
Erlang
solve() ->
solve(1, 0).
solve(Number, Sum) when Number == 1000 ->
Sum;
solve(Number, Sum) when ((Number rem 3) == 0) or ((Number rem 5) == 0) ->
solve(Number + 1, Sum + Number);
solve(Number, Sum) ->
solve(Number + 1, Sum).
ElixirJosé Valim
2011
6 años
Versión Estable: 1.4.0
Dinámico, Strong Typing, BEAM
Apache License 2.0
Elixir
1..999 |> Enum.filter (fn(x) -> rem(x,3) == 0 || rem(x,5)==0 end) |> Enum.sum
F#Don Syme
2005
12 años
Versión Estable: 4.0.1.20
Estático, Strong Typing, Inferencia, CLR
Apache License 2.0
F#
[1..999] |> List.filter (fun n -> n % 5 == 0 || n % 3 == 0) |> List.sum
GoRobert Griesemer, Rob Pike, Ken Thompson
2009
12 años
Versión Estable: 1.7.4
Estático, Strong Typing, Inferred, Structural, Native Code
BSD Style
Go
sum := 0
for i := 0; i < 1000; i++ {
if i % 3 == 0 || i % 5 == 0 { sum += i }
}
HaskellComité
1990
27 años
Versión Estable: Haskell 2010
Estático, Strong Typing, Inferred, Native Code
BSD Style
Haskell
import Data.List (union)
problema_1 = sum (union [3,6..999] [5,10..999])
KotlinJetbrains
2011
6 años
Versión Estable: Kotlin 1.0.6
Estático, Inferred, JVM
Apache 2
Kotlin
(1..999).asSequence()
.filter(dividesBy(3))
.filter(dividesBy(5))
.sum()
RustGraydon Hoare
2010
7 años
Versión Estable: 1.14
Estático, Strong, Inferred, Nominal, linear
Apache 2/ MIT
Rust
let mut sum = 0;
for i in range(1, 1000) {
if i % 3 == 0 || i % 5 == 0 {
sum += i;
}
}
sum
ScalaMartin Odersky
2004
12 años
Versión Estable: 2.12.1
Estático, Strong, Inferred, Structural, JVM
BSD
Scala
(1 until 1000) .filter(n => n % 3 == 0 || n % 5 == 0) .sum
SwiftCris Later
2014
2 años
Versión Estable: 3.0.2
Estático, Strong, Inferred, Nativo
Apache 2
Swift
let filtered = (1..<1000).filter {
$0 % 3 == 0 || $0 % 5 == 0
}
filtered.reduce(0, combine: +)