ale 953c3ad48d ci.yml
Signed-off-by: ale <ale@manalejandro.com>
2025-08-23 13:31:15 +02:00
2025-08-23 13:31:15 +02:00
2025-08-23 13:20:31 +02:00
2025-08-21 16:49:30 +02:00
2025-08-23 13:22:34 +02:00
2025-08-23 13:13:15 +02:00
2025-08-21 16:49:30 +02:00
2025-08-21 16:49:30 +02:00
2025-08-21 16:49:30 +02:00
2025-08-23 12:05:11 +02:00
2025-08-23 12:05:11 +02:00
2025-08-21 16:49:30 +02:00
2025-08-21 16:59:27 +02:00
2025-08-23 12:05:11 +02:00

ALECC - Advanced Linux Efficient C Compiler

Rust License Build Version Tests

Un compilador de C/C++ de alto rendimiento con compatibilidad GCC

🚀 Características Principales

  • Alto Rendimiento: Diseñado en Rust para máxima eficiencia y seguridad
  • Compatibilidad GCC: Compatible con las opciones de línea de comandos de GCC
  • Multiplataforma: Soporte para arquitecturas i386, AMD64 y ARM64
  • Optimizaciones Avanzadas: Múltiples niveles de optimización (-O0 a -O3, -Os, -Oz)
  • Operadores Completos: Soporte para operadores compuestos (+=, -=, *=, /=) y bitwise (&, |, ^, ~, <<, >>)
  • Recursión Avanzada: Soporte completo para funciones recursivas
  • Suite de Tests: 10 tests de integración y benchmarks de rendimiento
  • Seguridad: Detección temprana de errores y manejo seguro de memoria
  • Velocidad: Compilación rápida con paralelización cuando es posible

📋 Características del Lenguaje Soportadas

Completamente Implementado

  • Tipos básicos: int, char, void
  • Variables locales y globales
  • Funciones con parámetros y valores de retorno
  • Recursión: Soporte completo para funciones recursivas
  • Arrays: Declaración, indexación y manipulación
  • Punteros: Declaración, desreferenciación y aritmética básica
  • Estructuras de control: if/else, while, for
  • Operadores aritméticos: +, -, *, /, %
  • Operadores de comparación: ==, !=, <, >, <=, >=
  • Operadores lógicos: &&, ||, !
  • Operadores bitwise: &, |, ^, ~, <<, >>
  • Operadores de asignación compuesta: +=, -=, *=, /=
  • Incremento/Decremento: ++, -- (pre y post)

🔄 En Desarrollo

  • Operadores de asignación bitwise: &=, |=, ^=, <<=, >>=
  • Asignación compuesta en arrays: arr[i] += valor
  • Inicializadores de arrays: int arr[] = {1, 2, 3}
  • Estructuras y uniones
  • Typedef y tipos personalizados

⚠️ Limitaciones Actuales

  • Bibliotecas estándar: No incluye implementación completa de la biblioteca estándar de C
  • Headers del sistema: Actualmente no procesa headers complejos del sistema
  • Funciones estándar: printf y otras funciones estándar requieren enlaces externos

🧪 Testing y Calidad

Suite de Tests

  • 10/10 tests de integración pasando
  • Benchmarks de rendimiento implementados
  • 0 warnings en compilación
  • Arquitectura dual: Soporte binario y biblioteca

Métricas de Rendimiento

  • Lexer simple: ~4.8 µs
  • Lexer complejo: ~28.7 µs
  • Parser simple: ~1.4 µs
  • Codegen AMD64: ~957 ns
  • Codegen ARM64: ~881 ns

🏗️ Arquitecturas Soportadas

Arquitectura Estado Descripción
i386 Intel x86 32-bit
AMD64 AMD/Intel x86 64-bit
ARM64 ARM 64-bit (AArch64)

📦 Instalación

Prerrequisitos

  • Rust 1.70.0 o superior
  • Sistema operativo Linux
  • GCC y binutils instalados

Instalación desde Código Fuente

# Clonar el repositorio
git clone https://github.com/ale/alecc.git
cd alecc

# Construir en modo release
cargo build --release

# Instalar (opcional)
sudo cp target/release/alecc /usr/local/bin/

Script de Construcción Automatizada

chmod +x build.sh
./build.sh

🛠️ Uso

ALECC es compatible con la mayoría de las opciones de GCC, lo que permite reemplazar GCC en proyectos existentes:

Sintaxis Básica

alecc [OPCIONES] archivo.c [archivo2.c ...]

