Primeros programas con BLOX
Este documento muestra los dos primeros pasos prácticos con BLOX ESL:
- ejecutar un script con BLOX CLI;
- embeber BLOX dentro de un programa C con BLOX Core.
La CLI es la forma más simple de probar el lenguaje desde terminal. BLOX Core es el producto principal: la biblioteca embebible que permite que una aplicación host cargue scripts .blox, llame funciones BLOX y registre funciones nativas que BLOX puede invocar.
Tu primer programa CLI: "Hola mundo"
El clásico Hola mundo sirve para verificar tres cosas:
- que el binario de BLOX CLI funciona;
- que puedes ejecutar un archivo
.blox; - que entiendes la estructura mínima de un programa BLOX.
Script BLOX
Crea un archivo llamado holamundo.blox:
FUNCION PRINCIPAL
INICIO
IMPRIMIR("Hola mundo")
FINAL
Qué significa
FUNCION PRINCIPAL define el punto de entrada del programa.
INICIO y FINAL delimitan el bloque de instrucciones que se ejecuta.
IMPRIMIR() es una función interna que muestra texto o valores en la consola.
El texto se escribe entre comillas dobles:
"Hola mundo"
Ejecutarlo en Windows
Si descomprimiste BLOX CLI en C:\BLOX, ejecuta:
cd C:\BLOX
cli\bin\blox.exe holamundo.blox
También puedes ejecutar el ejemplo incluido en el ZIP:
cli\bin\blox.exe examples\hello.blox
Ejecutarlo en Linux
Desde la carpeta donde descomprimiste el ZIP:
chmod +x cli/bin/blox
./cli/bin/blox holamundo.blox
O ejecuta el ejemplo incluido:
./cli/bin/blox examples/hello.blox
Resultado esperado
Verás una salida similar a:
Hola mundo
Según la versión o el modo de ejecución, BLOX también puede mostrar información adicional de finalización, tiempo de ejecución o validación del programa.
Tu primer programa embebido con BLOX Core
BLOX no está pensado solamente para ejecutarse desde la terminal. Su uso principal es como lenguaje embebible: una aplicación host crea una VM BLOX, carga un script .blox y le pide decisiones o comportamiento.
En este primer ejemplo, el host está escrito en C.
El host hará tres cosas:
- registrar una función C llamada
HOST_LOG; - cargar un script BLOX llamado
programa.blox; - llamar una función BLOX llamada
sumar()y leer su resultado.
A su vez, el script BLOX podrá llamar a la función C registrada.
Script BLOX
Crea un archivo llamado programa.blox:
FUNCION sumar()
FUNCION PRINCIPAL
INICIO
HOST_LOG("script BLOX cargado desde C")
FINAL
FUNCION sumar()
INICIO
RETORNAR 40 + 2
FINAL_FUNCION
Host C
Crea un archivo llamado embed_demo.c:
#include <stdio.h>
#include "blox.h"
static BloxStatus host_log(
BloxVM *vm,
const BloxValue *args,
size_t argc,
BloxValue *result,
void *user_data
) {
(void)vm;
(void)user_data;
if (argc != 1 || args[0].type != BLOX_VALUE_STRING) {
return BLOX_ERROR_INVALID_ARGUMENT;
}
printf("BLOX dice: %.*s\n",
(int)args[0].as.string.length,
args[0].as.string.data);
result->type = BLOX_VALUE_EMPTY;
return BLOX_OK;
}
int main(void) {
BloxVM *vm = blox_vm_create();
BloxValue result;
if (!vm) {
return 1;
}
blox_vm_register_native(
vm,
"HOST_LOG",
1,
BLOX_VALUE_EMPTY,
host_log,
NULL
);
blox_vm_load_file(vm, "programa.blox");
blox_vm_run_main(vm);
blox_vm_call(vm, "sumar", NULL, 0, &result);
if (result.type == BLOX_VALUE_NUMBER) {
printf("resultado = %.0f\n", result.as.number);
}
blox_vm_destroy(vm);
return 0;
}
Qué está pasando
El programa C crea una VM:
BloxVM *vm = blox_vm_create();
Luego registra una función nativa:
blox_vm_register_native(vm, "HOST_LOG", 1, BLOX_VALUE_EMPTY, host_log, NULL);
Desde ese momento, el script BLOX puede llamar:
HOST_LOG("script BLOX cargado desde C")
Después, el host carga el script:
blox_vm_load_file(vm, "programa.blox");
Ejecuta FUNCION PRINCIPAL:
blox_vm_run_main(vm);
Y finalmente llama una función BLOX:
blox_vm_call(vm, "sumar", NULL, 0, &result);
Esto demuestra la comunicación en dos direcciones:
C -> llama funciones BLOX
BLOX -> llama funciones C registradas
Compilar en Windows
Desde el ZIP de BLOX Core para Windows:
gcc -std=c99 -O2 -DBLOX_USE_SHARED ^
-Icore\include ^
embed_demo.c ^
-Lcore\lib -lblox_core ^
-o embed_demo.exe
Antes de ejecutar, asegura que blox_core.dll esté disponible:
set PATH=%CD%\core\bin;%PATH%
embed_demo.exe
Compilar en Linux
Desde el ZIP de BLOX Core para Linux:
gcc -std=c99 -O2 \
-Icore/include \
embed_demo.c \
-Lcore/lib -lblox_core \
-Wl,-rpath,'$ORIGIN/core/lib' \
-o embed_demo
Ejecuta:
./embed_demo
Resultado esperado
BLOX dice: script BLOX cargado desde C
resultado = 42
Idea principal
Estos dos ejemplos muestran la progresión natural de BLOX:
- con BLOX CLI pruebas scripts
.bloxdesde terminal; - con BLOX Core embebes esos scripts dentro de una aplicación real.
El contrato básico de BLOX Core es:
- C crea y controla la VM;
- C registra funciones nativas;
- BLOX puede llamar esas funciones registradas;
- C puede llamar funciones definidas en BLOX;
- BLOX devuelve resultados al host.
En una aplicación real, HOST_LOG podría ser reemplazada por funciones como:
HOST_ENVIAR_EVENTO;HOST_LEER_SENSOR;HOST_ACTIVAR_RELE;HOST_CREAR_ENTIDAD;HOST_PUBLICAR_MQTT.
El patrón es el mismo: el host controla el sistema, BLOX decide la lógica.