Esos Raros Lenguajes Nuevos: Javascript/Node, Scala, Erlang, Clojure, Ruby, Python

El jueves pasado tuve el gusto de dar una charla sobre lenguajes, en el Microsoft User Group de Argentina, en su sede de Buenos Aires. Mi idea era presentar lenguajes de programación, alguno nuevo, otros ya con más de 15 años de existencia, que la comunidad de programadores .NET o de tecnologías Microsoft no ve frecuentemente.

Para mí, es un tema interesante: ver que a lo largo del tiempo, en la historia de la computación, hay lenguajes de programación que aparecen, tiene éxito u olvido. Pasan los años, y seguimos teniendo nuevos lenguajes. Vean que en el ambiente de las computadoras personales, no ha pasado lo mismo con los sistemas operativos: prácticamente se estabilizó en dos opciones con variantes: Windows y Linux (y otros Unix no derivados de Linux directamente). Podría poner Mac OS como aparte también. En cambio, en el ámbito de los lenguajes de programación, sigue habiendo actividad de creación, y viejos lenguajes aún sobreviven (desde Fortran hasta COBOL, y Smalltalk, por poner ejemplos diversos). Y aparecen lenguajes nuevos cada año, como en el 2011 que vió nacer a Dart, de la mano de Google (que también se animó antes a crear el lenguaje Go).

Los lenguajes que presenté fueron:
- Javascript (en NodeJs)
- Scala
- Erlang
- Clojure
- Ruby
- Python (no alcanzó el tiempo, pero lo incluyo en este post)

Un punto que destaqué es que los primeros cuatro (Javascript/NodeJs, Scala, Clojure, Erlang) tratan, entre otros objetivos, de encarar el problema de paralelismo, y multithreading. Ante la desaceleración de la ley de Moore, se trata de aprovechar el hardware de computadoras multicore. Eso lleva a que los lenguajes tengan que soportar múltiples threads (tema que casi todos hoy soportan, de una u otra forma, aunque algunos sólo recientemente: Smalltak, Ruby tuvieron mucho tiempo implementados “green threads”, hilos simulados por el lenguaje, sin aprovechar los threads del sistema operativo, que explotan los múltiples recursos del hardware). Pero también lleva a la complicación: tenemos que escribir programas contenplando múltitples hilos de ejecución, concurrencia, condiciones de carrera, lockeos, etc. Veremos que Erlang (y Scala con Akka) lleva a un paso más: ejecutar en varias máquinas. Ese camino es muy interesante para mí, porque libera la restricción de tener que explotar solamente una máquina: para procesos pesados (desde web crawling, big data, etc…) podemos repartir el trabajo en varias máquinas “normales”. De hecho, vean cómo el mercado de las supercomputadoras ha ido decayendo, porque desde fines del siglo pasado se han encontrado soluciones basadas en clusters, grillas, etc… con varias computadoras atacando un problema.

También quería mostrar que estos lenguajes se pueden probar en Windows, sin grandes problemas de instalación. Muchos de estos lenguajes “nuevos y raros” nacen en ambientes Unix/Linux y no siempre su instalación en Windows fue fácil. Pero en estos tiempos, ya tenemos un buen soporte de Windows para los lenguajes que presenté.

De cada lenguaje mostré algún ejemplo simple, y otro ejemplo más complejo (aunque corto) que mostrara alguna característica destacada.  Espero poder volcar todos los enlaces y comentarios hechos en este post. Comencemos.

Javascript/NodeJs

Sitio: http://nodejs.org/
Descripción, Historia: http://en.wikipedia.org/wiki/Nodejs http://en.wikipedia.org/wiki/JavaScript
Download que usé: el de Windows v0.6.7 pero pueden usar cualquiera de Windows 6.x. La actual es http://nodejs.org/dist/v0.6.12/node-v0.6.12.msi
Listas de Correo: http://groups.google.com/group/nodejs http://groups.google.com/group/nodejs-dev
Ejemplos que usé: https://github.com/ajlopez/NodeSamples
Mostré un servidor HTTP simplícimo, hello world asincrónico, y dibujar en canvas multiusuario, usando el módulo socket.io
Mis enlaces: http://delicious.com/ajlopez/nodejs
Mis posts: http://ajlopez.wordpress.com/category/nodejs/ http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx
En especial:
Programando Juegos Sociales en Línea (Parte 8) Agregando Node.js
http://msmvps.com/blogs/lopez/archive/2012/01/12/social_2D00_games_2D00_programming_2D00_part_2D00_8_2D00_adding_2D00_node_2D00_js.aspx
AjFabriq en NodeJs (Parte 3) Una aplicación Distribuida Simple
http://msmvps.com/blogs/lopez/archive/2011/09/15/ajfabriq_2D00_on_2D00_nodejs_2D00_part_2D00_3_2D00_a_2D00_distributed_2D00_simple_2D00_application.aspx

Javascript aparece como lenguaje en el lanzamiento del Netscape Navigator de 1995 (éramos tan pobres :-). Fue desarrollado por Brendan Eich http://en.wikipedia.org/wiki/Brendan_Eich de Netscape, con el nombre Mocha (un gusto de café como también lo es la palabra “java”) y luego LiveScript.
Node.js es creado por Ryah Dahl de Joyent http://joyent.com/ Pueden ver un video de introducción en http://ajlopez.wordpress.com/2011/10/15/code-snippets-are-for-sissies/

Comentarios:

Node.js tiene un REPL (Read Eval Print Loop)
Corre sobre el motor de Javascript Google V8. Un motor muy rápido, pero orientado a tener un solo thread a nivel de Javascript (en las librerías internas de C usa threads). Node.js entonces implementa servidores (y código general, si uno quiere) que ejecutan un solo thread de Javascript. Con eso evita el problema de programar en múltiples threads. Pero entonces ¿qué ganamos? Todo Node.js (sus funciones de base, los módulos adicionales) se orienta a ejecución asincrónica. Por ejemplo, el thread principal puede pedir una consulta a una base de datos (usando un driver/módulo de Node.Js adecuado) SIN QUEDARSE esperando la respuesta. El thread principal sigue ejecutando. Cuando la consulta de base de datos tiene algún resultado, lo anuncia (en un sistema interno de eventos). El thread principal de Javascript está atendiendo esos eventos. La escalabilidad se logra aprovechando que la entrada/salida (a disco, red, etc.) se puede derivar asincrónicamente, sin ocupar el thread principal. Internamente, usa características de los sistemas operativos (como el soporte de select() en Linux, o los Completion I/O ports de Windows).
En el ejemplo de dibujo sobre canvas usando socket.io, usamos npm para instalar el módulo:

npm install socket.io

desde el directorio Server

Scala

Sitio: http://www.scala-lang.org/
Descripción e Historia: http://en.wikipedia.org/wiki/Scala_(programming_language)
Download: http://www.scala-lang.org/downloads yo usé http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.zip lo expandi y agregué el directorio bin al PATH
Ejemplos: https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Scala Ver los ejemplos de http://www.scala-lang.org/node/219
Hola mundo en: http://www.scala-lang.org/node/166
Ejemplos avanzados: http://www.scala-lang.org/node/44
Actores: http://www.scala-lang.org/node/242
El ejemplo ping pong: http://www.scala-lang.org/node/54

Lo ejecutamos con

scalac pingpong.scala
scala -cp . examples.actors.pingpong

Ejemplo de mensajes entre actores: http://www.scala-lang.org/node/50
Mis enlaces: http://www.delicious.com/ajlopez/scala
Mis posts: http://ajlopez.wordpress.com/category/scala/

Comentarios:

Es multiparadigma (soporta objetos/clases y programación funcional). Lenguaje de autor, creado principalmente por Martin Odersky http://en.wikipedia.org/wiki/Martin_Odersky Compila a Java y permite reducir la ceremonia (por ejemplo, soporte de declarar directamente un objeto único, sin necesidad de declarar clase). Soporta actores, ejemplo que mostré en la charla. Con actores, Scala evita que el programador tenga que encargarse de los lockeos y manejo de múltiples threads.
Sobre actores ver: http://delicious.com/ajlopez/actormodel http://en.wikipedia.org/wiki/Actor_model
y también message passing: http://en.wikipedia.org/wiki/Message_passing
Ver el proyecto Akka, que extiende Scala a actores distribuidos: http://akka.io/

Clojure


Sitio: http://clojure.org/
Descripción e Historia: http://en.wikipedia.org/wiki/Clojure
Download: Ver http://clojure.org/downloads Yo usé http://repo1.maven.org/maven2/org/clojure/clojure/1.3.0/clojure-1.3.0.zip y también la versión 1.2.0
Listas de Correo: http://groups.google.com/group/clojure

Comentarios:

Vimos cómo Clojure es un dialecto de Lisp, y tiene homoniconicity http://en.wikipedia.org/wiki/Homoiconicity . Compila internamente a Java, y hay una versión para CLR (Common Language Runtime de .NET). Mostré en el ejemplo de Game of Life http://www.youtube.com/watch?v=CFCYVfApPUc http://github.com/sfraser/MultithreadedGameOfLife el uso de Software Transactional Memory, ver http://en.wikipedia.org/wiki/Software_transactional_memory que es una de las formas que tiene Clojure de “atacar” el problema de la concurrencia.
Para probar Clojure en línea ver http://tryclj.com/
Ver http://java.ociweb.com/mark/stm/article.html sobre STM

Erlang

