# Sistemas operativos/Texto completo

* Si imprimes esta página, o eliges la opción de Vista preliminar de impresión de tu navegador, verás que desaparecen este cuadro y los elementos de navegación de arriba y de la izquierda, pues no son útiles en una versión impresa.
* Pulsando antes en Refrescar esta página te asegurarás de obtener los últimos cambios del libro antes de imprimirlo.
* Para más información, puedes ver Wikilibros:Versión para imprimir.
El sistema operativo funciona como un intermediario para que el usuario pueda comunicarse con el hardware y así el sistema pueda proporcionar un ambiente en donde el usuario pueda ejecutar programas. Esta relación hace que el sistema operativo y el hardware funcionen de manera eficiente. Un sistema operativo forma parte de un sistema de computación y este se divide en 4(que se mencionaran más adelante), el sistema operativo es una parte indispensable para que funcione todo el sistema
En este wikilibro encontraras una descripción de todo lo que implica un Sistema Operativo(SO), habiendo decenas de SO y miles de programas para cada SO e incluso varios programas adaptados para multiples SO. De aquí la importancia de conocer que es lo que puede abarcar un SO.
* Características
* Clasificación
** Clasificación por servicios
** Clasificación por su estructura
** Clasificación por la forma en que ofrecen sus servicios
* SO y Ofimática
* Tipos de computadoras y sus dispositivos
* Lenguajes de Programación

## Enlace

* Libro en pdf sobre Sistema Operativo en Commons

# Características

•Un sistema operativo (SO o, frecuentemente, OS —del inglés operating systm—) es el software principal o conjunto de programas de un sistema informático que gestiona los recursos de hardware y provee servicios a los programas de aplicación de software.

## Características de los Sistemas Operativos (SO)

El sistema operativo (SO) tiene las siguientes características:
* Conveniencia: conveniente el uso de una computadora y/o dispositivo electrónico
* Eficiencia: El SO permite que los recursos de la computadora y/o dispositivo se usen de manera correcta y eficiente.
* Habilidad para evolucionar: Un SO debe de ser capaz de aceptar nuevas funciones sin que tenga problemas al ejecutarse.
* Encargado de administrar el hardware: El SO debe de ser eficaz, recibiendo las señales provenientes de los periféricos y Hardware en general.
* Relacionar dispositivos: Cuando el SO detecta otro sistema operativo conectado en sí mismo.
* Algoritmos: Un SO hace el uso de la computadora o dispositivo más racional y eficiente.

# Clasificación de los Sistemas Operativos

Actualmente los sistemas operativos se clasifican en tres grupos:
* por su estructura (visión interna);
* por los servicios que ofrecen;
* por la forma en que ofrecen sus servicios (visión externa).

# Clasificación por servicios

La clasificación por servicios es la más comúnmente usada y conocida desde el punto de vista del usuario final.

### Sistema operativo monousuario

Los sistemas operativos monousuario son aquellos que soportan a un usuario a la vez, no importando la cantidad de procesadores o procesos que se estén realizando. Las computadoras personales se han clasificado en esta sección. CLASIFICACIÓN DE LOS SISTEMAS OPERATIVOS DE ACUERDO A SUS ELEMENTOS DE SOFTWARE COMERCIAL. ¿Qué es el Software Comercial? El Software Comercial, es aquel que es desarrollado específicamente para su venta. Puede contar o no contar con una licencia, de hecho puede ser libre o puede no serlo, dependiendo de cómo nos enfoquemos hacia el término libre. Sin embargo una de las cosas que realmente debes saber, es que el objetivo de desarrollar software comercial, siempre será el obtener ganancias con él. Durante toda nuestra vida, hemos vivido al lado de Software Comercial, de hecho este tipo de software es el más utilizado en el mundo, una razón más por la que las empresas aún siguen manteniendo su enfoque del desarrollo de software lo más alto posible. Y si te digo que es el tipo de software que utilizas en tu andar diario y no me crees, presta atención a los siguientes nombres: • Microsoft Office • Microsoft Windows • Adobe Photoshop • Corel Draw • Dreamviewer Tipos de Software Comercial • Software Comercial En CD. Cuando vas a la tienda a comprar un nuevo software, todo lo que ahí encuentres estará en formato de CD o DVD, al final viene siendo lo mismo. Este tipo de software comercial, se ha manejado desde hace décadas y hoy por hoy sigue funcionando, sin embargo las tecnologías avanzan y con ello las nuevas tendencias. Por esa razón se espera que en unos años más, deje de promoverse y venderse en las tiendas este tipo de software. • Software Comercial en USB. Para dejar de lado lo que es el CD o el plástico tradicional donde venia el instalador, también se hicieron ventas de software mediante una USB. Comprabas la paquetería y el instalador ahora era una memoria USB. El problema claramente radica en el problema de distribución y piratería, pero es como cualquiera, si hoy no se puede piratear, seguramente mañana se podrá y esa es la ideología que muchos manejan. • Software Comercial en la Nube. La tendencia obviamente tenia que cambiar, los tiempos avanzan rápidamente y el software en la nube es lo que se maneja actualmente. Pero ¿Cómo funciona?. Es simple, ahora tu solamente tienes que descargar un simple instalador. Este instalador se encargará de hacer todo el trabajo en tu computadora, para dejar funcionando el software que necesitas. Básicamente todos los archivos a instalar se encuentran en la nube, por lo que solamente necesitas una conexión a internet, que hoy en día todo el mundo tiene y listo.Este tipo de software, además tiene la ventaja de que en ocasiones puede ser multiplataforma. Pues el hecho de solamente necesitar un instalador y el resto se maneje por si solo, hace que incluso desde tablets o dispositivos móviles, funcione del mismo modo. Solo que recuerda, una conexión a internet es obligatoria para trabajar en ella.

### Sistema operativo multiusuario

Los sistemas multiusuario son los que soportan varios usuarios a la vez, estos tipos de sistemas generalmente se utilizan en máquinas que están conectadas en red.

## Por número de tareas
### Sistema operativo monotarea

Los sistemas monotarea son aquellos que solo permiten realizar una sola tarea, estos sistemas son mas primitivos porque solo permiten un proceso a la vez.

### Sistema operativo multitarea

Desde luego el desarrollo de la tecnología informática digital ha avanzado a un ritmo cada vez más acelerado, hemos avanzado desde los tubos de vacío hasta los microcomponentes y de estos a los procesadores multi núcleo, esto desde luego en todo momento se ha reflejado en el desempeño y características de las tareas que las computadoras son capaces de realizar, todas las generaciones de computadoras han trabajado siempre realizando una operación a la vez, el aumento en su capacidad ha significado la reducción en los tiempos que cada operación consume, entre más rápidos son los procesadores desde luego son más las operaciones que realizan por unidad de tiempo, hemos empleado el segundo como unidad de medida, es decir, cuantificamos su velocidad a partir de la cantidad de operaciones realizadas en un segundo.
Gracias a los avances en la miniaturización y mejora de capacidades, las computadoras de los noventas nos presentaron con los sistemas operativos multitareas, estos poseen la capacidad para administrar el uso del procesador asignándole las operaciones a ejecutar, la aparente capacidad para realizar diferentes tareas al mismo tiempo es lograda gracias tanto a la velocidad del procesador y componentes físicos instalados como al sistema operativo que administra las diferentes tareas y va asignando una operación perteneciente a cada catea al procesador para su realización.
Definiremos a una Tarea como una secuencia de operaciones binarias que al ser procesadas por un sistema de cómputo.

## Por número de procesadores

Depende al numero de procesadores que se tengan, a partir de un procesador.

### Sistema operativo monoprocesador

Los sistemas monoprocesador solo pueden trabajar con un solo procesador si tuviera dos seria multiprocesador Ejemplo: DOS.

### Sistema operativo multiprocesador

Los sistemas de este tipo pueden utilizar varios procesadores para distribuir el trabajo de cada uno. Generalmente estos trabajan o pueden ser de dos tipos:
* Asimétrica: es donde el sistema operativo selecciona un procesador maestro y los demás funcionan con las actividades secundarias.
* Simétrica: en este tipo se envía información o se trabaja con el procesador con menos carga y así se distribuye mejor el trabajo, los procesos son enviados indistintamente a cualquiera de los procesadores disponibles .
Otros tipos de sistemas operativos también son: S.O por estructura S.O por servicios S.O por la forma de ofrecer sus servicios

# Clasificación por su estructura
## Estructura Monolítica

Es la estructura de los primeros sistemas operativos constituidos fundamentalmente por un solo programa compuesto de un conjunto de rutinas entrelazadas de tal forma que cada una puede llamar a cualquier otra. Las características:
* Construcción del programa final a base de módulos compilados separadamente que se unen a través del ligador.
* Buena definición de parámetros de enlace entre las distintas rutinas existentes, que puede provocar mucho acoplamiento.
* Carecen de protecciones y privilegios al entrar a rutinas que manejan diferentes aspectos de los recursos de la computadora, como memoria, disco, etc.
Es decir, ese sistema nos permite entender cualquier concepto adicional referente a las normas y modificaciones de la misma.

## Estructura Jerárquica

