Materia: #organizacion_del_computador_II

Tags:

Herramientas de desarrollo

Los procesadores originales fueron definidos para tratar con valores que pueden tomar dos estados: verdadero y falso, o 1 y 0, o tensión V y tensión 0. Por este motivo, cualquier microprocesador solo se comunica en binario.

El problema siguiente radica en que a los humanos no nos resulta natural escribir o leer este lenguaje. Es posible, pero muy dificil. A su vez, un simple error como permutar un 1 en un 0, ya se considera un bug, y seria terriblemente dificil de encontrar.


Assembler

Por este mismo motivo, se creo Assembler, tambien conocido como lenguaje de máquina. En ese lenguaje, cada instrucción tiene un nombre alusivo a la operación que realiza (en inglés), y se lo representa por su abreviatura. Por ejemplo, la instrucción mov viene del inglés move.

%define SYS_WRITE 1
%define SYS_EXIT 60

section .text
global _start

_start:
    mov rdx, len
    mov rsi, msg
    mov rdi, 1
    mov rax, SYS_WRITE
    syscall
    mov rax, SYS_EXIT
    mov rdi, 0
    syscall

section .data
    msg db 'Hola, mundo',0xa
    len equ $ - msg
Un programa en Assembler que imprime en pantalla Hola, mundo.

Cada sentencia en el programa corresponde a una y solo una operación de la CPU. Con la ayuda de un programa llamado Ensamblador (o Assembler, igual que el lenguaje), se convierte ese texto, apto para su entendimiento por parte de los seres humanos, a números binarios, único lenguaje que habla el microprocesador. Al codigo original del programa, el escrito en Assembler, se lo suele llamar codigo fuente.


Lenguajes de alto nivel

A diferencia del Assembler, en estos casos cada sentencia del programa puede componerse de varias instrucciones del procesador. Surgieron para poder escribir programas mas complejos con menos texto.

#include <stdio.h>

int main() {
	printf("Hola, mundo\n");
	return 0;
}
Un programa en C que imprime en pantalla Hola, mundo.

Con ayuda de un programa llamado compilador se convierte el texto del codigo a números binarios, explotando cada sentencia en una o mas instrucciones del procesador. Al igual que en el Assembler, al programa escrito en el lenguaje de alto nivel tambien se lo llama codigo fuente.


Proceso de desarrollo

A la hora de desarrollar un programa existen varias etapas por las que pasa nuestro codigo hasta llegar a ser un programa ejecutable. En particular, vamos a ver dos herramientas clave: el compilador y el linker.

flowchart TD

sourceCode(HolaMundo.c)
compiler([Compilador])
objectProgram(HolaMundo.o)
linker([Linker])
executable(HolaMundo)

sourceCode    --> compiler
compiler      --> objectProgram
objectProgram --> linker
linker        --> executable
Diagrama mostrando el flujo de desarrollo de un programa HolaMundo.c

El compilador es un programa capaz de analizar sintácticamente un archivo de texto que contiene un codigo fuente. Si éste está escrito de forma correcta, respetando la semántica del lenguaje para el cual compila, genera un código binario adeucado. En particular, crea un archivo objeto, que suele estar demarcado por la terminacion .o.

Además, reemplaza los nombres lógicos que adoptemos en nuestro programa para variables o funciones por las direcciones de memoria donde las mismas se encuentran. No puede hacer referencias a funciones exteriores al archivo fuente que analiza. En el ejemplo del HolaMundo.c, el compilador no seria capaz de reemplazar la operacion printf, ya que no esta definida en el mismo archivo.

Antes de hacer su trabajo, el compilador invoca un programa denominado preprocesador, que se encarga de eliminar los comentarios e incluir otros archivos (en nuestro ejemplo, la linea include <stdio.h> es reemplazada por el contenido del archivo stdio.h), y reemplaza las macros (la instrucción #define, que en ejemplo no se utiliza). Si genera errores, es porque el programa está mal escrito. En caso contrario, se genera el archivo objeto.

Por otro lado, tenemos al linker. Es un programa capaz de tomar el programa objeto generado recién por el compilador, enlazarlo (linkearlo) con otros programas objeto y con otras bibliotecas de código y generar un programa ejecutable para el sistema operativo sobre el cual estamos desarrollando nuestro programa.