- La clave de la productividad en programación está en un ecosistema rico de bibliotecas, más que en el lenguaje en sí
- Frameworks como Ruby on Rails, que aprovechan funciones avanzadas del lenguaje, ofrecen alta productividad incluso a personas no especialistas
- Sin embargo, debido a las limitaciones estructurales del lenguaje, es difícil implementar en Java o C frameworks del nivel de Rails
- El diseño del lenguaje determina directamente la forma y la complejidad de las bibliotecas que se pueden escribir, y ese es el propósito esencial de la evolución de los lenguajes
- Desde esta perspectiva, el lenguaje Stanza muestra la importancia del diseño de lenguajes que permita crear bibliotecas potentes y fáciles de usar
La relación entre los lenguajes de programación y las bibliotecas
- La mayoría de los lenguajes de programación tienen elementos básicos similares, como variables, arreglos, bucles y funciones
- Algunos lenguajes ofrecen funciones avanzadas como funciones de primera clase o corutinas, pero las personas no especialistas rara vez las usan
- Para muchos desarrolladores, lo que aumenta la productividad son las bibliotecas más que el lenguaje
- Por ejemplo, Ruby on Rails permite construir con facilidad aplicaciones web basadas en bases de datos
- Gracias a Rails, la preferencia suele inclinarse más por el framework que por el lenguaje Ruby en sí
La interacción entre Ruby on Rails y las funciones del lenguaje
- Rails aprovecha diversas funciones de Ruby como metaprogramación, evaluación en tiempo de ejecución, funciones de primera clase y recolección de basura
- Por ejemplo, ActiveRecords usa metaprogramación, y el sistema de plantillas usa evaluación en tiempo de ejecución
- El manejo de eventos se implementa pasando funciones de primera clase como callbacks
- En Java o C faltan estas capacidades, por lo que no es posible implementar un framework del nivel de Rails
- La metaprogramación de Java no es lo bastante potente como para implementar ActiveRecords
- Por eso Rails es posible gracias a la estructura del lenguaje Ruby, y el diseño del lenguaje determina las posibilidades de las bibliotecas
El diseño del lenguaje determina la forma de las bibliotecas
- El lenguaje C solo soporta reutilización mediante declaraciones y llamadas a funciones, por lo que la mayoría de las bibliotecas en C tienen la forma de conjuntos de funciones
- Ruby soporta funciones de primera clase, lo que permite expresar de forma concisa “qué hacer cuando se hace clic en un botón”
- En cambio, en Java hay que definir una clase manejadora, lo que complica el código
- La expresividad del lenguaje define de manera directa la estructura y la usabilidad de las bibliotecas
Software interactivo y aparición de frameworks extensibles
- En la computación por lotes de la década de 1970, las bibliotecas centradas en funciones eran suficientes
- En el software interactivo moderno se necesitan bibliotecas extensibles
- En GUI o sistemas basados en eventos, se requiere una estructura del tipo “ejecuta mi código cuando el usuario haga clic”
- Java y C++ soportan extensibilidad mediante herencia y sobrescritura de métodos, y esta estructura evolucionó hacia los frameworks
Trasfondo del diseño de Stanza y límites de los lenguajes
- La motivación detrás del diseño de Stanza surgió de la dificultad de escribir en Java una biblioteca de programación de juegos fácil de usar
- En Java, la concurrencia tenía que expresarse como una máquina de estados (state machine)
- Scheme soporta continuation, lo que permite una implementación más intuitiva
- Sin embargo, Scheme no soporta verificación estática de tipos, por lo que la eficiencia de depuración es baja
- Actualmente, la mayoría de los lenguajes no permiten extender el sistema de tipos como una biblioteca
- Stanza ofrece un sistema de tipos opcional, recolección de basura y un sistema de objetos basado en multimétodos
- Pero no permite volver a escribir desde cero un sistema de objetos definido por el usuario
El propósito del lenguaje y la dirección de la investigación
- El propósito de un lenguaje de programación de propósito general es apoyar la creación de bibliotecas potentes y fáciles de usar
- Cuanto más potente es el lenguaje, más conciso se vuelve el uso de las bibliotecas
- Cuando el código usa una biblioteca bien diseñada, tiene una naturalidad que se lee como si se le dieran instrucciones a un colega
- Racket, Shen y la investigación sobre protocolos metaobjeto exploran sistemas de tipos y de objetos extensibles
- En última instancia, los lenguajes se distinguen por “qué bibliotecas se pueden usar y cuáles no”
- Detrás de las bibliotecas elegantes hay décadas de investigación y esfuerzo de diseño de lenguajes
1 comentarios
Opiniones de Hacker News
El mejor ejemplo es Prolog. A menudo se le llama el lenguaje representativo de la programación lógica, pero en realidad no es más que una colección de algoritmos, y podría implementarse como una librería en distintos lenguajes. Pienso que bastaría con ofrecer la expresión sintáctica de Prolog adaptada a la gramática de cada lenguaje
Hace 10 años era fan de Scala. Me atraía la idea de “Scalable Language”, eso de poder construir DSL dentro del sistema de tipos. Pero perdí el interés cuando la comunidad empezó a usarlo como una especie de Haskell sobre la JVM. Últimamente tengo esperanza en tecnologías como WASM o Graal, porque podrían dar más flexibilidad al elegir lenguaje. Muchas veces JavaScript basta, pero está bueno tener la opción de usar un lenguaje de bajo nivel como Rust cuando haga falta
Estaría bien poder reemplazar bash con un lenguaje de scripting tipado. Hice un script sencillo en Elixir para parsear JSON y quedó bastante bien
#!/usr/bin/env ocaml. Eso sí, no tiene instalación automática de dependencias externas en un solo archivoEl lenguaje y la librería no son mutuamente excluyentes. Algunas librerías en la práctica funcionan como lenguajes, y a la inversa, hay lenguajes diseñados para cierta librería. Por ejemplo, Julia es un buen caso de equilibrio entre rendimiento y facilidad de uso. Puedes escribir directamente en Julia código de alto rendimiento y obtener ejecución optimizada mediante compilación con especialización de tipos a nivel JIT. Su modelo parece una simple llamada a funciones, pero por dentro opera de forma muy sofisticada
Raku está diseñado como una estructura que une varios sublenguajes (slang). Por ejemplo, regex, PEG y quoting se tratan como minilenguajes separados, y con Slangify puedes añadir fácilmente tu propio DSL
Una vez un desarrollador senior dijo: “si veo Rails en un currículum, lo tiro de inmediato”. Eso me hizo pensar otra vez en lo tonto que es juzgar a la gente por el lenguaje
Al final, el lenguaje o la librería son medios para comunicarse tanto con la máquina como con las personas. Con la máquina te comunicas mediante bits y voltajes; con las personas, mediante intención y conceptos. Por lo tanto, si un lenguaje o una librería permite a la gente expresar algo con claridad y rapidez, da igual si se le llama lenguaje o librería. Rails o Stanza, si sirve para el propósito y el equipo lo entiende bien, entonces esa es la respuesta correcta
Yo pienso que “la librería es el lenguaje final”. Por ejemplo, Ruby on Rails es un excelente lenguaje para servicios web construido sobre Ruby. Ruby y Rails evolucionaron el uno para el otro. Al final, creo que programar es un proceso continuo de traducción entre lenguajes
Es cierto eso de que “cuanto más poderoso es el lenguaje, más fácil es usar librerías”. Antes, en Java, era difícil hacer un framework como Express
Si hablamos de un framework web para el lenguaje C, ¿entonces PHP no cuenta? ;)