A medida que fueron creciendo las necesidades de los usuarios y se perfeccionaron los sistemas se hizo necesaria una mayor organización del software del sistema operativo, donde una parte del sistema contenía subpartes organizadas en forma de niveles.
Se dividió el sistema operativo en pequeñas partes, de tal forma que cada una de ellas estuviera perfectamente definida y con un claro interface con el resto de elementos.
Se constituyó una estructura jerárquica o de niveles en los sistemas operativos, el primero de los cuales fue denominado THE (Technische Hogeschool, Eindhoven), de Dijkstra, que se utilizó con fines didácticos (Ver Fig. 3). Se puede pensar también en estos sistemas como si fueran `multicapa'. Multics y Unix caen en esa categoría. [Feld93].

## Máquina Virtual

Se trata de un tipo de sistemas operativos que presentan una interface a cada proceso, mostrando una máquina que parece idéntica a la máquina real subyacente. Estos sistemas operativos separan dos conceptos que suelen estar unidos en el resto de sistemas: la multiprogramación y la máquina extendida. El objetivo de los sistemas operativos de máquina virtual es el de integrar distintos sistemas operativos dando la sensación de ser varias máquinas diferentes. Es un software.
La estructura de este sistema operativo maquina virtual parte principalmente de un Kernel que se denomina monitor de la máquina virtual, la cual se ejecuta sobre el hardware, generando así varias máquinas virtuales formando lo que se llama la multiprogramación.

# Clasificación por la forma en que ofrecen sus servicios

La clasificación de los sistemas operativos por la forma en que ofrecen sus servicios también se refiere a una visión externa, que en este caso se refiere a la del usuario, el cómo accesa a los servicios. Bajo esta clasificación se pueden detectar dos tipos principales: sistemas operativos de red y sistemas operativos distribuidos.

## Sistemas operativos de red

Los sistemas operativos de red se definen como aquellos que tiene la capacidad de interactuar con sistemas operativos en otras computadoras a través de un medio de transmisión con el objetivo de intercambiar información, transferir archivos, ejecutar comandos remotos y un sin fin de otras actividades.

## Sistemas operativos distribuidos

Los sistemas operativos distribuidos abarcan los servicios de los de red, logrando integrar recursos (impresoras, unidades de respaldo, memoria, procesos, unidades centrales de proceso) en una sola máquina virtual que el usuario acceda en forma transparente. Es decir, ahora el usuario ya no necesita saber la ubicación de los recursos, sino que los conoce por nombre y simplemente los usa como si todos ellos fuesen locales a su lugar de trabajo habitual.

## Proceso

Uno de los conceptos más importantes que gira en torno a un sistema operativo es el de proceso. Un proceso es un programa en ejecución junto con el entorno asociado (registros, variables, etc.). El corazón de un sistema operativo es el núcleo, un programa de control que reacciona ante cualquier interrupción de eventos externos y que da servicio a los procesos, creándolos, terminándolos y respondiendo a cualquier petición de servicio por parte de los mismos.

### Planificación del procesador

La planificación del procesador se refiere a la manera o técnicas que se usan para decidir cuánto tiempo de ejecución y cuando se le asignan a cada proceso del sistema. Obviamente, si el sistema es monousuario y monotarea no hay mucho que decidir, pero en el resto de los sistemas esto es crucial para el buen funcionamiento del sistema.

### Características a considerar de los procesos

No todos los equipos de cómputo procesan el mismo tipo de trabajos, y un algoritmo de planificación que en un sistema funciona excelente puede dar un rendimiento pésimo en otro cuyos procesos tienen características diferentes
* Cantidad de entrada/salida.
* Cantidad de uso de CPU.
* Procesos de lote o interactivos.
* Procesos en tiempo real.
* Longevidad de los procesos.

# Sistemas operativos de red

Son aquellos que te permiten instalar programas en el disco duro para compartir recursos entre varios equipos(cliente). Existen diferentes sistemas operativos de red los cuales se clasifican por las siguiente características:
•Medios de transmisión.
•Tipos de usuario(Permisos).
•Cantidad de programas que proporcione a nivel corporativo.
El primer Sistema Operativo de red estaba enfocado a equipos con un procesador Motorola 68000, pasando posteriormente a procesadores Intel como Novell Netware.
Los Sistemas Operativos de red mas ampliamente usados son: Novell Netware, Personal Netware, LAN Manager, Windows NT Server, UNIX, LANtastic, Li.
La mayoria, de los sistemas actualmente,j&b utilizan el Sistema Operativo Linux, debido a su elevada seguridad, y estabilidad, Mac es una buena opcion si se disponen de los recursos necesarios, la diferencia entre ambos radica en la licencia, el primero es libre y la segunda es propietario.

# Ofimática (Las herramientas productivas)

¿Qué es ofimática?
La palabra ofimática viene de la unión de las palabras oficina + informática. La herramienta ofimática se apoya en la integración de los siguientes elementos: comunicaciones, ordenador personal/workstation e interfaz hombre/máquina.

## Integración en la oficina

Los tres ejes de la integración de la tecnología en la oficina (ofimática) son:
* Comunicabilidad (comunicaciones),
* Computabilidad (ordenador personal/workstation y las herramientas de software) y
* Convivencialidad (interfaz hombre/máquina).
La oficina del futuro puede estar formada por un conjunto de herramientas informáticas conectadas, interna y externamente, por redes de comunicación de diferente naturaleza.
En la actualidad, debido a los inmensos volúmenes de información que deben procesar muchas organizaciones, y contando con los adelantos tecnológicos de la época, se debe hacer uso intensivo de equipos de cómputo adecuados para hallar solución a los diversos problemas que involucra el manejo de la información. Para ello se ha de emplear una serie de herramientas ofimáticas que permitan a los usuarios acceder a la información de forma eficiente, garantizando así la marcha normal de las actividades y el cumplimiento de las tareas.
Un ejemplo de un paquete ofimático es OpenOffice.org, siendo el mismo del tipo software libre y de código abierto.

# Herramientas

Usualmente estas herramientas de ofimática incluyen:
* Manejador o Administrador de Bases de Datos
* Hojas de cálculo
* Procesadores de Textos
* Presentadores de ideas
* Gráficos

## Manejador o Administrador de Bases de Datos

Un manejador de bases de datos básicamente permite almacenar información, clasificarla y posteriormente emplearla mediante consultas, resultados e informes que han de ser diseñados por el administrador o usuario de la base. Este aplicativo resulta especialmente útil cuando hablamos de analizar grandes volúmenes de información muy diferente, pero que cumple con ciertos requisitos en común al definir grupos.
Esos requisitos que son similares en cada grupo de datos son los que se definen como campos dentro de una tabla. Y cada conjunto de campos para un dato almacenado en particular, se denomina registro. Esto es, toda la información que almacenamos dentro de una base de datos está constituida por una serie de campos y registros cruzados, algunos de ellos relacionados con otros, que nos permiten clasificarla según los criterios que definamos para ello, para así hacerla mucho más útil para nuestras labores.

## Hojas de cálculo

Las hojas de cálculo (hojas electrónicas) aparecieron cuando surgió la necesidad de adaptar los sistemas de planificación utilizados en los grandes ordenadores a los nuevos microordenadores. Son una combinación de calculadora, lápiz y papel, que unido a la potencia y capacidad de almacenar datos de los sistemas informáticos, las convierten en una herramienta de primerísima importancia en el mundo empresarial. Mediante una hoja de cálculo podemos realizar diversas tareas que involucren tanto la organización y presentación de información, como el cálculo de valores y funciones haciendo uso de números, operadores matemáticos y lógicos.
Una hoja de cálculo está compuesta por filas y columnas. Cada punto donde se cruza una fila con una columna se conoce como celda. Por convención se suelen identificar las columnas con letras y las filas con números, por lo cual cuando hablamos de la celda "C24" decimos que es el cruce de la columna C con la fila 24. En cada celda podemos almacenar un valor, que puede ser numérico o no, e incluso puede tener diversos formatos. Cada celda puede ser referencia por otra de tal forma que los datos almacenados en unas se convierten en información utilizada por otras a través de formulas y funciones. Las formulas son cálculos matemáticos creados por el usuario mientras que las funciones son operaciones matemáticas predefinidas en las cuales el usuario sólo establece los argumentos o parámetros de funcionamiento. Una formula puede estar constituida por funciones, por ejemplo: =REDONDEAR(SUMA(A2:A15);1). En este ejemplo existen dos funciones que por separado realizan tareas distintas. La función REDONDEAR es una operación predefina que ajusta los números decimales de un resultado según los intereses del usuario. La función original tiene esta forma: REDONDEAR (n°;n°de decimales); esto es, primero se selecciona el número que se desea redondear y luego la cantidad de decimales que se necesita. En el ejemplo empleado, el número a redondear es el resultado de un suma (otra función) de los valores contenidos en las celdas A2 hasta la A15. En resumen, en este caso tenemos una Formula que combina dos funciones que por defecto no están juntas y que para efectos de lograr un mejor resultado el usuario las junta de la forma indicada. El funcionamiento de los cálculos matemáticos en una planilla sigue las mismas reglas de la aritmética básica. Primero se resuelven las divisiones y multiplicaciones y luego las sumas y restas. Lo mismo ocurre con los paréntesis. Primero se resuelven los paréntesis interiores y luego los exteriores.
Adicionalmente, las hojas de cálculo más conocidas en el mercado actual suelen integrar poderosas herramientas para análisis estadístico y financiero, pues en esos campos es donde resulta particularmente útil, tanto para almacenar datos, como para hacer diversos análisis de los mismos, bien se de forma preliminar o con fines más profesionales.

## Procesadores de Textos

Los procesadores de texto son unos de los programas más importantes y necesarios en la utilización de cualquier PC. Elegir el más adecuado depende de la experiencia y pretensiones de los usuarios. Un procesador de textos está orientado a la gestión de textos para la generación de informes, cartas, edición de documentos textuales, etc. que como último soporte utilizarán el papel para la transmisión de información escrita o bien las redes de comunicación. Hoy son una herramienta imprescindible en cualquier oficina.
La evolución ha sido tan importante que muchas veces no son aprovechadas ni la mitad de sus capacidades. Actualmente una sola persona sin conocimientos informáticos y con un entrenamiento de algunas horas puede realizar todo el proceso de edición; desde concebir el original hasta escribirlo, darle el formato adecuado e imprimirlo.
Un procesador de texto se define como el software aplicativo que permite editar, almacenar, recuperar e imprimir información escrita dentro de un PC. Muchos quizá recordemos algunos editores de texto muy populares en los 80`s (WordStar por ejemplo), que requerían una gran cantidad de comandos y donde era indispensable saberlos de memoria para poder obtener un documento medianamente presentable, sin embargo las herramientas de procesamiento de texto actuales son mucho más amigables y eficientes, en términos de recursos, complejidad, tiempo y resultados. mag Los procesadores actuales cuentan con programas auxiliares como los diccionarios ortográficos, de sinónimos o bilingües. Los ortográficos sirven para revisar el documento completo o páginas detectando los errores de mecanografía y faltas de ortografía. Los de sinónimos (tesauros) permiten consultar posibles alternativas a una palabra. Los diccionarios bilingües permiten buscar la palabra en otro idioma. Otras posibilidades hasta hace poco tiempo consideradas como avanzadas son: editores de fórmulas, posibilidad de definir macros, sombreados de marcos, escritura en columnas.

