Fundamentos de compilación de módulos

Maneras de compilar nuestros módulos escritos en archivos, para hacerlos accesibles a través de Elixir o a través de iex para poder emplear interactivamente las funciones que se declaran.

Cuando trabajamos con Elixir, es fundamental entender cómo cargar y compilar nuestros propios módulos para poder utilizarlos de forma eficiente en distintos entornos. Por ejemplo, si tenemos un archivo llamado func.xs que contiene un módulo con funciones como una calculadora, no basta con estar en la misma carpeta para poder invocar esas funciones directamente. El intérprete de Elixir no reconoce automáticamente ese módulo; necesitamos indicarle explícitamente dónde encontrarlo.

Para ello, Elixir nos ofrece una función especial llamada c, que es un alias de compile. Esta función nos permite importar archivos .xs (scripts) pasándoles la ruta como cadena de caracteres. Al hacerlo, Elixir interpreta el archivo y carga las definiciones dentro de su entorno, lo que nos permite llamar a funciones como calculadora.suma sin problemas. Es importante destacar que los archivos .xs son scripts que se ejecutan directamente, por lo que cualquier instrucción fuera de un módulo se ejecuta inmediatamente al cargarlos.

Sin embargo, cuando queremos que un módulo sea compilable y no solo un script, debemos trabajar con archivos .ex. Por ejemplo, si creamos un archivo llamado calculadora.ex que contiene nuestro módulo, este archivo está pensado para ser compilado a código máquina, que la máquina virtual de Erlang puede interpretar directamente. Aunque Elixir es bastante flexible con los nombres de archivos y módulos, es buena práctica mantener una correspondencia clara para facilitar la organización del código.

Para compilar un archivo .ex, utilizamos la herramienta elixirc (elixir compiler), que transforma nuestro código en un archivo .bim. Este archivo .bim contiene el código máquina que la máquina virtual de Erlang puede ejecutar. Por ejemplo, al compilar calculadora.ex, obtenemos Elixir.Calculadora.bim. Estos archivos compilados pueden almacenarse y reutilizarse como librerías estándar para nuestros programas.

Cuando abrimos el intérprete interactivo de Elixir (iex) en el mismo directorio donde se encuentran los archivos .bim, este carga automáticamente todos los módulos compilados disponibles. Así, podemos llamar a funciones como calculadora.suma(2, 3) sin necesidad de recompilar o importar manualmente el módulo cada vez.

Aunque este método de trabajar con archivos .ex y .bim es funcional, no es la forma más práctica para proyectos grandes o en producción. Para gestionar múltiples archivos y módulos, Elixir ofrece herramientas como mix, que facilitan la compilación, carga y distribución de módulos, además de simplificar la creación de aplicaciones completas, como aplicaciones web que se despliegan en servidores o contenedores Docker. Estas herramientas automatizan la gestión de archivos compilados y permiten un flujo de trabajo mucho más eficiente, pero su explicación queda para etapas posteriores.

# Ejemplo sencillo de uso de la función c para cargar un archivo .xs
iex> c("func.xs")
[Calculadora]

iex> Calculadora.suma(3, 3)
6
# Compilar un archivo .ex a .bim con elixir compiler
elixirc calculadora.ex
# Esto genera Elixir.Calculadora.bim en el directorio actual
# Uso de un módulo compilado .bim en iex
iex> Calculadora.suma(2, 3)
5

Con este conocimiento, podemos empezar a construir y organizar nuestros módulos en Elixir, entendiendo la diferencia entre scripts y módulos compilados, y cómo aprovechar los archivos .bim para ejecutar código máquina en la máquina virtual de Erlang. Esto sienta las bases para trabajar con proyectos más complejos y utilizar las herramientas que Elixir pone a nuestra disposición para facilitar el desarrollo.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos