Ir al contenido principal

Comparativa entre Odin y C

En está ocasión haremos una breve comparativa entre dos lenguajes de programación: C y Odin.

C, un lenguaje de programación estructurado y "multi propósito" que se niega a morir versus Odin, un nuevo lenguaje de programación que toma lo mejor de lenguajes como C, C++ o Java para resolver los grandes problemas que se dejaron pendientes (como el manejo de memoria, entre otros).

Por ejemplo, Odin fue diseñado para evitar las complejidades y los problemas potenciales de las macros (como depuración difícil o errores de precedencia).

En su lugar, confía en un sistema de tipos fuerte y en la capacidad del compilador para optimizar funciones inline, ofreciendo un enfoque más limpio y seguro.

Veamos un ejemplo de macro (sustituciones textuales realizadas por el preprocesador antes de la compilación) en C.

main.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include<stdio.h>

// Definimos la MACRO para determinar si un número es mayor a 100
#define ESMAYORA100(num) (num > 100? 1 : 0) 


int main(){
  int num = 101;
  puts("Programando en C.");

  // Invocamos la MACRO como si fuese una función
  if(ESMAYORA100(num)){
	printf("%d es mayor a 100\n",num);
  }
  return 0;
}

En Odin al no existir el concepto de MACRO, dependeremos de la creación de una función.

main.odin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import "core:fmt"

// Definimos la función
esmayora100 :: proc(num: int) -> bool{
	return num > 100
}

main :: proc(){
   fmt.println("Programando en Odin.")
   num:int = 101;
   
   // Invocamos la función
   if esmayora100(num) {
	   fmt.printf("%d es mayor a 100\n", num)
   }
   
}

Ambos programas hacen lo mismo: determinar si un número entero es mayor a 100.

Mientras que en C no empleamos algún tipo de dato booleano (en su lugar empleamos 1 como true, 0 como false), en Odin si empleamos el tipo bool.

Haciendo una comparativa de tiempo de ejecución tenemos:

 Lenguaje   Resultado de ejecución  Tiempo
 C   Programando en C.
101 es mayor a 100
 Start Time: 12:52:34.02
End Time: 12:52:34.05
 Odin   Programando en Odin.
101 es mayor a 100
 Start Time: 12:53:49.64
End Time: 12:53:49.67

Tanto el programa hecho en C como el de Odin tienen un tiempo de ejecución de apenas 3 milisegundos.

Otra diferencia es que en lenguajes como C deberás crear archivos encabezados para "combinar" el código de un programa con otro programa para crear una interoperabilidad.

Mientras que en Odin basta que pertenezcan al mismo ``package``.

Para demostrarlo, crearemos un programa que determine el IMC de una persona en C que tendrá:

  1. Un archivo encabezado: imc.h 
  2. Un archivo donde implementaremos el encabezado: imc.c 
  3. Un programa main que será el ejecutable: main.c

imc.h

1
2
3
4
5
6
7
8
#ifndef _IMC
#define _IMC
#include<stdio.h>

// Encabezado de la función
double getImc(double, double);

#endif

imc.c

1
2
3
4
5
#include "imc.h"

double getImc(double peso, double talla){
    return peso/(talla*talla);
}

main.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include "imc.c"

int main(int argc, char const *argv[]){
    puts("\t [Obtener IMC de una persona]\n");
    double peso, talla;
    peso = 78.0;
    talla = 1.72;
    printf("Peso: %.1f y talla: %.1f\n", peso, talla);
    printf("Tu IMC es de: %.2f\n", getImc(peso, talla));
    return 0;
}

Compilamos y creamos el ejecutable:

1
$ gcc main.c -o imc_generador.exe

Ejecutamos:

1
$ imc_generador.exe

Salida:

1
2
3
4
         [Obtener IMC de una persona]

Peso: 78.0 y talla: 1.7
Tu IMC es de: 26.37

¿Cómo será en Odin? Crearemos una carpeta llamada: imc_project. Dentro de esta tendremos dos programas:

  • Uno donde definiremos una función para calcular el IMC: imc.odin 
  • El otro que empleará la función: main.odin

imc.odin

1
2
3
4
5
package main

get_imc :: proc(peso: f32, talla: f32) -> f32 {
    return peso / (talla * talla)
}

main.odin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main 

import "core:fmt"
// Importamos el código del programa imc.odin
import "../imc_project"

main :: proc(){
    peso: f32 = 78.0
    talla: f32 = 1.72
    fmt.println("\t [ Obtener IMC de una persona ]\n")
    fmt.printfln("Peso: %.1f y talla: %.1f\n", peso, talla)
    fmt.printfln("Tu IMC es de: %.2f\n", get_imc(peso, talla))
} 

Es importante que ambos tengan el mismo ``package``, es decir deberá ser ``main``

Ejecutaremos el proyecto de la siguiente forma:

1
$ odin run imc_project

Donde ``imc_project`` es el directorio donde se esncuentran los dos programas *.odin.

Salida:

1
2
3
4
5
         [ Obtener IMC de una persona ]

Peso: 78.0 y talla: 1.7

Tu IMC es de: 26.37

Esta es solo una pequeña comparativa entre estos dos lenguajes. Continuaremos con esta serie de entregas sobre Odin.

Enlaces:

https://graphitemaster.github.io/odin_review/
https://hasenjudy.wordpress.com/2022/08/25/odin-praise/

Comentarios

Entradas populares de este blog

Odin language: el lenguaje de programación orientado a datos para un desarrollo de software sensato

En esta serie sobre lenguajes de programación hablamos de Odin , un lenguaje orientado a datos. Un nuevo lenguaje de programación que nos podrá recordar a lenguajes como C++, Python, Golang o hasta Rust. Instalación (Windows): 1 2 3 4 $ git clone https://github.com/odin-lang/Odin $ cd Odin $ git pull $ build.bat release Debemos asegurarnos de crear la variable de entorno: Nombre: ODIN_HOME Valor: C:\Users\HP\Documents\pruebasOdin\Odin Ejemplo 1. Como primer programa tendremos al clásico "Hola, mundo". holamundo.odin package holamundo import " core:fmt " main : : proc ( ) { fmt . println ( " ¡Hola, mundo desde Odin! " ) } Construimos: $ odin build holamundo . odin - file Ejecutamos: $ holamundo .exe Recordar que si usamos Visual Studio Code podemos instalar el plugin de Odin Language: https://marketplace.visualstudio.com/items?itemName=DanielGavin.ols Ejemplo 2. Programa que muestre las variables que pod...

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

z/OS, ¿Qué es? y ¿Cuáles son sus herramientas?

  En este post veremos las herramientas de z/OS de IBM. z/OS es un sistema operativo de mainframe desarrollado por IBM.  Es parte de la serie IBM z Systems (anteriormente conocida como System z), que se utiliza en los sistemas mainframe de IBM. z/OS es uno de los sistemas operativos más utilizados en el mundo empresarial para ejecutar aplicaciones críticas y procesar grandes volúmenes de datos. Características clave de z/OS: Escalabilidad : z/OS es conocido por su capacidad para manejar grandes cargas de trabajo y escalabilidad vertical, lo que permite agregar recursos de hardware para satisfacer las demandas de procesamiento. Confiabilidad y disponibilidad : z/OS está diseñado para ofrecer alta disponibilidad y confiabilidad. Incorpora características como redundancia y recuperación ante fallas para garantizar la continuidad de las operaciones. Seguridad : Proporciona una amplia gama de funciones de seguridad, como autenticación, autorización y auditoría, para proteger los...