## Presentadores de ideas

Estas sencillas pero útiles aplicaciones nos permiten diseñar presentaciones mediante diapositivas o avisos que incluyen texto, animaciones, sonidos, videos, etc. El trabajo dentro de estos presentadores se parece mucho al de un procesador de texto, sin embargo puede resultar más versátil al momento de incluir efectos en multimedia, así como al momento de exponerlos, pues suelen incluir una opción de presentación, que elimina de la pantalla todos los elementos innecesarios dejando solamente la presentación.
Este aplicativo suele ser empleado en exposiciones, presentaciones de productos, conceptos y trabajos, pues si se cuenta con el equipo adecuado, facilita la transmisión de información para auditorios con muchas personas.

## Gráficos

En un principio podemos clasificar a los distintos programas de gráficos como de dibujo o de diseño asistido por computadora. Los primeros son los que dibujan en pantalla y los segundos aquellos que dibujan en memoria y muestran el resultado en pantalla. Su forma de trabajar también es distinta: los de pantalla lo hacen agrupando puntos (pixeles) y se les suele denominar "mapas de bits" o "bitmap"; los de memoria trabajan con entidades vectoriales y sus definiciones geométricas como objetos. Cada método tiene sus ventajas y sus inconvenientes respecto a la calidad de representación y facilidad de manipulación o modificación.
a) Los gráficos de gestión: pertenecen al área de programas de dibujo para presentaciones de diagramas estadísticos, organigramas, esquemas, etc. Suelen ser programas integrados o relacionados con otros de gestión de datos: hojas de cálculo, bases de datos, procesadores de textos, etc.
b) Gráficos de dibujo y diseño: Se dispone de figuras geométricas (puntos, rectas y curvas) y funciones de gestión de las imágenes (borrado, centrado, traslaciones, giros, ampliaciones, etc). Se utilizan en dibujo lineal y artístico, diseño de máquinas y herramientas (incluidos los automóviles), esquemas eléctricos y electrónicos, mapas y cartografía, arquitectura y urbanismo, publicidad y artes gráficas, etc.

# Tipos de computadoras y sus dispositivos

Las computadoras(ordenadores en España) o dicho técnicamente "el hardware" se encuentra íntimamente relacionado con el SO, ya que varios de los sistemas operativos fueron diseñados originalmente pensando en algún ordenador en particular, en algunos casos con fines comerciales. Sin embargo debido a la popularidad de algunos SO que han sido portados (es decir acondicionado) a otro hardware distinto del original, actualmente es "común" encontrar un mismo SO en distintos tipos de ordenadores, no importando la marca, la empresa que lo fabrica o las características particulares de cada ordenador.
Para acabar pronto, Todo ordenador o computadora siempre necesitara un SO para trabajar.

## Supercomputadoras

Una supercomputadora es el tipo de computadora más potente y más rápido que existe en un momento dado. Estas máquinas están diseñadas para procesar enormes cantidades de información en poco tiempo y son dedicadas a una tarea específica. Así mismo son las más caras, sus precios alcanzan los 30 MILLONES de dólares y más; y cuentan con un control de temperatura especial, ésto para disipar el calor que algunos componentes alcanzan a tener.
Unos ejemplos de tareas a las que son expuestas las supercomputadoras son los siguientes:
* 1. Búsqueda y estudio de la energía y armas nucleares.
* 2. Búsqueda de yacimientos petrolíferos con grandes bases de datos sísmicos.
* 3. El estudio y predicción de tornados.
* 4. El estudio y predicción del clima de cualquier parte del mundo.
* 5. La elaboración de maquetas y proyectos de la creación de aviones, simuladores de vuelo.
Debido a su precio, son muy pocas las supercomputadoras que se construyen en un año.

## Macrocomputadoras o Mainframes

Las macrocomputadoras son también conocidas como Mainframes. Los mainframes son grandes, rápidos y caros sistemas que son capaces de controlar cientos de usuarios simultáneamente.
En el pasado, los Mainframes ocupaban cuartos completos o hasta pisos enteros de algún edificio, hoy en día, un Mainframe es parecido a una hilera de archiveros en algún cuarto con piso falso, ésto para ocultar los cientos de cables de los periféricos.

## Minicomputadoras

En 1960 surgió la minicomputadora, una versión más pequeña de la Macrocomputadora. Al ser orientada a tareas específicas, no necesitaba de todos los periféricos que necesita un Mainframe, y ésto ayudo a reducir el precio y costos de mantenimiento .
Las minicomputadoras , en tamaño y poder de procesamiento, se encuentran entre los mainframes y las estaciones de trabajo.En general, una minicomputadora, es un sistema multiproceso (varios procesos en paralelo) capaz de soportar de 10 hasta 200 usuarios simultáneamente. Actualmente se usan para almacenar grandes bases de datos, automatización industrial y aplicaciones multiusuario.

## Microcomputadoras o PC´s

