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.