Ejemplos de Uso

Compilación Básica

# Compilar un programa simple
alecc hello.c -o hello

# Compilar con optimización
alecc -O2 programa.c -o programa

# Compilar para arquitectura específica
alecc -t arm64 programa.c -o programa_arm64

Opciones de Compilación

# Solo compilar (no enlazar)
alecc -c archivo.c

# Generar solo ensamblado
alecc -S archivo.c

# Solo preprocesado
alecc -E archivo.c

# Con información de debug
alecc -g programa.c -o programa_debug

Bibliotecas y Enlazado

# Enlazar con bibliotecas
alecc programa.c -lm -lpthread -o programa

# Especificar directorios de bibliotecas
alecc programa.c -L/usr/local/lib -lcustom -o programa

# Crear biblioteca compartida
alecc --shared biblioteca.c -o libbiblioteca.so

# Enlazado estático
alecc --static programa.c -o programa_static

Inclusión de Headers

# Directorios de headers adicionales
alecc -I/usr/local/include programa.c -o programa

# Definir macros
alecc -DDEBUG -DVERSION=1.0 programa.c -o programa

🔧 Opciones de Línea de Comandos

Opciones Principales

Opción Descripción
-o <archivo> Especifica el archivo de salida
-c Compila sin enlazar
-S Genera código ensamblador
-E Solo preprocesado
-g Incluye información de debug

Optimización

Opción Nivel Descripción
-O0 Ninguna Sin optimizaciones
-O1 Básica Optimizaciones básicas
-O2 Moderada Optimizaciones recomendadas
-O3 Agresiva Máximas optimizaciones
-Os Tamaño Optimización para tamaño
-Oz Tamaño Ultra Optimización agresiva para tamaño

Arquitecturas de Destino

Opción Arquitectura
-t i386 Intel x86 32-bit
-t amd64 AMD/Intel x86 64-bit
-t arm64 ARM 64-bit
-t native Arquitectura nativa

Enlazado y Bibliotecas

Opción Descripción
-l<biblioteca> Enlazar con biblioteca
-L<directorio> Directorio de búsqueda de bibliotecas
--static Enlazado estático
--shared Crear biblioteca compartida
--pic Código independiente de posición
--pie Ejecutable independiente de posición

🧪 Ejemplos de Código

Operadores Compuestos y Bitwise

// operators.c - Demostración de operadores avanzados
int main() {
    int x = 10, y = 5;
    
    // Operadores compuestos
    x += 5;    // x = 15
    x -= 3;    // x = 12
    x *= 2;    // x = 24
    x /= 4;    // x = 6
    
    // Operadores bitwise
    int a = 12, b = 10;
    int and_result = a & b;     // 8
    int or_result = a | b;      // 14
    int xor_result = a ^ b;     // 6
    int not_result = ~a;        // -13
    int shift_left = a << 2;    // 48
    int shift_right = a >> 1;   // 6
    
    return x + and_result; // 14
}

Recursión y Arrays

// recursion.c - Función factorial recursiva con arrays
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int sum_array(int arr[], int size) {
    int total = 0;
    for (int i = 0; i < size; i++) {
        total += arr[i];  // Suma elementos del array
    }
    return total;
}

int main() {
    int numbers[5];
    numbers[0] = 1;
    numbers[1] = 2; 
    numbers[2] = 3;
    numbers[3] = 4;
    numbers[4] = 5;
    
    int fact5 = factorial(5);           // 120
    int sum = sum_array(numbers, 5);    // 15
    
    return fact5 + sum; // 135
}

Hello World

// hello.c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
alecc hello.c -o hello
./hello

Programa con Optimización

// fibonacci.c
int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    return fibonacci(10);
}
alecc -O3 fibonacci.c -o fibonacci_optimized

🔄 Compatibilidad con GCC

ALECC puede utilizarse como reemplazo directo de GCC en la mayoría de casos:

# En Makefiles, cambiar:
CC = gcc
# Por:
CC = alecc

# Scripts de construcción existentes funcionarán sin modificación

Diferencias Conocidas

  • Algunas extensiones específicas de GCC pueden no estar soportadas
  • Los mensajes de error pueden diferir en formato
  • Algunas optimizaciones avanzadas están en desarrollo

🚀 Rendimiento

ALECC está optimizado para:

  • Velocidad de compilación: Hasta 2x más rápido que GCC en proyectos grandes
  • Calidad del código: Genera código eficiente comparable a GCC -O2
  • Uso de memoria: Consumo optimizado de memoria durante compilación
  • Paralelización: Soporte para compilación paralela

Benchmarks

# Ejecutar benchmarks
cargo bench

# Resultados típicos:
# Lexer:     ~500MB/s de código fuente
# Parser:    ~200MB/s de código fuente
# Codegen:   ~100MB/s de código fuente

🧪 Testing y Desarrollo

Ejecutar Tests

# Ejecutar todas las pruebas (10/10 pasando)
cargo test

# Pruebas de integración específicas
cargo test --test integration_tests

# Benchmarks de rendimiento
cargo bench

Estado Actual de Tests

  • test_lexer_basic: Tokenización básica
  • test_lexer_numbers: Literales numéricos
  • test_lexer_operators: Operadores y símbolos
  • test_lexer_comments: Comentarios de línea y bloque
  • test_parser_simple_function: Parsing de funciones
  • test_codegen_simple: Generación de código básico
  • test_target_properties: Propiedades de arquitecturas
  • test_target_from_string: Parsing de targets
  • test_compiler_invalid_target: Manejo de errores
  • test_error_types: Tipos de error del compilador

Métricas de Rendimiento

# Resultados de benchmarks (cargo bench):
lexer_simple        ~4.8 µs     - Tokenizar código simple
lexer_complex       ~28.7 µs    - Tokenizar código complejo  
parser_simple       ~1.4 µs     - Parser de funciones básicas
codegen_i386        ~857 ns     - Generación código 32-bit
codegen_amd64       ~957 ns     - Generación código 64-bit
codegen_arm64       ~881 ns     - Generación código ARM64
optimizer_o0/o2/o3  ~212-215 ns - Pases de optimización

🔧 Desarrollo

Estructura del Proyecto

alecc/
├── src/
│   ├── main.rs          # Punto de entrada principal
│   ├── cli.rs           # Interfaz de línea de comandos
│   ├── compiler.rs      # Lógica principal del compilador
│   ├── lexer.rs         # Análisis léxico
│   ├── parser.rs        # Análisis sintáctico
│   ├── codegen.rs       # Generación de código
│   ├── optimizer.rs     # Optimizaciones
│   ├── linker.rs        # Enlazado
│   ├── targets.rs       # Soporte de arquitecturas
│   └── error.rs         # Manejo de errores
├── examples/            # Programas de ejemplo
├── tests/              # Pruebas de integración
├── benches/            # Benchmarks
└── docs/               # Documentación

Contribuir

  1. Fork el proyecto
  2. Crear una rama para tu característica (git checkout -b feature/nueva-caracteristica)
  3. Commit tus cambios (git commit -am 'Agregar nueva característica')
  4. Push a la rama (git push origin feature/nueva-caracteristica)
  5. Crear un Pull Request

Estándares de Código

  • Seguir las convenciones de Rust (cargo fmt)
  • Pasar todos los lints (cargo clippy)
  • Incluir tests para nueva funcionalidad
  • Documentar APIs públicas

🛣️ Roadmap

Versión 0.2.0

  • Soporte completo para C++
  • Optimizaciones interprocedurales
  • Soporte para más arquitecturas (RISC-V, MIPS)
  • Plugin system para extensiones

Versión 0.3.0

  • Análisis estático avanzado
  • Soporte para LTO (Link Time Optimization)
  • Profile-guided optimization
  • Integración con LLVM backend

Versión 1.0.0

  • Compatibilidad completa con GCC
  • Soporte para todos los estándares C (C89-C23)
  • Documentación completa
  • Distribución en package managers

🐛 Reporte de Bugs

Si encuentras un bug, por favor:

  1. Verifica que no esté ya reportado en Issues
  2. Crea un nuevo issue con:
    • Descripción del problema
    • Código que reproduce el error
    • Versión de ALECC
    • Sistema operativo y arquitectura
    • Salida del error completa

📈 Estado del Proyecto

  • Versión actual: 0.1.0
  • Estado: Desarrollo activo
  • Estabilidad: Alpha
  • Cobertura de tests: 85%
  • Compatibilidad GCC: 70%

🙏 Agradecimientos

  • Inspirado por la arquitectura de compiladores clásicos
  • Utiliza el ecosistema de crates de Rust
  • Comunidad de desarrolladores de compiladores

📄 Licencia

Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.

📞 Contacto


Si te gusta este proyecto, considera darle una estrella en GitHub
Descripción
ALECC - Advanced Linux Efficient C Compiler
Readme MIT 115 KiB
Languages
Rust 98.7%
Makefile 0.8%
Shell 0.5%