Del Callejo Tapia Rafaell
Este proyecto implementa una librería de alto rendimiento en ARM64 Assembly, integrada con Python mediante C y ctypes.
Demostrar la interoperabilidad entre lenguajes de alto y bajo nivel, así como analizar el rendimiento.
- Python 3
- C (clang)
- ARM64 Assembly (AArch64)
- Termux / Raspberry Pi OS
- Operaciones básicas
- Procesamiento de arreglos
- Funciones optimizadas en ensamblador
makepython src/app.pyComparación de rendimiento entre:
- Python
- C
- Assembly
Este proyecto me ayudo a entender mejor como funcionan mejor ciertas funciones de mi githhub como la configuracion y uso del ssh, uso de personal tokens de guardado para contraseñas y comandos basicos de git hub como git push, git pull, commit y un mejor uso de aws combinandolo con lo antes mencionado.
Tarde mucho en configurar el ssh ya que no pasaba al cat eñ archivo .pub esto fue un error por prisas y no terminar leyendolo pero se soluciono.
ARM64 es la arquitectura de 64 bits de ARM (Advanced RISC Machines), diseñada bajo la filosofía RISC (Reduced Instruction Set Computer). A diferencia de x86 (Intel/AMD), ARM64 utiliza instrucciones de longitud fija y un modelo de carga/almacenamiento (load/store). ¿Por qué usar Assembly?
Optimización crítica: Permite exprimir el rendimiento en algoritmos matemáticos complejos o drivers de hardware.
Control total: Gestionas directamente el movimiento de datos entre registros y memoria, eliminando las suposiciones que a veces hace el compilador.
Comprensión del silicio: Es la única forma de ver cómo se comporta realmente el procesador ante las ramas (branches) y la predicción de saltos.
👉 El ensamblador ayuda a entender cómo funciona la computadora a nivel de registros y memoria
Registros de Propósito General (x0–x30) En ARM64, tenemos 31 registros de propósito general de 64 bits. Si necesitas operar con 32 bits, se denominan w0–w30.
x0–x7: Se usan para pasar argumentos a funciones y devolver resultados.
x29 (Frame Pointer): Rastrea el inicio del marco de la pila.
x30 (Link Register): Almacena la dirección de retorno tras una llamada a función (bl).
xzr: El registro "zero"; siempre devuelve 0 y descarta cualquier valor escrito en él.
ABI (Application Binary Interface) La Standard ARM Procedure Call Standard (AAPCS) dicta las reglas de etiqueta:
Los primeros 8 argumentos van en x0-x7.
Si una función modifica los registros x19-x28, debe guardar sus valores originales en la pila y restaurarlos antes de terminar (callee-saved).
-
Explicación de cada archivo:
- Python
- C
- Assembly
Tabla tipo:
| Método | Tiempo |
|---|---|
| Python | ![]() |
| X ms | |
| C | X ms |
| ASM | X ms |
Al contrastar los tiempos de ejecución, la superioridad de Assembly y C sobre Python es drástica, pero por razones distintas. Python enfrenta un "overhead" masivo debido a que es un lenguaje interpretado; cada iteración del ciclo de suma requiere que la máquina virtual de Python verifique el tipo de dato, gestione el conteo de referencias para la memoria y maneje el Global Interpreter Lock (GIL). Esto convierte una simple operación de suma en cientos de instrucciones de CPU.
Por otro lado, la ventaja de Assembly sobre C —aunque menor— radica en la eliminación del prólogo y epílogo que los compiladores suelen generar por seguridad. En ARM64, al escribir el código manualmente, podemos mantener el acumulador de la suma directamente en un registro de alto rendimiento (como x0) y evitar cualquier acceso innecesario a la memoria RAM (Stack), logrando una ejecución lineal y ultraeficiente que aprovecha al máximo el pipeline del procesador.
La decisión de implementar soluciones en ARM64 Assembly debe reservarse para escenarios donde el rendimiento por ciclo de reloj es el factor crítico del éxito, como en el desarrollo de drivers, kernels de sistemas operativos o algoritmos criptográficos. Si bien ofrece un control absoluto sobre el hardware y una eficiencia energética superior, su uso conlleva una complejidad de mantenimiento elevada y la pérdida de portabilidad entre diferentes arquitecturas.
En la práctica moderna, lo más eficiente es un enfoque híbrido: utilizar lenguajes de alto nivel como Python para la lógica de negocio y "envolver" pequeñas subrutinas críticas escritas en C o Assembly. Esto permite obtener lo mejor de ambos mundos: la velocidad de desarrollo de las herramientas modernas y la potencia bruta de la arquitectura ARM64, garantizando que el software sea escalable pero capaz de realizar tareas intensivas en milisegundos.
Guarda capturas de:
* uso de GDB:
gdb ./libops.so
<img width="941" height="620" alt="image" src="https://github.com/user-attachments/assets/07d796fe-1846-44f8-9211-2cb6b990b96a" />
info registersdisassembleVideo: https://asciinema.org/a/73EgRp7GGFtn7A0r