Las microcomputadoras o Computadoras Personales (PC´s) tuvieron su origen con la creación de los microprocesadores. Un microprocesador es "una computadora en un chip", o sea un circuito integrado independiente. Las PC´s son computadoras para uso personal y relativamente son baratas y actualmente se encuentran en las oficinas, escuelas y hogares.
El término PC se deriva de que para el año de 1981 , IBM®, sacó a la venta su modelo "IBM PC", la cual se convirtió en un tipo de computadora ideal para uso "personal", de ahí que el término "PC" se estandarizó y los clones que sacaron posteriormente otras empresas fueron llamados "PC y compatibles", usando procesadores del mismo tipo que las IBM , pero a un costo menor y pudiendo ejecutar el mismo tipo de programas.
Existen otros tipos de microcomputadoras , como la Macintosh®, que no son compatibles con la IBM, pero que en muchos de los casos se les llaman también "PC´s", por ser de uso personal.
En la actualidad existen variados tipos en el diseño de PC´s:
* 1. Computadoras personales, con el gabinete tipo minitorre, separado del monitor.
* 2. Computadoras personales portátiles "Laptop" o "Notebook".
* 3. Computadoras personales más comunes, con el gabinete horizontal, separado del monitor.
* 4. Computadoras personales que están en una sola unidad compacta el monitor y el CPU.
* 5. Las computadoras "laptops" son aquellas computadoras que están diseñadas para poder ser transportadas de un lugar a otro. Se alimentan por medio de baterías recargables , pesan entre 2 y 5 kilos y la mayoría trae integrado una pantalla de LCD (Liquid Crystal Display).
* 6. Estaciones de trabajo o Workstations

## Estaciones de trabajo

Las estaciones de trabajo se encuentran entre las minicomputadoras y las macrocomputadoras (por el procesamiento). Las estaciones de trabajo son un tipo de computadoras que se utilizan para aplicaciones que requieran poder de procesamiento moderado y posibilidad de procesar gráficos de alta calidad.
Son usadas para: Aplicaciones de ingeniería
* CAD (Diseño asistido por computadora)
* CAM (manufactura asistida por computadora)

# Lenguajes de Programación

Un lenguaje de programación es una manera de entender lo que dice y/o hace el ordenador y si entiendes su lenguaje puedes decirle que quieres que haga el ordenador. ¡Recuerda! El ordenador el no lo sabe hacer y solo va a hacer lo que tú le digas, pero debes de fijarte bien que es lo que le pides hacer. Y el saber como debes de pedirle las cosas, no es tan sencillo como parece, ya que existen lenguajes de programación, como existen lenguajes (idiomas) en el mundo. Aquí encontrarás algunos de los lenguajes más comunes ó más usuales y/o más populares, en algunos casos ejemplos de uso.
Nota: Para algunos lectores es probable que sea la primera vez que vean un código en sí, pero no se espanten, ¡No! es necesario que aprendan algun lenguaje de programación para poder utilizar un SO(excepto casos especiales) sin embargo para información general existe esta pagina que te muestra unos ejemplos para que tengas idea de que algunas personas construyen su mundo con puro código.
De hecho para realizar un SO se necesita de un Lenguaje de Programación.
Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno.
John Von Neumann desarrolló el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstracción de la memoria como un conjunto de celdas, que almacenan simplemente números. Estos números pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en sí.
¿Cómo es que describimos un programa como números? Se tenía el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permitía almacenar números binarios.
La solución que se tomó fue la siguiente: a cada acción que sea capaz de realizar nuestra computadora, asociarle un número, que será su código de operación (opcode). Por ejemplo, una calculadora programable simple podría asignar los opcodes:
1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE.
Supongamos que queremos realizar la operación 5 * 3 + 2, en la calculadora descrita arriba. En memoria, podríamos «escribir» el programa de la siguiente forma:
Podemos ver que con esta representación, es simple expresar las operaciones de las que es capaz el hardware (en este caso, nuestra calculadora imaginaria), en la memoria.
La descripción y uso de los opcodes es lo que llamamos lenguaje de máquina . Es decir, la lista de códigos que la máquina va a interpretar como instrucciones, describe las capacidades de programación que tenemos de ella; es el lenguaje más primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la máquina al más bajo nivel.
los lenguajes más primitivos fueron los lenguajes de máquina. Esto, ya que el hardware se desarrolló antes del software, y además cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware.
La programación en esos momentos era sumamente tediosa, pues el programador tenía que "bajarse" al nivel de la máquina y decirle, paso a pasito, cada punto de la tarea que tenía que realizar. Además, debía expresarlo en forma numérica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente aún no existía alternativa.
El primer gran avance que se dio, como ya se comentó, fue la abstracción dada por el Lenguaje Ensamblador, y con él, el nacimiento de las primeras herramientas automáticas para generar el código máquina. Esto redujo los errores triviales, como podía ser el número que correspondía a una operación, que son sumamente engorrosos y difíciles de detectar, pero fáciles de cometer. Sin embargo, aún aquí es fácil para el programador perderse y cometer errores de lógica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de él.
Con el desarrollo en los 50s y 60s de algoritmos de más elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras científicos de otras ramas; ellos conocían mucho de Física, Química y otras ramas similares, pero no de Computación, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de fórmulas. Así, nació el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inició como un "simple" esfuerzo de traducir un lenguaje de fórmulas, al lenguaje ensamblador y por consiguiente al lenguaje de máquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstracción posible, y facilitar la vida al programador, aumentando la productividad, encargándose los compiladores o intérpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora.
Hay que notar la existencia de lenguajes que combinan características de los de alto nivel y los de bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de programación de alto nivel, y la facilidad de usar librerías que también son características de alto nivel; sin embargo, fue diseñado con muy pocas instrucciones, las cuales son sumamente sencillas, fáciles de traducir al lenguaje de la máquina; y requiere de un entendimiento apropiado de cómo funciona la máquina, el uso de la memoria, etcétera. Por ello, muchas personas consideramos a lenguajes como C (que fue diseñado para hacer sistemas operativos), lenguajes de nivel medio.

## Java