Sitio: http://www.erlang.org/
Descripción e Historia: http://en.wikipedia.org/wiki/Erlang_(programming_language)
Download: http://www.erlang.org/download.html Yo usé http://www.erlang.org/download/otp_win32_R15B.exe
Ejemplos: http://pragprog.com/titles/jaerlang/source_code del libro de Joe Armstrong Programming Erlang http://pragprog.com/book/jaerlang/programming-erlang Ejemplos más sencillos: https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Erlang a ir actualizando.
Primeros pasos: http://www.erlang.org/static/getting_started_quickly.html

Comunidad en Argentina: http://erlang.org.ar/
Lista de Correo de Argentina: http://erlang.org.ar/ListaDeCorreo

Comentarios:

Vimos que Erlang es un lenguaje funcional: no hay variables, una vez ligada una “variable” a un valor, no se puede modificar. Todas son funciones. Tenemos varios procesos. Vimos el ejemplo key value store (kvs.erl) del libro de Joe Armsgrong.

Ejecutamos en el REPL erl:

c(kvs).
kvs:start().
kvs:store(apple, 10).
kvs:lookup(apple).

Luego vimos de lanzar DOS cajas de DOS. En una:

erl -sname galdalf
c(kvs).
kvs:start().

en la otra ejecutamos:

erl -sname bilbo
rpc:call(gandalf@localhost, kvs, store, [apple, 10]).
rpc:call(gandalf@localhost, kvs, lookup, [apple]).

Caso de éxito http://couchdb.apache.org/  NoSQL reescrito en Erlang.

Post http://ajlopez.wordpress.com/2011/08/24/erlang-links-news-and-resources-1/
Mis enlaces: http://delicious.com/ajlopez/erlang

http://lambda-the-ultimate.org/node/4453 Long rant on Erlang-style Actors: Lost Dimension

Vean el lenguaje E:
http://erights.org/index.html
http://wiki.erights.org/wiki/Walnut
http://erights.org/talks/thesis/index.html

Ruby

Sitio: http://www.ruby-lang.org/en/
Descripción e Historia: http://en.wikipedia.org/wiki/Ruby_(programming_language)
Download: http://www.ruby-lang.org/en/downloads/ Yo usé http://rubyinstaller.org/downloads/ Revisar mis posts sobre detalles de instalación importantes, como el DevKit. Y tambien http://delicious.com/ajlopez/ruby+install

Mis posts: http://ajlopez.wordpress.com/category/ruby http://msmvps.com/blogs/lopez/archive/tags/ruby/default.aspx donde explico paso a paso instalación de Ruby, Rails, y un primer sitio Rails. Y también mi experiencia en el último Ruby Meetup de Buenos Aires.
Mis enlaces: http://delicious.com/ajlopez/ruby

Comunidad en Argentina: http://ruby.com.ar/
Conferencia 2011: http://rubyconfargentina.org/en
Lista de Correo Argentina, Latinoamérica: http://groups.google.com/group/rubysur
Sitio: http://rubysur.org/

Python

Sitio: http://python.org/
Descripción e Historia: http://en.wikipedia.org/wiki/Python_(programming_language)
Download: Hay dos versiones, usé http://python.org/ftp/python/2.7.2/python-2.7.2.msi y también tenía instalado http://python.org/ftp/python/3.2.2/python-3.2.2.msi Pero sólo la última instalación está ligada a ejecutar automáticamente los archivos .py, ver http://stackoverflow.com/questions/3809314/how-to-install-both-python-2-x-and-python-3-x-in-windows-7

Ejemplos simples: https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Python
Comunidad en Argentina: http://python.org.ar/pyar/
Lista de Correo en Argentina: http://listas.python.org.ar/listinfo/pyar
Vean el video anunciando la próxima PyCon http://animoto.com/play/zVp1IGeGaLVKco0FDlwcmA
Mostré Django
https://www.djangoproject.com/
https://docs.djangoproject.com/en/1.3/topics/install/#installing-official-release
C:\Software\Django-1.3.1
https://docs.djangoproject.com/en/1.3/intro/tutorial01/

Ver también
IronPython (Python running on .NET)
Jython (Python running on the Java Virtual Machine)
PyPy (A fast python implementation with a JIT compiler)
Stackless Python (Branch of CPython supporting microthreads)

Ver la implementación web: http://webpython.codepoint.net/wsgi_tutorial madre de otras implementaciones como Rack en Ruby, y OWIN en .NET

Mis enlaces: http://delicious.com/ajlopez/python
Mis posts: http://ajlopez.wordpress.com/category/python/

Patrones encontrados

Existencia de REPL: todos
Compilación a otro lenguaje: Scala, Clojure, usando la máquina virtual y librerías de clases existentes
Pasaje de Mensajes: Erlang
Módulos: todos
Actores: Scala, algo también en Clojure y Erlang
Software Transactional Memory: Clojure

Bueno, espero que les haya dado un panorama de que hay vida más allá de C# y Java ;-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 10755, 12538, 14005, 15550, 16397, 16509, 16845, 8870. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>