Julia es un lenguaje de programación dinámico y de tipado fuerte. Su estilo de programación es principalmente funcional, aunque con más flexibilidad que en lenguajes como Haskell.
Tiene un sistema de tipos sólido y versátil, que cobrará importancia en conceptos posteriores. En la práctica, Julia normalmente infiere un valor predeterminado adecuado a partir del contexto.
A pesar de su énfasis en la legibilidad, que hace que parezca un lenguaje de scripting como Python y Ruby, el código de Julia se compila antes de ejecutarse. El compilador Just In Time (JIT) produce código altamente optimizado para cada función a medida que se encuentra con ella, lo que da lugar a una alta velocidad de ejecución.
Julia no es un lenguaje orientado a objetos y no tiene una jerarquía de clases como la que es central en muchos otros lenguajes.
En su lugar (y, por favor, ¡no entres en pánico al leer esto!), Julia se apoya en:
Estos términos algo confusos deberían aclararse a medida que avancemos por el temario.
La documentación oficial contiene mucha información valiosa sobre la versión actual, aunque puede resultar un poco abrumadora para quien empieza.
Entre los vídeos se incluyen:
Incluir comentarios en tu código es extremadamente importante para ayudar a otras personas a leerlo y entender tus intenciones: quizá otras personas, pero también el tú del futuro. El compilador los ignora (en su mayoría).
En Julia hay dos opciones posibles:
#
#= y terminan en =#. Se permite anidarlos.# This is a single-line comment
x = 3 # This is an inline comment
#=
Multi-line comments can be used for longer explanations.
They are especially useful to comment out blocks of code during debugging.
=#
Para crear una variable, basta con asignarle un valor:
julia> myvar = 42 # an integer (in fact, Int64)
42
julia> bigint = 1_234_567_890 # optionally use underscore as digit separator, for readability
1234567890
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
La asignación «vincula» un valor a la variable.
Especificar un tipo es opcional y, en la mayoría de los casos, Julia inferirá un valor predeterminado adecuado a partir del contexto.
Los tipos son un tema importante en Julia. Los exploraremos más a fondo en conceptos posteriores. Por ahora, lo mejor es no preocuparse por ellos.
A diferencia de muchos lenguajes funcionales, las variables en Julia se pueden reasignar, y eres libre de cambiar tanto el valor como el tipo vinculados a la variable:
julia> myvar = 3
3
julia> myvar = "now a string"
"now a string"
Las variables globales, creadas fuera de cualquier función, son:
*.jl; el REPL funciona de otra manera).Si un valor necesita estar disponible en todo el programa, pero no se espera que cambie, usa mejor una constante.
Anteponer la palabra clave const a la asignación permite al compilador generar un código más eficiente.
Si intentas cambiar el valor de const por accidente, obtendrás una advertencia:
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
La aritmética funciona en su mayor parte de la forma convencional:
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division)
8 % 3 # 2 (remainder)
2 ^ 3 # 8 (exponentiation)
Ten en cuenta que la división con / siempre da un número de coma flotante.
Volveremos a esto en conceptos posteriores, donde trataremos la división entera con div() o ÷ para truncar y // para obtener un número racional.
Para obtener el mejor rendimiento en tiempo de ejecución, lo mejor es colocar la mayor parte del código dentro de funciones. Tener muchas funciones pequeñas está bien, a diferencia de lo que ocurre en otros lenguajes.
Hay dos formas habituales de definir una función con nombre en Julia:
Usar la palabra clave function
function muladd(x, y, z)
x * y + z
end
La sangría de 4 espacios es lo convencional por legibilidad, pero el compilador la ignora.
La palabra clave end es esencial: más parecido a Ruby que a Python.
Ten en cuenta que podríamos haber escrito return x * y + z.
Sin embargo, las funciones de Julia siempre devuelven la última expresión evaluada, así que la palabra clave return es opcional.
Muchas personas prefieren incluirla para dejar más clara su intención.
Usar la «forma de asignación»
muladd(x, y, z) = x * y + z
Se usa sobre todo para definiciones de funciones de una línea o funciones matemáticas, en las que el cuerpo de la función es una única expresión.
En la forma de asignación nunca se usa la palabra clave return.
Las dos formas son equivalentes y se usan exactamente igual, así que elige la que te resulte más legible.
Para invocar una función, se especifica su nombre y se pasan argumentos para cada uno de los parámetros de la función:
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
Por el hecho de que nos refiramos a estas como funciones «con nombre», quizá deduzcas que también existen funciones «anónimas». Las veremos en un concepto posterior.
Como muchos lenguajes, Julia exige que los nombres (de variables, funciones y muchas otras cosas) empiecen por una letra, seguida de cualquier combinación de letras, dígitos y guiones bajos.
Por convención, los nombres de variables, constantes y funciones van en minúsculas, y se evitan los guiones bajos salvo cuando son necesarios para evitar confusiones.
Sin embargo, Julia usa Unicode en todas partes, así que «letra» se interpreta con bastante flexibilidad.
Se admiten otros idiomas además del inglés, y también los emojis (aunque, por favor, con buen gusto y eligiendo algo apropiado).
En particular, están disponibles todas las letras griegas que tanto gustan a los matemáticos (y varios valores útiles están predefinidos):
julia> π # a built-in constant
π = 3.1415926535897...
Los editores con soporte para Julia, como el REPL, Pluto.jl y VS Code con el plugin de Julia, hacen que sea fácil introducir estos caracteres.
Para π, escribe \pi y pulsa <Tab>. Lo que has escrito se sustituirá por el carácter griego.
Verás muchos más ejemplos de esto en conceptos posteriores.
De hecho, las abreviaturas con barra invertida no son algo específico de Julia. Provienen de LaTeX, un sistema de composición tipográfica que muchos científicos e ingenieros usan casi a diario para escribir informes.