¿Cuál es el objetivo de ese proyecto con sus palabras y describa que debe hacer para desarrollarlo?
El principal objetivo del proyecto es construir compuertas lógicas progresivamente partiendo de las más básicas o primitivas a unas más complejas y que requieran la composición de otras compuertas. Esto con la finalidad de profundizar en el funcionamiento de dichas compuertas y descubrir algunas de las que quizá no habíamos oído antes.
Para el desarrollo de la practica se debe utilizar un simulador de hardware suministrado por Nand2Tetris que verifica la implementación de cada compuerta lógica, las cuales se tornaran mas complejas a medida que se avance en la construcción de las anteriores.
Esta practica se puede resolver de diversas formas, pero priorizaremos la eficiencia, esto al usar el menor numero de compuertas posibles durante la construcción, lo que nos ayudara a obtener una salida lo mas rápido posible.
¿Cuál es el objetivo de cada uno de esos proyectos con sus palabras y describa que debe hacer para desarrollarlo?
Para el proyecto 2 se realizará la construcción de una unidad aritmética lógica. De manera similar al proyecto 1, iremos construyendo progresivamente la ALU haciendo uso de los chips indicados, partiendo por el HalfAdder que se implementara para construir el siguiente chip de mayor complejidad y así sucesivamente. Cada chip será debidamente probado en el software proporcionado por Nand2Tetris.
Por otra parte, el proyecto 3 nos plantea la construcción de una unidad RAM (Random Access Memory), partiendo desde un DFF (Data Flip-Flop) como nuestro chip primitivo y secuencialmente construyendo los demás chips propuestos, cabe resaltar que también se hará uso de chips ya construidos en los anteriores proyectos . Este proyecto nos permitirá comprender como podemos almacenar bits de información haciendo uso de compuertas lógicas y a su vez como podemos localizar dicha información en caso de que se quiera manipular.
Ambos proyectos aquí descritos de desarrollaran de manera similar, construyendo chip secuencialmente partiendo de uno primitivo, además de poder usar los chips construidos en proyectos anteriores. La herramienta utilizada será la prevista por el sitio Nand2Tetris, con la cual cada chip será sometido a su respectiva prueba con el fin de verificar su correcto funcionamiento.
¿Cuál es el objetivo de cada uno de esos proyectos con sus palabras y describa que debe hacer para desarrollarlo?
El objetivo del proyecto 4 es introducirnos y familiarizarnos con el lenguaje ensamblador, un lenguaje de bajo nivel que posteriormente se traduce a lenguaje de máquina con el 'ensamblador' para ser ejectutado por la computadora. La importancia de este proyecto radica en el gran control que nos otorga el lenguaje ensamblador para realizar las tareas deseadas y optimizar al máximo el rendimiento.
Por otra parte, el proyecto 5 nos acerca más a la construcción de una computadora, usando los componentes construidos en la práctica 3 para crear una computadora básica que pueda ejecutar algunos sencillos programas escritos en el lenguaje máquina 'Hack'.
Los códigos realizados se podrán encontrar en el repositorio de GitHub adjunto a esta práctica. Estos son los siguientes:
Mult.asm : Código escrito en lenguaje ensamblador para multiplicar 2 números, en R[0] estará almacenado el multiplicando y en R[1] se almacenará el multiplicador, por medio de un bucle se irán actualizando los valores y almacenando el resultado de la operación en R[2]. El proceso explicado con mayor detalle se puede encontrar en el video adjunto a esta práctica.
Fill.asm: Este código utiliza un bucle para 'escuchar' cuando una tecla es presionada, en tal caso el programa pone los píxeles de la pantalla en negro y se mantiene así hasta que la tecla deje de ser presionada, en el caso de que ninguna tecla este siendo presionada el programa pone los píxeles en blanco.
Memory.hdl: Representa una memoria RAM, en esta caso utiliza la memoria RAM16K construida en el proyecto 3, además de un teclado y pantalla, los cuales ya estan incorporados en Nand2Tetris.
CPU.hdl: Para este chip fue necesario usar los siguientes chips: ARegister, DRegister, ALU y PC. Los anteriores a su vez usaban algunos chips ya construidos en prácticas anteriores.
Computer.hdl: Se utilizo el chip ROM32K que se encuentra incorporado en la herramienta, un chip CPU y el chip Memory.
Para esta práctica se logró un mayor entendimiento del funcionamiento del lenguaje ensamblador y algunas de sus instrucciones tales como los 'conditional jump' (saltos condicionales). Se aprecio también como a pesar de ser ensamblador un lenguaje de bajo nivel puede ser útil cuando se busca un mayor control sobre la forma en que se realizan los procesos.
Con la construcción de la computadora básica logramos pasar con éxito los test propuestos, además de notar como paulatinamente se ha logrado construir arquitecturas más complejas partiendo desde los cimientos.
Una de las principales labores que deben tomar en cuenta tanto estudiantes como profesionales, formadores y todos quienes pertenecen al área de la computación, la informática y tecnología es el reconocer y actuar de acuerdo a ciertos principios éticos existentes, cuyo propósito es garantizar los derechos y bienestar de usuarios y el entorno en general. Esta práctica se enfoca en conocer los principios éticos propuestos por la ACM (Association for Computing Machinery), las implicaciones y alcances de cada uno, con el fin de crear conciencia acerca de su relevancia a la hora de desempeñar la profesión y llevar al cumplimiento de los mismos. El desarrollo de la práctica se hizo de manera individual, inicialmente cada integrante leyó la información dada y respondió las preguntas propuestas para dicha prácticas.
César Hurtado:
Daniel La Rotta:
Julián León
Henry Mantilla:
Luis Linares:
¿Cuál es el objetivo de este proyecto con sus palabras y describa que debe hacer para desarrollarlo?
El objetivo de esta sexta práctica gira entorno al uso del lenguaje ensamblador, lenguaje con el cual muchos programadores no están familiarizados aunque de manera subyacente este presente en su día a día. El lenguaje ensamblador destaca por la optimización que otorga al desarrollador sobre el hardware, pudiendo este crear programas que sean lo más rápidos y eficientes posibles.
Ensamblador se puede encontrar en algunos compiladores, los cuales traducen lenguaje de alto nivel a ensamblador y posteriormente a lenguaje binario; también puede ser usado en ingeniería inversa, esto debido a que el código binario solamente es reversible a lenguaje ensamblador, lo anterior hace que este lenguaje sea de vital importancia cuando se debe analizar con detenimiento un software. Uno de los uso que demuestran el papel crucial que puede llegar a desempeñar ensamblador es el análisis de malware.
Para implementar el ensamblador se crea una función, en la cual, inicialmente se crean diccionarios donde se asocia los valores en binario que corresponden a los valores que se pueden encontrar en el código .asm, estos valores se asignan tomando como referencia las tablas mostradas en la sección del proyecto 6 del libro "The Elements of Computing Systems". Posteriormente se hace la revisión línea a línea del archivo que se esté traduciendo, y dependiendo del tipo de valor que tenga la línea se van asignando los valores binarios declarados en los diccionarios. Los resultados obtenidos se guardan en archivos separados con la traducción resultante dada para cada caso. Estos archivos se cargan en el Assembler para realizar la comparación con los archivos de prueba dados y se verifica que los resultados sean iguales.
¿Cuál es el objetivo de este proyecto con sus palabras y describa que debe hacer para desarrollarlo?
El objetivo de la presente práctica es desarrollar un traductor de VM, el cual traduzca los archivos ".vm" a lenguaje ensamblador Hack, para esto se hará uso de un lenguaje de alto como python. Para llevar a cabo el desarrollo nos apoyamos en el material ofrecido en el sitio www.nand2tetris.org
¿Cuál es el objetivo de cada uno de esos proyectos con sus palabras y describa que debe hacer para desarrollarlo?
El objetivo de la presente práctica es desarrollar una aplicación simple en lenguaje de programación Jack, en este caso un juego de laberinto que se compone de cuatro archivos Jack, los cuales se puede encontrar en el repositorio adjunto. Por otro lado el proyecto 10 tiene como finalidad crear un analizador de sintaxis para el lenguaje de alto nivel Jack, este mismo se realizo en código python.
Proyecto 9
Para el proyecto 9 se realizaron 4 códigos, los cuales son: cell.jack, maze.jack, mazegame.jack y main.jack. El archivo "cell.jack" contiene líneas de código referente a las celdas, dado que el juego de laberinto se elabora primeramente como una grilla, por lo cual el jugador hace un movimiento de casilla en casilla.
El archivo maze.jack se encarga de crear la grilla para el laberinto, lo que comienza como una cuadricula se convierte en un laberinto eliminando los lados de algunas celdas en cierto orden para crear los caminos del laberinto.
El archivo mazegame.jack tiene como propósito crear la jugabilidad del laberinto, haciendo uso de los anteriores archivos este crea al jugador y lo coloca al inicio del laberinto, el jugador esta representado por un punto que se puede desplazar en cuatro direcciones: arriba, abajo, derecha, izquierda; esto nos permite una navegación cómoda a través del laberinto.
Finalmente el archivo main.jack que cumple el rol de la función principal crea la instancia de juego que es mostrada como resultado final en el emulador VM.
Proyecto 10
En este proyecto se utilizo python para crear una analizador de sintaxis que fuera empleado con archivos escritos en el lenguaje de alto nivel jack y este genera dos archivos xml como salida. El código se implemento en 2 etapas, la primera consiste en el tokenizer y la segunda etapa en el motor de compilación.
Proyecto 11
En este proyecto se tiene como principal objetivo el expandir el analizador de sintaxis que se llevó a cabo en la práctica anterior, pasaremos del analizador al compilador Jack. La finalidad que se busca con la implementación es que la salida nos arroje un archivo .VM, el cual se podrá ejecutar en el simulador de máquina virtual proporcionado, donde podremos a su vez verificar que cada programa se ejecute acorde a su documentación.
Anteriormente, construimos un analizador de sintaxis, el cual era capaz de tomar la entrada fuente y generar a partir de la misma un código .XML que demuestra que el analizador “sabe lo que está haciendo”, es decir, que sabe cómo entender la sintaxis del código fuente, sin embargo, este desarrollo tiene una limitación, y es que no maneja los identificadores de una manera muy inteligente, todos los identificadores son tratados de la misma manera desde el analizador. Es por ello, que se busca desarrollar la capacidad de manejar y entender la semántica de los símbolos del código fuente, es decir, la capacidad de crear y usar tablas de símbolos.
Tokenizer: Como lo que queremos es ampliar el analizador, partimos de la implementación del Tokenizador, el cual como vimos en el proyecto anterior, busca dividir una entrada de texto determinada en un flujo de tokens. El tokenizador también puede clasificar los tokens en categorías léxicas. Este tokenizador pasa por un archivo de entrada dado y produce un flujo de tokens. Cada token se imprime en una línea separada, junto con su clasificación: símbolo, palabra clave, identificador, constante entera o constante de cadena.
Tabla de simbolos: los programas que se conocen de alto nivel, usan muchos identificadores, cada vez que el compilador encuentra un identificador, necesita saber su significado, la mayoría de los compiladores mantienen esta información usando una abstracción de tabla de símbolos.
Proyecto 12
Este Proyecto tiene como objetivo la Creación de un sistema operativo Jack que implementará una colección modular de algunos algoritmos de informática aplicada. Una de Las capacidades del sistema es tomar un programa escrito en un lenguaje simbólico para "traducirlo" a un lenguaje comprensible por el computador. Dentro de los programas traductores se encuentran ensambladores, compiladores y programas intérpretes.