Si buscas hosting web, dominios web, correos empresariales o crear páginas web gratis, ingresa a PaginaMX
Por otro lado, si buscas crear códigos qr online ingresa al Creador de Códigos QR más potente que existe


La descripción de un algoritmo usualmente se hace en tres niveles:
 
  1. Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
  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 o algún objeto capaz de llevar a cabo instrucciones.

 
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.


 

4.3.3.- IMPLEMENTACION DE MACROLLADAMAS DENTRO DE MACROS

Una macroinstrucción puede ser de la biblioteca del sistema o generada por el programador. En ambos casos, la definición del macroinstrucción consta  de una pseudo-instrucción de cabecera o de nombre de la macro y de un conjunto de instrucciones en lenguaje ensamblador o cuerpo de la macro.
La operación de sustituir el macroinstrucción por el conjunto correspondiente de instrucciones recibe el nombre de expansión del macroinstrucción.


Cuando un macroensamblador encuentra un «nombre de macro», introduce (durante el paso primero, gracias a una bifurcación) el nombre y el cuerpo en una tabla llamada tabla de definición de macros.
Durante el segundo paso cuando separa el campo de operación, busca primero el símbolo en la tabla de definición de macros. Si no lo encuentra, procede como en un ensamblador; pero si lo encuentra, el macroensamblador bifurca a la tabla y procesa la expansión de la macro, sustituyendo los parámetros formales que tenía la tabla por los parámetros de la instrucción.
 

 
5.- CARGADORES

5.1.- ESQUEMA DE CARGA

Un cargador es la parte de un sistema operativo que es responsable de cargar programas en memoria desde los ejecutables (por ejemplo, USB y cd). El cargador es usualmente una parte del núcleo del sistema operativo y es cargado al iniciar el sistema y permanece en memoria hasta que el sistema es reiniciado o apagado. Algunos sistemas operativos que tienen un núcleo paginable pueden tener el cargador en una parte paginable de la memoria, entonces a veces el cargador hace un intercambio de memoria.


Todos los sistemas operativos que soportan la carga de programas tienen cargadores. Algunos sistemas operativos empotrados de computadoras altamente especializadas corren un único programa y no existen capacidades de carga de programas, por lo tanto no usan cargadores.

 

5.1.1.- CARGADORES “COMPILE YTRANSFERENCIA”

Consiste en juntar en un mismo espacio de direcciones módulos que han sido compilados por aparte y resolver las referencias externas entre ellos.
El encadenamiento se puede realizar:

Al compilar: por ejemplo al utilizar las directivas de compilación #include en C, o uses en Pascal. En este caso el sistema operativo no se ve directamente involucrado en el proceso pues este es responsabilidad del compilador.


Después de compilar y antes de cargar: Cuando se tiene después de compilación un programa.obj y para su ejecución es necesario convertirlo en .exe. En estos casos se recurre a programas que se encargan de realizar el proceso, como por ejemplo link, plink86, etc.

Durante la ejecución. Es el caso del llamado a librerías del tipo .dll (dynamic link library) de Windows, en donde el encadenamiento se realiza durante el tiempo de ejecución.

Carga
La carga consiste en colocar un programa en memoria para que pueda ser ejecutado. Existen diferentes tipos de cargadores:

Compile and go: (compile y execute). Son los utilizados por los compiladores tipo Turbo (Pascal, C, Prolog, etc.), que realizan todas las etapas enumeradas previamente, cuando la compilación se realiza directamente a la memoria. La idea central consiste en que a medida que se va compilando se va escribiendo directamente sobre la memoria el código ejecutable y una vez se termine el proceso, se le da el control al programa compilado para su ejecución.


Cargadores Absolutos: Existen en sistemas en los que los compiladores generan código absoluto (no relocalizarla). De esta forma se obliga a que el programa siempre se deba carga en las mismas posiciones de memoria. Son relativamente simples pero no permiten tener multiprogramación.


Cargadores Relocalizados: permiten cargar el programa en cualquier sitio de la memoria. Para que esto sea posible, es necesario contar con algún mecanismo de relocalización.

