Software Acces
Software Acces
Software Acces
10 de noviembre de 2017
El Software
En esta parte de la unidad, El Software, nos interesa conocer el proceso de desarrollo
de software, desde el punto de vista de la organización de computadoras. Explicaremos
cómo se llega desde un programa, en un lenguaje de alto o bajo nivel, a obtener una
sucesión de instrucciones de máquina para un procesador.
Lenguaje ensamblador
1
Para las instrucciones de salto, en lugar de desplazamientos, también usamos
rótulos o etiquetas para indicar la instrucción del programa adonde deseamos
saltar.
Cada CPU del mundo real tiene su propio lenguaje de máquina, y aunque mucho
más poderosos y de instrucciones más complejas, se parecen bastante, en líneas
generales, al lenguaje de máquina del MCBE. Igual que ocurre con el lenguaje de
máquina, cada CPU del mundo real tiene su propio lenguaje ensamblador, basado
en los mismos principios que el que mostramos aquí.
El lenguaje de máquina de cualquier CPU, y su lenguaje ensamblador (o Assembler ),
son llamados en general lenguajes de bajo nivel.
Mnemónicos
Rótulos
2
Dirección Instrucción Rótulo Mnemónico Argumento
En este ejemplo, SIGUE, FIN, UNO y CANT son rótulos. El rótulo CANT, por
ejemplo, nos permite referirnos en la primera instrucción, LD CANT, a un dato
declarado más adelante con ese nombre. Del mismo modo, cuando la instrucción es
de salto, podemos hacer referencia a la posición de memoria donde se hará el salto
usando un rótulo, como en la quinta instrucción, JMP SIGUE.
Rótulos predefinidos
3
Traductores
Ensambladores
Como hemos dicho anteriormente, una CPU como el MCBE sólo sabe ejecutar
instrucciones de código máquina expresadas con unos y ceros. Cuando vimos el
lenguaje ensamblador del MCBE lo propusimos simplemente como una forma de
abreviar las instrucciones de máquina, o como una forma de facilitar la escritura,
porque los mnemónicos y rótulos eran más fáciles de memorizar y de leer que las
instrucciones con unos y ceros.
Sin embargo, un programa escrito en ensamblador del MCBE podría ser traducido
automáticamente, por un traductor, a código de máquina MCBE, ahorrándonos
mucho trabajo y errores.
Esta clase de traductores, que reciben un programa en lenguaje ensamblador y
devuelven un programa en código de máquina, son los llamados ensambladores o
assemblers.
Ensamblador x86
.globl _start
.text # seccion de codigo
_start:
movl $len, %edx # carga parametros longitud
movl $msg, %ecx # y direccion del mensaje
movl $1, %ebx # parametro 1: stdout
4
movl $4, %eax # servicio 4: write
int $0x80 # syscall
Ensamblador ARM
.global main
main:
@ Guarda la direccion de retorno lr
@ mas 8 bytes para alineacion
push {ip, lr}
@ Carga la direccion de la cadena y llama syscall
ldr r0, =hola
bl printf
@ Retorna 0
mov r0, #0
@ Desapila el registro ip y guarda
@ el siguiente valor desapilado en el pc
pop {ip, pc}
hola:
.asciz "Hola, mundo!\n"
5
El ARM es un procesador que suele encontrarse en plataformas móviles como tablets
o teléfonos celulares, porque ha sido diseñado para minimizar el consumo de energía,
una característica que lo hace ideal para construir esos productos portátiles. Su
arquitectura, y por lo tanto, su conjunto de instrucciones, están basados en esos
principios de diseño.
Ensamblador PowerPC
Lenguajes de programación
6
Lenguajes de alto nivel
Otros lenguajes, los de alto nivel, ocultan al usuario los detalles de la arquitectura de
las computadoras y le facilitan la programación de problemas de software complejos.
Son más orientados al problema, lo que quiere decir que nos aíslan de cómo
funcionan los procesadores o de cómo se escriben las instrucciones de máquina, y nos
permiten especificar las operaciones que necesitamos para resolver nuestro problema
en forma más parecida al lenguaje natural, matemático, o humano.
Una ventaja adicional de los lenguajes de alto nivel es que resultan más portables,
y su depuración (el proceso de corregir errores de programación) es normalmente
más fácil.
Niveles de lenguajes
Paradigmas de programación
7
int factorial(int n)
{
int f = 1;
while (n > 1) {
f *= n;
n--;
}
return f;
}
factorial(0,X):- X=1.
factorial(N,X):- N1=N-1, factorial(N1,X1), X=X1*N.
factorial(N):- factorial(N,X), write(X).
El usuario de este programa puede usarlo de dos maneras. Podría preguntar el valor
del factorial de un número N, o consultar si es cierto que el factorial de N es otro
número dado Y.
Paradigma funcional
8
Orientación a objetos
class Combinatoria():
def factorial(self,n):
num = 1
while n > 1:
num = num * n
n = n - 1
return num
c = Combinatoria()
a = c.factorial(3)
print a
Compiladores e intérpretes
Los traductores de lenguajes de alto nivel pueden funcionar de dos maneras: o bien
producen una versión en código máquina del programa fuente (compiladores) o
bien analizan instrucción por instrucción del programa fuente, y además de generar
una traducción a código máquina de cada línea, la ejecutan (intérpretes).
Luego de la compilación, el programa en código máquina obtenido puede ser ejecutado
muchas veces. En cambio, el programa interpretado debe ser traducido cada vez que
se ejecute.
Velocidad de ejecución
9
Portabilidad
Ciclo de compilación
Terminología
10
Esa biblioteca es consultada por el vinculador para completar las referencias
pendientes del archivo objeto.
En resumen, la primera fase del ciclo de compilación es necesariamente la
edición del programa fuente.
11