No te ilusiones con la tecnología
Eligir la herramienta correcta es crucial para aumentar tu productividad -crisis del software- y evita que te ilusiones por la tecnología de moda -esto es aplicable no solo para lenguajes-, pero ¿cómo sabemos que es lo correcto?
Los siguientes criterios te permiten predecir la adopción de esta o aquella tecnología -que asombroso, ¿no?- y evaluar un lenguaje de programación: primero debes entender cuál capa de abstracción te encuentras, los requisitos y el mantra, filosofía o líneas guía perseguidas por el autor (véase, por ejemplo, el Zen de Python [b4] o de C++ [b5]) para no caer en «si solo manejas un martillo, todo te parecerá un clavo».
Así, si piensas en la web es JavaScript, no C. ¿Quieres un sistema SCADA? Entonces, programas en lenguaje escalara, no en Python. Si lanzas una aplicación para iOS será en Swift, no en Go. Esto viene a cuento en cualquier lenguaje de programación para decidir usarlo o los motivantes para crearlo.
Este primer criterio descrimina pero no es suficiente, agregemos unos cuantos más [b1] [b2].
Legibilidad
Antes de saber que estabamos enfermos -crisis del software-, los lenguajes fueron construidos para ser lo más rápido posibles, procupados principalmente por la computadora más que por el programador. Después se creo el concepto del ciclo del software como antítesis de la crisis del software, desde ese momento el foco ha sido la persona tras la pantalla -tú- sobre la computadora y el mantenimiento como parte central del ciclo.
La legibilidad es una métrica no binaria de los lenguajes de programación medida en términos del contexto de los problemas de dominio y su cercanía con el lenguaje natural. Así, dices que un lenguaje es legible cuando naturalmente podemos leerlo, especialmente la persona de dominio y no tanto una técnica. ¿Usas más tiempo pensando como la máquina que pensando en desarrollar el dominio?
Por ejemplo
«Hello World» en binario sobre ASCII. Ilegible.
01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
«Hello World» en Python. Legible.
print(“Hello World”)
Las siguientes características contribuyen a la legibilidad:
Simplicidad
Se refiere a la cantidad de conceptos o constructores disponibles en un lenguaje para construir el software requerido.
«Array dinámico» en C. No simple.
typedef struct {
int *array;
size_t used;
size_t size;
} Array;void insertArray(Array *a, int element) {
if (a->used == a->size) {
a->size *= 2;
a->array = realloc(a->array, a->size * sizeof(int));
}
a->array[a->used++] = element;
}
«Array dinámico» en Python. Simple.
a=[]
a.append("A")
Ortogonalidad
Los constructores se deben comportar de igual forma en todos los contextos. Los lenguajes deben ser precisos en su interpretación, es decir, se deben comportar siempre tal y como se espera que se comporten. Un lenguaje tiene generalidad eliminando casos especiales de los constructores.
Tipos de datos
Característica que tienen los lenguajes para que un programador no tenga que conocer muchos constructores para resolver el problema
que está desarrollando. Es decir, un lenguaje tiene una capacidad de restricción si un programador puede centrarse en un subconjunto mínimo de conceptos del lenguaje para ser posible que construya la solución que necesita.
Sintaxis
Se refiere a lo parecido que se ve lo que se debe parecer, y lo distinto que se es lo que no debe ser igual: azúcar sintáctico.
Escribibilidad
Simplicidad y ortogonalidad
Es la capacidad de poder añadir nuevas características al lenguaje.
Expresividad
Es la cualidad de un lenguaje de programación que permite representar los procesos y estructuras complejos. Uso de las convenciones y notaciones estandarizadas, donde utilizan las notaciones y convenciones estandarizadas. Por ejemplo, el uso de operadores aritméticos básicos.
Interoperabilidad, referido a la propiedad que tienen los programas de interactuar entre sí. Deben proveer mecanismos de intercomunicación, de forma que no haga falta comunicación previa para intercambiar información.
Fiabilidad
Revisión de tipos
Se refiere a la predicción de errores en el código fuente, evitándolos. Para hacer más seguros los lenguajes de programación se compromete en cierta
medida la expresividad de estos.
Manejo de errores
Como gestiona los errores el lenguaje ante los fallos provocados por el contexto del sistema o por el usuario. Por ejemplo, en Go no existe el concepto de lanzamiento de excepciones.
Costo
Los apartados donde se destina dinero y tiempo necesarios para cumplir el ciclo de vida del software, tales como: curva de aprendizaje (ampliamente relacionado con la simplicidad), entrenamientos, escribir en dichos lenguajes (propósito de la aplicación, el mantra del lenguaje), ambientes de desarrollo (el lenguaje puede ser gratuito, por escribir en el no, por ejemplo Swift), costo de compilar (el tiempo necesario para llevarlo a producción puede llevar horas y eso se encuentra en un entorno de continua de integración puede ser bastante costoso), el costo de ejecutar dichos programas, el costo de implementar, costo de fiabilidad, costo de mantener los programas y la la posibilidad de construir programas independientes -portabilidad- de la máquina donde se ejecuten. Los lenguajes que se ejecutan sobre máquina virtuales son siempre portables: Java, Scala, PHP, …
Soporte y comunidad
Lo relacionado con el mantenimiento del lenguaje y la búsqueda de respuestas para la implementación: licencia, foros, preguntas, librerías, frameworks, tecnologías alrededor, empresas y universidades, documentación, tiempo en el mercado, cantidad de proyectos y mantenimiento.
Caso de estudio
Julia
El mantra de Julia es ser tan interactivo como Mathematica, fácil de usar como Python y rápido como C: un lenguaje de programación para la ciencia [b6] [b7] [b8].
Legibilidad
La cantidad de conceptos necesarios para implementar un algoritmo científico es mínimo: no es orientando a objetos.
«Hello World» en Julia. Legible.
"Hello World"
Escribibilidad
Codificar en Julia facilita bastante el trabajo del cientifico [b6].
Multiplicación de dos matrices. Escribible.
[1 2 3; 1 2 3]*I
Fiabilidad
Es un lenguaje débilmente tipado. Es posible lanzar excepciones y gestionar los errores vía if, en vez de try and catch.
Costo
Un lenguaje gratuito, fácil de empezar a probar gracias a los notebooks en la nube. Sus tutoriales son principalmente en inglés. Para problemas científicos puede ser bastante útil, su ecosistema para desarrollo empresarial es limitado.
Soporte y comunidad
Licencia MIT: Julia es de uso libre y de código abierto. Con pocas librerías y un lenguaje relativamente nuevo (v1.7.3 (May 6, 2022), en cualquier momento puede dejar de ser mantenido, aunque muchas universidades estadounidenses están apostandole al enseñarlo en la academia.
Referencias
\bibitem{b1} Tucker, A. B., \& Noonan, R. (2007). Programming languages: Principles and paradigms. In Programming languages: Principles and paradigms (pp. 11–18). New York: McGraw-Hill Higher Education.
\bibitem{b2} Sebesta, R. W. (2016). Concepts of programming languages. In Concepts of programming languages (pp. 30–44). Upper Saddle River: Pearson.
\bibitem{b3} Gabbrielli, M., \&; Martini, S. (2010). Programming languages: Principles and paradigms. In Programming languages: Principles and paradigms. London: Springer.
\bibitem{b4} 2021. PEP 20 — The Zen of Python. Python.org. Retrieved February 14, 2021 from https://www.python.org/dev/peps/pep-0020/
\bibitem{b5} The C++ programming language [Preface]. (2018). In 1195232291 893002481 B. Stroustrup (Author), The C++ programming language. Upper Saddle River i pozostałe: Pearson.
\bibitem{b6}
Steven Johnson. MIT Applied Math MIT 337,. Retrieved February 15, 2021 from http://web.mit.edu/18.06/www/Fall17/1806/julia/Julia-intro.pdf
\bibitem{b7}
Stephen Boyd. 2020. Introduction to Julia. Retrieved February 15, 2021 from https://web.stanford.edu/class/engr108/julia\_slides/julia\_intro\_slides.pdf
\bibitem{b8} 2020. Julia Documentation · The Julia Language. Julialang.org. Retrieved February 15, 2021 from https://docs.julialang.org/en/v1/
\end{thebibliography}