sábado, 7 de febrero de 2026

Beef y C3, dos lenguajes de programación que evolucionan a C

En este 2026 la programación será cada vez más díficil de aprender y enseñar. La I.A. ha surgido como una herramienta útil para el desarrollador moderno, aunque también un lastre para quienes no quieren evolucionar (o morir en el intento). Es por eso que es necesario el estudio y práctica de la programación.

Existen dos lenguajes llamados Beef y C3 respectivamente que prometen ser la evolución directa al lenguaje mítico C.

Beef se siente como un híbrido entre C++ y C#, con tooling propio y características modernas (tuplas, pattern matching, mixins, reflexión, compilación en caliente). Es ideal para quienes buscan un lenguaje nativo con ecosistema completo y mayor productividad.

La documentación oficial nos dice:

"Beef es un lenguaje de programación de código abierto multiparadigma de alto rendimiento centrado en la productividad del desarrollador".

Beef soporta programación orientada a objetos, funcional y estructurada.

Enfocado a la alta productividad y rendimiento, con fuerte integración C/C++. Busca ser un lenguaje moderno para aplicaciones nativas con tooling propio (IDE, depurador, profiler).

C3 es más conservador. Se mantiene muy cerca de C, pero añade mejoras puntuales (contratos, macros más potentes, genéricos claros, mejor manejo de errores). Es atractivo para proyectos que ya usan C y quieren evolucionar sin perder compatibilidad.

La documentación oficial nos dice:

"C3 es una evolución, no una revolución: el C-like para programadores a quienes les gusta C".

El paradigma de C3 es ser imperativo y estructurado, con extensiones modernas (contratos, macros, genéricos).

Se conidera así mismo como una evolución ergonómica de C, manteniendo compatibilidad total con ABI de C. Su meta es mejorar la seguridad y expresividad sin perder la familiaridad para programadores de C.

Cada uno tiene sus propias características y peculiaridades.

Filosofía de Beef

Se basa en:

  • "Productividad sin sacrificar rendimiento". 
  • Ofrece compilación incremental, detección de fugas en tiempo real, generación de código en tiempo de compilación y un IDE dedicado.
  • Se centra en mejorar la experiencia del desarrollador.

Filosofía de C3

Se basa en:

  • "Una evolución, no una revolución"
  • Mantiene la simplicidad y cercanía a C, pero añade contratos, macros semánticos, reflexión y manejo de errores más seguro. 
  •  Busca ser C mejorado, no reemplazarlo.

Relación con C/C++

Beef:

  • Interoperabilidad directa con librerías C/C++ (estáticas y dinámicas).
  • Permite mezclar niveles de optimización en un mismo proyecto.
  • Sintaxis inspirada en C#, pero con bajo nivel similar a C++.

C3:

  • Compatibilidad ABI completa con C.
  • Puede integrarse en proyectos C/C++ sin esfuerzo.
  • Sintaxis muy cercana a C, con mejoras inspiradas en C++ pero sin su complejidad.

Instalación

Ambos lenguajes pueden ser instalados en plataformas Linux, Mac OS y Windows.

Este es el IDE de Beef

Hola mundo

Observemos el clásico programa de "Hola, mundo" escrito en ambos lenguajes.

Beef:

HolaMundo.bf

using System;

class Program
{
    public static void Main()
    {
        Console.WriteLine("Hola, mundo en Beef!");
    }
}

Como se puede observar, la extensión de un programa Beef es *.bf.

Beef puede usarse desde una terminal o desde su IDE.

Podemos crear un proyecto con los siguientes comandos:

$ beef new HolaMundo

Coloca el código en HolaMundo/src/HolaMundo.bf

Ejecuta el proyecto:

$ beef run

C3:

holamundo.c3

module hola_mundo;
import std::io;

fn void main()
{
io::printn("Hola, mundo en C3!");
}

La extensión de un programa en C3 no podría ser otro que *.c3.

Tiene una cercanía más expresiva a C.

Compilamos:

$ c3c compile holamundo.c3 -o holamundo

Ejecutamos:

$ holamundo.exe

Tipos de datos y estructuras de control básicas

Ejemplo 1. Crear un programa que muestre los tipos de datos y estructuras de control en ambos lenguajes. Para el caso de Beef usaremos su IDE. C3 será compilado y ejecutado desde terminal

Beef:

Program.bf

using System;

namespace HelloWorld;

