martes, 27 de abril de 2010

MEMORIA VIRTUAL


La memoria virtual es un espacio de direcciones cuyo tamaño máximo está determinado por el esquema de direccionamiento del computador (es decir, por la cantidad máxima de bytes posibles de direccionar que depende de la cantidad de bits o dígitos binarios utilizados para expresar una dirección.

El almacenamiento que puede ser directamente accedido por el computador (memoria principal) se denomina memoria real. El espacio de la memoria real es un conjunto de ubicaciones físicas de memoria en el cual las instrucciones y datos de programa deberán ser ubicados para su procesamiento. Los programas se refieren a los datos e instrucciones por la dirección de memoria virtual sin conocer la ubicación física de memoria real.

La memoria virtual se llama así porque representa una imagen de memoria en lugar de una memoria física del procesador. Dado que la memoria virtual no existe como una entidad física de memoria principal, las instrucciones y datos de un programa referenciados por direcciones virtuales deben ser contenidos en alguna ubicación física de memoria para ser ejecutados.

Los contenidos de la memoria virtual están divididos en porciones o secciones (páginas) de tamaño fijo. El programa está completo en la memoria virtual pero en la memoria real sólo están algunas páginas del mismo que van cambiando automáticamente durante la ejecución.

La memoria real también está dividida en secciones (bloques) de igual tamaño que las páginas. Cuando se debe ejecutar un programa, éste es traído a la memoria virtual y las instrucciones y datos del mismo son transferidos entre la memoria virtual y la real de a una sección por vez durante la ejecución del programa. Una sección será llevada a la memoria real sólo cuando es requerida. Por otro lado, una sección que está en la memoria real sólo será reescrita en la memoria virtual cuando la memoria real asignada a esa sección es requerida por otra sección del mismo o de otro programa, siempre que no se esté ejecutando y, además, si ha sido modificada.

En general, se controla la actividad de las secciones de todos los programas en ejecución a fin de mantener, en lo posible, en memoria real a las secciones más activas o usadas, dejando las menos activas en la memoria virtual.

El hardware de traducción de direcciones o la función interna de mapping son los mecanismos por los cuales se pueden traducir las direcciones de memoria virtual en direcciones de memoria real durante la ejecución de las instrucciones.

ADMINISTRACION DE MEMORIA


Se le llama administración de memoria a los diversos métodos y operaciones destinados a obtener la máxima utilidad y provecho de una memoria informática, en pos del buen uso y funcionamiento del sistema en su totalidad.

Una memoria informática consiste en la serie de componentes, dispositivos y medios en una computadora que tienen el fin de retener y almacenar datos informáticos en forma circunstancial o permanente. Toda computadora moderna dispone de unidades de memoria que permiten el correcto funcionamiento del CPU o Unidad Central de Procesamiento.Las hay de distintos tamaños y formatos.

Una memoria puede ser un chip insertado en el interior de la computadora, pero también puede considerarse memoria al uso de unidades externas de almacenamiento como CDs, DVDs o memorias flash.

A menudo una computadora dispone de una memoria principal, pero ésta puede ser complementada con otras unidades de memoria que se agreguen o con memorias movibles que permitan intercambiar datos entre varias computadoras.

La administración de memoria refiere, entonces, a la serie de métodos y procesos que se llevan adelante desde la parte usuaria a los efectos de obtener el mejor rendimiento posible por parte de estas unidades.

Estas operaciones son múltiples y tienen distintos usos y objetivos directos. Por ejemplo, una típica operación es trasladar la información a ser ejecutada dentro y fuera de la memoria principal, procurando maximizar el uso del procesador. Otras operaciones comunes son la protección de los procesos de interferencias de otros, uso compartido de datos, para que varios procesos compartan la misma información y memoria, partición de memoria en varias partes, limpieza de datos en la memoria que son poco utilizados o irrelevantes, formateo de disco y muchas otras.

Todos estos procesos son flexibles y dependen del uso y propósito del ordenador por parte del usuario para optimizar su rendimiento. Con frecuencia, la ejecución de estas operaciones brindará mayor espacio disponible para el almacenamiento de información y proporcionará una mayor agilidad en la gestión de procesos de diversa índole y nivel.

ADMINISTRACION DE PROCESOS

  • Concurrencia: Normalmente en una computadora co-existen n-procesos simultáneamente.
  • Administrador de Procesos: se encarga de seleccionar el proceso en turno a ser ejecutado en el CPU.
  • Objetivo: maximizar uso del CPU bajo un tiempo de respuesta razonable manteniendo un uso justo, seguro y equilibrado del CPU entre los procesos.

DEFINICION DE PROCESOS:

Proceso: programa en ejecución.

  • Aquel cuyas instrucciones son ejecutadas en ese momento por el CPU.

  • Entidad que puede ser asignada y ejecutada por un procesador.
  • Un proceso tiene un espacio de direcciones privado.
  • Los procesos del SO corren en modo kernel (privilegiado o supervisor).
  • El resto de los procesos corren en modo usuario (sin privilegios.



DEFINICION DE PROCESOS:

  • Programa: entidad estática grabada en disco.

  • Proceso: entidad dinámica grabada en memoria, i.e. processes, tasks, jobs.

ESTADOS DE UN PROCESO:

  • Conforme se ejecuta un proceso, cambia de estado.

COMPONENTES Y SERVICIOS DE UN SISTEMA OPERATIVO

LOS SISTEMAS OPERATIVOS SE COMPONEN DE:



GESTIÓN DE PROCESOS

Un proceso es simplemente, 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:

• Crear y destruir los procesos.
• Parar y reanudar los procesos.
• Ofrecer mecanismos para que se comuniquen y 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 pueden 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 LA MEMORIA PRINCIPAL

La Memoria (informática) es una gran tabla de palabras o bytes que se referencian cada una mediante una dirección única. Este almacén de datos de rápido accesos es compartido por la CPU y los dispositivos de E/S, es volátil y pierde su contenido en los fallos del sistema. El SO es el responsable de:

• Conocer qué partes de la memoria están 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 DEL ALMACENAMIENTO SECUNDARIO

Un sistema de almacenamiento secundario es necesario, ya que la memoria principal (almacenamiento primario) es volátil y además muy pequeña para almacenar todos los programas y datos. También es necesario mantener los datos que no convenga mantener en la memoria principal. El SO se encarga de:

• Planificar los discos.
• Gestionar el espacio libre.
• Asignar el almacenamiento.

EL SISTEMA DE E/S

Consiste en un sistema de almacenamiento temporal (caché), 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.

SISTEMA DE ARCHIVOS

Los archivos son colecciones de información relacionada, definidas por sus creadores. Éstos 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 y 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 los ordenadores. Por ejemplo, existen los sistemas de archivos FAT, FAT32, EXT2, NTFS, etc.

Desde el punto de vista del usuario estas diferencias pueden parecer insignificantes a primera vista, sin embargo, existen diferencias muy importantes. Por ejemplo, los sistemas de ficheros FAT32 y NTFS, que se utilizan fundamentalmente en sistemas operativos de Microsoft, tienen una gran diferencia para un usuario que utilice una base de datos con bastante información ya que el tamaño máximo de un fichero con un Sistema de Archivos FAT32 está limitado a 4 gigabytes, sin embargo, en un sistema NTFS el tamaño es considerablemente mayor.

SISTEMAS DE PROTECCIÓN

Mecanismo que controla el acceso de los programas o los usuarios a los recursos del sistema. El SO se encarga de:
• Distinguir entre uso autorizado y no autorizado.
• Especificar los controles de seguridad a realizar.
• Forzar el uso de estos mecanismos de protección.

SISTEMA DE COMUNICACIONES

Para mantener las comunicaciones con otros sistemas es necesario poder controlar el envío y recepción de información a través de las interfaces de red. También hay que crear y mantener puntos de comunicación que sirvan a las aplicaciones para enviar y recibir información, y crear y mantener conexiones virtuales entre aplicaciones que están ejecutándose localmente y otras que lo hacen remotamente.

PROGRAMAS DE SISTEMA

Son aplicaciones de utilidad que se suministran con el SO pero no forman parte de él. Ofrecen un entorno útil para el desarrollo y ejecución de programas, siendo algunas de las tareas que realizan:

• Manipulación y modificación de archivos.
• Información del estado del sistema.
• Soporte a lenguajes de programación.
• Comunicaciones.

GESTOR DE RECURSOS

Como gestor de recursos, el Sistema Operativo administra:

• La CPU (Unidad Central de Proceso, donde está alojado el microprocesador).
• Los dispositivos de E/S (entrada y salida)
• La memoria principal (o de acceso directo).
• Los discos (o memoria secundaria).
• Los procesos (o programas en ejecución).

SERVICIOS BASICOS DE UN SISTEMA OPERATIVO:

  • Requisitos de usuario: Sistema fácil de usar y de aprender, seguro, rápido y adecuado al uso al que se le quiere destinar.
  • Requisitos del software: Donde se engloban aspectos como el mantenimiento, forma de operación, restricciones de uso, eficiencia, tolerancia frente a los errores y flexibilidad.

SUS SERVICIOS PRINCIPALES SON:

  • Proporcionar ya sea una interfaz de línea de comando o una interfaz gráfica al usuario, para que este último se pueda comunicar con la computadora.
  • Interfaz de línea de comando: Se introducen palabras y símbolos desde el teclado de la computadora, ejemplo, el MS-DOS.
  • Interfaz gráfica del Usuario (GUI): Se seleccionan las acciones mediante el uso de un Mouse para pulsar sobre figuras llamadas iconos o seleccionar opciones de los menús.
  • Administrar los dispositivos de hardware en la computadora. El Sistema Operativo sirve de intermediario entre los programas y el hardware.
  • Administrar y mantener los sistemas de archivo de disco. Los SO agrupan la información dentro de compartimientos lógicos para almacenarlos en el disco. Estos grupos de información son llamados archivos. Los archivos pueden contener instrucciones de programas o información creada por el usuario. El SO mantiene una lista de los archivos en un disco, y nos proporciona las herramientas necesarias para organizar y manipular estos archivos.
  • Apoyar a otros programas. Por ejemplo, listar los archivos, grabarlos en el disco, eliminar archivos, revisar espacio disponible, etc.

1. OBJETIVOS PARA LA CREACIÓN DE LOS SISTEMAS OPERATIVOS.

El objetivo fundamental de los sistemas de computación es ejecutar los programas de los usuarios y facilitar la resolución de sus problemas. El hardware se construye con este fin, pero como este no es fácil de utilizar, se desarrollan programas de aplicación que requieren ciertas operaciones comunes.

OTROS OBJETIVOS SON:

* Transformar el complejo hardware de una computadora a una máquina accesible al usuario.
* Lograr el mejor uso posible de los recursos.
* Hacer eficiente el uso del recurso.

TIPOS DE SISTEMAS OPERATIVOS


LOS SISTEMAS OPERATIVOS MÁS CONOCIDOS SON LOS SIGUIENTES:

1) DOS: El famoso DOS, que quiere decir Disk Operating System (sistema operativo de disco), es más conocido por los nombres de PC-DOS y MS-DOS. MS-DOS fue hecho por la compañía de software Microsoft y es en esencia el mismo SO que el PC-DOS.

La razón de su continua popularidad se debe al aplastante volumen de software disponible y a la base instalada de computadoras con procesador Intel.

Cuando Intel liberó el 80286, DOS se hizo tan popular y firme en el mercado que DOS y las aplicaciones DOS representaron la mayoría del mercado de software para PC. En aquel tiempo, la compatibilidad IBM, fue una necesidad para que los productos tuvieran éxito, y la "compatibilidad IBM" significaba computadoras que corrieran DOS tan bien como las computadoras IBM lo hacían.

Aun sigue siendo todavía un sólido contendiente en la guerra de los SO (DOS).


2) Windows 3.1: Microsoft tomo una decisión, hacer un sistema operativo que tuviera una interfaz gráfica amigable para el usuario, y como resultado obtuvo Windows. Este sistema muestra íconos en la pantalla que representan diferentes archivos o programas, a los cuales se puede accesar al darles doble click con el puntero del mouse. Todas las aplicaciones elaboradas para Windows se parecen, por lo que es muy fácil aprender a usar nuevo software una vez aprendido las bases.