Cargadores Dinámicos: Cargan los procedimientos del programa dinámicamente durante su ejecución. Son necesarios en el caso de presentarse recubrimientos.
Cargadores en memoria virtual.
 

5.1.3.- CARGADORES ABSOLUTOS

Como ya se mencionó, el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Si dichas instrucciones se almacenan siempre en el mismo espacio de memoria (cada vez que se ejecute el programa cargador), se dice que es un cargador absoluto.
 


5.1.4.- ENCADENAMIENTO DE SUBRUTINAS

Consiste en juntar en un mismo espacio de direcciones módulos que han sido compilados por aparte y resolver las referencias externas entre ellos.
Tipo de encadenamiento al compilar, por ejemplo al utilizar las directivas de compilación #include en lenguaje C o uses en PASCAL.
En este caso el Sistema Operativo no se ve directamente involucrado en el proceso pues este es responsabilidad del compilador.
 

3.1.5.- CARGADORES

Un cargador es un programa del sistema que realiza la función de carga, pero muchos cargadores también incluyen relocalización y ligado. Algunos sistemas tienen un ligador para realizar las operaciones de enlace, y un cargador separado para manejar la relocalización y la carga. Los procesos de ensamblado y carga están íntimamente relacionados.


Las funciones más importantes de un cargador son: colocar un programa objeto en la memoria e iniciar su ejecución. Si tenemos un cargador que no necesita realizar las funciones de ligado y relocalización de programas, su operación es muy simple, pues todas las funciones se realizan en un solo paso. Se revisa el registro de encabezamiento para comprobar se ha presentado el programa correcto para la carga (entrando en la memoria disponible).


A medida que se lee cada registro de texto, el código objeto que contiene pasa a la dirección de memoria indicada. Cuando se encuentra el registro de fin, el cargador salta a la dirección especificada para iniciar la ejecución del programa cargado.
Un programa objeto contiene instrucciones traducidas y valores de datos del programa fuente, y específica direcciones en memoria donde se cargarán estos elementos.


Carga, que lleva el programa objeto a la memoria para su ejecución.
Relocalización, que modifica el programa objeto de forma que puede cargarse en una dirección diferente de la localidad especificada originalmente.

 

5.1.8.- OTROS SISTEMAS DE CARGA

Un cargador de arranque (“bootloader" en inglés) es un programa sencillo (que no tiene la totalidad de las funcionalidades de un sistema operativo) diseñado exclusivamente para preparar todo lo que necesita el sistema operativo para funcionar. Normalmente se utilizan los cargadores de arranque multietapas, en los que varios programas pequeños se suman los unos a los otros, hasta que el último de ellos carga el sistema operativo.

En los ordenadores modernos, el proceso de arranque comienza con la CPU ejecutando los programas contenidos en la memoria ROM en una dirección predefinida (se configura la CPU para ejecutar este programa, sin ayuda externa, al encender el ordenador).

5.3.2.- ESPECIFICACION DE LA ESTRUCTURA DE DATOS

Una estructura de Datos es una colección de datos que pueden ser caracterizados por su organización y las operaciones que se definen en ella.
Los tipos de datos más frecuentes utilizados en los diferentes lenguajes de programación son:
Para ver el gráfico seleccione la opción "Descargar" del menú superior
Los tipos de datos simples pueden ser organizados en diferentes estructuras de datos: estáticas y dinámicas.


Las estructuras de datos estáticas:
Son aquellas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa.
Estas estructuras están implementadas en casi todos los lenguajes.
Su principal característica es que ocupan solo una casilla de memoria, por lo tanto una variable simple hace referencia a un único valor a la vez, dentro de este grupo de datos se encuentra: enteros, reales, caracteres, boléanos, enumerados y subrangos (los últimos no existen en algunos lenguajes de programación)


Las estructuras de datos dinámicas:
No tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas.
Mediante el uso de un tipo de datos especifico, denominado puntero, es posible construir estructuras de datos dinámicas que no son soportadas por la mayoría de los lenguajes, pero que en aquellos que si tienen estas características ofrecen soluciones eficaces y efectivas en la solución de problemas complejos.


Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria. Es decir un dato estructurado tiene varios componentes.


5.3.3.- FORMATO DE LA BASE DE DATOS

Una base de datos o banco de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su posterior uso. En este sentido, una biblioteca puede considerarse una base de datos compuesta en su mayoría por documentos y textos impresos en papel e indexados para su consulta.

Actualmente, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital (electrónico), y por ende se ha desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.

Existen programas denominados sistemas gestores de bases de datos, abreviado SGBD, que permiten almacenar y posteriormente acceder a los datos de forma rápida y estructurada. Las propiedades de estos SGBD, así como su utilización y administración, se estudian dentro del ámbito de la informática.

Las aplicaciones más usuales son para la gestión de empresas e instituciones públicas. También son ampliamente utilizadas en entornos científicos con el objeto de almacenar la información experimental. Aunque las bases de datos pueden contener muchos tipos de datos, algunos de ellos se encuentran protegidos por las leyes de varios países.
 
 

5.3.4.- ALGORITMOS

Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema. Método y notación en las distintas fórmulas del cálculo. El algoritmo constituye un método para resolver un problema mediante una secuencia de pasos a seguir. Dicha secuencia puede ser expresada en forma de diagrama de flujo con el fin de seguirlo de una forma más sencilla.

De acuerdo con el concepto anterior, el algoritmo podría estar incluido en la definición de programa de ordenador de la Ley de Propiedad Intelectual (TRLPI), al referirse a éste como toda secuencia de instrucciones o indicaciones destinadas a ser utilizadas, directa o indirectamente, en un sistema informático para realizar una función o una tarea o para obtener un resultado determinado, cualquiera que fuere su forma de expresión y fijación.
 

6. LENGUAJES DE LA PROGRAMACION

Un lenguaje de programación es un idioma artificial diseñado para expresar procesos que pueden ser llevados a cabo por máquinas como las computadoras.

Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.


Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.


También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:

·         El desarrollo lógico del programa para resolver un problema en particular.
·         Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
·         Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
·         Prueba y depuración del programa.
·         Desarrollo de la documentación.


Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten diseñar el contenido de los documentos).

Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.
 

6.1 importancia de los lenguajes de alto nivel



La importancia del lenguaje ensamblador radica principalmente que se trabajadirectamente con el microprocesador;

por lo cual se debe de conocer elfuncionamiento interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo puedenrealizar. Otro punto sería que los programas en ensamblador ocupan menosespacio en memoria.Permitirá adentrarnos al estudio del hardware de una PC.

Este lenguaje proporciona las herramientas para tomar control sobre todo lo que lacomputadora realiza físicamente.

Es importante como se puede ver, el Lenguaje Ensamblador es directamentetraducible al Lenguaje de Máquina, y viceversa; simplemente, es una abstracciónque facilita su uso para los seres humanos.



Por otro lado, la computadora noentiende directamente al Lenguaje Ensamblador; es necesario traducirle aLenguaje de Máquina. Pero, al ser tan directa la traducción, pronto aparecieron losprogramas Ensambladores, que son traductores que convierten el código fuente(en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje de Máquina.Surge como una necesidad de facilitar al programador la tarea de trabajar conlenguaje máquina sin perder el control directo con el hardware.VentajasProporciona un control absoluto sobre la PC.


Los programas en ensamblador sonrápidos y compactos

1.Velocidad.- Como trabaja directamente con el microprocesador al ejecutar unprograma, pues como este lenguaje es el mas cercano a la máquina lacomputadora lo procesa mas rápido.

2. Eficiencia de tamaño.- Un programa en ensamblador no ocupa muchoespacio en memoria porque no tiene que cargan librerías y demás como son loslenguajes de alto nivel

3. Flexibilidad.- Es flexible porque todo lo que puede hacerse con una máquina,puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de altonivel tienen en una u otra forma limitantes para explotar al máximo los recursos dela máquina.



O sea que en lenguaje ensamblador se pueden hacer tareasespecificas que en un lenguaje de alto nivel no se pueden llevar acabo porquetienen ciertas limitantes que no se lo permite.

Un programa escrito en el lenguaje ensamblador requiere considerablementemenos memoria y tiempo de ejecución que un programa escrito en los conocidoslenguajes de alto nivel, como Pascal y C.El lenguaje ensamblador da a un programador la capacidad de realizar tareasmuy técnicas que serian difíciles, si no es que imposibles de realizar en unlenguaje de alto nivel.El conocimiento del lenguaje ensamblador permite una comprensión de laarquitectura de la maquina que ningún lenguaje de alto nivel puede ofrecer.
 
DesventajasTiempo de programación .- Como es un lenguaje de bajo nivel requiere másinstrucciones para realizar el mismo proceso, en comparación con un lenguaje dealto nivel. Por otro lado, requiere de más cuidado por parte del programador, pueses propenso a que los errores de lógica se reflejen más fuertemente en laejecución.Programas fuente grandes .- Por las mismas razones que aumenta el tiempo,crecen los programas fuentes; simplemente requerimos más instruccionesprimitivas para describir procesos equivalentes.


Esto es una desventaja porquedificulta el mantenimiento de los programas, y nuevamente reduce la productividadde los programadores.Peligro de afectar recursos inesperadamente .- Que todo error que podamoscometer, o todo riesgo que podamos tener, podemos afectar los recursos de lamaquina, programar en este lenguaje lo más común que pueda pasar es que lamáquina se bloquee o se reinicialize.


Porque con este lenguaje es perfectamenteposible (y sencillo) realizar secuencias de instrucciones inválidas, quenormalmente no aparecen al usar un lenguaje de alto nivel.Falta de portabilidad.- Porque para cada máquina existe un lenguaje ensamblador;por ello, evidentemente no es una selección apropiada de lenguaje cuandodeseamos codificar en una máquina y luego llevar los programas a otros sistemasoperativos o modelos de computadoras.

 

6.2 peculiaridades de un lenguaje de alto nivel



Se encuentran totalmente vinculados a la estructura del computador.
 Están diseñados para sacar el máximo partido de las características físicas del
computador.
 Características:
•Dependencia absoluta de la arquitectura del computador.
•Imposibilidad de transportar programas entre distintas máquinas, salvo que
sean de la misma familia o compatibles.
•Instrucciones poco potentes.
•Programas muy largos.
•Códigos de operación, datos y referencias en binario.
 Tipos:
•Lenguaje máquina.
ƒCódigos de operación, datos y referencias en binario.
ƒDirectamente interpretable y ejecutable por la circuitería del computador.
•Lenguaje ensamblador.

 

6.3 tipos de datos y estructura de datos

   6.3.1 series de caracteres

Una serie de caracteres es una secuencia de bytes. La longitud de la serie es el número de bytes en la secuencia. Si la longitud es cero, el valor se denomina la serie vacía. Este valor no debe confundirse con el valor nulo.

Serie de caracteres de longitud fija (CHAR)

Todos los valores de una columna de series de longitud fija tienen la misma longitud, que está determinada por el atributo de longitud de la columna. El atributo de longitud debe estar entre 1 y 254, inclusive.

Series de caracteres de longitud variable

Existen dos tipos de series de caracteres de longitud variable:
Un valor VARCHAR puede tener una longitud máxima de 32.672 bytes.
Un valor CLOB (objeto grande de caracteres) puede tener una longitud máxima de 2 gigabytes menos 1 byte (2.147.483.647 bytes). Un CLOB se utiliza para almacenar datos basados en caracteres SBCS o mixtos (SBCS y MBCS) (como, por ejemplo, documentos grabados con un solo juego de caracteres) y, por lo tanto, tiene una página de códigos SBCS o mixta asociada).

Se aplican restricciones especiales a las expresiones que dan como resultado un valor de tipo de datos CLOB y a columnas de tipo estructurado; estas expresiones y columnas no se permiten en:
Una lista SELECT precedida por la cláusula DISTINCT
Una cláusula GROUP BY
Una cláusula ORDER BY
Una subselección de un operador de conjunto que no sea UNION ALL
Un predicado BETWEEN o IN básico y cuantificado
Una función agregada
Las funciones escalares VARGRAPHIC, TRANSLATE y de fecha y hora
El operando patrón de un predicado LIKE o el operando de serie de búsqueda de una función POSSTR
La representación en una serie de un valor de fecha y hora.

Las funciones del esquema SYSFUN que toman VARCHAR como argumento no aceptarán las VARCHAR que tengan más de 4.000 bytes de longitud como argumento. Sin embargo, muchas de estas funciones también pueden tener una signatura alternativa que acepte un CLOB (1M). Para estas funciones, el usuario puede convertir explícitamente las series VARCHAR mayores que 4.000 en datos CLOB y, a continuación, volver a convertir el resultado en datos VARCHAR de la longitud deseada.

Las series de caracteres terminadas en nulo que se encuentran en C se manejan de manera diferente, dependiendo del nivel de estándares de la opción de precompilación.
Cada serie de caracteres se define con más detalle como:

Datos de bit: Datos que no están asociado con una página de códigos.
Datos de juego de caracteres de un solo byte (SBCS): Datos en los que cada carácter está representado por un solo byte.
Datos mixtos: Datos que pueden contener una mezcla de caracteres de un juego de caracteres de un solo byte y de un juego de caracteres de múltiples bytes (MBCS).

Nota: El tipo de datos LONG VARCHAR sigue estando soportado pero ha quedado obsoleto, no es recomendable y puede eliminarse en un release futuro.
6.3.2 Series de bits
El método más sencillo de representación son los números naturales. Por ejemplo, si tengo el número 85 en decimal, solo tengo que llevarlo a binario y obtengo una serie de unos y ceros:

1010101 = 85 en binario

Cada dígito (un cero o un uno) de este número se llama bit. Java tiene una serie de operadores capaces de manipular estos dígitos, son los operadores de bits.



Para operar a nivel de bit es necesario tomar toda la longitud predefinida para el tipo de dato. Estamos acostumbrados a desechar los ceros a la izquierda en nuestra representación de números. Pero aquí es importante. Si trabajamos una variable de tipo short con un valor de 3, está representada de la siguiente manera:

0000000000000011

Aquí los 16 bits de un short se tienen en cuenta.

6.3.3 Operadores booleanos


Los operadores booleanos (AND, NOT, OR, XOR) localizan registros que contienen los términos coincidentes en uno de los campos especificados o en todos los campos especificados. Utilizar operadores booleanos para conectar palabras o frases entre más de un campo de texto, o utilizar operadores booleanos para conectar palabras o frases dentro de un campo de texto.
Utilizar el operador AND para localizar registros que contengan todos los términos de búsqueda especificados. Por ejemplo, si se busca por "perros AND gatos", la biblioteca-e localiza registros que contengan todos los términos especificados.
Utilizar el operador OR para localizar registros que contengan cualquiera o todos los términos especificados.


Por ejemplo, si se busca por "perros OR gatos", la biblioteca-e localiza registros que contengan el primer término o el segundo.
Utilizar el operador NOT para localizar registros que contengan el primer término de búsqueda pero no el segundo. Por ejemplo, si se busca por "perros NOT gatos", la biblioteca-e localiza registros que contienen el primer término pero no el segundo.
Utilizar el operador XOR (o exclusivo) para localizar registros que contengan cualquiera de los términos especificados pero no todos los términos especificados. Por ejemplo, si se busca por "perros XOR gatos", la biblioteca-e localiza registros que contienen cualquiera de los términos especificados pero no todos los términos especificados.

6.3.4 Estructura de datos


Una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un sistema.
Una estructura de datos define la organización e interrelación de estos y un conjunto de operaciones que se pueden realizar sobre ellos.

Las operaciones básicas son:

Alta, adicionar un nuevo valor a la estructura.
Baja, borrar un valor de la estructura.
Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma secuencial o binario (siempre y cuando los datos estén ordenados).
 
Otras operaciones que se pueden realizar son:
Ordenamiento, de los elementos pertenecientes a la estructura.
Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas.
 
Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos.
 

6.4 Asignación de almacenamiento y alcance de nombres

6.4.1 Clase de almacenamiento



Existen los modificadores de tipo o clases de almacenamiento que permiten modificar el ámbito y la permanencia de una variable dentro de un programa. Existen cuatro modificadores de tipo, automático, externo, estático y registró, que se corresponden con las palabras reservadas auto, extern, static y register, respectivamente.

6.4.2 Estructura de bloques


El diagrama de bloques es la representación gráfica del funcionamiento interno de un sistema, que se hace mediante bloques y sus relaciones, y que, además, definen la organización de todo el proceso interno, sus entradas y sus salidas.

Un diagrama de bloques de procesos de producción es un diagrama utilizado para indicar la manera en la que se elabora cierto producto alimenticio, especificando la materia prima, la cantidad de procesos y la forma en la que se presenta el producto terminado.

Un diagrama de bloques de modelo matemático es el utilizado para representar el control de sistemas físicos (o reales) mediante un modelo matemático, en el cual, intervienen gran cantidad de variables que se relacionan en todo el proceso de producción. El modelo matemático que representa un sistema físico de alguna complejidad conlleva a la abstracción entre la relación de cada una de sus partes, y que conducen a la pérdida del concepto global. En ingeniería de control, se han desarrollado una representación gráfica de las partes de un sistema y sus interacciones. Luego de la representación gráfica del modelo matemático, se puede encontrar la relación entre la entrada y la salida del proceso del sistema.
 

6.5 Flexibilidad de acceso

6.5.1 Indicador



El indicador de programación se usa para definir si hay que ejecutar el programa del ciclo de fabricación para el cálculo de fechas extremas (fechas planificadas) para materiales fabricados en la empresa. El programa del ciclo de fabricación calcula las fechas de inicio y final para la fabricación. El sistema sólo crea la necesidad de capacidad si se ha ejecutado el programa del ciclo de fabricación.

6.6.1 Procedimientos

La modularidad es generalmente deseable, sobre todo en programas grandes y complejos. Las entradas se suelen especificar sintácticamente en forma de argumentos y los resultados entregados como valores de retorno.

Alcance es otra técnica que ayuda a mantener los procedimientos fuertemente modulares. Evita que el procedimiento de acceso a las variables de otros procedimientos, incluyendo los casos anteriores de sí mismo, sin la autorización explícita.

Los procedimientos menos modulares, a menudo usados en los programas de pequeñas o escritas rápidamente, tienden a interactuar con un gran número de variables en el entorno de ejecución, que otros procedimientos también se pueden modificar.

Debido a la posibilidad de especificar una interfaz simple, para ser autónomo, y para ser reutilizados, los procedimientos son un vehículo ideal para hacer piezas de código escritas por diferentes personas o en diferentes grupos, incluyendo a través de bibliotecas de programación.


6.6.2 Reclusión

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitar el concepto de estado del cómputo. La secuencia de computaciones llevadas a cabo por el programa se rige única y exclusivamente por la reescritura de definiciones más amplias a otras cada vez más concretas y definidas, usando lo que se denominan "definiciones dirigidas".
 

6.7.2 Señales

La E/S asíncrona envía la señal SIGIO al proceso de usuario cuando ocurre el evento de E/S. En este caso esto significa cuando la gente mueve el ratón. La señal SIGIO.

 

8.1.1 Reconocimiento de los elementos básicos


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.


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.

 

8.1.2 Reconocimiento de las unidades sintácticas e interpretación del significado


En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.

La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:
Cualquier identificador es una expresión.
Cualquier número es una expresión.
Si expresión  y expresión son expresiones, entonces también lo son:
expresión + expresión
expresión * expresión
(expresión )

Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a otras expresiones.

La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra.

Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador.

Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.


8.1.3 Formas intermedias



GENERACION CODIGO INTERMEDIO: Los compiladores deben analizar y generar secuencias de instrucciones iguales a un programa fuente con el fin de aprovechar mucho más la memoria del equipo, en esta etapa se genera un código con el fin de que este sea optimizando en la siguiente etapa.
 


8.2.1 Fase léxica


El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.

Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, se usan principalmente los autómatas finitos que acepten expresiones regulares. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.


8.2.2 Fase de interpretación


En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.


8.2.3 Optimización


La fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un intérprete puede optimizar el código objeto). Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados «compiladores optimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.
 


8.2.4 Asignación del almacenamiento


La asignación de memoria consiste en el proceso de asignar memoria para propósitos específicos, ya sea en tiempo de compilación o de ejecución. Si es en tiempo de compilación es estática, si es en tiempo de ejecución es dinámica y si son variables locales a un grupo de sentencias se denomina automática.
 


8.2.5 Generación del código


Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tres direcciones» que es como el lenguaje ensamblador de una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operando. Esta representación intermedia tiene varias propiedades:
Primera. Cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación, por tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse las operaciones.
Segunda. El traductor debe generar un nombre temporal para guardar los valores calculados por cada instrucción.
Tercera. Algunas instrucciones de «tres direcciones» tienen menos de tres operando, por ejemplo, la asignación.


8.2.6 Fase de ensamble


El ensamblador traduce en instrucciones de lenguaje de máquina, empaquetándolas en una forma conocida como programa objeto relocalizable, y almacena el resultado en el archivo objeto. El archivo es un archivo binario cuyos bytes tienen codificados las instrucciones en lenguaje de máquina en vez de caracteres. SI quisiéramos visualizar con un editor de texto, aparecerían solo caracteres especiales.

 


8.2.7 Pasadas de un compilador


El compilador traduce el archivo texto de entrada al archivo texto, el cual contiene un programa en lenguaje ensamblador. Normalmente, cada declaración en un programa en lenguaje ensamblador describe exactamente una instrucción en lenguaje de máquina de bajo nivel en forma de archivo texto estándar. El lenguaje ensamblador es útil porque permite un lenguaje de salida común para diferentes compiladores para diferentes lenguajes de programación de alto nivel. Por ejemplo, los compiladores de C y Fortran generan archivos de salida en el mismo lenguaje ensamblador.
8.3.2 Implementación
 
Primero se aplica el ensamblamiento y la propagación de constantes.
Después se reordena el árbol sintáctico hasta obtener la forma normal.
Se inicia la eliminación de las sobreexpresiones redundantes.
Hay que considerar las asignaciones que pueden convertir una sobreexpresión redundante en no redundante. Ejemplo:
 
 
Ejemplo de eliminación de sobreexpresiones
J=2*D+3
D=D*2
J=J+D
 


8.5.1 Almacenamiento estático


Para especificar este tipo de almacenamiento se usa el especificador static.


Sintaxis:
static ;
static ();

Cuando se usa en la declaración de objetos, este especificador hace que se asigne una dirección de memoria fija para el objeto mientras el programa se esté ejecutando. Es decir, su ámbito temporal es total. En cuanto al ámbito de acceso conserva el que le corresponde según el punto del código en que aparezca la declaración.


Debido a que el objeto tiene una posición de memoria fija, su valor permanece, aunque se trate de un objeto declarado de forma local, entre distintas reentradas en el ámbito del objeto. Por ejemplo si se trata de un objeto local a una función, el valor del objeto se mantiene entre distintas llamadas a la función. Hay que tener en cuenta que los objetos estáticos no inicializados toman un valor nulo. Por el contrario, si se le da un valor inicial a una variable estática, la asignación sólo afecta a la primera vez que es declarada.
Este tipo de almacenamiento se usa con el fin de que las variables locales de una función conserven su valor entre distintas llamadas sucesivas a la misma. Las variables estáticas tienen un ámbito local con respecto a su accesibilidad, pero temporalmente son como las variables externas.

Parecería lógico que, análogamente a lo que sucede con el especificador auto, no tenga sentido declarar objetos globales como estáticos, ya que lo son por defecto. Sin embargo, el especificador static tiene un significado distinto cuando se aplica a objetos globales. En ese caso indica que el objeto no es accesible desde otros ficheros fuente del programa.
En el caso de las funciones, el significado es el mismo, las funciones estáticas sólo son accesibles desde el fichero en que están declaradas.

 


8.5.2 Almacenamiento automático




Para especificar el tipo de almacenamiento automático se usa el especificador auto.

Sirve para declarar variables automáticas o locales. Es el modificador por defecto cuando se declaran variables u objetos locales, es decir, si no se especifica ningún modificador, se creará una variable automática.
Estas variables se crean durante la ejecución, y se elige el tipo de memoria a utilizar en función del ámbito temporal de la variable. Una vez cumplido el ámbito, la variable es destruida. Es decir, una variable automática local de una función se creará cuando sea declarada, y se destruirá al terminar la función. Una variable local automática de un bucle será destruida cuando el bucle termine.

Debido a que estos objetos serán creados y destruidos cada vez que sea necesario, usándose, en general, diferentes posiciones de memoria, su valor se perderá cada vez que sean creadas, perdiéndose el valor previo en cada caso. Por supuesto, no es posible crear variables automáticas globales, ya que son conceptos contradictorios.
 
 
 
 


8.5.3 Almacenamiento controlado externo


Para especificar este tipo de almacenamiento se usa la palabra externo.
Sintaxis:
extern ;
[extern] ();

De nuevo tenemos un especificador que se puede aplicar a funciones y a objetos. O más precisamente, a prototipos de funciones y a declaraciones de objetos.

Este especificador se usa para indicar que el almacenamiento y valor de una variable o la definición de una función están definidos en otro módulo o fichero fuente. Las funciones declaradas con extern son visibles por todos los ficheros fuente del programa, salvo que (como vimos más arriba) se defina la función como static.

El especificador extern sólo puede usarse con objetos y funciones globales. En el caso de las funciones prototipo, el especificador extern es opcional. Las declaraciones de prototipos son externas por defecto. Este especificador lo usaremos con programas que usen varios ficheros fuente, que será lo más normal con aplicaciones que no sean ejemplos o aplicaciones simples.
 


8.5.4 Almacenamiento controlado interno        


   
Para especificar este tipo de almacenamiento se usa el especificador register.


Sintaxis:
register ;

Indica al compilador una preferencia para que el objeto se almacene en un registro de la CPU, si es posible, con el fin de optimizar su acceso, consiguiendo una mayor velocidad de ejecución.

Los datos declarados con el especificador register tienen el mismo ámbito que las automáticas. De hecho, sólo se puede usar este especificador con parámetros y con objetos locales.

El compilador puede ignorar la petición de almacenamiento en registro, que se acepte o no estará basado en el análisis que realice el compilador sobre cómo se usa la variable.

Un objeto de este tipo no reside en memoria, y por lo tanto no tiene una dirección de memoria, es decir, no es posible obtener una referencia a un objeto declarado con el tipo de almacenamiento en registro. Se puede usar un registro para almacenar objetos de tipo char, int, float, punteros. En general, objetos que quepan en un registro.

 


8.5.9 Interrupciones


Interrupción (también conocida como interrupción de hardware o petición de interrupción) es una señal recibida por el procesador de un ordenador, indicando que debe "interrumpir" el curso de ejecución actual y pasar a ejecutar código específico para tratar esta situación.

Una interrupción es una suspensión temporal de la ejecución de un proceso, para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa (generalmente perteneciente al sistema operativo, o al BIOS). Luego de finalizada dicha subrutina, se reanuda la ejecución del programa.
Las interrupciones surgen de las necesidades que tienen los dispositivos periféricos de enviar información al procesador principal de un sistema de computación.


8.5.10 Indicadores (pointers)


El indicador de programación se usa para definir si hay que ejecutar el programa del ciclo de fabricación para el cálculo de fechas extremas (fechas planificadas) para materiales fabricados en la empresa. El programa del ciclo de fabricación calcula las fechas de inicio y final para la fabricación. El sistema sólo crea la necesidad de capacidad si se ha ejecutado el programa del ciclo de fabricación.





 
© 2025