class Program
{
    static void Main()
    {
        Console.WriteLine("\t [ Fundamentos de Beef ]");
		TestA();
		TestB();
    }

	static void TestA(){
		Console.WriteLine("\t [ Tipos de variables en Beef ]");
		int entero = 42;
		float flotante = 3.14f;
		double doble = 2.71828;
		bool booleano = true;
		char8 caracter = 'A';
		String texto = "Hola, mundo";

		Console.WriteLine($"Entero: {entero}");
		Console.WriteLine($"Flotante: {flotante}");
		Console.WriteLine($"Doble: {doble}");
		Console.WriteLine($"Booleano: {booleano}");
		Console.WriteLine($"Caracter: {caracter}");
		Console.WriteLine($"Texto: {texto}");

	}


	static void TestB(){
		Console.WriteLine("\t [ Estructuras de control en Beef ]");
		bool numeroV =  23 > 20;
		if(numeroV){
			Console.WriteLine("Verdadero: 23 > 20");
			numeroV = 300 < 100;
		}

		if(numeroV){
			Console.WriteLine("Verdadero: 300 < 10");
		}else{
			Console.WriteLine("Falso: 300 < 100");
		}

		int x = 3;
		if (x < 0)
		    Console.WriteLine("x es negativo");
		else if (x == 0)
		    Console.WriteLine("x es cero");
		else
		    Console.WriteLine("x es positivo");

		switch (x)
		{
		    case 1:
		        Console.WriteLine("x es uno");
		        break;
		    case 10:
		        Console.WriteLine("x es diez");
		        break;
		    default:
			    Console.WriteLine($"x no es ni 1 ni 10 es: {x}");    
		        break;
		}


	}


}

Salida:

         [ Fundamentos de Beef ]
         [ Tipos de variables en Beef ]
Entero: 42
Flotante: 3.14
Doble: 2.71828
Booleano: True
Caracter: A
Texto: Hola, mundo
         [ Estructuras de control en Beef ]
Verdadero: 23 > 20
Falso: 300 < 100
x es positivo
x no es ni 1 ni 10 es: 3

C3:

fundamentos.c3

module fundamentos;

import std::io;

fn void main()
{
    io::printn("\t [ Fundamentos en C3 ]");
    test_a();
    test_b();
}

fn void test_b()
{
   io::printn("\t [ Estructuras de control en C3 ]");
    int x = 10;

   
    if (x > 5){
        io::printn("x es mayor que 5");
    }
    
    if (x % 2 == 0){
        io::printn("x es par");
    }else{
        io::printn("x es impar");
    }
   
    if (x < 0){
        io::printn("x es negativo");
    }else if (x == 0){
        io::printn("x es cero");
    }else{
        io::printn("x es positivo");
    }
    
    switch (x) {
        case 1:
            io::printn("x es uno");
            break;
        case 10:
            io::printn("x es diez");
            break;
        default:
            io::printf("x no es ni 1 ni 10 es: %d\n", x);
            break;
    }
}

fn void test_a()
{
    io::printn("\t [ Tipos de datos en C3 ]");

    int entero = 42;
    float flotante = 3.14f;
    double doble = 2.71828;
    bool booleano = true;
    char caracter = 'A';
    ZString texto = (ZString)"Hola, mundo";


    io::printf("Entero: %d\n", entero);
    io::printf("Flotante: %f\n", flotante);
    io::printf("Doble: %f\n", doble);
    io::printf("Booleano: %s\n", booleano ? "true" : "false");
    io::printf("Caracter: %c\n", caracter);
    io::printf("Texto: %s\n", texto);
}

Compilación:

$ c3c compile fundamentos.c3 -o fundamentos

Salida:

         [ Fundamentos en C3 ]
         [ Tipos de datos en C3 ]
Entero: 42
Flotante: 3.140000
Doble: 2.718280
Booleano: true
Caracter: A
Texto: Hola, mundo
         [ Estructuras de control en C3 ]
x es mayor que 5
x es par
x es positivo
x es diez

Ejemplo 2. Crear un programa que muestre las estructuras de control iterativas como for, while y foreach.

Beef:

Program.bf

         using System;

namespace HelloWorld;

class Program
{
    static void Main()
    {
        Console.WriteLine("\t [ Fundamentos de Beef ]");
        TestA();
    }