3) Windows 95: En 1995, Microsoft introdujo una nueva y mejorada versión del Windows 3.1. Las mejoras de este SO incluyen soporte multitareas y arquitectura de 32 bits, permitiendo así correr mejores aplicaciones para mejorar la eficacia del trabajo.

4) Windows NT: Esta versión de Windows se especializa en las redes y servidores. Con este SO se puede interactuar de forma eficaz entre dos o más computadoras.

5) OS/2: Este SO fue hecho por IBM. Tiene soporte de 32 bits y su interfaz es muy buena. El problema que presenta este sistema operativo es que no se le ha dad el apoyo que se merece en cuanto a aplicaciones se refiere. Es decir, no se han creado muchas aplicaciones que aprovechen las características de el SO, ya que la mayoría del mercado de software ha sido monopolizado por Windows.

6) Mac OS: Las computadoras Macintosh no serían tan populares como lo son si no tuvieran el Mac OS como sistema operativo de planta. Este sistema operativo es tan amigable para el usuario que cualquier persona puede aprender a usarlo en muy poco tiempo. Por otro lado, es muy bueno para organizar archivos y usarlos de manera eficaz. Este fue creado por Apple Computer, Inc.

7) UNIX: El sistema operativo UNIX fue creado por los laboratorios Bell de AT&T en 1969 y es ahora usado como una de las bases para la supercarretera de la información. Unix es un SO multiusuario y multitarea, que corre en diferentes computadoras, desde supercomputadoras, Mainframes, Minicomputadoras, computadoras personales y estaciones de trabajo. Esto quiere decir que muchos usuarios pueden estar usando una misma computadora por medio de terminales o usar muchas de ellas.

