Descargar

Elementos básicos de las técnicas digitales


    1. Resumen
    2. Bosquejo histórico
    3. Computadoras analógicas y digitales
    4. Microelectrónica y sistemas de cómputo
    5. Estructura de los sistemas de cómputo
    6. Solución de problemas empleando sistemas de cómputo
    7. El ambiente WINDOWS
    8. Inteligencia Artificial
    9. Redes de computadoras
    10. Seguridad Informática
    11. Anexos

    Resumen

    Una característica fundamental de toda sociedad es su desarrollo tecnológico, marcado, incluso algunos de ellos, períodos concretos, como el caso del uso del vapor en el siglo XIX.

    En el caso de la sociedad contemporánea uno de los elementos que forma parte indisoluble de la misma, a partir de su acelerada introducción en la práctica social desde la primera mitad de los años 80, lo constituyen las técnicas digitales, que hoy día se encuentran presentes, de una u otra forma en todas las actividades y esferas de nuestra vida.

    Por otra parte, la propia rapidez de este proceso incrementa la cantidad de publicaciones especializadas sobre el tema, pero éstas, por razones obvias, cada vez dedican menos espacio a los aspectos básicos y caen de lleno en lo novedoso que las ocupa, dejando un vació para el lector no especializado.

    Tomando en cuenta los aspectos mencionados se elaboró el presente trabajo donde, el autor a partir de una recopilación bibliográfica, que incluye trabajos propios anteriores, expone los elementos básicos asociados a la evolución de las técnicas digitales y sus aplicaciones, con lo cual facilita la comprensión de temas más avanzados a los interesados.

    I. Bosquejo histórico

    La evolución histórica de los sistemas informativos y, por supuesto, de las técnicas de desarrollo de estos sistemas, puede rastrearse a través de la historia de la humanidad.

    Desde la época primitiva el hombre sintió la necesidad de contar y realizar cálculos numéricos, los cuales con el transcurso del tiempo resultaban cada vez más complejos y en cuya realización empleó los más diversos métodos.

    La forma más elemental consistió en contar con los dedos de las manos, que tiene el inconveniente de no poder enumerar conjuntos de más de diez elementos. Como «solución» existía la posibilidad de utilizar a otras personas!!!.

    El siguiente paso lo realizaron las antiguas civilizaciones de Egipto y de los valles asiáticos, que consistió en representar los números por grupos de guijarros en montones de diez. Este método con el tiempo derivó en el ábaco, que más evolucionado ha llegado a nuestros días.

    Hasta el momento, los documentos más antiguos que se conocen fueron descubiertos en los años 3000 – 2800 ADNE, cerca del antiguo estuario del Eufrates, en Mesopotamia, pudiendo afirmarse que representaban el soporte físico del primer sistema para el control económico de que se tiene noticia: se trata de libros de cuentas y de inventarios redactados en escritura cuneiforme arcadiana en tablillas de arcilla. Paralelamente, aparece en Egipto la escritura jeroglífica, destinada originalmente a inscripciones en monumentos y edificios.

    Ya en los años 79 – 78 ADNE, se construye en Roma el Tabularium, adoptándose los rollos de papiro empleados por griegos y egipcios, que pueden considerarse como uno de los primeros archivos centrales de un estado.

    En el 868 ya se imprimían libros en China, existiendo como prueba de tal aseveración el Sutra del Diamante, versión china de un texto budista sánscrito.

    Los diseñadores de sistemas informativos en cada época histórica se vieron favorecidos por la alta estima y consideración de los gobernantes que valoraban significativamente sus servicios.

    Así, el diseñador de sistemas utilizó para almacenar información piedras (India y Tibet), monumentos (Egipto, Mesoamérica), cuerdas (Europa, Tibet, Imperio Inca), madera (Europa) e incluso el cuerpo humano mediante tatuajes (Benin), utilizando siempre en su trabajo la técnica disponible en su tiempo, reflejando el desarrollo de la ciencia en la época que les tocó vivir.

    Del ábaco a la primera calculadora mecánica pasaron varios siglos, atribuyéndose este hecho al físico y matemático Blaise Pascal (1623-62) quien dijo al respecto: "Ofrezco al público una pequeña máquina de mi iniciativa, con la cual, usted sólo, podrá realizar todas las operaciones aritméticas sin esfuerzo y se sentirá aliviado del trabajo que con harta frecuencia ha fatigado su espíritu cuando trabajaba con el ábaco y la pluma".

    El siguiente paso lo dio el matemático alemán Liebnitz (1646-1716), quien introdujo a la máquina de Pascal la multiplicación de forma directa con la rueda dentada escalonada y no mediante sumas reiteradas como su predecesora.

    Un nuevo avance se logró con los trabajos de Charles Babbage (1792-1817) quien estableció los conceptos básicos de las estructuras de las computadoras digitales y en 1812 propuso la idea de una máquina para tabular funciones matemáticas tales como logaritmos, etc., mediante aproximaciones de polinomios. En 1822 terminó un modelo que podía calcular diferencias con seis dígitos de precisión y posteriormente propuso construir una que utilizaba diferencias de 6to orden con 20 dígitos de precisión, pero perdió el interés en ésta cuando concibió su máquina analítica, conceptualmente más avanzada, pero recibida con escepticismo por sus contemporáneos y que a su muerte pasó al olvido.

    La continuación de los trabajos de Babbage lo realizó su colaboradora Augusta Ada (1815-52) -condesa de Lovelace e hija de Lord Byron- la cual desarrolló varios programas para resolver problemas matemáticos avanzados, lo que la convierte en la primera programadora en la Historia de la Computación. Igualmente contribuyó a exponer, incluso con más claridad, las ideas de Babbage entre las que pueden señalarse las siguientes:

    La Máquina Analítica no pretende, en absoluto, crear nada. Puede realizar lo que nosotros le mandamos.

    En relación con el empleo de ciclos repetitivos y las instrucciones de salto expresó: "La máquina es capaz de hacer un examen, en ciertas circunstancias, para averiguar si se ha producido una contingencia posible, dos o más, y seguir después el rumbo que convenga.

    En 1888 tiene lugar otro avance significativo, cuando el estadístico norteamericano Herman Hollerith inventó una máquina que contaba automáticamente los huecos perforados en una tarjeta de papel, lo que permitió utilizar este soporte para introducir información a los sistemas, que estuvo vigente hasta la década de los 70-80 del siglo XX.

    A partir del desarrollo de la electricidad a mediados del siglo XIX y los avances en la electrónica en el siglo XX, la Mecánica comienza a ceder terreno en este tipo de aplicaciones y surgen computadoras que emplean dispositivos electrónicos (diodos de vacío constituidos por dos electrodos encapsulados en una ampolla de vidrio al vacío entre los cuales circula una corriente y las más evolucionadas válvulas de vacío que disponen de rejillas colocadas entre los electrodos para regular la magnitud de la corriente), las cuales aventajan en velocidad, tamaño y fiabilidad a las mecánicas.

    Posteriormente, el inglés George Boole desarrolló un sistema algebraico para la representación de operaciones lógicas, que constituyó el germen para el diseño de los circuitos lógicos y de cálculo en las computadoras, y la base matemática en que se apoyan algunos métodos actuales de diseño de sistemas informáticos y de bases de datos.

    En la década del 40, von Newman culmina la configuración de la arquitectura básica de las computadoras, al combinar los conceptos de programa almacenado y ruptura de la secuencia del programa mediante la toma de decisiones, en tanto en los 50 los trabajos empleando semiconductores condujeron al descubrimiento del transistor, base del desarrollo de los circuitos integrados, lo que permitió el tránsito de las computadoras de válvulas a las basadas en microprocesadores, cuyo surgimiento en los 70 originó una profunda transformación, tanto desde el punto de vista de la arquitectura de los sistemas de cómputo como de las técnicas de cómputo y la informática en su conjunto.

    A partir de los finales de la tercera década del siglo XX comienza el desarrollo de la primera generación, diferentes colectivos de científicos trabajaban fuertemente en el desarrollo de dispositivos de cálculo automático. Los más significativos fueron Howard Haiken y Grace Hopper en Harvards, con los Mark I, II, III y IV; J.P. Eckert y J.W. Mauchly en Pennylvania con el ENAC (y posteriormente con la UNIVAC I, primera computadora electrónica comercializada en el mundo que podía almacenar programas y datos); John von Newman en Pennsylvania y Cambridge con los EDVAC y EDSAC respectivamente, computadoras que tenían programas almacenados (conjuntos de instrucciones codificados y precableados) que se ejecutaban secuencialmente.

    Los primeros equipos computacionales estaban orientados al llamado cálculo científico y los lenguajes se vinculaban directamente a la máquina en cuestión, asociados fundamentalmente al código que ésta empleaba. Fue la etapa heroica, donde paralelamente al empleo de los medios de cómputo, a la elaboración de los programas, surgía toda una teoría sobre la programación.

    En estos primeros métodos se insistía mucho en la organización del flujo informativo entre los elementos del sistema, diseño óptimo de la información de entrada a la computadora, la cual, en su gran mayoría, se soportaba sobre tarjetas perforadas; el diseño de las tablas de salidas.

    En este momento, Herbert Simón desarrolla en 1956 los primeros programas heurísticos, con lo que comenzaba a tomar cuerpo una disciplina que ya cuenta con gran difusión en el mundo: la inteligencia artificial y se desarrollan y difunden superlenguajes o lenguajes de alto nivel para su utilización en cálculo científico: el FORTRAN y el ALGOL.

    Con el surgimiento del transistor, al final de la década de los cincuenta, surge la segunda generación de computadoras, en la que los tubos al vacío son sustituidos por transistores, se dispone de sistemas magnéticos de memoria central, de memoria virtual, dispositivos de micro y multiprogramación.

    Quizás el logro más importante de la segunda generación de métodos de diseño fue la concepción sistemática de las aplicaciones con la introducción del SOP (Study Organization Plan), que partía de concebir a la entidad como un sistema y dividía el trabajo de confección de un sistema en tres etapas y seis fases.

    Dos aspectos interesantes y novedosos del SOP lo fueron:

    • La utilización de documentos diseñados ergonómicamente para la concepción de diagramas, ficheros, programas y tablas de salida.
    • El cálculo de la eficiencia económica del nuevo sistema, como elemento a valorar para determinar la prioridad de desarrollo de las tareas a automatizar.

    La tercera generación, denominada empirismo desarrollado, se caracteriza por la introducción de los métodos estructurados, el formalismo y la automatización del diseño, que tienen como punto de partida, los hechos siguientes:

    1961: se comercializa el primer circuito integrado que sale al mercado.

    1964: con máquinas caracterizadas por la integración en gran escala de circuitos híbridos y monolíticos, la capacidad de manejar multiprocesadores, la multiprogramación de tareas, el aumento de la velocidad de procesamiento y de la capacidad de memoria, el procesamiento en tiempo compartido y el almacenamiento de volúmenes significativos de información en dispositivos de acceso directo a un costo razonable.

    Otro logro muy significativo de la tercera generación de computadoras fue el desarrollo del software, tanto básico (sistemas operativos, compiladores, etc), como utilitario (generadores de programas, programas parametrizados de amplia utilización, etc), surgiendo la industria del software, elaboradora de productos de amplia difusión, convirtiéndose la informática en una de las ramas de punta del desarrollo.

    En el campo metodológico se produce una proliferación de enfoques en los métodos empleados cuya utilización conduce a la elaboración de sistemas metodológicos, llamados genéricamente métodos estructurados de análisis y diseño de sistemas informáticos, entre los que se encuentran:

    Jackson: Abarca el análisis y la programación, orientado tanto al análisis por lotes como en tiempo real. No se apoya en ningún lenguaje en particular, aunque tiene una aplicación casi directa en PL/1.

    Constantine. Diseñado especialmente para el trabajo en tiempo real.

    Bertini: Prácticamente resulta una estructuración del lenguaje COBOL.

    Warnier: Abarca el análisis y la programación (Leyes de Construcción de Sistemas y Programas), que orienta su trabajo fundamentalmente a los datos y a las relaciones entre ellos principalmente a las aplicaciones aisladas. Estas relaciones se apoyan en los principios de la Lógica Matemática y la Teoría de Conjuntos.

    En general, los métodos estructurados tuvieron mucha efectividad en la programación, al aumentar de manera significativa la productividad de los programadores y reducir la complejidad y el diseño incorrecto de los programas.

    No puede decirse lo mismo de la concepción del sistema, de su diseño. La mayoría de estos métodos reduce el proceso de proyección a un conjunto de pasos y de decisiones simples, los cuales, si bien son apropiados para especialistas de poca experiencia, con frecuencia entorpecen el trabajo de especialistas de mayor destreza.

    Otro enfoque fue el de los sistemas metodológicos basados en documentación normalizada. Uno de los sistemas más conocidos es el de NCC-Systems Documentation Standards. El mismo abarca todas las etapas de elaboración del sistema, y su rasgo distintivo es la formalización del sistema mediante documentos, que deben ser cumplimentados en determinado orden por los especialistas.

    El principal inconveniente de estos sistemas metodológicos fue la tendencia (inconsciente e involuntaria, pero real) a documentar el sistema y no a elaborarlo realmente: una tendencia burocrática que ha lastrado la eficiencia de muchos buenos especialistas.

    Dentro de la línea de la formalización, deben mencionarse los intentos por representar algebraicamente los procesos informativos.

    Paralelamente, el desarrollo electrónico no se detiene. Aumenta la densidad de los circuitos integrados. En 1970, se produce el primer RAM de 1024 bytes. Ello prepara la escena para la aparición, en 1971, del primer microprocesador comercial, el INTEL 4004, y la primera microcomputadora .

    Los pequeños cambios cuantitativos se suceden uno tras otro hasta que su acumulación genera el cambio cualitativo revolucionario: Steve, Wozniak y Jobs, diseñan la Apple II y el mundo de la informática se conmociona, surgiendo la cuarta generación. El impacto del Apple II fue considerable. Por primera vez, la informática salía de los centros de cálculo (técnicos altamente especializados, cristales, jerga incomprensible, etc.) para invadir las oficinas, los talleres, el aula y el hogar.

    Comenzaba, según muchos, la primera gran revolución informativa desde Gutenberg. La potencia de cálculo, la capacidad de memorización, pero sobre todo la sencillez de manejo, el bajo consumo energético, las posibilidades de trabajo en condiciones ambientales normales y el bajo precio; pusieron la computación al alcance de grandes masas no especializadas en esas técnicas.

    En este momento la electrónica ejecuta el segundo paso, esta vez sobre seguro, pero a su vez de muchas mayores dimensiones: IBM entra en el negocio de las microcomputadoras con su serie IBM PC (en sus versiones PC, XT, AT y posteriormente con el PS/2, éste último un fracaso comercial). El mérito principal de esta serie ha sido su capacidad de estandarizar la actividad del software: el sistema operativo MS-DOS se convierte en norma internacional por la fuerza de la transnacional gigante, lo cual crea el entorno de trabajo necesario para el desarrollo de software utilitario a una escala inmensa.

    Esta enorme difusión ha propiciado varias tendencias:

    Grandes firmas de software concentran los mejores especialistas y elaboran programas de alta complejidad (utilitarios de diversos tipos, generadores de programas, etc.) pero altamente amistosos, para propiciar su utilización por personal no informático.

    Lo anterior hace que cada vez se difundan y resulte más fácil la difusión de las técnicas informáticas a personal no especializado.

    El empleo de estas técnicas por este tipo de personas, ha motivado una alta utilización de las computadoras en todas las esferas de la vida, así como el diseño de sistemas caracterizados por:

    • Espontaneidad e ineficiencia.
    • Resultados rápidos pero incompletos.
    • Participación mayoritaria de especialistas en aplicaciones concretas y minoritaria de especialistas en informática.

    En este sentido, se están difundiendo algunos sistemas que combinan las características y enfoques de los métodos estructurados con las ventajas indudables de la automatización.

    Uno de los sistemas más conocidos es el EXCELERATOR, paquete basado en las técnicas y símbolos que han propuesto Gane y Sarson en su método estructurado, el cual permite automatizar un volumen considerable de tareas en el proceso de creación de un sistema automatizado.

    Este acelerado desarrollo técnico permitió el acceso masivo al empleo de las técnicas digitales, quedando a los especialistas el desarrollo de nuevos programas y sistemas que faciliten y amplíen su utilización por el creciente número de usuarios.

    II. Computadoras analógicas y digitales

    El bosquejo histórico realizado evidencia que el punto de partida de los sistemas de cómputo ha estado asociado al procesamiento de números (sin importar su procedencia), de ahí la importancia de una adecuada selección de la notación (representación de los números mediante conjuntos de símbolos, entre las que pueden señalarse la romana que utiliza símbolos alfabéticos (I,V,X,L,C,D,M); la decimal que utiliza para la representación caracteres numéricos (0,1,2,3,4,5,6,7,8,9) y la binaria que caracteriza sus resultados por dos estados (verdadero y falso).

    Por otra parte es necesario señalar que los números reflejan el comportamiento del mundo físico, en el cual los fenómenos se manifiestan de dos formas: continua (la transición de un estado a otro del sistema se realiza de forma progresiva) y discreta (la transición se realiza a saltos), lo que motiva a pensar en dos tipos de sistemas computacionales diferentes, cuya forma de trabajo se encuentre lo más cercana posible a la realidad que refleja: analógico para procesos continuos y digital para discretos, que brevemente se describen a continuación.

    La utilización progresiva de los tubos de vacío en conjunción con otros dispositivos permitió obtener circuitos que representan con buena aproximación de forma continua la derivada o la integral de una función representada por las variaciones de voltaje a la entrada del circuito. Este procedimiento permitió la «solución» de ecuaciones diferenciales, dando lugar a las computadoras analógicas, en las cuales modificando adecuadamente determinadas conexiones electrónicas o valores de componentes discretos (resistencias y condensadores) es posible evaluar la influencia de una o varias magnitudes en el sistema físico caracterizado por la ecuación diferencial simulada.

    La otra vertiente de los sistemas de cómputo, las computadoras digitales, utilizan la notación en base binaria, atendiendo a que cada dígito (denominado bit y que se utiliza como unidad de información binaria), dispone de dos estados (verdadero y falso) lo que facilita el tratamiento de la información a través de elementos electrónicos, pues cada estado puede asociarse con la presencia o no de voltaje en un determinado dispositivo.

    La Matemática Binaria opera de la misma forma que la decimal, excepto que el valor de cada término (bit) sólo puede ser sólo 0 ó 1. En la tabla 1 se muestra la correspondencia entre los valores decimales y binario.

    Tabla 1. Ejemplo de empleo de la notación binaria

    decimal

    binario

    decimal

    binario

    decimal

    binario

    0

    0

    4

    100

    8

    1000

    1

    1

    5

    101

    9

    1001

    2

    10

    6

    110

    10

    1010

    3

    11

    7

    111

    11

    1011

    La forma más sencilla para comprender la Matemática Binaria, es a través de la realización de la una operación en ambos sistemas. Sea la suma de los números 452 y 751:

    452

    + 751

    —–

    1203

    El procedimiento para sumar los dos números es el conocido por todos: se comienza desde la derecha. 2 + 1 = 3. Sin problemas. 5 + 5 = 10, se coloca el 0 y lleva 1. 4 + 7 + 1 (porque llevaba 1) = 12. Se coloca el 2 y lleva 1. 0 + 0 + 1 = 1. Así que la respuesta es 1203.

    La Matemática binaria funciona exactamente igual. Sea la suma de los números binarios 010 (dos en decimal) y 111 (siete en decimal).

    010

    + 111

    —–

    1001

    Comenzando desde la derecha, 0 + 1 = 1 para el primer dígito. No se lleva nada. 1 + 1 = 10 para el segundo dígito, así que colocamos el 0 y se lleva 1. 0 + 1 + 1 = 10 para el tercer dígito, así que colocamos el 0 y llevamos 1. 0 + 1 + 1 = 10 para el tercer dígito. Así que colocamos el 0 y llevamos 1. 0 + 0 + 0 + 1 = 1. Por tanto, la respuesta es 1001. Si convierte todo esto a decimales podrá ver que es correcto: 2 + 7 = 9.

    Sin embargo, la notación binaria hace muy extensa la representación de los números lo que dificulta la operatoria a nivel de un usuario humano no experto como se aprecia en los ejemplos siguientes: el número 16 se representa como 1000 y el 255 como 11111111.

    Los bits son raramente vistos en las computadoras. Estos casi siempre se agrupan en colecciones de 8-bits, y esas colecciones son llamadas bytes.

    Por tanto se hace necesario compactar esta representación, lo que dio lugar a dos bases derivadas: octal (en desuso) y hexadecimal (empleada en la actualidad), que como su nombre indica tienen como base el 8 y el 16 respectivamente. En la tabla 2 se ilustra la representación de números empleando estas bases.

    Tabla 2. Ejemplo de empleo de la notación octal y hexadecimal

    decimal

    octal

    hexadecimal

    decimal

    octal

    hexadecimal

    0

    0

    0

    10

    12

    A

    1

    1

    1

    11

    13

    B

    8

    10

    8

    15

    17

    F

    9

    11

    9

    16

    20

    10

    Aprovechando su capacidad de almacenamiento, los caracteres alfanuméricos se asocian al valor de un byte, lo que se conoce como código ASCII, en el cual cada valor binario entre 0 y 127 está asociado un carácter específico. La mayoría de las computadoras extienden los caracteres ASCII para usar un rango amplio de los 256 caracteres disponibles en un byte. Los caracteres después del 128 ejecutan tareas especiales como acentos para ciertos lenguajes. En el Anexo B de este trabajo se muestran los 127 códigos ASCII estándar y los del ASCII, extendido.

    Cuando se habla de muchos bytes, se utilizan prefijos tales como kilo, mega y giga, (kilobyte, megabyte y gigabyte también abreviados a k, m y g o KB, MB y GB). La siguiente tabla recoge la forma de cálculo de las cantidades de bits y el prefijo correspondiente.

    Tabla 3. Unidades binarias

    prefijo

    abreviatura

    cantidad de bits

    forma de cálculo

    cantidad exacta

    Kilo

    K

    1,024

    Mega

    M

    1,048,576

    Giga

    G

    1,073,741,824

    Tera

    T

    1,099,511,627,776

    Peta

    P

    1,125,899,906,842,624

    Estos sistemas se desarrollaron de forma acelerada hasta las actuales microcomputadoras, a partir de las posibilidades de la microelectrónica, que a finales de los 70 permitió la fabricación de circuitos complejos capaces de agrupar en un mismo dado semiconductor (circuitos integrados) diversas estructuras requeridas por los sistemas de cómputo, lo que redundó en un incremento de la fiabilidad y reducción de las dimensiones, al mismo tiempo que posibilitó la creación de una unidad central de control estándar, lo que reporta beneficios en términos de programación y una reducción en los costos que facilita el acceso masivo a esta técnica.

    Como consecuencia de este desarrollo, tuvo lugar una evolución y significativos avances en las técnicas digitales (en la actualidad se emplean a gran escala en todas las actividades de la ciencia y la técnica como las comunicaciones, control de proceso industriales, etc.) las cuales han permitido la asimilación progresiva de los problemas solubles mediante las computadoras analógicas reduciendo drásticamente la presencia de éstas hasta su casi total desaparición.

    III. Microelectrónica y sistemas de cómputo

    Considerando el impacto de la microelectrónica en el rápido y sostenido desarrollo de las técnicas digitales y lo frecuente del empleo de términos como capacidad de memoria, microprocesador, etc. es conveniente establecer el alcance real de éstos y su vinculación con los dispositivos que componen el sistema de cómputo.

    En primer lugar es necesario diferenciar los términos de microcomputadora de microprocesador.

    El microprocesador es un circuito integrado que agrupa todos o casi todos los elementos que constituyen la Unidad Central del Proceso (UCP), y es capaz de interpretar y ejecutar una serie de operaciones (aritméticas, lógicas, transferencia de control durante la ejecución de un programa, entrada / salida de información de datos) en código binario (0 y 1), así como dirigir al resto de los componentes que constituyen el sistema; para lo cual cuenta con la Unidad Aritmética – Lógica y la Unidad de Control, en tanto el término microcomputadora designa al sistema de cómputo en su conjunto: teclado, monitor, etc., que en la actualidad por la potencialidad de que disponen son denominadas Estaciones de Trabajo.

    Desde la aparición de estos sistemas se han ido desarrollando diversos dispositivos que integran en mismo dado semiconductor (chip) diversas funciones (no sólo para el desarrollo de sistemas de cómputo), los cuales independientemente del fabricante de procedencia exhiben dos tendencias comunes: incrementar la velocidad en las operaciones internas mediante la incorporación de técnicas de microelectrónica avanzadas y el procesamiento simultáneo (en paralelo) de mayor cantidad de bits, que se conoce como palabra, de la cual la más conocida el es byte (conjunto de ocho bits).

    Otro tipo de dispositivo de gran impacto en la ampliación de las posibilidades de los sistemas de cómputo son las memorias semiconductoras, las cuales se clasifican en dos grandes grupos: permanentes y volátiles.

    Las memorias semiconductoras permanentes, como su nombre lo indica tienen la propiedad de retener la información en ellas almacenada por tiempo indefinido, o que permite utilizarla para el almacenamiento de los programas o rutinas de control de un equipo o sistema. En la práctica existen cuatro tipos atendiendo a las opciones de grabación de la información:

    • ROM (Read Only Memory; Memorias de lectura solamente). Vienen programadas por el fabricante y no es posible variar la información contenida. Se emplean para almacenar códigos estándar como el utilizado para la generación de caracteres alfanuméricos.
    • PROM (Programmable ROM; Memorias programables de lectura solamente). Pueden ser programadas en una oportunidad por el usuario, pero resultan inservibles si se desea modificar la información almacenada. Una de sus aplicaciones es la sustitución de varios circuitos que generan una combinación de salida a partir de una determinada entrada.
    • EPROM (Erasable PROM; Memorias programables de lectura solamente borrables). Pueden ser programadas en reiteradas ocasiones, debido a que la información puede ser borrada mediante el empleo de luz ultravioleta. Generalmente se utilizan para almacenar el programa conocido como BIOS de la máquina, que es utilizado por el microprocesador para administrar y controlar los recursos de que dispone el sistema.
    • E2PROM (Electrically EPROM; Memorias programables de lectura solamente borrables eléctricamente). Tiene un funcionamiento semejante a las EPROM, pero se diferencia de éstas en que el borrado de la información almacenada se realiza aplicando un nivel de voltaje determinado al dispositivo.

    El otro tipo de memoria, las volátiles, denominadas RAM (Random Access Memory), a diferencia de las anteriores, permite al usuario variar su contenido. Este tipo de componente se emplea en los sistemas digitales para almacenar los programas que se están ejecutando y sus datos, ya que el acceso a la información contenida en ellas es cerca de un millón de veces más rápida que en un disco duro. Desde el punto de vista del usuario es este tipo de memoria la que limita las dimensiones del programa y la cantidad de datos que pueden procesarse.

    Finalmente, debe mencionarse otro tipo de dispositivo de gran impacto en el desarrollo de los sistemas de cómputo: los controladores. Estos componentes agrupan en un mismo dispositivo los elementos electrónicos necesarios para establecer los protocolos requeridos para transferencia de datos entre los elementos de entrada / salida (memorias RAM, disco duro, teclado, mouse, etc.) y el microprocesador, incrementando la velocidad de operación y fiabilidad del sistema.

    IV. Estructura de los sistemas de cómputo

    La organización interna de un sistema de cómputo digital puede variar en dependencia de la destinación o fabricante, no obstante lo cual existen regularidades que son aplicadas casi sin excepción.

    Sin embargo, su complejidad hace necesario recurrir a las analogías existentes entre éstos y otros sistemas más conocidos los cuales facilitan la comprensión del funcionamiento de las microcomputadoras.

    Para este propósito se seleccionó el ser humano, atendiendo a que ha sido utilizado exitosamente con fines similares en otros casos, entre los que puede señalarse los vehículos automotores, donde incluso condujo a la popularización de cambios en la denominación de órganos como el de corazón por «bomba» en franca alusión al dispositivo de este tipo que existe en los automóviles y tiene semejante función a la del corazón.

    Por tanto, el primer paso para alcanzar este objetivo es la división funcional del sistema analizado, el cual consta de dos bloques fundamentales: equipos periféricos que permiten el intercambio de información hombre / máquina y la Unidad Central de Procesamiento (UCP) que se encarga del control, administración de los recursos internos y ejecución de las acciones solicitadas por el usuario.

    Los equipos periféricos pueden asociarse con los sentidos humanos, ya que conforman un sistema de recolección de información (datos, solicitud de ejecución de acciones, etc.) como se ilustra a continuación: un sistema de multimedia (con micrófono incluido) emula la recepción de información a través del sentido de la audición y la comunicación oral a partir de la emisión de sonidos a través de las bocinas; las cámaras digitales de video y el escáner pueden considerarse como los «ojos» de la máquina pues permiten introducir información gráfica o de texto directamente al sistema; una impresora es equivalente al acto de escribir, en tanto el teclado y el mouse pueden asociarse con el sentido del tacto pues reciben información a partir «del contacto físico» con el medio.

    En la práctica, existe un elemento intermedio llamado BUS a través del cual se intercambia información entre la UCP y los dispositivos de control interno y los administradores de los sistemas periféricos, que son conjuntos de señales eléctricas (datos y comandos) que en cada caso particular tienen una o varias funciones específicas. En la analogía con el cuerpo humano, los buses (existen gran cantidad de ellos) que permiten la transferencia de información y energía dentro del sistema de cómputo pueden homologarse con las vías linfática y circulatoria, por donde circulan dos fluidos corporales imprescindibles para la vida (linfa y sangre) pero que no se mezclan, y cuando sucede es debido a una enfermedad que en la máquina se traduce en una falla, en tanto los buses que manejan los protocolos para el manejo e intercambio de información y comandos con los periféricos tienen su similar humano en los nervios y músculos del cuerpo humano.

    En cuanto a la información, una vez que llega a la UCP se desencadenan diversos procesos, cuya complejidad hace conveniente una nueva separación de actividades atendiendo a sus dos funciones fundamentales: administración y control de los recursos internos y ejecución de las acciones requeridas o solicitadas a través de la interacción hombre / máquina.

    La administración de los recursos internos se realiza por el microprocesador a partir de la estrategia establecida en un programa llamado BIOS, que se encuentra almacenado en la memoria semiconductora permanente de la máquina y cuya finalidad es resolver los conflictos (cuando la máquina se vuelve inoperante es debido a la ocurrencia de un conflicto no resuelto) sin participación del usuario.

    Por tanto, estas acciones resultan transparentes al usuario, que percibe su existencia a través de las «demoras» en la ejecución de acciones solicitadas, de manera análoga al sistema parasimpático de nuestro cuerpo que se encarga de las funciones vegetativas (digestión, respiración, circulación etc.) y del cual tenemos conciencia cuando alguna de estas funciones se afecta a causa de una enfermedad.

    En cuanto a la función de intercambio de información con el exterior y la ejecución de acciones solicitadas, se realiza de la forma siguiente:

    Sé «copia» en la memoria RAM el programa que contiene las acciones solicitadas, para incrementar la velocidad de ejecución.

    Ejecución por parte del microprocesador de la secuencia de acciones previstas en el programa «cargado». Durante este proceso se solicita la información requerida si procede y se emiten los reportes previstos al alcanzar determinados objetivos.

    En cuanto a la ejecución de los programas es conveniente señalar que en la actualidad se utiliza un recurso electrónico con manejo estadístico: la memoria caché. Esta memoria se manipula de forma diferenciada por el microprocesador y en ella se encuentran almacenadas las acciones que estadísticamente tienen mayor probabilidad de volver a ejecutarse, lo que contribuye a disminuir el tiempo de acceso a la información por parte del procesador. Continuando con la analogía de la computadora con el ser humano, la memoria cache es un enfoque semejante a la preparación de argumentos para defender una tesis previa a una discusión de la misma. En este caso cuando surgen «imprevistos», entonces es necesario «cargar» otros argumentos para enfrentarlos (nuevas acciones en el caso de la máquina) lo que provoca en ambos casos una demora mayor en la respuesta.

    Como se ha visto, las computadoras digitales basan su trabajo en señales eléctricas que transitan entre dos niveles de voltaje, a los cuales se les asocian dos estados lógicos (0: ausencia de voltaje; 1: presencia de un determinado nivel de voltaje).

    Sin embargo, este procedimiento para desarrollar aplicaciones tiene varias desventajas:

    La programación de sistemas voluminosos es engorrosa y dificulta la puesta a punto y detección de errores.

    Resulta difícil de analizar, incluso por quienes los elaboran cuando ha pasado un cierto período, cuando es necesario realizar alguna modificación para incorporar una nueva facilidad o corregir un error no detectado durante su prueba.

    Adicionalmente, es necesario una interfaz que administre los recursos de la máquina y armonice las peticiones del usuario al sistema, por lo cual en los sistemas de cómputo existe una plataforma para este propósito: el Sistema Operativo, el cual fundamenta su trabajo en el manejo y utilización de archivos (ficheros) y la ejecución de comandos.

    En la actualidad se ha desarrollado para las microcomputadoras un medio ambiente, WINDOWS, que pone a disposición del usuario los recursos de una manera nemotécnica sencilla: iconos (rectángulos que emulan teclas), que al ser seleccionados desencadenan la operación o comando asociado al mismo.

    En cuanto al otro elemento fundamental, los ficheros, éstos pueden clasificarse en dos grandes grupos:

    Ficheros ejecutables. Están constituidos por conjuntos ordenados de bits que contienen secuencias de operaciones que pueden ser interpretados directamente por el Sistema Operativo (código de máquina) y que el usuario NO puede modificar. Su función es permitir al usuario establecer y modificar los datos necesarios, así como seleccionar entre los procedimientos alternativos para resolver un problema o realizar directamente una función específica para la cual fue desarrollado. En esta categoría se incluyen los lenguajes de computación (FORTRAN, PASCAL, BASIC, C), procesadores de texto (Word Perfect, WORD), hojas de cálculo (LOTUS, EXCEL), sistemas para el manejo de bases de datos (DBASE, FOXPRO, ACCESS), archivos que conforman el Sistema Operativo, etc.

    Ficheros de datos. Son aquellos ficheros que contienen la información requerida por un programa para realizar determinadas operaciones o brindar un resultado. Estos archivos son creados por el usuario para almacenar información mediante programas de propósito general (bases de datos, hojas de cálculo, documentos de texto) o específicos (programas de aplicaciones) que sólo pueden ser modificados con el programa que los creó.

    Por su importancia merecen un tratamiento particular los archivos ejecutables correspondientes a los lenguajes de programación, los cuales permiten al usuario establecer una estrategia para la ejecución de operaciones y procesamiento de datos (un plan de trabajo para la máquina) a partir de la combinación de operaciones lógicas, aritméticas y ruptura de secuencias condicionalmente y cuyo resultado es un archivo ejecutable (NO MODIFICABLE) que con iguales condiciones de entrada conduce siempre al mismo resultado y que puede repetirse «tantas veces como se quiera». Para alcanzar este objetivo, cada lenguaje establece un conjunto de reglas particulares para utilizar letras, números y símbolos en la programación.

    En cuanto al desarrollo de programas, es necesario significar que al comienzo de la vida de una entidad se desarrollan programas que parecen ser definitivos e inalterables, pero poco a poco la realidad se hace sentir en forma de modificaciones y reformas que van socavando su estructura inicial. Esto conduce a que un programa incapaz o difícil de ser modificado, hace que caiga en desuso y se abandona al cabo de algún tiempo.

    Bajo este punto de vista comenzó poco a poco un marcado énfasis en las tareas de mantenimiento de programas, es decir, su adaptación a los cambios tales como: aumento de volumen en los datos y ficheros, cambios en la organización de los ficheros y los reportes de resultados finales o de operaciones intermedias, modificaciones en el procesamiento de datos, etc.

    Finalmente, es necesario significar que los archivos se denotan mediante un nombre (hasta ocho letras en el Sistema Operativo MS-DOS y prácticamente ilimitado en ambiente WINDOWS) que se escoge de forma que permita identificar fácilmente su contenido o destino y una extensión (tres letras máximo) que permite identificar la función o procedencia de un archivo y que constituye «un sello de familia». Así pueden señalarse diversas extensiones predeterminadas, algunas de las cuales se muestran en la siguiente tabla.

    Tabla 4. Ejemplos de extensiones predeterminadas

    extensión

    características

    DOC

    Documento Word.

    XLS

    Hojas de cálculo EXCEL.

    MDB

    Base de Datos de ACCESS.

    DBF

    Base de Datos de DBASE y FOXPRO.

    BMP

    Es el formato que se utiliza para mostrar imágenes en el WINDOWS y debe emplearse para este propósito.

    GIF

    Es un formato desarrollado para permitir la transferencia de imágenes de forma independiente del dispositivo donde fue obtenida y soporta 256 colores.

    Nótese, que estas extensiones predeterminadas NO deben utilizarse para denotar ficheros con otras funciones, pues confunden a otras personas y ocasionan errores de ejecución cuando se trata de trabajar con éstos empleando programas específicos que manipulan este tipo de información.

    V. Solución de problemas empleando sistemas de cómputo

    V.1 Aspectos generales

    Como se ha expresado, los sistemas de cómputo se utilizan ampliamente hoy día en la solución de los más diversos problemas de la ciencia, la ingeniería, la economía, etc., atendiendo a su versatilidad, facilidades de manipulación, posibilidad de estas máquinas para trabajar a muy alta velocidad, almacenar grandes volúmenes de información y realizar con éstos largas y complejas operaciones para «brindar soluciones exactas».

    Sin embargo, es importante resaltar que la computadora «no resuelve el problema planteado» sino que ayuda a explorar las diferentes alternativas que el problema en cuestión plantea al especialista, es decir, no podemos pensar en la computadora brindando respuesta a preguntas como las siguientes: ¿Cómo construiré este nuevo equipo?, ¿Cómo trabajaría el sistema bajo una serie de condiciones si se construye de esta forma?, ya que existen diversas maneras de construir un equipo, hay varias condiciones de operación a tener en cuenta y pueden obtenerse resultados diferentes en dependencia de la valoración y de las facilidades con que se pretenda dotar al equipo, algunas de las cuales constituyen un compromiso para el diseñador.

    Por tanto, la computadora no puede enumerar las consideraciones de diseño, especificar las condiciones de operación que deben investigarse, determinar cuáles son los resultados o plantear nuevas alternativas cuando existe un compromiso entre ellas. La computadora puede ser útil para predecir las consecuencias de nuestras decisiones en este aspecto del problema, por lo cual antes de acometer el desarrollo de un programa o evaluar la concurrencia de proveedores deben evaluarse los aspectos siguientes:

    ¿Qué necesito?. La respuesta debe incluir tipos y volumen de datos que deben procesarse y almacenarse, qué se propone medir y qué tipos de resultados se esperan y en qué forma resultan adecuados para su interpretación, gráficos, tablas, etc. Es importante señalar que esta evaluación no sólo debe responder a las necesidades actuales, sino contemplar la proyección futura.

    ¿Cómo se manipulan los datos?. El formato utilizado para el almacenamiento de los datos tiene especial importancia pues el empleo de variantes propias de un fabricante limita o imposibilita según sea el caso, el intercambio de información con otras aplicaciones existentes. Otro aspecto de interés es la posibilidad de conectar al sistema, a través de manipuladores estándar como el puerto serie y PSB diversos periféricos.

    ¿Cuán fácil de configurar y utilizar es el programa de análisis?. El proveedor debe suministrar un programa demostrativo que permita evaluar la complejidad de configurar y utilizar el programa, antes de su adquisición. Este demo debe disponer de datos, sino reales, al menos lógicos que permitan evaluar en primera instancia sus resultados.

    ¿Cómo se puede probar el programa?. Los programas demostrativos no son muy útiles para este propósito, pues tienen el énfasis en las facilidades usuario y generalmente no tienen opciones que permitan probar la fortaleza de operación. Es importante determinar como el programa maneja los problemas de overflow, divisiones entre cero y otras condiciones extremas, así como el manejo simultáneo de gráficos de distintos tipos, importación de datos y algoritmos de procesamiento.

    ¿Qué características tiene la documentación y el soporte técnico?. La documentación debe disponer de un Manual de Usuario y de una detallada descripción de las opciones del menú. En cuanto al soporte técnico, éste debe estar garantizado aún cuando se sustituye por una nueva versión.

    ¿Puede programarse el sistema?. Un aspecto que debe evaluarse es la disponibilidad de facilidades que permitan conformar macro instrucciones para las tareas periódicas.

    ¿Cuánto necesito conocer acerca del análisis de datos?. En cualquier caso, deben estar definido los elementos de procesamiento que se requieren, en particular los algoritmos específicos de la actividad que generalmente no se encuentran incorporados de oficio por los proveedores en las aplicaciones, tales como tales como Transformada de Fourier o Laplace, solución de Sistemas de Ecuaciones Diferenciales, etc.

    ¿Cuán flexibles son las salidas gráficas?. La presentación gráfica de resultados es una manera ventajosa y por tanto debe brindar las opciones que resulten sencillas para su análisis.

    ¿Qué garantía de devolución de pagos por rechazo ofrece el proveedor?. Otro factor que reviste importancia cuando se va a determinar la adquisición de un programa es la oferta de alternativas de compensación o reembolso que establece el proveedor en los casos de no-aceptación. Otra variante que generalmente se presenta combinada con la anterior es el tiempo de prueba de aceptación por parte del usuario.

    ¿Qué beneficios obtengo por el empleo del programa?. Habitualmente se analiza el costo de la inversión en términos de los resultados esperados, pero en el caso de las aplicaciones informáticas existen dos aspectos adicionales que deben considerarse: seguridad y costo de la adquisición de las versiones mejoradas y si existe la seguridad de que éstas se realizarán, así como el costo del total que representan las opciones que existen en el programa y que no son útiles para la aplicación.

    Antes de concluir este aspecto, debe señalarse que como parte de la etapa de concepción inicial de cualquier programa, es necesario establecer las vías para garantizar ka protección ante los errores en que puede incurrir el operador del programa. LOS PROGRAMAS SON PARA SER UTILIZADOS POR SERES HUMANOS QUE TIENEN PROBLEMAS Y SE EQUIVOCAN.

    El primer paso en el blindaje a los errores es determinar cuáles son los posibles y cuáles son los que se van a proteger, para lo cual es conveniente tomar en consideración los siguientes factores:

    • Errores que interrumpen la ejecución del programa, como son las divisiones por cero, el cálculo de logaritmos de números negativos, raíces cuadradas de números negativos, etc. Este tipo de error puede ser detectado, brindando opciones de recuperación al usuario.
    • Los que conducen a resultados erróneos, que son los que se cometen por falta de atención o insuficiente conocimiento de los datos requeridos por el programa. El blindaje a estos errores está casi exclusivamente en el sentido común del usuario al evaluar los resultados y en la revisión de los datos de partida que nunca está de más.
    • Complejidad que reviste el blindaje. Una detección de errores puede hacerse tan compleja como se desee, pero no debe convertirse en el centro del programa. Cuando un programa requiere de muchas protecciones generalmente es que la interacción con el usuario no es la más conveniente. En este caso debe evaluarse otro método.
    • Errores que conllevan a la pérdida de información, que tienen que ser implementados siempre.

    Entonces, ¿para qué sirve la microcomputadora?. Para responder a esto es necesario aclarar que «Resolver un problema» con una computadora es un proceso mucho más complejo que el trabajo que ejecuta la máquina y que en líneas generales requiere de los pasos siguientes:

    • Primer paso: Identificación del problema y definición de objetivos. Consiste en seleccionar un método general para la solución, decidir qué combinaciones de objetivos cumplir y especificar las condiciones que debe satisfacer. Igualmente es imprescindible definir concretamente cuál resultado se considera solución del problema. En este paso se requiere de un conocimiento completo del problema y puede resultar de poca ayuda la computadora.
    • Segundo paso: Modelación del problema. Generalmente existen varias maneras de modelar un problema entre las cuales debe escogerse una o desarrollar una nueva cuando ninguna de las existentes satisface los objetivos planteados.
    • Tercer paso: Análisis numérico. La formulación matemática del problema no es directamente traducible a la computadora, ya que ésta sólo puede ejecutar operaciones aritméticas y ejecutar decisiones simples. Esto implica que las integrales, ecuaciones de todo tipo deben ser expresadas en forma de operaciones simples y es necesario evaluar los errores inherentes a los datos y los introducidos por la máquina con vistas a evitar que sean inútiles los resultados.
    • Cuarto paso: Programación de la computadora. Los procedimientos numéricos deben establecerse como una serie de operaciones bien definidas, que generalmente se realizan en dos pasos: concepción del programa en un diagrama de bloques funcionales, es decir, se establece la estrategia de solución que permite expresar de forma más clara lo que se quiere hacer, pero que no puede ser entendido por la computadora. Una vez concluido este trabajo, se traduce a un lenguaje de computación que si puede ser entendido por la máquina que se conoce como programa en el cual se define la secuencia de operaciones y las decisiones condicionadas por el valor que tengan en ese momento determinadas magnitudes del problema objeto de solución.
    • Quinto paso: Verificación del programa. Después de traducir el problema a un programa debe verificarse con datos cuyos resultados sean conocidos o permitan fácilmente determinar su veracidad y de esta forma evaluar si el programa satisface los objetivos y exigencias previstas.
    • Sexto paso: Utilización del programa. La utilización del programa es el momento donde se realizan combinaciones de datos «coherentes» para obtener resultados que permitan tomar decisiones certeras al enfrentar el problema que resuelve el programa.

    Como se aprecia, las computadoras digitales están restringidas en sus operaciones a aquello que el hombre es capaz de «decirle», por lo cual su principal ventaja radica en la realización de estas operaciones a muy alta velocidad y a procesar grandes volúmenes de información «sin sufrir cansancio ni cometer errores».

    V.2 Soluciones numéricas a problemas

    Las respuestas numéricas a problemas es una de las aplicaciones de gran difusión e importancia por la cual merecen un tratamiento independiente.

    En estas aplicaciones el aspecto de mayor importancia radica en que los datos generalmente contienen errores y que se originan en las cuatro áreas fundamentales siguientes y que deben ser considerados al interpretar los resultados obtenidos:

    Errores por parte del operador durante el proceso de incorporación de los datos al sistema. Este tipo de error no puede ser ignorado. Si existen errores en los datos, las soluciones o resultados que proporciona el sistema serán inútiles en su totalidad o de manera parcial, en dependencia de la magnitud del error. Esta posibilidad hace que los resultados obtenidos deben ser analizados críticamente y no confiar ciegamente en los mismos. La revisión de los datos utilizados es una forma de minimizar la presencia de este tipo de error.

    Inherentes a la formulación del problema. El procedimiento para reducir este tipo de error es mejorar el modelo utilizado en la formulación del problema hasta que el error a que conduce permita trabajar con los datos de que se dispone y obtener resultados válidos. Generalmente la precisión del modelo está estrechamente relacionada con el conocimiento existente del problema cuya solución se acomete. Es importante señalar que este tipo de error condiciona la validez de los resultados sin importar cuan exactos sean los cálculos numéricos realizados por la máquina.

    Las relacionadas con la incertidumbre en la determinación de los datos. Este problema es causado por el error en los instrumentos de medición utilizados, y su reducción se logra empleando instrumentos de una calidad que esté en correspondencia con la precisión deseada.

    Aquellas en que se incurre durante la determinación numérica de la solución y que se encuentran asociados a la representación necesariamente aproximada en la computadora mediante un número finito de dígitos de los números reales tales como el resultado de la división de 2 entre 3, los números e y p , etc. y pueden ser de dos tipos:

    Errores por truncamiento. Son los errores que provienen del cálculo numérico de una expresión cuando se desprecian a partir de un término los restantes dígitos.

    Errores por redondeo. Es el conocido por el hecho de que los cálculos aritméticos casi nunca pueden llevarse a cabo con una completa exactitud, ya que muchos números que tienen una representación decimal infinita deben ser expresados de forma finita.

    Desde el punto de vista computacional, para reducir estos errores, se emplean entre otras las siguientes recomendaciones:

    Cuando se van a sumar o restar números, trabajar siempre con los números más pequeños PRIMERO siempre que sea posible, evitando la sustracción de dos números aproximadamente iguales.

    Una expresión a(b-c) puede escribirse como ab-ac y (a-b)/c como a/c-b/c. Si hay números muy cercanos entre paréntesis ejecutar la resta antes de la multiplicación y la división.

    Utilizar números de doble precisión (utilizan mayor cantidad de bytes para representar los números reales). Tiene el inconveniente de que requiere de más capacidad de memoria RAM en el sistema.

    Para evaluar el impacto en los resultados del acarreo de errores en una expresión o cálculos sucesivos, se emplea el procedimiento de la propagación de errores:

    • Error absoluto. Es la diferencia existente entre el valor "verdadero" de una magnitud y el obtenido de la práctica, que matemáticamente se representa mediante la expresión.

    donde:

    x : valor medido.

    xr : valor verdadero.

    d x : error absoluto.

    • Error relativo. Es el cociente obtenido de la división del error absoluto y el valor verdadero, dado mediante la expresión

    A partir de la definición puede calcularse la propagación del error en las operaciones aritméticas que se muestran en la tabla 5.

    Tabla 5. Propagación del error en las operaciones fundamentales

    Operación:

    Magnitudes:

    Error:

    suma / resta

    x ± y

    ± (d x + d y)

    multiplicación

    xy

    yd x + xd y

    división

    x/y

    » ()

    V.3 Elementos de programación secuencial

    V.3.1 Recursos generales disponibles

    El desarrollo de cualquier lenguaje de programación consta de varias etapas que abarcan desde la definición de las características del lenguaje hasta la implementación de una interfase que genera el código de máquina a partir del programa elaborado por el programador.

    Existen tres tipos diferentes de interfaces destinadas a este fin que son:

    Ensambladores, que permiten programar directamente en lenguaje de máquina y generan un programa en código de máquina.

    Intérpretes, que permiten desarrollar un programa, creando un código intermedio. La ventaja de estas interfaces es que hacen al intérprete independiente de la máquina, pero no generan directamente un código ejecutable, sino que debe ser pasado por un traductor para su ejecución.

    Compiladores, generan directamente un programa en código de máquina a partir de las instrucciones programadas.

    No obstante estas diferencias, en todos los casos para la elaboración de programas existen el conjunto de regularidades siguientes:

    Disponen de un conjunto de caracteres y símbolos que en cada caso tienen una interpretación diferente, algunos de los más comunes se muestran en la tabla 6.

    Tabla 6. Símbolos permitidos

    Símbolo

    Representación

    Símbolo

    Representación

    letras

    A..Z, a..z

    agrupación

    ( ) [ ]

    dígitos

    0..9

     

     

    Otro aspecto de importancia para la programación empleando cualquiera de las interfaces antes descritos, es el significado especial de algunas palabras (palabras reservadas), las cuales NO PUEDEN SER UTILIZADAS PARA OTROS FINES QUE LOS ASIGNADOS POR EL FABRICANTE y que suelen denominarse palabras reservadas del lenguaje, un ejemplo de las cuales se relacionan en la tabla 7.

    Tabla 7. Ejemplos de palabras reservadas y su significado.

    Palabra reservada:

    Significado:

    and

    Expresa la operación lógica «Y»

    div

    Indica la división entera de dos números

    goto

    Establece un salto en la secuencia de ejecución del programa

    V.3.2 Estructuras para la evaluación de alternativas

    V.3.2.1 IF … THEN … ELSE

    Esta estructura está concebida para permitir seleccionar entre dos conjuntos de instrucciones cuál de ellas ejecutar en dependencia de una condición lógica preestablecida, como se muestra en los siguientes ejemplos:

    IF * profesor escribe THEN ** los alumnos toman notas

    ELSE ** los alumnos atienden

    IF * pizarra llena THEN ** borrar parcialmente

    ELSE ** continuar escribiendo.

    IF * terminó la clase THEN ** borrar la pizarra.

    * : condición

    ** : secuencia de instrucciones.

    Gráficamente, esta estructura puede ser representada como se ilustra en la figura 1:

    V.3.2.2 CASE … OF

    Es una generalización de la anterior, en el sentido de que permite escoger entre un conjunto "infinito" de caminos en dependencia de una condición que devuelve una constante, a diferencia de la estructura IF…THEN…ELSE que utiliza una sola condición lógica, como se aprecia en los siguientes ejemplos:

    CASE *alumno OF

    ** presente *** salida1

    ** ausente *** salida2

    ** llegó tarde *** salida3

    ** tiene trabajo fuera *** salida4

    CASE * color OF

    ** amarillo *** salida1

    ** morado *** salida2

    ** rojo *** salida3

    ELSE ***salida4

    * condición

    ** constante que devuelve el selector

    *** secuencia de instrucciones que se ejecuta en cada caso

    En la figura 2 se muestra esquemáticamente el modo de operación de esta estructura.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior

    V.3.3 Estructuras para la ejecución reiterada de acciones

    Son diversos los ejemplos de problemas en los cuales se requiere de repetir una cierta cantidad de veces determinadas acciones, para lo cual en los lenguajes de programación disponen básicamente de las tres estructuras que se detallan a continuación.

    V.3.3.1 FOR … TO (DOWNTO)… DO

    Esta estructura se utiliza cuando un conjunto de instrucciones debe repetirse un cierto número de veces que se establece durante la ejecución del programa. El control del número de ejecuciones puede efectuarse en forma ascendente (TO) o descendente (DOWNTO) de uno en uno, como se ilustra en los ejemplos siguientes:

    FOR * primer alumno TO ** último alumno DO

    *** mostrar las notas de alumnos, una a una con pausa para efectuar su lectura.

    FOR * primer alumno TO ** último alumno DO

    *** sumar las notas de alumnos para calcular el promedio de las calificaciones.

    * condición de comienzo

    ** condición de terminación

    *** secuencia de instrucciones

    Desde el punto de vista gráfico esta estructura puede representarse mediante la figura 3.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior

    V.3.3.2 WHILE…DO.

    Esta sentencia es otra forma de repetir la ejecución de un conjunto de instrucciones un número de veces, pero que a diferencia del FOR…TO(DOWNTO)…DO se ejecuta mientras se cumpla una condición preestablecida la cual tiene que cumplirse en alguna ocasión, ya que en caso contrario el programa cae en un lazo infinito. La modificación de la condición se realiza como parte de los resultados obtenidos en el conjunto de instrucciones que se ejecutan repetitivamente, como en los ejemplos que se muestran a continuación.

    WHILE *no sea hora de receso DO ** desarrollo de la clase

    WHILE * receso DO **conversar con los compañeros

    * condición

    ** conjunto de instrucciones

    Desde el punto de vista gráfico esta estructura puede representarse mediante la figura 4.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior

    ES IMPORTANTE SEÑALAR QUE ESTA ESTRUCTURA PREGUNTA SI SE CUMPLE O NO LA CONDICION ANTES DE EJECUTAR POR PRIMERA VEZ EL CONJUNTO DE INSTRUCCIONES REPETITIVAS, por tanto, es posible que la secuencia de instrucciones que abarca nunca se ejecute.

    V.3.3.3. REPEAT…UNTIL

    Al igual que las dos últimas estructuras descritas, permite realizar ciclos cuya cantidad de veces se determina no por un número sino por una condición, pero a diferencia del WHILE…DO esta estructura ejecuta el conjunto de instrucciones una vez al menos y después pregunta por la condición. A modo de ejemplos pueden señalarse los siguientes:

    REPEAT

    * conversar con los compañeros

    UNTIL ** termine el receso

    REPEAT

    * contar el número de bicicletas

    UNTIL hora prefijada

    * condición

    ** conjunto de instrucciones

    Desde el punto de vista gráfico esta estructura puede representarse mediante la figura 5.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior

    V.3.4 Operadores

    Los lenguajes de programación disponen de operadores, ya que durante la programación en cualquier tipo de lenguaje es necesario realizar operaciones de tipo aritméticas y lógicas y en dependencia del lenguaje la representación de estos operadores varía. De forma general puede decirse que existen los tres tipos de operadores siguientes.

    V.3.4.1 Aritméticos

    Una de las principales aplicaciones de los lenguajes de programación es la solución de problemas numéricos, los cuales llevan implícitamente la realización de operaciones aritméticas las cuales requieren de la definición de operadores de este tipo, tal es el caso de los mostrados en la tabla 8.

    Tabla 8. Operadores aritméticos

    Operador

    Función

    Ejemplo

    +

    suma

    a + b

    resta

    a – b

    *

    multiplicación

    a * b

    /

    división real

    a / b

    div

    división de números enteros

    a div b

    mod

    resto de una división entera

    a mod b

    V.3.4.2 De relación

    Otro tipo de operador de amplia utilización durante la elaboración de un programa son los operadores de relación, que nos permiten comparar dos o más magnitudes, una variante de los cuales se muestran en la tabla 9.

    Tabla 9. Operadores de relación

    Para ver la tabla seleccione la opción "Descargar" del menú superior

    V.4.3.3 Lógicos

    Son los que permiten durante la programación escoger la realización de diversos conjuntos de sentencias o instrucciones en dependencia del resultado de determinadas proposiciones lógicas, que se basan en la Lógica Preposicional, la cual se hace corresponder a cada átomo un elemento del conjunto {V (verdadero),F (falso)}de acuerdo a las siguientes funciones lógicas, que se recogen en la Tabla 10.

    Tabla 10. Operadores lógicos fundamentales.

    Para ver la tabla seleccione la opción "Descargar" del menú superior

    * niega el resultado que existe al ser aplicado el operador: si el valor es falso devuelve, verdadero y viceversa.

    ** devuelve verdadero cuando alguna magnitud lógica es verdadera.

    *** devuelve verdadero cuando todas las magnitudes lógicas involucradas en la operación son verdaderas.

    **** devuelve verdadero cuando una cualquiera de las magnitudes lógicas difiere del valor de las restantes operaciones y falso en alguna otra condición.

    En la tabla 11 se muestran ejemplos de operadores lógicos

    Tabla 11. Operadores lógicos

    Operador

    Función

    Ejemplo

    NO

    negación lógica

    NO A

    O

    "O" lógico

    A O B

    Y

    "Y" lógico

    A Y B

    V.3.5 Otros recursos

    En la práctica, para llevar a cabo la programación se requiere de otras facilidades, entre las que pueden enumerarse las siguientes.

    Constantes. Son magnitudes de tipo numérico (fundamentalmente) que permiten manejar una magnitud no con su valor sino con una representación simbólica que facilita la comprensión del programa. Por ejemplo puede definirse: pi=3.1415…; e=2.71…, etc.

    Tipos. Permite definir tipos de estructuras de datos a partir de los estándares del lenguaje, los cuales facilitan el manejo, almacenamiento y acceso a la información. Por ejemplo puede definirse que: la magnitud color, a la que pueda exhibir los valores, rojo, verde, azul, magenta y cian; la magnitud animal puede adoptar los valores gato, león, pantera, etc.

    Variables. Constituyen las magnitudes dinámicas de un programa y son las que reciben valores durante la ejecución de éste, en dependencia de los cuales se toman decisiones o se realizan nuevas operaciones. Por ejemplo, puede definirse suma para almacenar la suma de diversos números.

    Funciones. Es una facilidad para unificar un conjunto de instrucciones que se ejecuta en diferentes partes del programa las cuales a partir de un grupo de datos realiza un conjunto de operaciones cuyo fin es obtener un resultado que debe ser asignado a UNA VARIABLE para su posterior uso en el programa.

    V.3.6 Lenguajes de programación de alto nivel

    Con el desarrollo de la computación han surgido diversos lenguajes de programación los cuales responden en algunos casos a necesidades específicas de determinadas aplicaciones en tanto otros se corresponden con nuevas técnicas de programación. Veamos algunos ejemplos:

    • Desarrollo de un nuevo concepto o una nueva área de aplicación que demande su propio lenguaje: cálculo numérico, FORTRAN y aplicaciones aeroespaciales, FORTH.
    • A partir de las experiencias con un lenguaje y el conocimiento de sus deficiencias como el COBOL a partir del FLOWMATIC.
    • Es más fácil introducir nuevas capacidades y cambiar de estilo con un nuevo lenguaje que extender o modificar uno existente.

    Definición de lenguaje de programación. Se acostumbra denominar «lenguajes de programación o lenguajes de alto nivel» independiente de la máquina, a los lenguajes que disponen de un conjunto de caracteres (finito) y reglas para combinar a éstos cuyas características fundamentales son:

    Se pueden escribir programas en él, lo que lleva implícito que potencialmente se pueda instrumentar un programa (compilador, traductor, intérprete) que haga factible la ejecución de estos programas en una computadora.

    No es necesario el conocimiento del código de máquina para programar en este lenguaje.

    Existe facilidad para pasar de un programa escrito en un lenguaje a otro lenguaje.

    Existe una «explosión» de instrucciones, es decir, a una instrucción en el lenguaje le corresponden en general varias instrucciones de máquina.

    Su notación es más cercana al problema original en que se quiere aplicar, en relación con el código de máquina o ensamblador.

    Se incorporan facilidades de diferentes lenguajes combinados en uno más simple.

    Es más fácil introducir nuevas capacidades y cambiar el estilo con un nuevo lenguaje que extender o modificar uno existente.

    Hay preferencias personales y prejuicios con los lenguajes que existen en cuanto a que puedan servir para el propósito, por lo cual se diseña una nuevo.

    En la práctica se han desarrollado diversos lenguaje de alto nivel como son los siguientes:

    FORTRAN (FORmula TRANslator). Diseñado para el cálculo numérico científico, es el primer lenguaje de alto nivel, que abre las puertas de la computación a muchos científicos e ingenieros debido a:

    Es el primer lenguaje de programación que aprende mucha gente y eso crea hábitos.

    Cualquier configuración de cómputo tiene un compilador de FORTRAN.

    Permite obtener un código de máquina muy eficiente.

    La existencia de una versión estándar ha permitido un amplio uso de las bibliotecas.

    COBOL (COmmon Business Oriented Languaje). Está destinado al procesamiento de datos, fundamentalmente económicos y es ampliamente utilizado. Existe también una versión estándar y presenta la posibilidad de segmentación de programas.

    ALGOL (ALGOrithmic Languaje). Se desarrollaron dos versiones ALGOL-60 y ALGOL-68 y constituye uno de los primeros intentos de disponer de un lenguaje de propósito universal.

    LISP (LISt Processing). Desarrollado por John Mac Carthy y el grupo de Inteligencia Artificial del MIT a finales de los años 50 y principios de los 60, que ha sido mal llamado lenguaje para el procesamiento de lista, ya que su objetivo no es el de procesar listas sino que la forma de representar los datos e instrucciones y de procesar éstos es a través de listas. Es el primer lenguaje que da una formalización a su semántica.

    PASCAL. El nombre de este lenguaje rinde homenaje a uno de los fundadores de la computación, el físico y matemático francés Blaise Pascal (1623-62), y su característica fundamental es disponer de potentes estructuras.

    En la práctica las causas de la popularidad de un lenguaje están generalmente asociadas a que el lenguaje es conveniente para una clase significativa de problemas, existen buenos compiladores desarrollados para ese lenguaje, el "snob" de algunos de utilizar un nuevo lenguaje, la importancia de nuevos conceptos introducidos con el lenguaje y el prestigio personal de quienes participan en el desarrollo del lenguaje.

    Por tanto, los criterios para seleccionar un lenguaje deben ser lo más objetivos posibles ya que en general todos los lenguajes tienen sus posibilidades y sus insuficiencias y pueden emplearse muchos criterios para seleccionar un lenguaje de programación para una aplicación determinada:

    Claridad, sencillez y consistencia de los aspectos del lenguaje.

    Claridad en su estructura (facilidad para comprender el programa y modificarlo).

    naturalidad de las instrucciones (con relación al tipo de tareas en que se desea utilizar).

    facilidades de extensión.

    aseguramiento externo. Estar en un Sistema Operativo y régimen de trabajo, tener la posibilidad de trabajar interactivamente o con ficheros, tener una buena documentación y un buen editor. Estos elementos pueden convertir a un lenguaje débil en poderoso.

    Efectividad en: compilación, que incluye velocidad de compilación, tamaño del compilador, etc.; en la ejecución del programa, que evalúa la velocidad y tamaño del programa ejecutable y en el uso de bibliotecas.

    conocer una amplia gama de lenguajes para poder escoger adecuadamente.

    No obstante, debe tenerse en cuenta el siguiente principio: «Con un lenguaje poderoso se pueden hacer muy malos programas».

    V.3.7 Elementos de programación estructurada.

    A partir de la década del 70 cobró especial importancia alcanzar incrementos en la productividad de la programación, debido a las reducciones en costo de este tipo de instalación y el surgimiento y desarrollo explosivo de las computadoras personales.

    En primer término debe señalarse que las primeras versiones de los programas inicialmente parecen ser definitivas e inalterables, pero poco a poco la realidad se hace sentir en forma de modificaciones y reformas (en muchos casos verdaderos «parches») que van socavando la estructura inicial de los programas.

    El iniciador de la línea de investigación de programación estructurada fué el profesor Edeser W. Dijkstra de la Universidad de Eindhoven, existiendo en la actualidad otros métodos como el de Bertini Jackson y las Leyes de Construcción de Programas de Jean Dominique Warnier.

    Si un programa brinda pocas facilidades para sufrir modificaciones, entonces su poca flexibilidad hace que caiga en desuso al cabo de poco tiempo. Bajo este punto de vista se acentúa cada vez más la importancia del mantenimiento de un programa, es decir, su adaptación continua a los cambios tales como: aumento de la cantidad y extensión de los datos, cambios en la organización de los ficheros; pasar los ficheros a bases de datos; cambios en los formatos de los reportes de resultados y cambios en el equipamiento.

    Las modificaciones hay que esperarlas y, sino desearlas por o menos ser capaz de vivir con ellas. CON EL PASO DEL TIEMPO PUEDE RESULTAR NECESARIO TODO EL PERSONAL PARA EL MANTENIMIENTO DE PROGRAMAS LO CUAL CREA SIN DUDAS UNA SITUACION LIMITE.

    En este sentido G. Winnberg planteó que es importante leer programas, aunque existen otros tipos de lecturas más amenas, se puede aprender mucho de esta lectura.

    Como consecuencia de todo lo antes expresado un programa no debe escribirse en la creencia de que sólo lo va leer el compilador, sino también una persona (incluso uno mismo), ya sea con el fin altruista de aprender, o con el más preciso de modificar o adaptar el programa a una nueva necesidad, por tanto evite las sentencias complejas.

    Para el mantenimiento de un programa resulta esencial que éste se pueda leer y comprender con facilidad, con el fin de que sea fácil introducir cambios, sin tener que comenzar nuevamente una puesta a punto de igual o mayor importancia que la realizada al programa original.

    Con el inicio de la década del 70 el campo de la programación ha sido objeto de constantes estudios para mejorar los resultados de la programación modular que condujeron a la Programación Estructurada cuyo iniciador fué el profesor Edeser W. Dijkstra de la Universidad de Eindhoven.

    De la Programación Estructurada es difícil dar una definición exacta, ya que no existe una universalmente aceptada, no obstante lo cual si hay acuerdo en que la programación estructurada es todo diseño de programa que cumpla con los aspectos siguientes:

    • Estructuras básicas:
    • Secuencias. Conjunto ordenado de instrucciones que se repiten un mismo número de veces en el mismo lugar del programa. Cada secuencia termina en una bifurcación o va seguida de un enlace.
    • Alternativas. Conjunto ordenado de instrucciones que se ejecuta en dependencia de que se cumpla o no determinada condición. Cada alternativa puede tener un solo camino en dependencia del valor que tomó la condición, el resto de los caminos quedan excluidos.
    • Repetitivas. Conjunto ordenado de instrucciones que se repiten mientras o hasta que se cumpla determinada condición.

    Recursos abstractos. Es la descomposición en niveles de un problema ajeno a la computadora y sus instrucciones. Esta descomposición en niveles debe hacerse conforme a esquemas suficientemente simples y bien comprendida.

    Razonamiento deductivo de arriba hacia abajo. Es una marcha analítica reflejada en niveles o pasos consecutivos que poseen sus propios recursos abstractos y que permiten resolver el problema por completo.

    En la práctica son de utilidad las siguientes recomendaciones: utilizar nombre con significado claro, estándar; emplear paréntesis para evitar ambigüedades; evitar los trucos con el lenguaje; buscar la eficiencia donde sea necesaria; en los sistemas complejos los algoritmos más simples son los mejores; comentar para responder a las preguntas de los lectores, y si es necesario el significado de TODAS LAS VARIABLES; no utilizar una variable para más de un propósito; el empleo del salto incondicional no está prohibido, lo que no debe utilizarse para sustituir el empleo de las estructuras del lenguaje; los ficheros lógicos se diseñan siguiendo una organización jerárquica que permite ir del conjunto al elemento, de lo general a lo particular.

    El PASCAL surge como una herramienta para la enseñanza de prácticas de "buena programación", es un lenguaje de propósito general, estructurado de forma clara y sencilla. La primera versión del PASCAL aparece en 1968 desarrollada por Niklaus Wirth, profesor del Instituto Tecnológico de Zurich, Suiza. Sus objetivos eran obtener una herramienta que mantuviera un pequeño número de conceptos fundamentales de la programación útiles para enseñar la programación como una disciplina lógica y eficiente.

    Es realmente numerosa la cantidad de implementaciones del PASCAL que se reportan, por lo cual mencionaremos sólo algunas:

    PASCAL/Z, creado por la Ithaca Intersystem.

    PASCAL/M, creado por la sorcim.

    PASCAL 6000, implementado para utilizarse en el sistema operativo CDC 6000.

    PASCAL 80, para el sistema TRS-80 modelos del I al III.

    MP/PASCAL de la "Data General" para su Sistema MICRONOVA.

    NBS PASCAL, para la mini computadoras PDP-11.

    ATARI PASCAL. para ATARI 800.

    RSI y Mototrola PASCAL, para procesadores 68000.

    Cllor PASCAL de la "Dinisot".

    UCSD PASCAL. Este sistema en sus inicios fué diseñado para correr en mini micromputadoras, suministrado por la Softech Microsystem Inc. y comprende un sistema Operativo completo que puede correr sobre una variedad de procesadores e incluye un manipulador de ficheros, un editor orientado a caracteres, un compilador de una pasada que genera código P, un macro ensamblador condicional, un enlazador y una biblioteca de utilitarios.

    PASCAL MT+. Este sistema fué desarrollado por la Digital Research, diseñado tanto para las aplicaciones de procesamiento de datos como para control en tiempo real. Este sistema incluye un compilador, un enlazador, un macro ensamblador, un monitor de puesta apunto y una biblioteca.

    TURBO PASCAL, desarrollada por la Borland International.

    Borland Delphy, es la versión de programación en Pascal en Objeto.

    V.3.8 Elementos de programación orientada a objetos

    Es una forma de programación, en la cual el desarrollo del programa se realiza a partir del trabajo de estructuras llamadas objetos, las cuales están disponibles en el lenguaje de programación.

    Esta forma de trabajo se fundamenta en las ventajas de que una vez creado el objeto, este puede ser utilizado en reiteradas ocasiones con lo cual se gana tiempo y estandarización en los programas, lo cual se traduce en incremento en la productividad..

    VI. El ambiente WINDOWS (*)

    VII. Inteligencia Artificial (*)

    VII.1 Aspectos generales

    VII.2 Formas de Representación del conocimiento

    VII.2.1 Representación del conocimiento por vías tradicionales

    VII.2.2 Representación del conocimiento por vías no tradicionales

    VII.2.3 Pasos en la construcción de Sistemas de Aplicación

    VII.2 Lógica y Programación Lógica

    VII.2.2 Lógica de predicado

    VII.4.3 Sistemas Expertos

    VII.3.2 Estructura interna

    VII.3.3 Características del desarrollo de SE

    VII.3.4 Clasificación de los Sistemas Expertos

    VII.4 Redes Neuronales

    VIII. Redes de computadoras (*)

    VIII.1 Aspectos generales

    VIII.2 Razones para utilizar una red local

    VIII.3 Topología de la red

    VIII.4 Internet

    IX. Seguridad Informática (*)

    X. Bibliografía (*)

    Anexos (*)

    Anexo A. Términos y definiciones.

    Anexo B. Caracteres ASCII

    (*)Para ver el texto completo seleccione la opción "Descargar" del menú superior

     

     

    Autor:

    Lic. Jesús de la Caridad Mesa Oramas