El lenguaje de programación Java fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un lenguaje que pudiera funcionar en redes computacionales heterogéneas (redes de computadoras formadas por más de un tipo de computadora, ya sean PC, Mac, estaciones de trabajo, etc.),y que fuera independiente de la plataforma en la que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse en cualquier máquina o plataforma. El lenguaje fue diseñado con las siguientes características en mente:
* Simple. Elimina la complejidad de los lenguajes como «C» y da paso al contexto de los lenguajes modernos orientados a objetos. Orientado a Objetos. La filosofía de programación orientada a objetos es diferente a la programación convencional.
* Familiar. Como la mayoría de los programadores están acostumbrados a programar en C o en C++, el sintaxis de Java es muy similar al de estos.
* Robusto. El sistema de Java maneja la memoria de la computadora por ti. No te tienes que preocupar por apuntadores, memoria que no se esté utilizando, etc. Java realiza todo esto sin necesidad de que uno se lo indique.
* Seguro. El sistema de Java tiene ciertas políticas que evitan se puedan codificar virus con este lenguaje. Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no puede hacer con los recursos críticos de una computadora.
* Portable. Como el código compilado de Java (conocido como byte code) es interpretado, un programa compilado de Java puede ser utilizado por cualquier computadora que tenga implementado el interprete de Java.
* Independiente a la arquitectura. Al compilar un programa en Java, el código resultante es un tipo de código binario conocido como byte code. Este código es interpretado por diferentes computadoras de igual manera, solamente hay que implementar un intérprete para cada plataforma. De esa manera Java logra ser un lenguaje que no depende de una arquitectura computacional definida.
* Multithreaded. Un lenguaje que soporta multiples threads es un lenguaje que puede ejecutar diferentes líneas de código al mismo tiempo.
* Interpretado. Java corre en máquina virtual, por lo tanto es interpretado.
* Dinámico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificación a una clase Java se encarga de realizar un Dynamic Bynding o un Dynamic Loading para encontrar las clases.
Java puede funcionar como una aplicación sola o como un "applet", que es un pequeño programa hecho en Java. Los applets de Java se pueden "pegar" a una página de Web (HTML), y con esto puedes tener un programa que cualquier persona que tenga un browser compatible podrá usar.
Nota:Diferencia entre Java y CGI La diferencia es esencialmente simple, un CGI se ejecuta en el servidor mientras que un programa en Java se ejecuta en la máquina del usuario.
Java funciona de la siguiente manera: El compilador de Java deja el programa en un Pseudo-código (no es código maquinal) y luego el intérprete de Java ejecuta el programa (lo que se conoce como el "Java Virtual Machine"). Por eso Java es multiplataforma, existe un intérprete para cada máquina diferente. Nota: El código maquinal es el código binario que la computadora entiende y puede ejecutar.
Para entender bien cómo funciona un applet de Java vean el siguiente ejemplo:
* Existe un código de Java en un servidor de Web (los códigos de Java se caracterizan por tener la extensión *.class).
* Una persona en Internet, con un navegador compatible con Java, realiza una conexión al servidor.
* El servidor envía el documento HTML y el código en Java (*.class).
* En la computadora del usuario remoto llegan ambos, y la Máquina Virtual de Java, que está en el browser, transforma el código Java en un código que entienda la máquina local y se ejecuta el programa dentro de la página de Web.
* Si el usuario realiza otra conexión a otro URL o se sale del browser, el programa se deja de ejecutar y en la computadora no queda rastro de el.

### Ejemplo de tutorial de Java

En Java hay tres tipos de comentarios:
Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentación, colocados inmediatamente antes de una declaración (de variable o función), indican que ese comentario ha de ser colocado en la documentación que se genera automáticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripción del elemento declarado permitiendo generar una documentación de nuestras clases escrita al mismo tiempo que se genera el código.
En este tipo de comentario para documentación, se permite la introducción de algunos tokens o palabras clave, que harán que la información que les sigue aparezca de forma diferente al resto en la documentación.

### Identificadores

Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar.
En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay longitud máxima.
Serían identificadores válidos:
identificador
nombre_usuario
Nombre_Usuario
_variable_del_sistema
$transaccion
y su uso sería, por ejemplo:
int contador_principal;
char _lista_de_ficheros;
float $cantidad_en_Ptas;

## Unix
### Ejemplo de Unix

No todo el «árbol» de directorios está compuesto por directorios de usuario. Existen muchos de ellos que son de uso general o del propio sistema y con los que habrá que familiarizarse. Los más importantes son:
El raíz, del que "cuelgan" todos.
/bin y /usr/bin
Contienen comandos UNIX ejecutables.
/etc
Es quizá el directorio más importante. Contiene ficheros de datos y configuración del sistema, el fichero de password, configuración de terminales, red, etc (de ahí su nombre).
/dev
Ficheros de dispositivos E/S.
/usr/man
Manual
/tmp
Directorio para arreglos temporales. TODOS los usuarios pueden leer y escribir en él.

## C

C es un lenguaje de programación diseñado por Dennis Ritchie, de los Laboratorios Bell, y
se instaló en un PDP-11 en 1972; se diseñó para ser el lenguaje de los Sistemas Operativos
UNIX1. A su vez, UNIX es un Sistema Operativo desarrollado por Ken Thompson, quién
utilizó el lenguaje ensamblador y un lenguaje llamado B para producir las versiones originales de UNIX, en 1970. C se inventó para superar las limitaciones de B.
C es un lenguaje maduro de propósitos generales que se desarrolló a partir de estas raíces;
su definición aparece en 1978 en el apéndice ``C Reference Manual del libro The C
Programming Language, de Brian W. Kernighan y Dennis M. Ritchie (Englewood Cliffs,
Nueva Jersey, Prentice-Hall 1978), pero el estándar recomendable más reciente apareció en
junio de 1983, en el documento de los Laboratorios Bell titulado The C Programming
Language-Reference Manual, escrito por Dennis M. Ritchie

### Un programa en C

Generalizando, un programa en C consta de tres secciones. La primera sección es donde van todos los ``headers. Estos ``headers son comúnmente los ``#define y los ``#include. Como segunda sección se tienen las ``funciones. Al igual que Pascal, en C todas las funciones que se van a ocupar en el programa deben ir antes que la función principal (main). Declarando las funciones a ocupar al principio del programa, se logra que la función principal esté antes que el resto de las funciones. Ahora, solo se habla de funciones ya que en C no existen los procedimientos.
Y como última sección se tiene a la función principal, llamada main. Cuando se ejecuta el programa, lo primero que se ejecuta es esta función, y de ahí sigue el resto del programa.
Los símbolos { y } indican ``begin y ``end respectivamente. Si en una función o en un ciclo while, por ejemplo, su contenido es de solamente una línea, no es necesario usar ``llaves ({ }), en caso contrario es obligación usarlos.