NECESIDADES DE LOS SISTEMAS OPERATIVOS




OBJETIVOS PARA LA CREACIÓN DE LOS SISTEMAS OPERATIVOS.

El objetivo fundamental de los sistemas de computación es ejecutar los programas de los usuarios y facilitar la resolución de sus problemas. El hardware se construye con este fin, pero como este no es fácil de utilizar, se desarrollan programas de aplicación que requieren ciertas operaciones comunes.

OTROS OBJETIVOS SON:

  • Transformar el complejo hardware de una computadora a una máquina accesible al usuario.
  • Lograr el mejor uso posible de los recursos.
  • Hacer eficiente el uso del recurso.

FUNCIONES DE LOS SISTEMAS OPERATIVOS.

  • Aceptar todos los trabajos y conservarlos hasta su finalización.
  • Interpretación de comandos: Interpreta los comandos que permiten al usuario comunicarse con el ordenador.
  • Control de recursos: Coordina y manipula el hardware de la computadora, como la memoria, las impresoras, las unidades de disco, el teclado o el Mouse.
  • Manejo de errores: Gestiona los errores de hardware y la pérdida de datos.
  • Secuencia de tareas: El sistema operativo debe administrar la manera en que se reparten los procesos. Definir el orden. (Quien va primero y quien después).
  • Protección: Evitar que las acciones de un usuario afecten el trabajo que esta realizando otro usuario.
  • Multi acceso: Un usuario se puede conectar a otra máquina sin tener que estar cerca de ella.
  • Contabilidad de recursos: establece el costo que se le cobra a un usuario por utilizar determinados recursos.