    static void TestA()
    {
        Console.WriteLine("\t [ Estructuras de control iterativas en Beef ]");

	    // for
	    for (int x = 0; x < 5; x++){
			Console.WriteLine($"for: i = {x}");
		}
	        

	    // while
	    int j = 0;
	    while (j < 5)
	    {
	        Console.WriteLine($"while: j = {j}");
	        j++;
	    }

	    // do-while
	    int k = 0;
	    do repeat
	    {
	        Console.WriteLine($"do-while: k = {k}");
	        k++;
	    } while (k < 5);

	    
		int[] numeros = new int[] { 1, 2, 3, 4, 5 };
		// foreach para recorrerlo
		foreach (int n in numeros){
			Console.WriteLine($"foreach: n = {n}");
		}
		 
    }
}

Salida:

         [ Fundamentos de Beef ]
         [ Estructuras de control iterativas en Beef ]
for: i = 0
for: i = 1
for: i = 2
for: i = 3
for: i = 4
while: j = 0
while: j = 1
while: j = 2
while: j = 3
while: j = 4
do-while: k = 0
do-while: k = 1
do-while: k = 2
do-while: k = 3
do-while: k = 4
foreach: n = 1
foreach: n = 2
foreach: n = 3
foreach: n = 4
foreach: n = 5

C3:

fundamentos.c3

module fundamentos;

import std::io;

fn void main()
{
    io::printn("\t [ Fundamentos en C3 ]");
    test_a();
}

fn void test_a()
{
   io::printn("\t [ Estructuras de control iterativas en C3 ]");
    
    for (int i = 0; i < 5; i++){
        io::printf("for: i = %d\n", i);
    }
    
    int j = 0;
    while (j < 5) {
        io::printf("while: j = %d\n", j);
        j++;
    }

    
    int k = 0;
    do {
        io::printf("do-while: k = %d\n", k);
        k++;
    } while (k < 5);

    

   int[5] numeros = {1, 2, 3, 4, 5};
    for (int idx = 0; idx < numeros.len; idx++){
        io::printf("array[%d] = %d\n", idx, numeros[idx]);
   }

}

Compilación:

$ c3c compile fundamentos.c3 -o fundamentos

Salida:

         [ Fundamentos en C3 ]
         [ Estructuras de control iterativas en C3 ]
for: i = 0
for: i = 1
for: i = 2
for: i = 3
for: i = 4
while: j = 0
while: j = 1
while: j = 2
while: j = 3
while: j = 4
do-while: k = 0
do-while: k = 1
do-while: k = 2
do-while: k = 3
do-while: k = 4
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5

En conclusión:

  • Si buscas un lenguaje moderno con tooling completo y sintaxis más expresiva, Beef es la apuesta. 
  •  Si prefieres una transición suave desde C, con mejoras de seguridad y ergonomía pero sin perder compatibilidad total, C3 es la opción.

Continuaremos con esta serie sobre lenguajes de programación.

Enlaces:

https://www.beeflang.org/
https://c3-lang.org/

lunes, 2 de febrero de 2026

OpenCode: un agente para escribir código

OpenCode es una alternativa Open Source a herramientas como Claude Code.

Está disponible como interfaz de terminal, aplicación de escritorio o extensión de IDE. Sirve para acelerar el desarrollo de software al generar, analizar, editar y corregir código. Permite multisesiones, se conecta con Github Copilot, entre otras cosas más.

Puedes usarlo a la par con ChatGPT Plus/Pro, Github Copilot, etc. mediante una subscripción. Aunque no necesitas necesariamente una subscripción para usar OpenCode. Además te permite personalizarlo.

En pocas palabras, con OpenCode podrás crear código de manera fácil desde una terminal.

¿Cómo instalo OpenCode?

Requisitos:

  • Emulador de terminal moderno: WezTerm, Alacritty, Ghostty o Kitty. 
  • Claves API: Debes tener credenciales de los proveedores de LLM que quieras usar (ej. OpenAI, Anthropic, Google Gemini). 
  • Sistema operativo compatible: macOS, Linux o Windows (con WSL recomendado).

Existen varias formas de hacerlo.

En entornos Linux:

$ curl -fsSL https://opencode.ai/install | bash

Con Node JS:

# npm
$ npm install -g opencode-ai

# bun
$ bun install -g opencode-ai

# pnpm
$ pnpm install -g opencode-ai

# yarn
$ yarn global add opencode-ai

En entornos Mac OS:

$ brew install anomalyco/tap/opencode

Con un instalador .exe (Windows):

https://opencode.ai/download

Verificamos la instalación:

$ opencode --version

OpenCode necesita conectarse a modelos de IA. Puedes configurar tus credenciales en el archivo de configuración:

$ opencode config set 
$ openai_api_key=TU_API_KEY
$ opencode config set anthropic_api_key=TU_API_KEY
$ opencode config set gemini_api_key=TU_API_KEY

Seleccionamos un modelo por defecto:

$ opencode config set default_model=openai:gpt-4

Podemos abrirlo de manera interactiva:

$ opencode 

También escribiendo un prompt de manera directa:

$ opencode "Escribe un script en Python que calcule la serie de Fibonacci"

Conclusiones:

OpenCode (y herramientas similares) ayudará a los programadores a hacer su trabajo más rápido y a otros les hará creer que son programadores sin serlo (como lo hizo Visual Basic en su momento).

La I.A. ya llegó. Lo que imaginabamos o veíamos en series o películas de ciencia ficción se ha vuelto una realidad. El programador pronto pasará a ser un espectador (lo queramos o no) que solicita X o Y cosa para que un asistente virtual nos sirva lo solicitado.

El futuro es la automatización del trabajo. No ayudar al trabajador a hacer su trabajo más rápido. No, no es el caso.

2026 mostrará la otra cara de la I.A. una que casi nadie quiere ver: el desplazamiento del humano por un agente virtual.

Quien se duerma en sus laureles pronto será reemplazado. Ese es el plan a futuro. Solo un tonto no lo verá de ese modo.

Enlaces:

https://opencode.ai/
https://lapascalinaatomica.blogspot.com/2026/02/fortran-oberon-y-pascal-frente-la-ia.html

domingo, 1 de febrero de 2026

Crystal: la hermana "cool" de Ruby

Hace tiempo que hablamos sobre este lenguaje de programación que comparte mucha similitud con Ruby.

Como mencionamos anteriormente, Crystal posee una sintaxis similar a Ruby. Sin embargo, es un lenguaje que promete ser mucho más rápido y eficiente. Además de otras peculiaridades que lo hacen digno de no pasar inadvertido.

Veamos un ejemplo.

server.cr

# Un servidor HTTP básico
require "http/server"

server = HTTP::Server.new do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hola, mundo, obtenemos #{context.request.path}!"
end

address = server.bind_tcp(8080)
puts "Escuchando desde el puerto: http://#{address}"

# Invocamos el bloque hasta que el proceso finaliza
server.listen

En pocas palabras se trata de una aplicación HTTP que muestra el clásico "Hola, mundo". Echémoslo a andar. Pero antes de hacer nada comencemos con su instalación.

Instalación en Linux

Abrimos una terminal y tecleamos lo siguiente:

$ curl -fsSL https://crystal-lang.org/install.sh | sudo bash
$ apt install crystal

Instalación en Windows

Abrimos una terminal y tecleamos lo siguiente:

$ scoop install git
$ scoop bucket add crystal-preview https://github.com/neatorobito/scoop-crystal
$ scoop install vs_2022_cpp_build_tools crystal

Podemos validar la instalación tecleando:

$ crystal --version

Ejecutamos el script:

$ crystal server.cr

Abrimos el navegador en la ruta: http://localhost:8080/Thomas

Salida:

Hola, mundo, obtenemos /Thomas!

En lenguajes como Java tendríamos que haber creado un proyecto completo para realizar esta actividad.

