Arquitecturas de Computadoras Capítulo I. Abstracciones

Slides:



Advertisements
Presentaciones similares
Org. y Arquitectura del Computador
Advertisements

FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE (SL-110) CAPÍTULO 5: DECLARACIÓN, INICIALIZACIÓN Y USO DE VARIABLES Ing. Ronald Criollo.
Curso de java básico (scjp)
El lenguaje de programación C - El primer programa -
Computadora Máquina electromecánica. Rapidez y eficiencia (MIPS)
Complejidad Computacional
Complejidad Computacional
UNIVERSIDAD DEL VALLE DE MEXICO CAMPUS CHAPULTEPEC
ING SEC 3 - UCSC Agosto 2009 Laboratorio Lenguaje de Programación ING – Universidad Católica SSMA Concepción Semestre II Tema:
ARQUITECTURA DE COMPUTADORES - PERFORMANCE
5. Técnicas de Simulación 1. Conceptos
Informática I – 4to año Volumen II.
CICLO DE EJECUCION DE UNA INSTRUCCION
INSTTUTO TECNOLOGICO DE APIZACO
Repaso para la construcción del intérprete 2012
Elementos básicos del Lenguaje
Temas Operaciones básicas Instalando el compilador
Fundamentos de la Programación Estructurada
Tema: Microprocesadores
Programación I Teoría I
Abstracciones y Modelos
INFORMATICA I Funciones CLASE 13.
Programación Estructurada
Ingeniero Anyelo Quintero
Composición Interna de un Procesador
El lenguaje de programación C - Funciones -
Java Mayra M. Méndez Anota.
CLASE 11.
Asignatura: Computadores
ALGORITMOS Y ESTRUCTURAS DE DATOS
Lenguaje C.
MIPS Intermedio.
INTERRUPCIONES Y TEMPORIZADORES Programación en C para electrónica.
Características de “C”
Características de “C” Y Esta conformado por un Ambiente Integrado. Y Es un Lenguaje de Nivel medio. Y Es un compilador. YContiene un conjunto de palabras.
Estructuras de Iteracion (Repetitivas ) while , for,, do-while
Introducción INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACION EN COMPUTACION LABORATORIO DE MICROTECNOLOGÍA Y SISTEMAS EMBEBIDOS Arquitecturas de.
Tema 2: Los tipos de datos
Análisis de Algoritmos
Organización del Computador I Verano MIPS (1 de 2) Basado en el capítulo 3 del libro de Patterson y Hennessy Verano 2004 Profesora Borensztejn.
Lenguaje C Ing. Sonia Alexandra Pinzón Nuñez
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Capitulo 2 INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACION EN COMPUTACION LABORATORIO DE MICROTECNOLOGÍA Y SISTEMAS EMBEBIDOS Grupo de Arquitectura.
Programa Vespertino de Automatización Equipos y Sistemas de Control Digital Lenguaje C Profesor: Felipe Páez Mejías D e p a r t a m e n t o d e I n g e.
Un programa no es nada mas que una serie de instrucciones dadas al ordenador en un lenguaje entendido por el, para decirle exactamente lo que queremos.
Administración de Proyectos de desarrollo de Software Ciclo de vida de un proyecto Enfoque moderno Temas Componentes Directivas Declaraciones globales.
Laboratorio de Organización del Computador. Cómo nos podemos comunicar con un computador Add A, B CA0 Ensamblador Hexadecimal Binario.
INTRODUCCION. LOS LENGUAJES DE PROGRAMACIÓN Los lenguajes de programación herramientas que nos permiten crear programas y software. EL LENGUAJE DE MAQUINA.
Programación en Lenguaje C
MÁQUINAS MULTINIVEL NIVEL 5 Lenguajes de alto nivel
José Estay A / jea I semestre académico 2014 Computadores (TU Sistemas Computacionales) Tema: elementos de estructura de computadores.
INTEGRANTES LINA JIMÉNEZ LOZANO ROSA ELENA REINA CARLOS VILLADIEGO MARIANO SEPULVEDA.
COMP 250.  Ejemplo:  Suponer que se necesita codificar un programa donde se muestre como resultado el string “Bienvenidos al mundo de JAVA!!!” cien.
Arquitecturas de Computadoras Aritmética Computacional
“Organización y Arquitectura de Computadores” William Stallings
Definición de subprogramas en C
Unidad 1. Introducción a los Compiladores.
Tipo de Errores.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C Tercera Clase (Segunda de C)
Curso: Programación I Grado: 4to. Bachillerato Prof. Gerardo Barrientos.
Programas Son una serie o secuencia de instrucciones entendibles por los ordenadores que permiten la realización de las acciones o tareas para las que.
CONJUNTO DE INSTRUCCIONES Maquinas Digitales
EL TIPO DE DATO LOGICO y constantes.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) V. GESTIÓN DE TIPOS Y GENERACIÓN DE CÓDIGOS.
Fundamentos de Programación Unidad I Conceptos Básicos.
Microtecnolgía y Arquitecturas de Computadoras Abstracciones.
Tema 8: Programación estructurada Introducción La importancia del conocimiento de programación es mucho mayor de lo que se piensa. Aprender a programar.
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
SISTEMAS ELECTRÓNICOS 3ºGIERM1 1. Introducción 2. Tipos de datos 3. Estructuras típicas de programación 4. Manejo de bits Tema 7. Programación de microcontroladores.
Transcripción de la presentación:

Arquitecturas de Computadoras Capítulo I. Abstracciones INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACION EN COMPUTACION LABORATORIO DE MICROTECNOLOGÍA Y SISTEMAS EMBEBIDOS Arquitecturas de Computadoras Curso Propedéutico Capítulo I. Abstracciones 1

Objetivo Se analizarán aspectos de arquitectura, sistemas operativos y compiladores

Realidad importante # 1 Los números enteros (int) no son enteros, los números de punto flotante (float) no son reales Ejemplos ¿Es X2  0? Con float: ¡Si! Con int: 4000*4000  1600000000 50000*50000  ¿? Es (x + y) + z = x + (y + z) Con signed int & unsigned int: ¡Si! Con float: (1e20 + -1e20) + 3.14  3.14 1e20 + (-1e20 + 3.14)  ¿?

Aritmética computacional No genera valores aleatorios Las operaciones aritméticas tienen propiedades matemáticas importantes No se puede asumir propiedades “usuales” Debido a la exactitud de las representaciones (Registros) Las operaciones con enteros satisfacen las propiedades de un “anillo” Conmutatividad, asociatividad y distributividad Las operaciones de punto flotante satisfacen las propiedades de “orden” Monotonicidad, valores de signo Observaciones Se necesita entender cuál abstracciones aplicar dependiendo del contexto Es un tema importante para programadores de compiladores y programadores de aplicaciones serias

Realidad importante # 2 Se tiene que saber ensamblador En general, las oportunidades de nunca escribir un programa en ensamblador son grandes Los compiladores son mucho mejores y más pacientes de lo que son las personas Entender el lenguaje ensamblador es clave para ejecutar modelos a nivel máquina El comportamiento de programas en presencia de errores Se analiza el Modelo de lenguaje de alto nivel Ajustar en desempeño del programa Entender las fuentes de ineficiencia del programa Implementando software de sistemas Los compiladores tiene código máquina como objetivo Los sistemas operativos deben administrar el estado del proceso

Ejemplo de código ensamblador Contador Registro de 64 bits especial en máquinas compatibles con procesador Intel Incrementa cada ciclo de reloj Lee con la instrucción rdtsc Aplicación Medir el tiempo requerido para un procedimiento En unidades de ciclos de reloj double t; start_counter(); P(); t = get_counter(); printf("P required %f clock cycles\n", t);

Código para leer el contador Escribe pequeñas cantidades de código ensamblador utilizando las opciones asm de GCC Inserta código ensamblador en código máquina generado por el compilador static unsigned cyc_hi = 0; static unsigned cyc_lo = 0; /* Set *hi and *lo to the high and low order bits of the cycle counter. */ void access_counter(unsigned *hi, unsigned *lo) { asm("rdtsc; movl %%edx,%0; movl %%eax,%1" : "=r" (*hi), "=r" (*lo) : : "%edx", "%eax"); }

Código para leer el contador /* Record the current value of the cycle counter. */ void start_counter() { access_counter(&cyc_hi, &cyc_lo); } /* Number of cycles since the last call to start_counter. */ double get_counter() unsigned ncyc_hi, ncyc_lo; unsigned hi, lo, borrow; /* Get cycle counter */ access_counter(&ncyc_hi, &ncyc_lo); /* Do double precision subtraction */ lo = ncyc_lo - cyc_lo; borrow = lo > ncyc_lo; hi = ncyc_hi - cyc_hi - borrow; return (double) hi * (1 << 30) * 4 + lo;

Midiendo el tiempo Más engañoso de lo que parece Ejemplo Muchas fuentes de variaciones Ejemplo Suma de enteros de 1 a n n Ciclos Ciclos/n 100 961 9.61 1,000 8,407 8.41 1,000 8,426 8.43 10,000 82,861 8.29 10,000 82,876 8.29 1,000,000 8,419,907 8.42 1,000,000 8,425,181 8.43 1,000,000,000 8,371,2305,591 8.37

Link del Material del curso http://www.microse.cic.ipn/?q=ca

Realidad importante # 3 La memoria si importa La memoria no es infinita Debe de ser asignada y administrada Muchas aplicaciones son dominadas por la memoria El desempeño de la memoria no es uniforme La memoria cache y virtual afectan en gran medida el desempeño de un programa Adaptar los programas a las características de los sistemas de memoria puede llevar a mejorar la velocidad

Ejemplo: Error de referencia a memoria La versión de Linux da un resultado correcto, pero implementando el programa como una función separada da una falla de segmentación. main () { long int a[2]; double d = 3.14; a[2] = 1073741824; /* Out of bounds reference */ printf("d = %.15g\n", d); exit(0); } A lph a M I PS Linux -g 5.30498947741318e-315 3.1399998664856 3.14 -O

Errores de referencia a memoria C y C++ no tienen protección a memoria Las referencias a arreglos pueden estar fuera del límite Se pueden generar valores de apuntadores inválidos Se pueden dar abusos de las funciones de manejo de la memoria malloc/free Se pueden generar errores graves Los errores pueden tener o no pueden tener efectos que dependen del sistema y el compilador Acción a distancia Objetos lógicos corrompidos sin relación con uno que esta siendo accedido El efecto de los errores pueden ser observados mucho después de ser generados ¿Cómo se puede superar esto? Programar en Java, Lisp, o ML Entender las posibles interacciones que pueden ocurrir Utilizar o desarrollar herramientas que detecten referencias a errores Depuradores

Errores de desempeño de memoria Implementación de multiplicación de matrices Múltiples formas de anillos anidados /* ijk */ for (i=0; i<n; i++) { for (j=0; j<n; j++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum; } /* jik */ for (j=0; j<n; j++) { for (i=0; i<n; i++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum }

Multiplicación de Matrices 1 /* ijk */ for (i=0; i<n; i++) { for (j=0; j<n; j++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum; } B k j i j k Para calcular cada elemento de C se requiere la columna de A (indexada por k, i) y el renglón de B (indexada por k, j). El resultado se guarda en la columna C (indexada por i,j) Columna X Renglón = Columna i A C

Multiplication de Matrices 2 /* jik */ for (j=0; j<n; j++) { for (i=0; i<n; i++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum } B j k k j i Para calcular cada elemento de C se requiere el renglón de A (indexada por k,i) y la columna de B (indexada por k,j). El resultado se guarda en la columna C (indexada por i,j) i A Renglón X Columna = Renglón C

Desempeño de mult. mat. (Alpha 21164) Demasiado grande para Cache L1 Demasiado grande para Cache L2 20 40 60 80 100 120 140 160 matrix size (n) ijk ikj jik jki kij kji

Desempeño de mult. mat. bloqueado (Alpha 21164) 20 40 60 80 100 120 140 160 50 75 125 150 175 200 225 250 275 300 325 350 375 400 425 450 475 500 matrix size (n) bijk bikj ijk ikj

Realidad importante # 4 Hay más que mejorar que la complejidad asintótica Los factores constantes también importan Se puede ver un rango de desempeño 10:1 dependiendo en la forma en que el código es escrito Se puede optimizar a múltiples niveles: algoritmos, representación de datos, procedimientos y anillos Se debe de entender el sistema para mejorar el desempeño Hay que saber cómo son compilados y ejecutados los programas Hay que saber cómo medir el desempeño de un programa e identificar los cuellos de botella Hay que saber cómo mejorar el desempeño sin destruir la modularidad y generalidad del código

Realidad importante # 5 Las computadoras hacen mas que ejecutar programas Ellas necesitan obtener datos de entrada y salida La entrada/salida de un sistema es un factor crítico de los programas para la confianza y desempeño Ellas se comunican con otras a través de redes de computadora Muchos temas a nivel-sistema surgen en presencia de redes Operaciones concurrentes por medio de procesos autónomos Copia con medios no confiables Compatibilidad con la plataforma Temas de desempeño complejos

¿Por qué no se utiliza la base 10 para representar a los números Es una numeración difícil de almacenar. La ENIAC (primera computadora) utilizó 10 bulbos (tubo al vacío) por cada dígito. Se necesita alta precisión para codificar señales de 10 niveles en una simple alambre o medio de comunicación de un solo canal. Es difícil de implementar funciones lógicas digitales como son suma, multiplicación, entre otras.

Representación binaria Representación numérica de base 2 1521310 se presenta como 111011011011012 1.2010 se representa como 1.0011001100110011[0011]…2 1.5213104 se representa como 1.11011011011012213 Implementación electrónica Fácil de almacenar con elementos bi-estables. Disponible de se transmitida en medio ruidos o inadecuados. Implementación directa de funciones aritméticas.

Señal Eléctrica de la Representación binaria 0.0V 0.5V 2.8V 3.3V 1

Organización de memoria orientada a bytes Los programas hacen referencia a memorias virtuales Conceptualmente a arreglos muy grandes de bytes Realmente son implementadas con jerarquías de memoria de diferentes tipos SRAM, DRAM, discos Sólo destinadas para regiones reales utilizadas por el programa En Unix y Windows NT, el espacio de direcciones es privado a un “proceso” en particular Al programa que está siendo ejecutado El programa puede destruir sus propios datos pero no los de otros Compilador + Tiempo de ejecución del sistema controlan el destino Donde diferentes objetos del programa podría estar almacenados Múltiples mecanismos: estáticos, pila, cima En cualquier caso, todos los destinos están dentro de un espacio de direcciones virtuales

Codificación de valores de bytes Byte = 8 bits Binario 000000002 a 111111112 Decimal 010 a 25510 Hexadecimal 0016 a FF16 Representación numérica base 16 Utiliza los caracteres ‘0’ a ‘9’ y ‘A’ a ‘F’ E.g. Se escribe FA1D37B16 en C como 0xFA1D37B >> Ó 0xfa1d37b

Ejemplo de Representación Numérica 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 A 10 1010 B 11 1011 C 12 1100 D 13 1101 E 14 1110 F 15 1111 Hex Decimal Binario

Palabras de las máquinas Las máquinas tienen un “tamaño de palabra” Tamaño nominal de datos con valores enteros Incluyendo direcciones La mayoría de las máquinas son de 32 bits (4 bytes) Su dirección se limita a 4 GB Siendo muy lentas para aplicaciones de memoria intensiva Sistemas más sofisticados son de 64 bits (8 bytes) Pueden potencialmente direccionar  1.8  1019 bytes Las máquinas soportan múltiples formatos de datos Fracciones o múltiplos de tamaño de palabra Siempre números enteros de bytes

Organización de memoria orientada a palabras Las direcciones de una memoria especifican localizaciones de Bytes Se da la dirección del primer byte en la palabra Las direcciones de palabras sucesivas difieren en 4 bytes (32 bits) u 8 bytes (64 bits)

32-bit Words 64-bit Words Bytes Addr. 0000 Addr = ?? 0001 0002 0000 Addr = ?? 0003 0004 0000 Addr = ?? 0005 0006 0004 0007 0008 Addr = ?? 0009 0010 0008 Addr = ?? 0011 0008 0012 Addr = ?? 0013 0014 0012 0015

Abstracción Un modelo que oculta detalles de bajo nivel de un sistema de computadora temporalmente invisible para facilitar el diseño de un sistema sofisticado. Wikipedia: La abstracción, es un principio por el cual se aísla toda aquella información que no resulta relevante a un determinado nivel de conocimiento.

Abstracción La abstracción consiste en aislar un elemento de su contexto o del resto de los elementos que lo acompañan. En programación, el término se refiere al énfasis en el "¿qué hace?" más que en el "¿cómo lo hace?" (característica de caja negra). El común denominador en la evolución de los lenguajes de programación, desde los clásicos o imperativos hasta los orientados a objetos, ha sido el nivel de abstracción del que cada uno de ellos hace uso. Los lenguajes de programación son las herramientas mediante las cuales los diseñadores de lenguajes pueden implementar los modelos abstractos. La abstracción ofrecida por los lenguajes de programación se puede dividir en dos categorías: abstracción de datos (pertenecientes a los datos) y abstracción de control (perteneciente a las estructuras de control).

Representación de datos Tipos de datos en C en un procesador (en bytes) Tipo de dato en C Compaq Alpha Típico de 32 bits Intel IA32 Int 4 4 4 long int 8 4 4 char 1 1 1 short 2 2 2 float 4 4 4 double 8 8 8 long double 8 8 10/12 char * 8 4 4 >> ó cualquier otro apuntador

Orden de los bytes ¿Cómo deben de ordenarse en memoria las palabras multi-bytes? Convenciones: Las PC’s y las Alphas son máquinas “Little Endian” El byte menos significativos tienen las direcciones más bajas Las Sun’s y las Mac’s son máquinas “Big Endian” El byte menos significativo tiene la dirección más grande

Ejemplo de ordenamiento de bytes La variable x tiene una representación de 4 bytes 0x01234567 La dirección &x está dada por 0x100 Big Endian Little Endian 0x100 0x101 0x102 0x103 01 23 45 67 01 23 45 67 0x100 0x101 0x102 0x103 67 45 23 01 67 45 23 01

Leyendo la lista de bytes en reversa Desensamblado Representación del texto de código máquina binario Generado por el programa que lee el código máquina Ejemplo del fragmento Dirección Código de la instrucción Código ensamblado 8048365: 5b pop %ebx 8048366: 81 c3 ab 12 00 00 add $0x12ab,%ebx 804836c: 83 bb 28 00 00 00 00 cmpl $0x0,0x28(%ebx) Descifrando números Valor: 0x12ab Grupo de 4 bytes: 0x000012ab Separado en bytes: 00 00 12 ab Reversa: ab 12 00 00

Examinando la representación de datos Código para imprimir la representación de datos El apuntador a unsigned char * crea un arreglo byte typedef unsigned char *apuntador; void muestra_bytes(apuntador comienzo, int longitud) { int i; for (i=0; i < longitud; i++) printf(“0x%p\t0x%.2x\n”,comienzo+i, comienzo[i]); printf(“\n”); } Directivas Printf: %p: Imprime apuntador %x: Imprime hexadecimal

Ejecución del ejemplo muestra_bytes int a = 15213; printf(“int a = 15213;\n); muestra_bytes((apuntador) &a sizeof(int)); Resultado (en Linux): 0x11ffffcb8 0x6d 0x11ffffcb9 0x3b 0x11ffffcba 0x00 0x11ffffcbb 0x00

Representando enteros int A = 15213; Decimal: 15213 int B = -15213; Binario: 0011 1011 0110 1101 long int C = 15213; Hex: 3 B 6 D Representación complemento a 2’s. 6D 3B 00 Linux/Alpha A 3B 6D 00 Sun A 6D 3B 00 Linux C 6D 3B 00 Alpha C 3B 6D 00 Sun C 00 93 C4 FF Linux/Alpha B C4 93 FF Sun B

Representando apuntadores int B = -15213; int *p = &B; Dirección en la Alpha Hex: 1 F F F F F C A 0 Binario: 0001 1111 1111 1111 1111 1111 1100 1010 0000 Dirección en la Sun Hex: E F F F F B 2 C Binario: 1110 1111 1111 1111 1111 1011 0010 1100 Dirección en Linux Hex: B F F F F 8 D 4 Binario: 1011 1111 1111 1111 1111 1000 1101 0100 Diferentes compiladores y máquinas asignan diferentes localidades a los objetos Alpha P A0 FC FF Sun P FB 2C EF FF 01 00 Linux P FF BF D4 F8

Representando números en punto flotante 00 B4 6D 46 Linux/Alpha F B4 00 46 6D Sun F Flotante F = 15213.0 IEEE Representación en punto flotante de precisión simple Hex: 4 6 6 D B 4 0 0 Binario: 0100 0110 0110 1101 1011 0100 0000 0000 15213: 1110 1101 1011 01 No es como la representación de enteros, pero es consistente entre diferentes máquinas. Se puede ver alguna relación en la representación a enteros, pero no es obvio.

Representando cadenas de caracteres Cadenas en C Representadas por arreglos de caracteres Cada carácter se codifica en un formato ASCII Codificación en un estándar de 7 bits del conjunto del caracteres Existen otras codificaciones, pero no son comunes El carácter cero “0” tiene el código 0x30 Digito i tiene el código 0x30 + i La cadena debe de terminar con un carácter nulo Carácter final = 0 Compatibilidad El ordenamiento de bytes no es importante Los datos son cantidades de bytes simples Los archivos de texto son independientes de la plataforma Excepto por diferentes convenios de terminación de líneas de caracteres

Ejemplo char S[6] =“15213” Linux/Alpha S Sun S 32 31 35 33 00 32 31 35

Representación de código a nivel máquina Se codifica un programa como una secuencia de instrucciones Cada operación simple Operaciones aritméticas Lectura y escritura de memoria Saltos condicionales Instrucciones codificadas como bytes Las Alpha’s, Sun’s y Mac’s utilizan instrucciones de 4 bytes Computadoras con Conjunto de Instrucciones Reducidas (RISC) Las PC’s utilizan instrucciones de longitud variable Computadoras con Conjunto de Instrucciones Complejas (CISC) Diferentes tipos de instrucciones como bytes La mayoría del código binario no es compatible Los programas son también secuencias de bytes

Representación de instrucciones int sum (int x, int y) { return x + y; } Para este ejemplo, las Alpha’s y las Sun’s utilizan dos instrucciones de 4 bytes Utilizan diferentes números de instrucciones en otros casos. Las PC’s (Intel) utilizan 7 instrucciones con longitudes de 1, 2, y 3 bytes Lo mismo para NT y Linux (NT/Linux no son compatibles) en código binario completamente Diferentes máquinas utilizan instrucciones y codificaciones totalmente diferentes 00 30 42 Alpha sum 01 80 FA 6B E0 08 81 C3 Sun sum 90 02 00 09 E5 8B 55 89 PC sum 45 0C 03 08 EC 5D C3

Álgebra Booleana Fue desarrollada por George Boole en el siglo 19 - Es una representación algebráica de la lógica binaria - Codifica “verdadero” como 1 y “falso” como 0 AND OR A&B = 1 cuando A|B = 1 cuando A = 1 o B= 1 A = 1 y B = 1 NOT XOR ~A = 1 cuando A = 0 A^B = 1 cuando A = 1 o B = 1, pero no ambos A,B | 00 01 1 10 11 A,B & 00 01 10 11 1 A,B ^ 00 01 1 10 11 A Ã 1

Aplicaciones del álgebra de Boole Fue aplicado a sistemas por Claude Shannon En su tesis de Mestría del MIT en 1937 Razonó acerca de redes de relevadores con interruptores Se codificaron los interruptores cerrados como 1 y los interruptores abiertos como 0 A&~B A ~A ~B B Se conecta cuando A&~B | ~A&B = A^B ~A&B

Álgebra de enteros Aritmética de enteros Z, +, *, -, 0, 1 forma un anillo La adición es la operación de “suma” La multiplicación es la operación de “producto” - Es inverso aditivo 0 Es la identidad de la suma 1 Es la identidad del producto

Álgebra Booleana {0, 1}, |, &, ~, 0, 1 forma un “álgebra de Boole” OR es la operación de “suma” AND es la operación de “producto” ~ Es la operación de complemento (inverso no aditivo) 0 Es la identidad de la suma 1 Es la identidad del producto

Álgebra Booleana  Anillo entero Conmutatividad A | B = B | A A + B = B + A A & B = B & A A * B = B * A Asociatividad (A | B) | C = A | (B | C) (A + B) + C = A + (B + C) (A & B) & C = A & (B & C) (A * B) * C = A * (B * C) Producto distribuido sobre la suma A & (B | C) = (A & B) | (A & C) A * (B + C) = A * B + B * C Identidades de suma y producto A | 0 = A A + 0 = A A & 1 = A A * 1 = A Cero es un producto aniquilador A & 0 = 0 A * 0 = 0 Cancelación de la negación ~ (~ A) = A – (– A) = A

Álgebra Booleana  Anillo entero Booleana: Suma distribuida sobre el producto A | (B & C) = (A | B) & (A | C) A + (B * C)  (A + B) * (A + C) Booleana: Idempotencia A | A = A A + A  A “A es verdaero” o “A es verdadero” = “A es verdadero” A & A = A A * A  A Booleana: Absorción A | (A & B) = A A + (A * B)  A “A es verdadero” o “A es verdadero y B es verdadero” = “A es verdadero” A & (A | B) = A A * (A + B)  A Booleana: Leyes de complementos A | ~A = 1 A + –A  1 “A es verdadero” or “A es falso” Anillo: Cada elemento tiene su inverso aditivo A | ~A  0 A + –A = 0

Propiedades de & y ^ A ^ A = 0 Anillo Booleano {0,1}, ^, &, , 0, 1 Idéntica a enteros en mod 2  es la operación de identidad:  (A) = A A ^ A = 0 Propiedad Anillo Booleano Suma conmutativa A ^ B = B ^ A Producto conmutativo A & B = B & A Suma asociativa (A ^ B) ^ C = A ^ (B ^ C) Producto asociativo (A & B) & C = A & (B & C) Producto sobre la suma A & (B ^ C) = (A & B) ^ (B & C) 0 es identidad suma A ^ 0 = A 1 es identidad producto A & 1 = A 0 es producto aniquilador A & 0 = 0 Inverso aditivo A ^ A = 0

Relaciones entre operaciones Leyes de DeMorgan Expresa & en términos de |, y viceversa A|B = ~(~A & ~B) A o B son verdad si ni A ni B son falsos A & B = ~(~A | ~B) A y B son verdad si A y B no son falsos Or exclusivo utilizando OR inclusivo A^B = (~A & B) | (A & ~B) Exactamente uno A o B es verdadero A^B = (A|B) & ~(A&B) Ya sea que A sea verdadero, o B sea verdadero, pero no ambos

Álgebras Booleanas generales Operaciones sobre vectores de bits Las operaciones son aplicadas bit por bit Todas las propiedades del álgebra Boolena se aplican 01101001 & 01010101 01000001 01101001 | 01010101 01111101 01101001 ^ 01010101 00111100 ~ 01010101 10101010 01000001 01111101 00111100 10101010

Representación y manipulación de conjuntos El vector de bits con ancho w representa un subconjunto {0, …,w-1} aj = 1 si j  A 01101001 {0, 3, 5, 6} 76543210 01010101 76543210 {0, 2, 4, 6} Operaciones & Intersección 01000001 {0, 6} | Unión 01111101 {0, 2, 3, 4, 5, 6} ^ Diferencia simétrica 00111100 {2, 3, 4, 5} ~ Complemento 10101010 {1, 3, 5, 7}

Operaciones en C a nivel de bit Las operaciones &, |, ~ y ^ están disponibles en C Se aplica a cualquier tipo de dato “entero” long, int, short, char Se ven los argumentos como vectores de bits Los argumentos se aplican bit a bit Ejemplos (dato tipo char) ~0x41  0xBE ~010000012  101111102 ~0x00  0xFF ~000000002  111111112 0x69 & 0x55  0x41 011010012 & 010101012  10000012 0x69 | 0x55  0x7D 011010012 | 010101012  011111012

Contraste: Operaciones lógicas en C Contraste para operadores lógicos &&, ||, ! El 0 se ve como “falso” Cualquier cosa no cero es “verdadero” Siempre regresa 0 ó 1 Terminación temprana Ejemplos !0x41  0x00 !0x00  0x01 !!0x41  0x01 0x69 && 0x55  0x01 0x69 || 0x55  0x01 p && *p (evita el acceso a apuntador nulo)

Operaciones de desplazamiento de bits Desplazamiento a la izquierda x << y Desplaza un vector x de bits y posiciones a la izquierda Elimina los bits extras de la izquierda Llena con 0’s a la derecha Desplazamiento a la derecha x >> y Desplaza un vector x de bits y posiciones a la derecha Elimina los bits extras a la derecha Desplazamiento lógico Llena con 0’s a la izquierda Desplazamiento aritmético Replica el bit más significativo a la derecha Es útil en la representación de enteros con complemento a dos Argumento x 01100010 << 3 00010000 00010000 00010000 Log. >> 2 00011000 00011000 00011000 Aritm. >> 2 00011000 00011000 00011000 Argumento x 10100010 << 3 00010000 00010000 00010000 Log. >> 2 00101000 00101000 00101000 Aritm. >> 2 11101000 11101000 11101000

Tarea1: Algo interesante con XOR Operaciones bit a bit con XOR es una forma de suma Con la propiedad extra de que cada valor es su propio aditivo inverso A ^ A = 0 void divertido(int *x, int *y) { *x = *x ^ *y; /* #1 */ *y = *x ^ *y; /* #2 */ *x = *x ^ *y; /* #3 */ } *x *y Comienzo A B 1 B A^B 2 (A^B)^B = A A^B 3 A (A^B)^A = B Final A B

Puntos principales Todo es acerca de Bits y Bytes Números Programas Texto Diferentes máquinas siguen diferentes convenciones Tamaño de palabra Orden de los bytes Representaciones Algebra Booleana es la base de matemática computacional La forma básica codifica “falso” como 0 y “verdadero” como 1 Forma general como operaciones bit a bit en C Buena para representación y manipulación de conjuntos