SISTEMAS OPERATIVOS

Un sistema Operativo (SO) es en sí mismo un programa de computadora. Y, es un programa muy especial, quizá el más complicado e importante en una computadora. El SO despierta a la computadora y hace que reconozca a la CPU, la memoria, el teclado, el sistema de vídeo y las unidades de disco.



Además, proporciona la facilidad para que los usuarios se comuniquen con la computadora y sirve de plataforma a partir de la cual se corran programas de aplicación.

INTERPRETES


Un intérprete es un software que recibe un programa en lenguaje de alto nivel, lo analiza y lo ejecuta. Para analizar el programa completo, va traduciendo sentencias de código y ejecutándolas si están bien, así hasta completar el programa origen.

Los intérpretes informáticos, al contrario que los compiladores, no generan un fichero ejecutable u otro programa equivalente en otro lenguaje, por lo que cada vez que se ejecuta el programa original debe pasar por la fase de análisis. Esto hace de los intérpretes más lentos que los compiladores, donde las fases de análisis y ejecución son independientes, por lo que solo se compila una vez y se ejecuta cuantas veces se quiera.

Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.

Así, mientras un intérprete toma las instrucciones del programa fuente y las traduce y ejecuta a lenguaje máquina una a una, un compilador realiza la traducción completa del programa fuente a código máquina, sin ejecutarlo, siendo posteriormente cuando se ejecute el programa una vez compilado.