Ahora veamos cómo consumir una API pública (https://api.chucknorris.io/).

get_chiste.cr

require "http/client"
require "json"

response = HTTP::Client.get("https://api.chucknorris.io/jokes/random")
json = JSON.parse(response.body)

value = json["value"]
put "Chiste sobre Chuck Norris: #{value || "Ninguno"}"

Ejecutamos el script:

$ crystal get_chiste.cr

Salida:

Chiste: Chuck Norris attended last year's Nobel Prize ceremony wearing an all-white snakeskin pimp suit with matching widebrim hat and feather.

Al ser una salida aleatoria el resultado puede variar.

Notas importantes

Crystal nos permite compilar nuestros scripts y con ello crear ejecutables.

Compilando el ejemplo anterior:

$ crystal build get_chiste.cr

Con esto nos creará los siguientes archivos:

gc.dll
get_chiste.cr
get_chiste.exe
get_chiste.pdb
iconv-2.dll
libcrypto-3-x64.dll
libssl-3-x64.dll
zlib1.dll

O si solo preferimos la ejecución de estas dos formas:

$ crystal programa.cr
# O de esta otra forma:
$ crystal run programa.cr

Los "nuevos" lenguajes como Crystal, Ballerina, Go y Rust han aprendido lo mejor de los lenguajes clásicos y han olvidado lo malo de ellos.

Prometen ser la panacea universal y aliviarnos de las complejidades y otras cuestiones que hacian del desarrollo una actividad, en ocasiones, tediosa y complicada.

Continuaremos con esta serie sobre nuevos lenguajes y herramientas.

Enlaces:

https://crystal-lang.org/
https://codemonkeyjunior.blogspot.com/2024/09/crystal-un-lenguaje-de-programacion.html
https://api.chucknorris.io/
https://emanuelpeg.blogspot.com/2026/01/crystal-el-lenguaje-de-programacion-que.html



domingo, 25 de enero de 2026

gRPC y GraphQL en una comparativa

gRPC y GraphQL son dos de los protocolos de comunicación más utilizados actualmente en el desarrollo de APIs.

GraphQL es ideal cuando el cliente necesita controlar qué datos obtiene, evitando cargas innecesarias. Consultas flexibles y un solo endpoint para múltiples recursos.

gRPC destaca en rendimiento, streaming y comunicación entre microservicios gracias a su formato binario y contratos estrictos. Con una comunicación bidireccional y streaming.

Comparativa entre gRPC y GraphQL

He aquí una tabla comparativa entre estos dos protocolos de comunicación:

Aspecto GraphQL gRPC
Modelo de comunicación Basado en consultas declarativas; el cliente define qué datos necesita. Basado en llamadas a procedimientos remotos (RPC) con contratos definidos en archivos .proto.
Formato de datos JSON, fácil de leer y depurar. Protocol Buffers (binario), más eficiente en tamaño y velocidad.
Orientación Optimizado para APIs orientadas a frontends y aplicaciones con múltiples vistas. Optimizado para comunicación entre microservicios y sistemas distribuidos de alto rendimiento.
Similitudes Ambos buscan mejorar la eficiencia respecto a REST, soportan tipado fuerte y facilitan la evolución de APIs.
Pros - Flexibilidad en consultas.
- Evita el overfetching y underfetching.
- Gran ecosistema y soporte en frontend.
- Alto rendimiento y baja latencia.
- Streaming bidireccional.
- Contratos estrictos con Protobuf.
Contras - Mayor complejidad en servidores.
- Problemas de caché.
- Curva de aprendizaje para consultas avanzadas.
- Menos legible para humanos (binario).
- Requiere más configuración inicial.
- Ecosistema más orientado a backend que frontend.
Casos de uso ideales Aplicaciones web y móviles que requieren flexibilidad en datos. Microservicios, sistemas distribuidos y aplicaciones de tiempo real.


GraphQL en un ejemplo

Miremos la siguiente imagen que muestra un ejemplo del uso de GraphQL.

El flujo nos dice que:

  • El cliente (una app web o móvil) envía una consulta específica. 
  • El servidor GraphQL responde solo con los datos solicitados, evitando el overfetching
  • Además se usa JSON como formato de respuesta, y el cliente controla qué campos necesita.

gRPC en un ejemplo

Ahora miremos un ejemplo de uso de gRPC.

El flujo nos dice que:

  • El cliente (normalmente otro microservicio) realiza una llamada RPC. 
  • El servidor gRPC responde con datos serializados en Protocol Buffers, optimizados para velocidad y eficiencia. 
  • El contrato entre ambos está definido en archivos .proto, lo que garantiza tipado fuerte y evolución controlada.

Lenguajes de programación más utlizados para ambos protocolos

Lenguaje Uso en GraphQL Uso en gRPC
JavaScript / TypeScript Muy popular en frontend y backend con frameworks como Apollo Server y Express. Soporte limitado; se usa más en clientes que en servidores.
Python Usado con librerías como Graphene y Ariadne. Bien soportado con gRPC Python; útil en ciencia de datos y microservicios.
Java Compatible con librerías como graphql-java. Muy usado en backend empresarial con soporte oficial de gRPC.
Go Menos común en GraphQL, aunque existen librerías como gqlgen. Uno de los lenguajes más eficientes para gRPC; ideal para microservicios.
C++ Raramente usado en GraphQL. Alto rendimiento en sistemas embebidos y backend con gRPC.
.NET (C#) Compatible con HotChocolate y GraphQL.NET. Soporte oficial de gRPC en .NET Core; muy usado en entornos Windows.
Ruby Popular en startups con graphql-ruby. Soporte limitado para gRPC.

Como se puede observar:

  • Go, Java y .NET son excelentes opciones para gRPC
  • JavaScript/TypeScript y Python son ideales para GraphQL.

Conclusiones:

Ambos son alternativas modernas a REST, pero su elección depende del contexto: GraphQL para flexibilidad en frontends y gRPC para eficiencia en backends distribuidos.

Enlaces:

https://alquimistadecodigo.blogspot.com/2024/04/un-vistazo-grpc-una-alternativa-soap-y.html
https://alquimistadecodigo.blogspot.com/2024/05/graphql-en-un-vistazo.html
https://unpocodejava.com/2019/01/23/que-es-grpc/
https://alquimistadecodigo.blogspot.com/2024/05/grpc-protobuff-protocol-buffers.html
https://learn.microsoft.com/es-es/dotnet/architecture/cloud-native/grpc
https://learn.microsoft.com/es-es/dotnet/architecture/cloud-native/grpc



sábado, 17 de enero de 2026

RESTEasy: un REST de manera fácil

RESTEasy es, en pocas palabras, una implementación de JAX-RS; un framework para crear servicios web RESTful.

Permite crear servicios REST usando anotaciones como @Path, @GET, @POST, etc., sobre clases e interfaces Java. También permite crear clientes RESTful, pues provee frameworks para realizar esa tarea.

Ayuda al desarrolllador web a crear APIs que se comunican a través de HTTP, facilitando la creación de microservicios y servicios web ligeros en el ecosistema Java.

Se puede integrar con Quarkus y Wildfly.

Para mayor información puedes consultar este sitio: https://docs.resteasy.dev/7.0/userguide/

Empezando con RESTEasy

Existen dos formas recomendadas:

  • La manera clásica: con Jakarta EE 10 y Wildfly. 
  • La moderna y recomendada: con Quarkus y RESTEasy Reactive.

Nosotros elegiremos Quarkus con RESTEasy Reactive (Quarkus REST) para crear un sencillo servicio.

Tenemos dos opciones para crear el proyecto.

Con Quarkus CLI:

$ quarkus create app mx.inforhomex:hola-quarkus-rest --extension=rest

Si no contamos con la herramienta, la podemos instalar con estos comandos:

Linux:

$ curl -Ls https://sh.jbang.dev | bash -s - trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
$ curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio

Usando SDKMAN!:

$ sdk install quarkus

Windows:

$ iex "& { $(iwr https://ps.jbang.dev) } trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/"
$ iex "& { $(iwr https://ps.jbang.dev) } app install --fresh --force quarkus@quarkusio"

La otra alternativa para crear el proyecto es con Maven:

$ mvn io.quarkus.platform:quarkus-maven-plugin:3.15.1:create -DprojectGroupId=mx.inforhomex -DprojectArtifactId=hola-quarkus-rest -Dextensions=rest

Una vez creado el proyecto nos ubicaremos en el directorio principal.

$ cd hola-quarkus-rest

Abrimos y editamos la clase ``GreetingResource.java`` para que luzca de esta forma:

package mx.inforhomex;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import java.util.HashMap;

@Path("/saludar")
public class GreetingResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HashMap<String, Object> saludar() {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("message","Hola, mundo desde Quarkus REST");
        map.put("active",true);
        map.put("id",1202029L);
        return map;
    }
}

Ejecutamos con Quarkus:

$ quarkus dev

O con Maven:

$ ./mvnw quarkus:dev

Abrimos el navegador en la ruta: http://localhost:8080/saludar

Si todo va bien, veremos esta salida:

{active=true, id=1202029, message=Hola, mundo desde Quarkus REST}

¡Hemos creado nuestro primer proyecto con RESTEasy y Quarkus!

En próximas entregas hablaremos de Quarkus, un fuerte contendiente de Spring Boot.

Enlaces:

https://resteasy.dev/
https://docs.resteasy.dev
https://codemonkeyjunior.blogspot.com/2026/01/un-vistazo-jakartaee.html
https://es.quarkus.io/


Beef y C3, dos lenguajes de programación que evolucionan a C

En este 2026 la programación será cada vez más díficil de aprender y enseñar. La I.A. ha surgido como una herramienta útil para el desarr...

Etiquetas

Archivo del blog