### Ejemplo de un programa en C

/*Programa ejemplo que despliega el contenido de "ROL" en pantalla*/
* include <stdio.h>
* define ROL "9274002-1"
despliega_rol {
printf("Mi rol es : \%s\n", ROL);
void main {
despliega_rol;
/* Fin programa */

## Pascal

Pascal es un lenguaje de programación de alto nivel de propósito general; se puede utilizar para escribir programas para fines científicos y comerciales.
El lenguaje de programación Pascal fue desarrollado por el profesor Niklaus (Nicolás) Wirth en Zurich, Suiza, al final de los años 1960s y principios de los 70s. Wirth diseñó este lenguaje para que fuese un buen primer lenguaje de programación para personas comenzando a aprender a programar. Pascal tiene un número relativamente pequeño de conceptos para aprender y dominar. Su diseño facilita escribir programas usando un estilo que está generalmente aceptado como práctica estándar de programación buena. Otra de las metas del diseño de Wirth era la implementación fácil. Él diseñó un lenguaje para el cual fuese fácil escribir un compilador para un nuevo tipo de computadora.

## QBasic

QBasic es un lenguaje de alto nivel, el cual consiste en instrucciones que los humanos pueden relacionar y entender. El compilador de Qbasic se encarga de traducir el mismo a lenguaje de máquina.
Un programa es una secuencia de instrucciones. El proceso de ejecutar esas instrucciones se llama correr el programa. Los programas contienen las funciones de entrada, procesamiento y salida. La persona que resuelve problemas mediante escribir programas en la computadora se conoce como programador. Después de analizar el problema y desarrollar un plan para solucionarlo, escribe y prueba el programa que instruye a la computadora como llevar a cabo el plan. El procedimiento que realiza el programador se define como "problem solving". Pero es necesario especificar que un programador y un usuario no son lo mismo. Un usuario es cualquier persona que use el programa.

### Ejemplo de QBasic

Ejemplo para hacer una calculadora:

## Linux

Linux es una implementación del sistema operativo UNIX (uno más de entre los numerosos clónicos del histórico Unix), pero con la originalidad de ser gratuito y a la vez muy potente, que sale muy bien parado (no pocas veces victorioso) al compararlo con las versiones comerciales para sistemas de mayor envergadura y por tanto teóricamente superiores. Comenzó como proyecto personal del –entonces estudiante- Linus Torvalds, quien tomó como punto de partida otro viejo conocido, el Minix de Andy. S. Tanenbaum (profesor de sistemas operativos que creó su propio sistema operativo Unix en PCs XT para usarlo en su docencia). Actualmente Linus lo sigue desarrollando, pero a estas alturas el principal autor es la red Internet, desde donde una gigantesca familia de programadores y usuarios aportan diariamente su tiempo aumentando sus prestaciones y dando información y soporte técnico mútuo. La versión original -y aun predominante- comenzó para PCs compatibles (Intel 386 y superiores), existiendo también en desarrollo versiones para prácticamente todo tipo de plataformas, entre otras:
* PowerPC <http://www.cs.us.es/archive/linuxppc/>.
* Sparc <http://www.geog.ubc.ca/sparclinux.html>.
* Alpha <http://www.azstarnet.com/~axplinux>.
* Mips <http://www.fnet.fr/linux-mips/>.
De todas ellas la más reciente en este momento es la versión para PowerMac <http://www.mklinux.org> (el PowerPC de Apple) basada en el microkernel Mach 3.0 y de la que ya hay una distribución para desarrolladores avalada directamente por Apple y OSF pero conservando el espíritu (gratuito, de libre distribución, etc) de la version original. Un servidor la acaba de probar hace unos días y se ha llevado una grata sorpresa (aún tendrá muuuchos fallos, pero para ser una primerísima versión y el poco tiempo que lleva en marcha, ha avanzado más de lo que me esperaba).

### Ejemplo de Linux

Compilar el Kernel
Dado que un diskette sólo almacena 1.44 Megabytes (1440 Kilobytes) de datos, no puedes el mismo kernel que utilizas al diskette. Primero debes conseguir los fuentes del núcleo y descomprimirlos en /usr/src/linux. Luego ejecuta la siguiente orden desde el directorio
/usr/src/linux:
Configura solamente aquello que realmente necesites. Yo, personalmente, sólo configuro el soporte para "ext2", soporte para la disquetera (floppy disk), y soporte para "PPP". Tus elecciones pueden se diferentes en función de lo que decidas incluir. Ahora introduce el siguiente comando:
¡make zImage es muy importante! Comprime el kernel definitivo. Después de que termine la compilación, deberás buscar el nuevo núcleo en /usr/src/linux/arch/i386/boot bajo el
nombre de zImage.
El sistema de ficheros: No es solamente un conjunto de ficheros
Ahora hemos de crear el sistema de ficheros (en inglés: filesystem, fs) para el diskette. En vez de copiar los ficheros tal cual directamente al diskette, los comprimiremos antes de copiarlos. Esto nos hará un poco más difícil la faena de modificar todo permanentemente. Primero tecleamos el siguiente
comando:
Donde [DEVICE] es "lugar" en el disco duro donde vas a guardar el sistema de ficheros descomprimido. Luego, introduce el siguiente comando y pulsa ENTER, sustituyendo [DEVICE] por el directorio en tu disco duro donde estás guardando el sistema de ficheros descomprimido:
Si make2fs te pregunta si realmente quieres hacer esto (Do you really want to do this?), acepta tecleando "y" (yes).
Después tenemos que montar este sistema de ficheros que hemos creado. Para ello, el núcleo que utilices tiene que permitir "montar ficheros", en otras palabras, ha de tener habilitada la posibilidad de "loopback devices". Para ello has de compilar el núcleo de tu máquina (no el núcleo que hemos creado, sino el de tu propia máquina) con la opción:
bien como módulo (M) o en el mismo núcleo (Y). Si lo compilas como módulo (lo más recomendable) luego tienes que insertar el módulo modprobe loop !No olvides rearrancar la máquina si has tenido que recompilar el núcleo!
Si se queja la orden mount puedes intentar con la siguiente orden:
Ahora debes copiar todos los ficheros que necesites en el nuevo sistema de ficheros. Primero, ponte en el directorio /mnt, (cd /mnt), y crea los siguientes directorios:
/dev
/pro
/etc
/bin
/lib
/mnt
/usr
Ahora crearemos el directorio /dev tecleando lo siguiente:
Si se te acaban los i-nodos del diskette, puedes ir a /mnt/dev y borrar los archivos de dispositivo que no necesites. Cuando acabes de copiar los ficheros necesarios para /dev, ves a /etc. Para estar seguro copia todos los ficheros de /etc a /mnt/etc:
Luego copia todo del directorio /lib en /mnt:
Para el directorio /bin, copia sólo aquello que creas que necesitas en /mnt/bin.
Copiar todo a tu diskette
Ahora hemos de copiar todo en el/los diskette/s. Para hacer esto, debemos comprimir ahora el sistema de ficheros tecleando las siguientes ordenes:
Ahora es importante comprobar el tamaño del núcleo. Ponte en /usr/src/linux/arch/i386/boot y teclea "ls -l". Luego divide el tamaño del núcleo entre 1024.
Por ejemplo, si el tamaño es de 250000 bytes, entonces son 245 KB. En adelante, reemplaza [ROOTBEGIN] en las ordenes que aparezca por el número total de kilobytes que has calculado. Ahora copia el kernel al diskette usando el siguiente comando:
Este comando grabará el kernel en el diskette. Luego introduce el siguiente comando para que el kernel pueda encontrar la raíz del sistema de ficheros en el diskette.
Ahora tendrás que hacer un pequeño cálculo en hexadecimal. Suma 4000 al equivalente en hexadecimal de [ROOTBEGIN] (que en nuestro ejemplo es F5). Convierte el resultado a decimal y teclea el siguiente comando, sustituyendo 16629 con el resultado que tú has obtenido:
rdev -r /dev/fd0 16629
Finalmente, teclea lo siguiente para copiar el sistema de ficheros al diskette:
El sistema de ficheros raíz será copiado al diskette justo después del kernel. ¡Ya lo tienes! Para el segundo diskette, el proceso es más fácil. Copia los ficheros que quieras en el diskette. No obstante, para poder usar los ficheros que hay en el segundo disco, tendrás que entrar lo siguiente después de arrancar con el diskette:

## Ensamblador

Cuando abstraemos los opcodes y los sustituimos por una palabra que sea una clave de su significado, a la cual comúnmente se le conoce como mnemónico, tenemos el concepto de Lenguaje Ensamblador. Así, podemos definir simplemente al Lenguaje Ensamblador de la siguiente forma:
Lenguaje Ensamblador es la primera abstracción del Lenguaje de Máquina, consistente en asociar a los opcodes palabras clave que faciliten su uso por parte del programador
Como se puede ver, el Lenguaje Ensamblador es directamente traducible al Lenguaje de Máquina, y viceversa; simplemente, es una abstracción que facilita su uso para los seres humanos. Por otro lado, la computadora no entiende directamente al Lenguaje Ensamblador; es necesario traducirle a Lenguaje de Máquina. Originalmente, este proceso se hacía a mano, usando para ello hojas donde se escribían tablas de programa similares al ejemplo de la calculadora que vimos arriba . Pero, al ser tan directa la traducción, pronto aparecieron los programas Ensambladores, que son traductores que convierten el código fuente (en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje de Máquina).
Una característica que hay que resaltar, es que al depender estos lenguajes del hardware, hay un distinto Lenguaje de Máquina (y, por consiguiente, un distinto Lenguaje Ensamblador) para cada CPU. Por ejemplo, podemos mencionar tres lenguajes completamente diferentes, que sin embargo vienen de la aplicación de los conceptos anteriores:
1.Lenguaje Ensamblador de la familia Intel 80x86 2.Lenguaje Ensamblador de la familia Motorola 68000 3.Lenguaje Ensamblador del procesador POWER, usado en las IBM RS/6000.
Tenemos 3 fabricantes distintos, compitiendo entre sí y cada uno aplicando conceptos distintos en la manufactura de sus procesadores, su arquitectura y programación; todos estos aspectos, influyen en que el lenguaje de máquina y ensamblador cambie bastante.

### Ventajas y desventajas del Lenguaje Ensamblador

Una vez que hemos visto la evolución de los lenguajes, cabe preguntarse: ¿En estos tiempos «modernos», para qué quiero el Lenguaje Ensamblador?
El proceso de evolución trajo consigo algunas desventajas, que ahora veremos como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel:
* Velocidad.
* Eficiencia de tamaño.
* Flexibilidad.
Por otro lado, al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel:
* Tiempo de programación.
* Programas fuente grandes.
* Peligro de afectar recursos inesperadamente.
* Falta de portabilidad.

### Velocidad

El proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos.
De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente.
Sin embargo, la mayor parte de las veces, el código generado por un compilador es menos eficiente que el código equivalente que un programador escribiría. La razón es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear código genérico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las características específicas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso que no sea necesario.
Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará cerca de 20 veces más en Visual Basic (un intérprete), y 2 veces más en C (un compilador), que el equivalente en Ensamblador.
Por ello, cuando es crítica la velocidad del programa, Ensamblador se vuelve un candidato lógico como lenguaje.
Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces más rápido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la elección apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere más optimización y no se puede lograr por estos medios.

### Tamaño

Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.

### Flexibilidad

Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor.
Resumiendo, la flexibilidad consiste en reconocer el hecho de que
Todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina.

### Tiempo de programación

Al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstracción.
Programas fuente grandes
Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos inesperadamente
Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.
En la vida práctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje verán que es mucho más común que la máquina se «cuelgue», «bloquee» o «se le vaya el avión»; y que se reinicialice. ¿Por qué? porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
En ciertos casos extremos, puede llegarse a sobreescribir información del CMOS de la máquina (no he visto efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su información.

### Falta de portabilidad

Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en «C», en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de «C», y los principios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100% del código al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.

# Autor(es)

Nota: Se esta revisando la procendencia del contenido de este wikilibro, así como sus autor(es) originales.

# Colaborador(es)

Oleinad - Reestructuracion del wikilibro en subpaginas, comentarios introductorios en subpaginas y algunos arreglos.

# Invitación

Tu puedes colocar tu nombre aquí siempre y cuando colabores agregando más material respecto al wikilibro o colaborando en la corrección gramatical y/u ortográfica de este wikilibro.
Pero recuerda
Parece dificíl pero con ganas de aprender todo se puede.