Computación =========== Por Devine > Un mono inmortal sería suficiente Belleza fría y austera, como una escultura, sin muestra de debilidad, sin ornamentos llamativos de pintura o sonidos, pero sublime o pura, capaz de una perfección severa como solo el arte puede mostrar. [~](https://es.wikipedia.org/wiki/Belleza_matem%C3%A1tica) Así fueron diseñadas las primeras computadoras, diseñadas para ser verdaderamente de propósito general. Cuando las encendías aparecía en la pantalla un único mensaje: > Ready Y su cursor parpadeante esperando tus órdenes, una invitación a ¡PROGRAMAR!. En ese momento te dabas cuenta que esto no era un electrodoméstico, ¡es una puerta abierta al descubrimiento intelectual!. > La incansable fascinación de la computadora > La incansable fascinación de la computadora > La incansable fascinación de la computadora Para crear sistemas excelentes y escalabes debes diseñar cómo se comunicarán entre sus módulos en vez de definir cuáles deberían ser sus propiedades y comportamientos internos.[~](https://es.wikipedia.org/wiki/Belleza_matem%C3%A1tica) No te enamores de la tecnología como hacen los defensores de Forth o de Linux. Si te da una ventaja, si te permite hacer las cosas más rápido, entonces, úsala. úsala pra construir lo que siempre haz querido construir, y luego, enamórate de eso. [~](no-te-enamores.html) * [Construye una computadora digital funcional](https://archive.org/details/howtobuildaworkingdigitalcomputer_jun67) * [Diseña sistemas](https://apenwarr.ca/log/20201227) * [Archivo de calculadoras mecánicas portátiles](http://www.computercollector.com/archive/hhmechcalc/) ## Imagina una computadora que aproveche el comportamiento natural y utilice sus dinámicas para resolver ecuaciones. Todos sabemos cuán laboriosos son los métodos para que alcancemos conocimientos en artes y ciencias; Sin embargo con algo de ingenio y un costo razonable una persona ignorante puede llegar a escribir libros de filosofía, poesía, política, leyes matemáticas y teología, sin más ayuda que su ingenio y estudio. [~](the-engine.html) ## Computadoras de color Computadoras no electrónicas que funcionan coloreando, siguiendo un conjunto simple de reglas. El folleto tiene tres series de computadoras: las que comparan, las que cuentan y las que juegan. Desde un punto de vista técnico, todas son circuitos lógicos basados en compuertas NOR, diseñadas utilizando tablas de verdad, mapas de Karnaugh y expansiones de maxterms. Desde una perspectiva social, política y ambiental, estas computadoras son una exploración de la computación sin electricidad ni semiconductores, un intento de reinventar los sistemas digitales alejados de la eficiencia y productividad, y un prototipo esperanador para exponer y conocer el funcionamiento interno de las computadoras. [~](https://ipfs.io/ipfs/QmYz7DPRWypGQcbAHr7Mi8EKB6ntSPsEnUsCXbAhBiHQZP/) ## Nomogramas Un nomograma es un dispositivo gráfico e cálculo, consiste en un diagrama bidimensional diseñado para permitir el cálculo aproximado de una función de manera gráfica. Cada variable se marca a lo largo de una escala, y una línea trazada a través de los valores conocidos en las escalas (o una regla colocada sobre ellos) cruzará el valor de la variable desconocida. Esto es como las reglas de cálculo. [~](https://wiki.xxiivv.com/site/slide_rule.html) ![Achivo Gif con Nomograma para conocer el índice de masa corporal](nomograma-imc.gif) ## Multiplicación visual El método consiste en realizar multiplicaciones colocando y cruzando palitos de manera adecuada. Simplemente colocas palitos de acuerdo con los valores posicionales de los dígitos que se están multiplicando. Luego, cuentas la cantidad de puntos donde estos palitos se cruzan. Por ejemplo: 62x21 = 1302. ![Archivo Gif ilustracion de multiplicación visual](multiplicacion-visual.gif') ## Multpilicación con método de ceolosía Este método utiliza una cuadrícula (o celosía) para multiplicar dos números de varios dígitos. Por ejemplo: 64x17 = 1088. ![Archivo Gif con el gráfico de celosía](multiplicacion-celosia.gif) ## Regletas de Genaille-Lucas El lado derecho del triángulo cubre los dígitos de las unidades de un producto parcial, sumado a un posible acarreo proveniente de la derecha. La esquina izquierda del triángulo se coloca a una altura que corresponde a la cifra de las decenas del producto parcial. La multiplicación se realiza organizando las regletas para los números necesarios y luego siguiendo las flechas de derecha a izquierda se puede leer el resultado. ![Archivo Gif con un ejemplo de las regletas](regletas.gif] ## Bloques deslizantes Una de los comportamientos intrigantes de este tipo de lógica extraña y no determinista es que las señales pueden fluir tanto hacia adelante como hacia atrás, de hecho ni siquiera necesitan respetar las nociones normales de entrada y salida. Considera el mini-rompecabezas de la compuerta AND. Supongamos que el objetivo es deslizar el bloque superior que sobresale hacia la caja. La respuesta es primero el bloque izquierdo y el bloque inferior deben deslizarse hacia afuera una unidad. Esto permitirá que los bloque sinternos se deslicen para liberar esppaci y que el bloque superior pueda deslizarse hacia adentro. Por lo tanto, este rompecabezas tiene efectivamente una propiedad similar a una compuerta AND: tanto el bloque izquierdo como el inferior deben deslizarse hacia afuera antes de que el bloque superior pueda deslizarse hacia adentro. Los bloques grises claros son separadores, que nunca necesitan moverse. [~](https://groups.csail.mit.edu/mac/users/bob/sliding-blocks.pdf) ![Archivo Gif mostrando una serie de bloques deslizantes](bloques-deslizantes.gif) ## Microfluídos en papel La fluídica es la construcción de sistemas de computación utilizando fluídos. La microfluídica en papel no requiere bombas externas ni fuentes de energía, puede ser pequeña, portátil, desechable, fácil de distribuir, operar y de bajo costo. Técnicamente simple de fabricar, solo necesitas pequeñas cantidades de fluido muestra. Una configuración mínima puede ser tan simple como calentar las líneas dibujadas con crayón de cera en papel absorbente, y usar gotas con colorante alimentario. ![Archivo Gif con un ejemplo de un artefacto de Fluídica](microfluidica.gif) * [Nomografía](https://archive.org/details/traitdenomograp00ocaggoog/page/n21/mode/2up) * [Cálculos muertos](https://deadreckonings.com/) * [Teléfono de papel](https://specialprojects.studio/project/paper-phone) * [Cámara de papel](https://kellianderson.com/books/thecamera.html) * [Reproductor de Tarjeta](https://globalrecordings.net/en/cardtalk) * [Cálculo con cocodrilos](http://worrydream.com/AlligatorEggs/) * [Sadako](https://esolangs.org/wiki/Sadako) * [Computadora con bloques deslizantes](https://groups.csail.mit.edu/mac/users/bob/sliding-blocks.pdf) * [Azulejos Wang](https://grahamshawcross.com/2012/10/12/wang-tiles-and-turing-machines/) * [Ciencias de la computación desenchufada](https://classic.csunplugged.org/activities/) * [Plantillas cortar y doblar](https://www.cutfoldtemplates.com/) ## -0+ Computadora con "palabras-medidas" no en bits sino trits. Utilizaremos un trybble de 3 trits, un tryte de 9 trits y una palabra de 28 trits. La lógica de Kleene amplía los valores convencionales de verdadero y falso de la lógica booleana conun tercer valor: desconocido. | Valor | Unsigned | Balanced | BCB | | ----- | -------- | -------- | --- | | False | 0 | - |11 | | unknow| 1 | 0 |00 | | truth | 2 | + |01 | ## Código binario balanceado (BCB) El binario codificado balanceado (BCB) es una representación que permite a las computadoras binarias manipular datos [ternarios](https://wiki.xxiivv.com/site/ternary.html). En el sistema ternario, un trit codifica 3 valores. Por lo tanto, si usamos 2 bits por trit ternario codificado en binario. | Unsigned | BCB | Balanced | | ------------ | ---- | ------------ | | Dec. | Tern. | no | Tern. | Dec. | | ------------ | ---- | ----- | ---- | | 0 | 00 | 1111 | xx | -4 | | 1 | 01 | 1100 | -0 | -3 | | 2 | 02 | 1101 | -+ | -2 | | 3 | 10 | 0011 | 0- | -1 | | 4 | 11 | 0000 | 00 | 0 | | 5 | 12 | 0001 | 0+ | 1 | | 6 | 20 | 0111 | +- | 2 | | 7 | 21 | 0100 | +0 | 3 | | 8 | 22 | 0101 | ++ | 4 | La ventaja de BCB sobre el BCT de [Douglas W. Jones](http://homepage.cs.uiowa.edu/~dwjones/ternary/bct.shtml) es que facilita la detección de acarreo, ya que 1+1=2 y 2+0=2 producen el mismo resultado, mientras que si sumas dos valores que son 0, 1 y 3, nunca obtendrás la misma suma de dos maneras diferentes. Para convertir a la forma sin signo, puedes hacer (x+1)>>1, y para revertirlo, (x>>1)|x. | Balanced Trite | | ------------------ | | tri | - | 0 | + | | bc1 | 11 | 00 | 01 | | int | -1 | 0 | 1 | | Balanced Trybble | | ------------------------------- | | try | --- | 000 | +++ | | bc3 | 1111111 | 000000 | 010101 | | int | -13 | 000 | 13 | * ![Ternary Logic] http://homepage.cs.uiowa.edu/~dwjones/ternary/logic.shtml ## Computación en el que se realizan muchas operaciones simultáneamente. Un programa concurrente necesita realizar varias tareas posiblemente no relacionadas al mismo tiempo. En contraste, un programa paralelo resuelve un solo problema. Por definición, un programa concurrente se ocupa continuamente de protocolos de red, bases de datos y similares. Un programa paralelo típico tiende a estar más enfocado: ingresa datos, los procesa por un tiempo y luego los envía de vuelta. Hay muchos aspectos en la ejecución paralela de un programa: los hilos se crean, se ejecutan en un procesador, transfieren datos hacia y desde procesadores remotos, y se sincronizan con otros hilos. Gestionar todos estos aspectos además de construir un algoritmo correcto y eficiente es lo que hace que la programación paralela sea tan difícil. *"Los eventos ocurren tanto en el tiempo como en el espacio. Es posible que dos eventos ocurran en el mismo lugar uno después del otro en el tiempo (es decir, secuencialmente), e igualmente posible que ocurran en diferentes lugares al mismo tiempo (es decir, concurrentemente o en paralelo)."* ## Divide y vencerás Para resolver una instancia grande de un problema, divídelo en instancias más pequeñas del mismo problema y utiliza las soluciones de estas para resolver el problema original. El factor de ramificación de un algoritmo de divide y vencerás es el número de subproblemas en los que se divide un problema. Un algoritmo de divide y vencerás es equilibrado si divide el problema inicial en subproblemas de igual tamaño. ## Procesos secuenciales comunicantes (CSP) CSP es un álgebra de procesos que se utiliza para describir programas paralelos. En este mundo, un programa es una red de procesos conectados mediante canales. Un canal es un enlace de comunicación punto a punto, unidireccional, síncrono y sin búfer. Los procesos solo necesitan conocer los canales que los conectan a otros procesos y cómo comunicarse a través de esos canales (generalmente utilizando el mismo protocolo que el proceso del otro extremo). ## Mutex En su forma más simple, un "semáforo binario" es una bandera asociada a un recurso. Dos operaciones actúan sobre los semáforos: WAIT y SIGNAL. WAIT verifica si el recurso está disponible. Si lo está, se marca como "no disponible"; si no, la CPU se libera para otras tareas hasta que el recurso esté disponible. SIGNAL simplemente marca el recurso como "disponible". Un verdadero mutex tiene un caso de uso y una definición más específicos, ya que solo la tarea que bloqueó el mutex debe desbloquearlo. Cada tarea, antes de usar un recurso compartido, realiza un WAIT en su semáforo, y después de usar el recurso, realiza un SIGNAL. Esto es suficiente para garantizar que solo una tarea pueda usar ese recurso en cualquier momento, y aún así, si una tarea está bloqueada, las otras tareas pueden ejecutarse normalmente. ## Sin bloqueos (Lock-free) Las estructuras de datos sin bloqueos son estructuras de datos seguras para hilos e interrupciones sin necesidad de usar mecanismos de exclusión mutua. Las estructuras de datos sin bloqueos son más útiles para la comunicación entre procesos, pero debido a su eficiencia, también pueden usarse de manera segura en aplicaciones de un solo hilo, lo que las hace adecuadas para uso general. *"Sin embargo, vale la pena reflexionar sobre el contraste entre la naturaleza concurrente del mundo y la naturaleza secuencial de la computadora digital. Dado que el propósito principal de la computadora es modelar el mundo, parecería haber una seria incompatibilidad."* ## Multitarea *Round-robin* significa que cada tarea toma su turno en la CPU, una a la vez, en una secuencia fija como un gran ciclo de tareas. *Cooperativo* significa que cada tarea tiene la CPU durante el tiempo que desee y la libera solo cuando está lista. * [El paralelismo y la concurrencia necesitan herramientas diferentes] (https://yosefk.com/blog/parallelism-and-concurrency-need-different-tools.html) * [Programación concurrente y multicore, Haskell] (https://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html) * [Multitarea en Forth en pocas palabras] (https://www.bradrodriguez.com/papers/mtasking.html) * [El diseño de lenguajes de programación paralela, Richard P. Gabriel] (https://dreamsongs.com/10ideas.html) ## La computación reversible es un modelo de computación en el que el tiempo es reversible. Hasta donde se sabe, las leyes de la física son reversibles: es decir, puedes ejecutarlas en reversa y recuperar cualquier estado anterior del universo. Esto significa que, desde una perspectiva física, la información nunca puede destruirse, solo reorganizarse. Un proceso se considera físicamente reversible si no resulta en un aumento de la entropía física; es isentrópico. ## Lógica reversible La primera condición para que cualquier dispositivo determinista sea reversible es que su entrada y salida sean únicamente recuperables una de la otra. Esto se llama reversibilidad lógica. Si, además de ser lógicamente reversible, un dispositivo puede realmente funcionar en reversa, entonces se llama físicamente reversible, y la segunda ley de la termodinámica garantiza que no disipa calor. | CNOT | | :------------: | | INPUT | OUTPUT | | ----- | ------ | | 0 | 0 | 0 | 0 | | 0 | 1 | 0 | 1 | | 1 | 0 | 1 | 1 | | 1 | 1 | 1 | 0 | Para un bit de entrada, existen dos compuertas reversibles posibles. Una de ellas es la compuerta NOT (NO). La otra es la compuerta de identidad, que mapea su entrada a la salida sin cambios. Para dos bits de entrada, la única compuerta no trivial es la compuerta controlled NOT (NO controlada), que aplica la operación XOR al primer bit y lo deja sin cambios, mientras que el segundo bit se modifica según el valor del primero. | INPUT | OUTPUT | |-------------|-------------| | C | i1 | i2 | C | o1 | o2 | |-------------|-------------| | 0 | 0 | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 0 | 0 | 1 | | 0 | 1 | 0 | 0 | 1 | 0 | | 0 | 1 | 1 | 0 | 1 | 1 | | 1 | 0 | 0 | 1 | 0 | 0 | | 1 | 0 | 1 | 1 | 1 | 0 | | 1 | 1 | 0 | 1 | 0 | 1 | | 1 | 1 | 1 | 1 | 1 | 1 | ## Consumo de energía en la computación El principio de Landauer establece que cualquier manipulación lógicamente irreversible de la información, como la eliminación de un bit o la fusión de dos rutas de cálculo, debe ir acompañada de un aumento correspondiente de la entropía en los grados de libertad no portadores de información del aparato de observación. | Self-Reversible | |---------------------| | swp ( a b -- b a ) | | sign ( a -- -a ) | | not ( a-- ~a ) | | cnot ( a b -- c d) | | Reversible | |------------------------------------------------| | rot( a b c -- b c a ) | -rot( a b c -- c b a ) | | csr( a b -- a ~>b ) | csl( a -- a<~b ) | | Reversible Arithmetic | |---------------------------------------------------| | add( a b -- a b+a ) | sub( a b -- a a-b ) | | mad( a b c -- a+b*c c ) | dam( a b -- a%b a/b b ) | Los microprocesadores que son reversibles a nivel de sus compuertas lógicas fundamentales pueden potencialmente emitir radicalmente menos calor que los procesadores irreversibles, y algún día eso podría hacerlos más económicos que los procesadores irreversibles. El microprocesador Pendulum es una arquitectura de computadora lógicamente reversible que se asemeja a una mezcla de PDP-8 y RISC. La promesa de la computación reversible es que la cantidad de pérdida de calor para arquitecturas reversibles sería mínima incluso para un número significativamente grande de transistores. En lugar de crear entropía (y, por lo tanto, calor) a través de operaciones destructivas, una arquitectura reversible conserva la energía realizando otras operaciones que preservan el estado del sistema. La eliminación de información en un sistema cerrado siempre está acompañada de un aumento en el consumo de energía. ## Lógica lineal Un [sistema lineal](http://tunes.org/~iepos/joy.html#linear) excluye combinadores que tienen un efecto duplicativo, así como aquellos que tienen un efecto destructivo. Un lenguaje de computación basado en lógica lineal evita la necesidad de recolección de basura mediante la construcción y destrucción explícita de objetos. En una máquina reversible, la recolección de basura para reciclar almacenamiento siempre puede realizarse mediante un subcálculo invertido. El "problema de la referencia colgante" no puede ocurrir en un lenguaje lineal porque la única ocurrencia de un nombre para un objeto se utiliza para invocar su destructor, y el destructor no devuelve el objeto. La mayoría de los operadores de Forth toman sus operandos de la parte superior de la pila y devuelven sus valores a la parte superior de la pila. La ausencia de nombres de variables en el lenguaje es característica de los [combinadores](https://wiki.xxiivv.com/site/logic.html), por lo que la programación de operadores de Forth puede verse como la construcción de combinadores más grandes a partir de otros más pequeños. Un Forth que incorpora solo operaciones de permutación de pila, como intercambiar, rotar y rodar, debe ser lineal porque no tiene operadores de copia o eliminación.[~](https://web.archive.org/web/20180704171411/http://home.pipeline.com/~hbaker1/ReverseGC.html) Para un ejemplo de autómatas celulares reversibles, consulta [Fractran](https://wiki.xxiivv.com/site/fractran.html#reversibility) y [Qu-Ants](https://wiki.xxiivv.com/site/qu-ants.html). En 1949, Claude Shannon caracterizaba la pérdida de información y necesitaba un término para describir el grado en que la información se mezcla o desordena. Al visitar al físico matemático John von Neumann, recibió el siguiente consejo: ***"Deberías llamarlo entropía... nadie sabe realmente qué es la entropía, así que en un debate siempre tendrás la ventaja."*** * [Computadoras que pueden ejecutarse hacia atrás] (https://www.americanscientist.org/article/computers-that-can-run-backwards) * [Simulador de software de procesador reversible con pila] (https://arxiv.org/pdf/1104.0924v2.pdf) * [El cálculo Aleph] (https://arxiv.org/abs/2011.14989) ## Los estantes vertiginosos que obstruyen el día y sobre los cuales yace el caos. Usamos software porque tenemos objetivos que alcanzar y cosas que hacer. El software que utilizamos está codificado por programadores que tienen sus propios objetivos; a veces estos objetivos coinciden con los nuestros, pero con el tiempo divergen. Las herramientas de las que dependemos adquieren funciones que no usamos ni entendemos, introduciendo errores que nos impedirán alcanzar nuestras metas. Tenemos la opción de intentar comprender el código y corregirlo, la opción de probar otro programa y la opción de programar el software nosotros mismos. Todas los caminos, excepto la última, implican una [búsqueda](https://wiki.xxiivv.com/site/stack.html), y evaluación interminables y una mayor desviación de nuestros objetivos. * Implementamos según nuestros propios objetivos. * Cometemos errores y aprendemos de ellos. * Aprendemos cómo deben funcionar las herramientas de las que dependemos. * Adquirimos una comprensión profunda de nuestro dominio de problemas. * Adoptamos el intercambio de ideas y código. Llamemos elegante a un programa si no existe un programa más pequeño escrito en el mismo lenguaje de programación que tenga la misma salida. Jen entró para ver las increíbles creaciones de los ingenieros y artistas. Todos estaban miraban fijamente un televisor conectado a una consola de desarrollo para Sony PlayStation. Allí, en la pantalla sobre un fondo monocromático, había un triángulo negro.[~](https://web.archive.org/web/20120229000202/http://rampantgames.com/blog/2004/10/black-triangle.html) ***"Programar es una forma de crear mundos, en la que el programador define cómo funciona ese mundo"*** [~](https://www.chronicle.com/article/hello-worlds/) * [Kit de inicio para subcomunes éticos](https://writing.kemitchell.com/2019/03/15/Ethical-Subcommons.html) * [El pecado original del software libre](https://lipu.dgold.eu/original-sin) ## Una máquina virtual es un programa que actúa como una computadora. Simula las instrucciones de un procesador junto con algunos otros componentes de hardware, lo que le permite realizar operaciones aritméticas, leer y escribir en la memoria e interactuar con dispositivos de entrada/salida, al igual que una computadora física. Lo más importante es que puede entender un lenguaje de máquina que puedes usar para programarla. Las máquinas virtuales proporcionan una etapa de lenguaje intermedio para la compilación. Sirven como puente entre el alto nivel de un lenguaje de programación y el bajo nivel de una máquina real. Las instrucciones de una máquina abstracta están adaptadas a las operaciones específicas necesarias para implementar las operaciones de un lenguaje fuente o una clase de lenguajes fuente. [Archivo Gif con un esquema bedroak](bedrock.gif) Un nivel de abstracción fundamental se encuentra en todos los sistemas humanos. Ningún fallo recuperable, sin importar cuán catastrófico sea, requerirá intervención inteligente por debajo de este nivel. Cuando una aplicación se bloquea, podría dejar un volcado de memoria (core dump), pero nunca un "volcado de compuertas lógicas" y mucho menos un "volcado de transistores". Las compuertas lógicas y los transistores están muy por debajo del nivel de abstracción fundamental de cualquier computadora ordinaria.[~](http://www.loper-os.org/?p=55) Para experimentar con la computación desde los primeros principios, echa un vistazo a la [computadora de papel](https://wiki.xxiivv.com/site/paper_computer.html). * [sbtcvm] (https://sbtcvm.blogspot.com/) * [Máquinas abstractas para la implementación de lenguajes de programación] (https://www.rw.cdl.uni-saarland.de/people/diehl/private/pubs/articleDiehlHartelSestoft.pdf) ## Traducido del original: https://wiki.xxiivv.com/site/computation.html