VENTAJAS DEL INTÉRPRETE FRENTE AL COMPILADOR:

  • El programa se puede ejecutar de inmediato, sin esperar a ser compilado.
  • Puede ser interrumpido con facilidad.
  • puede ser rápidamente modificado y ejecutado nuevamente.
  • Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la compilación no permite la ejecución paso a paso del programa y con ello impide la edición seguimiento y depuración del programa.

DESVENTAJAS DEL INTÉRPRETE FRENTE AL COMPILADOR:

  • La ejecución es más lenta, pues cada instrucción debe ser traducida a código máquina tantas veces como sea ejecutada.
  • No son adecuados en la fase de explotación del programa ya que el proceso de interpretación se ha de repetir cada vez que se ejecuta el programa, mientras que con la compilación, una vez obtenido el programa en leguaje máquina éste puede ser ejecutado sin necesidad de compilarlo de nuevo.

Son lenguajes interpretados:

  • PHP
  • ASP (hasta la versión 3)
  • HTML
  • Java Script
  • Haskell
  • Prolog

COMPILADORES


Un compilador es aquel que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación haciendo un programa que la maquina lo interpretará, y por ende da (el segundo lenguaje de maquina), puede ser texto a esto se le conoce como compilación.

Un compilador es un programa que traduce el código de un programa en un lenguaje de alto nivel, y a otro lenguaje de maquina. Ósea que el programador hace un programa en un lenguaje mucho mas apropiado ha como piensa una persona, para luego traducirlo aun programa más manejable por una computadora.

El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de programaciónJohn Backus dirigió una investigación en IBM sobre un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la computadora IBM modelo 704.

El primer compilador de FORTRAN tardó 18 años-persona en realizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy influenciado por la máquina objeto en la que iba a ser implementado. Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido a que el periférico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas) no contaba correctamente los espacios en blanco.

El primer compilador autocontenido, es decir, capaz de compilar su propio código fuente fue el creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una práctica común escribir el compilador en el mismo lenguaje que este compila, aunque Pascal y C han sido alternativas muy usadas.

Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer compilador creado para un lenguaje tiene que o bien ser compilado por un compilador escrito en otro lenguaje o bien compilado al ejecutar el compilador en un intérprete.

PARTES DE UN COMPILADOR

Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto.
A-0, En 1950
  • Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales) y Análisis Semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).
  • Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible).
Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end:
  • Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio.
  • Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.
Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación y optimización del código dependiente de la máquina.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker).

TIPOS DE COMPILADORES:
  • Compiladores cruzados: generan código para un sistema distinto del que están funcionando.
  • Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.
  • Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.
  • Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.
  • Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.
PROCESO DE COMPILACIÓN:

Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dos pasos:

  • Paso 1: se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina).
  • Paso 2: se llama enlazado en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.
Los pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable.