EI Unidad43
EI Unidad43
EI Unidad43
Facultad de Ingeniería
Para comenzar a estudiar esta unidad es importante tener en claro el concepto de algoritmo. Un
algoritmo es un conjunto de instrucciones o reglas bien definidas, ordenadas y finitas que permite
llevar a cabo una actividad mediante pasos sucesivos que no generen dudas a quien deba hacer
dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un
estado final y se obtiene una solución.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos
ejemplos son:
los manuales de usuario, que muestran algoritmos para usar un aparato, o
las instrucciones que recibe un trabajador por parte de su patrón.
Algunos ejemplos en matemática son el algoritmo de multiplicación, para calcular el
producto, el algoritmo de la división para calcular el cociente de dos números
Los algoritmos pueden ser expresados de muchas maneras, incluyendo el lenguaje natural,
pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. El pseudocódigo y
diagramas de flujo son formas más estructuradas para representar algoritmos; y además, se
mantienen independientes de un lenguaje de programación específico.
La descripción de un algoritmo usualmente se hace en tres niveles:
1. Descripción de alto nivel. Se establece el problema, se desglosa para poder entenderse
en detalle y se explica el algoritmo de manera verbal, posiblemente con diagramas de flujo.
2. Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que
encuentran la solución.
3. Implementación. Se muestra el algoritmo expresado en un lenguaje de programación
específico.
Existe una gran diversidad de lenguajes de programación y permanentemente nacen mejoras a los
ya existentes o se crean nuevos lenguajes.
Clasificación
Los lenguajes de programación se pueden clasificar de acuerdo con diversos criterios:
Uno de los criterios más típicos y que mencionan la gran mayoría de los autores es la clasificación
según su proximidad al lenguaje de máquina o al natural.
De acuerdo con este criterio, existen tres niveles de lenguajes:
• Lenguajes de bajo nivel: propio de los circuitos electrónicos, expresado con ceros y unos.
• Lenguajes ensambladores.
• Lenguajes de alto nivel: más cercano al lenguaje natural. Se pueden clasificar atendiendo
a los estilos de programación, en varios grupos.
Lenguajes de bajo nivel
El lenguaje de bajo nivel (también llamado lenguaje de máquina) es aquel en el que sus
instrucciones ejercen un control directo sobre el hardware y están condicionadas por la
estructura física de las computadoras. El uso de la palabra bajo en su denominación no
implica que el lenguaje sea menos potente que un lenguaje de alto nivel, sino que se refiere
a la reducida abstracción entre el lenguaje y el hardware.
Utiliza el sistema binario, que consta de los dos únicos símbolos 0 y 1, denominados bits.
Fue el primer lenguaje utilizado en la programación de computadoras y aunque su velocidad
de ejecución era muy alta, dejó de utilizarse por su complejidad.
Las instrucciones escritas en lenguaje de máquina son muy complejas en cuanto a
redacción y legibilidad.
Un ejemplo de una instrucción escrita en lenguaje de bajo nivel sería:
0011 1010 0000 0000 1110 1111
Lenguajes ensambladores
Un lenguaje ensamblador consiste en un conjunto de mnemónicos que representan
instrucciones básicas para las computadoras, microprocesadores, microcontroladores y
otros circuitos integrados programables. Constituye la representación más directa del código
máquina específico para cada arquitectura, legible por un programador.
Cada arquitectura de procesador tiene su propio lenguaje ensamblador que usualmente es
definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los
pasos de procesamiento, los registros del procesador, las posiciones de memoria y otras
características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta
arquitectura de computadora.
Cabe destacar que un programa escrito en lenguaje ensamblador no es directamente
ejecutable por la computadora, por lo que requiere de una traducción que permita
representar esos nombres simbólicos o mnemónicos en lenguaje de máquina, esto lo realiza
un ensamblador.
2) Según paradigma
Procedural o imperativo
La programación imperativa es uno de los paradigmas de programación de
computadoras más generales, que describe la programación en términos del estado del
programa y sentencias que cambian dicho estado. Los programas escritos en lenguajes
de programación imperativos son un conjunto de instrucciones que le indican a la
computadora cómo realizar una tarea. Lenguajes imperativos muy utilizados son Ada, C,
entre otros.
Lógico
En la programación lógica, el enfoque es expresar programas de manera lógica simbólica
y utilizar un proceso de inferencia lógica para producir resultados. Los programas lógicos
son declarativos, no de procedimiento, lo que significa que sólo se expresan las
especificaciones de los resultados deseados en vez de detallar los procedimientos para
producirlos.
Los programas escritos en lenguajes de programación lógica son colecciones de hechos y
reglas. Dicho programa es utilizado para realizar preguntas, a las que se intenta dar
respuesta mediante la consulta de los hechos y reglas. Son llamados lenguajes de
programación lógica, o lenguajes declarativos.
La sintaxis de los lenguajes de programación lógica es notablemente diferente a la de los
lenguajes imperativos y funcionales. La semántica de los programas lógicos también tiene
poco parecido al de los programas de lenguaje imperativo.
Prolog fue el primer lenguaje de programación lógica y se utiliza en muchas áreas de
conocimiento.
Funcional
El paradigma de programación funcional se basa en funciones matemáticas. No tienen
efectos secundarios.
En los programas escritos en lenguaje imperativo, una de las características
fundamentales es el estado que tienen, lo que cambia a lo largo de la ejecución. Este
estado está representado por las variables del programa. El autor y todos los lectores del
programa deben entender los usos de sus variables y cómo el estado del programa
cambia a través de la ejecución. Para un programa amplio, esto es una tarea
desalentadora. Este es un problema con los programas escritos en un lenguaje imperativo
POO
La programación orientada a objetos incorpora el concepto de objeto, de forma similar a
un objeto del mundo real. Un objeto tiene ciertas propiedades y cierta capacidad para
reaccionar ante eventos o sucesos.
El concepto de programación orientada a objetos tiene sus raíces en Simula 67, pero no
se desarrolló plenamente hasta 1980 con Smalltalk 80. Smalltalk fue el primer lenguaje
que ofreció soporte completo para la programación orientada a objetos.
Esta clasificación según criterio histórico da lugar a las generaciones de lenguajes, que no
necesariamente coinciden con las generaciones de computadoras que trabajamos en la unidad
1. Hay diferencias en cuánto a las generaciones de lenguajes según distintos autores, sobre
todo para definir la cuarta y quinta generación.
Las tres primeras generaciones están directamente relacionadas con el gran avance que hubo
en el tiempo para comenzar programando con un lenguaje de programación de bajo nivel,
continuar con el ensamblador y luego con los de alto nivel.
Además, cabe aclarar que al estar los lenguajes de programación en permanente crecimiento,
podrían haber modificaciones o agregado de nuevas generaciones.
Proceso de traducción
Cualquier programa escrito en lenguaje de alto nivel posee un programa fuente asociado, el cuál no
puede ser ejecutado directamente por la PC. Por eso mismo el programa fuente debe ser traducido
a lenguaje de máquina. Esta conversión de código la realiza el traductor de lenguaje, y el resultado
obtenido se denomina programa objeto.
Existen básicamente dos maneras de implementar un lenguaje:
Interpretación
Compilación
Los sistemas de aplicación de los primeros lenguajes de programación de alto nivel, construidos a
finales de 1950, se encontraban entre el software más complejo de la época. En la década de
1960, se realizaron intensos esfuerzos de investigación para entender y formalizar el proceso de
construcción e implementación de estos lenguajes de alto nivel. El mayor éxito de estos esfuerzos
fue en el área del análisis sintáctico.
Interpretación
Aunque algunos lenguajes simples de principios de la década de 1960 (APL, SNOBOL, y LISP)
fueron puramente intérpretes, por la década de 1980, el enfoque se utiliza muy poco en lenguajes
de alto nivel. Sin embargo, en los últimos años, la interpretación ha hecho una reaparición
significativa con algunos lenguajes de scripting web, como JavaScript y PHP, que son ahora
ampliamente utilizados.
Proceso de interpretación:
Compilación
Es el proceso que traduce un programa escrito en un lenguaje de programación de alto nivel a otro
lenguaje de programación, pero este de bajo nivel o de máquina, generando un programa
equivalente que la máquina será capaz de interpretar. Los programas traductores que pueden
realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores
avanzados, pueden generar muchas líneas de código de máquina por cada proposición del
programa fuente.
La construcción de un compilador involucra la división del proceso en una serie de fases que
variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del
programa fuente y la síntesis del programa objeto.
Debido a que el compilador cada vez que precisa ejecutarse, no se vuelve a compilar, sino que lo
hace una sola vez, insume menos tiempo en ejecución.
El intérprete debe analizar, convertir y ejecutar cada instrucción cada vez que se ejecute el
programa ejecutable, por lo tanto consume mucho tiempo en ejecución.
Elementos de Informática 2024 Pág. 9
Universidad Nacional de la Patagonia San Juan Bosco
Facultad de Ingeniería
Programa Programa
Intérprete SO Memoria libre
traductor Fuente
Programa
Programa Fuente →
SO Memoria libre Traducción
traductor Programa
Compilador ejecutable
Programa
SO Ejecución
ejecutable
Híbridos
Existe también una tercera opción, que es la combinación entre la interpretación y la compilación,
estas implementaciones se denominan sistemas híbridos. Estos traducen programas en lenguaje
de alto nivel en un lenguaje intermedio diseñado para permitir una interpretación fácil. Luego este
código intermedio puede ser interpretado en distintos entornos.
Este método es más rápido que la interpretación pura porque se decodifican las instrucciones del
lenguaje fuente sólo una vez.
Sistemas Operativos
En cualquier sistema informático para que el hardware realice el trabajo para el que ha sido
construido es necesario contar con el software necesario, que posee una serie de normas y
órdenes que coordinan los distintos procesos que se desarrollan en el sistema. A través del
software, que puede estar integrado por un gran número de programas que interactúan unos con
otros, pueden ser manejados todos los recursos de un sistema informático, logrando de esta forma
resolver problemas.
Todos los programas que conforman el software pueden dividirse en dos grupos:
"Presentar al usuario una máquina ampliada o máquina virtual más fácil de programar
que el hardware implícito"
Los programadores se manejan con abstracciones; por ejemplo, podemos ver la lista de
archivos almacenados en un disco como una abstracción de la realidad física (el disco: con
sus sectores, pistas y cabezas de lectura y escritura). Al usuario le interesa poder leer,
escribir y consultar el archivo fácilmente sin tener que considerar, entre otros aspectos, en
qué posición del disco (en qué sector, en qué pista) está almacenada esa información.
El SO es un programa que actúa como intermediario, oculta la verdad del hardware, facilita
el manejo de los dispositivos de almacenamiento al programador y presenta una vista
simple y agradable de los archivos nominados, archivos identificados por el usuario a través
de un nombre.
A través del ejemplo dado, hemos podido observar que el SO presenta una interfaz simple
orientada a la manipulación de archivos de un disco y resguarda al usuario y al programador
de todos los aspectos relacionados con el manejo o acceso al hardware del disco.
Además de facilitar el acceso a discos, el SO también presenta abstracciones para el
manejo de interrupciones, de relojes, de memoria, etc. abstracciones más fáciles, sencillas y
simples de utilizar que el hardware implícito.
"Manejar los recursos del sistema informático, llevar el control de quien utiliza cual
recurso, conceder requerimientos de recursos, explicar el uso e interceder en
solicitudes conflictivas de diferentes programas y usuarios"
En una computadora con múltiples usuarios se necesita compartir los recursos costosos: el
procesador central, la memoria, los dispositivos de E/S, etc., estos elementos compartidos
deben ser racionalmente distribuidos para mejorar el rendimiento de todo el sistema y
asegurar una manipulación adecuada y segura de los mismos.
Kernel
El núcleo o kernel es un software que constituye una parte fundamental del sistema
operativo. Es el principal responsable de facilitar a los distintos programas acceso seguro al
hardware de la computadora en forma básica, es el encargado de gestionar recursos, a
través de servicios de llamada al sistema. Como hay muchos programas y el acceso al
hardware es limitado, también se encarga de decidir qué programa podrá usar un dispositivo
de hardware y durante cuánto tiempo, lo que se conoce como multiplexado. Acceder al
hardware directamente puede ser realmente complejo, por lo que los núcleos suelen
implementar una serie de abstracciones del hardware. Esto permite esconder la
complejidad, y proporcionar una interfaz limpia y uniforme al hardware subyacente, lo que
facilita su uso al programador.
En algunos sistemas operativos, no existe un núcleo como tal debido a que en ciertas
arquitecturas no hay distintos modos de ejecución.
Gestor de recursos
Como gestor de recursos, el sistema operativo administra:
La unidad central de procesamiento.
Los dispositivos de entrada y salida.
La memoria principal y memoria secundaria (discos).
Los procesos (o programas en ejecución).
Y en general todos los recursos del sistema.
Gestión de memoria
La memoria es una gran tabla de palabras o bytes a las cuales se referencia
mediante una dirección única. Este almacén de datos de rápido acceso es
compartido por la CPU y los dispositivos de E/S, es volátil y pierde su contenido ante
ausencia de energía eléctrica o por fallas del sistema. El SO es el responsable de:
Conocer qué partes de la memoria están siendo utilizadas y por quién.
Decidir qué procesos se cargarán en memoria cuando haya espacio disponible.
Asignar y reclamar espacio de memoria cuando sea necesario.
Gestión de procesos
Un proceso es un programa en ejecución que necesita recursos para realizar su
tarea: tiempo de CPU, memoria, archivos y dispositivos de E/S. El SO es el
responsable de lo siguiente:
Crear y destruir procesos.
Parar y reanudar procesos.
Ofrecer mecanismos para que los procesos puedan comunicarse y se
sincronicen.
La gestión de procesos podría ser similar al trabajo de oficina. Se puede tener una
lista de tareas a realizar y a estas fijarles prioridades alta, media, baja por ejemplo.
Debemos comenzar haciendo las tareas de prioridad alta primero y cuando se
terminen seguir con las de prioridad media y después las de baja. Una vez realizada
la tarea se tacha.
Esto puede traer un problema: que las tareas de baja prioridad puede que nunca
lleguen a ejecutarse y permanezcan en la lista para siempre. Para solucionar esto,
se puede asignar alta prioridad a las tareas más antiguas.
Gestión de E/S
Consiste en un sistema de almacenamiento temporal, una interfaz de manejadores
de dispositivos y otra para dispositivos concretos. El sistema operativo debe
gestionar el almacenamiento temporal de E/S y servir las interrupciones de los
dispositivos de E/S.
Gestión de archivos
Los archivos son colecciones de información relacionada. Estos almacenan
programas (en código fuente y objeto) y datos tales como imágenes, textos,
información de bases de datos, etc. El SO es responsable de:
Construir, eliminar archivos y directorios.
Ofrecer funciones para manipular archivos y directorios.
Establecer la correspondencia entre archivos y unidades de almacenamiento.
Realizar copias de seguridad de archivos.
Existen diferentes sistemas de archivos, es decir, existen diferentes formas de
organizar la información que se almacena en las memorias (normalmente discos) de
las computadoras. Por ejemplo, existen los sistemas de archivos FAT, FAT32, ext3,
NTFS, XFS, etc.
Shell
El shell o intérprete de órdenes o intérprete de comandos es el programa informático
que provee una interfaz de usuario para acceder a los servicios del sistema operativo.
Dependiendo del tipo de interfaz que empleen, los shells pueden ser:
De líneas texto (CLI, Command-Line Interface, interfaz de línea de comandos),
Gráficos (GUI, Graphical User Interface, interfaz gráfica de usuario),
Los shell son necesarios para invocar o ejecutar los distintos programas disponibles en la
computadora.
Los SO varían mucho en propósito y diseño. Algunos son muy simples planeados para dar servicio
a un solo usuario en una computadora personal (SO monousuario), en tanto que otros son muy
complejos, atienden a muchos usuarios a la vez y administran recursos de hardware y software de
gran complejidad (SO multiusuario).