stringtranslate.com

Programa de computadora

Código fuente de un programa informático escrito en lenguaje JavaScript.

Un programa de computadora es una secuencia o conjunto [a] de instrucciones en un lenguaje de programación para que las ejecute una computadora . Es un componente del software , que también incluye documentación y otros componentes intangibles. [1]

Un programa de computadora en su forma legible por humanos se llama código fuente . El código fuente necesita otro programa informático para ejecutarse porque las computadoras sólo pueden ejecutar las instrucciones nativas de su máquina . Por lo tanto, el código fuente se puede traducir a instrucciones de máquina utilizando un compilador escrito para el lenguaje. ( Los programas en lenguaje ensamblador se traducen usando un ensamblador ). El archivo resultante se llama ejecutable . Alternativamente, el código fuente puede ejecutarse dentro de un intérprete escrito para el idioma. [2]

Si se solicita la ejecución del ejecutable, el sistema operativo lo carga en la memoria e inicia un proceso . [3] La unidad central de procesamiento pronto cambiará a este proceso para poder buscar, decodificar y luego ejecutar cada instrucción de la máquina. [4]

Si se solicita la ejecución del código fuente, el sistema operativo carga el intérprete correspondiente en la memoria e inicia un proceso. Luego, el intérprete carga el código fuente en la memoria para traducir y ejecutar cada declaración . Ejecutar el código fuente es más lento que ejecutar un ejecutable. [5] [b] Además, el intérprete debe estar instalado en el ordenador.

Ejemplo de programa informático

El mensaje "¡Hola mundo!" El programa se utiliza para ilustrar la sintaxis básica de un lenguaje . La sintaxis del lenguaje BASIC (1964) se limitó intencionalmente para que el lenguaje fuera fácil de aprender. [6] Por ejemplo, las variables no se declaran antes de usarse. [7] Además, las variables se inicializan automáticamente a cero. [7] Aquí hay un programa de computadora de ejemplo, en Básico, para promediar una lista de números: [8]

10 ENTRADA "¿Cuántos números promediar?" , A 20 FOR I = 1 TO A 30 INPUT "Ingrese número:" , B 40 LET C = C + B 50 NEXT I 60 LET D = C / A 70 PRINT "El promedio es" , D 80 END                            

Una vez que se aprende la mecánica de la programación informática básica, se encuentran disponibles lenguajes más sofisticados y potentes para construir sistemas informáticos de gran tamaño. [9]

Historia

Las mejoras en el desarrollo de software son el resultado de mejoras en el hardware informático . En cada etapa de la historia del hardware, la tarea de la programación informática cambió drásticamente.

Motor analítico

Descripción de Lovelace de la Nota G

En 1837, el telar de Jacquard inspiró a Charles Babbage a intentar construir la máquina analítica . [10] Los nombres de los componentes del dispositivo de cálculo fueron tomados de la industria textil. En la industria textil, el hilo se traía del almacén para ser molido. El dispositivo tenía un "almacenamiento" que consistía en una memoria para almacenar 1.000 números de 50 dígitos decimales cada uno. [11] Los números de la "tienda" se transfirieron a la "fábrica" ​​para su procesamiento. Fue programado utilizando dos juegos de tarjetas perforadas. Un conjunto dirigió la operación y el otro conjunto ingresó las variables. [10] [12] Sin embargo, las miles de ruedas dentadas y engranajes nunca funcionaron completamente juntos. [13]

Ada Lovelace trabajó para Charles Babbage para crear una descripción de la máquina analítica (1843). [14] La descripción contenía la Nota G que detallaba completamente un método para calcular los números de Bernoulli utilizando el motor analítico. Esta nota es reconocida por algunos historiadores como el primer programa informático del mundo . [13]

Máquina universal de Turing

En 1936, Alan Turing presentó la máquina universal de Turing , un dispositivo teórico que puede modelar todos los cálculos. [15] Es una máquina de estados finitos que tiene una cinta de lectura/escritura infinitamente larga. La máquina puede mover la cinta hacia adelante y hacia atrás, cambiando su contenido mientras realiza un algoritmo . La máquina arranca en el estado inicial, sigue una secuencia de pasos y se detiene cuando llega al estado de parada. [16] Todas las computadoras actuales son Turing completas . [17]

ENIAC

Glenn A. Beck cambiando un tubo en ENIAC

El integrador y ordenador numérico electrónico (ENIAC) se construyó entre julio de 1943 y el otoño de 1945. Era un ordenador Turing completo de uso general que utilizaba 17.468 tubos de vacío para crear los circuitos . En esencia, era una serie de Pascalinas conectadas entre sí. [18] Sus 40 unidades pesaban 30 toneladas, ocupaban 1.800 pies cuadrados (167 m 2 ) y consumían 650 dólares por hora ( en moneda de la década de 1940 ) en electricidad cuando estaban inactivas. [18] Tenía 20 acumuladores de base 10 . La programación del ENIAC llevó hasta dos meses. [18] Tres mesas funcionales tenían ruedas y debían trasladarse hasta paneles funcionales fijos. Las mesas de funciones se conectaban a paneles de funciones conectando pesados ​​cables negros a tableros de enchufes . Cada mesa de funciones tenía 728 perillas giratorias. La programación del ENIAC también implicó configurar algunos de los 3.000 interruptores. Depurar un programa llevó una semana. [19] Funcionó desde 1947 hasta 1955 en Aberdeen Proving Ground , calculando parámetros de bombas de hidrógeno, prediciendo patrones climáticos y produciendo tablas de tiro para apuntar cañones de artillería. [20]

Computadoras con programas almacenados

En lugar de enchufar cables y accionar interruptores, una computadora con programas almacenados carga sus instrucciones en la memoria del mismo modo que carga sus datos en la memoria. [21] Como resultado, la computadora podría programarse rápidamente y realizar cálculos a velocidades muy rápidas. [22] Presper Eckert y John Mauchly construyeron el ENIAC. Los dos ingenieros introdujeron el concepto de programa almacenado en un memorando de tres páginas fechado en febrero de 1944. [23] Más tarde, en septiembre de 1944, John von Neumann comenzó a trabajar en el proyecto ENIAC. El 30 de junio de 1945, von Neumann publicó el primer borrador de un informe sobre el EDVAC , que equiparaba las estructuras del ordenador con las estructuras del cerebro humano. [22] El diseño se conoció como la arquitectura von Neumann . La arquitectura se implementó simultáneamente en las construcciones de las computadoras EDVAC y EDSAC en 1949. [24]

El IBM System/360 (1964) era una familia de computadoras, cada una con la misma arquitectura de conjunto de instrucciones . El Modelo 20 era el más pequeño y menos costoso. Los clientes podrían actualizar y conservar el mismo software de aplicación . [25] El modelo 195 era el más premium. Cada modelo System/360 presentaba multiprogramación [25] , es decir, múltiples procesos en la memoria a la vez. Cuando un proceso estaba esperando entrada/salida , otro podía calcular.

IBM planeó que cada modelo se programara usando PL/1 . [26] Se formó un comité que incluía programadores de COBOL , Fortran y ALGOL . El propósito era desarrollar un lenguaje que fuera integral, fácil de usar, extensible y que reemplazara a Cobol y Fortran. [26] El resultado fue un lenguaje grande y complejo que tomó mucho tiempo para compilarse . [27]

Interruptores para entrada manual en un Data General Nova 3, fabricado a mediados de la década de 1970

Las computadoras fabricadas hasta la década de 1970 tenían interruptores en el panel frontal para programación manual. [28] El programa de computadora fue escrito en papel como referencia. Una instrucción estaba representada por una configuración de ajustes de encendido/apagado. Después de establecer la configuración, se presionó un botón de ejecución. Luego se repitió este proceso. Los programas de computadora también se ingresaban automáticamente mediante cinta de papel , tarjetas perforadas o cinta magnética . Después de cargar el medio, la dirección inicial se configuró mediante interruptores y se presionó el botón de ejecución. [28]

Integración a muy gran escala

Una matriz de circuito integrado VLSI

Un hito importante en el desarrollo de software fue la invención del circuito de integración a muy gran escala (VLSI) (1964). [29] Después de la Segunda Guerra Mundial , la tecnología basada en tubos fue reemplazada por transistores de contacto puntual (1947) y transistores de unión bipolar (finales de la década de 1950) montados en una placa de circuito . [29] Durante la década de 1960 , la industria aeroespacial reemplazó la placa de circuito por un chip de circuito integrado . [29]

Robert Noyce , cofundador de Fairchild Semiconductor (1957) y de Intel (1968), logró una mejora tecnológica al perfeccionar la producción de transistores de efecto de campo (1963). [30] El objetivo es alterar la resistividad eléctrica y la conductividad de una unión semiconductora . En primer lugar, los minerales de silicato naturales se convierten en barras de polisilicio mediante el proceso Siemens . [31] El proceso de Czochralski convierte luego las varillas en un silicio monocristalino , cristal boule . [32] Luego, el cristal se corta en rodajas finas para formar un sustrato de oblea . Luego, el proceso planar de fotolitografía integra transistores, condensadores , diodos y resistencias unipolares en la oblea para construir una matriz de transistores semiconductores de óxido metálico (MOS). [33] [34] El transistor MOS es el componente principal de los chips de circuitos integrados . [30]

Originalmente, los chips de circuitos integrados tenían su función establecida durante la fabricación. Durante la década de 1960, el control del flujo eléctrico migró a la programación de una matriz de memoria de sólo lectura (ROM). La matriz parecía una serie bidimensional de fusibles. [29] El proceso para incrustar instrucciones en la matriz consistió en quemar las conexiones innecesarias. [29] Había tantas conexiones que los programadores de firmware escribieron un programa de computadora en otro chip para supervisar la grabación. [29] La tecnología pasó a ser conocida como ROM programable . En 1971, Intel instaló el programa informático en el chip y lo llamó microprocesador Intel 4004 . [35]

La CPU System/360 (1964) de IBM no era un microprocesador.

Los términos microprocesador y unidad central de procesamiento (CPU) ahora se usan indistintamente. Sin embargo, las CPU son anteriores a los microprocesadores. Por ejemplo, el IBM System/360 (1964) tenía una CPU hecha de placas de circuito que contenían componentes discretos sobre sustratos cerámicos . [36]

Estado de la bolsa 8008

Representación artística de la microcomputadora Intel 8008 de la Universidad Estatal de Sacramento (1972)

El Intel 4004 (1971) era un microprocesador de 4 bits diseñado para ejecutar la calculadora Busicom . Cinco meses después de su lanzamiento, Intel lanzó el Intel 8008 , un microprocesador de 8 bits. Bill Pentz dirigió un equipo en Sacramento State para construir la primera microcomputadora utilizando Intel 8008: la Sac State 8008 (1972). [37] Su propósito era almacenar registros médicos de pacientes. La computadora admitía un sistema operativo de disco para ejecutar una unidad de disco duro Memorex de 3 megabytes . [29] Tenía una pantalla a color y un teclado empaquetados en una sola consola. El sistema operativo del disco se programó utilizando el lenguaje ensamblador básico (BAL) de IBM . La aplicación de historias clínicas se programó mediante un intérprete BÁSICO . [29] Sin embargo, la computadora fue un callejón sin salida evolutivamente porque era extremadamente costosa. Además, fue construido en el laboratorio de una universidad pública para un propósito específico. [37] No obstante, el proyecto contribuyó al desarrollo del conjunto de instrucciones Intel 8080 (1974) . [29]

serie x86

La computadora personal IBM original (1981) utilizaba un microprocesador Intel 8088.

En 1978, el entorno de desarrollo de software moderno comenzó cuando Intel actualizó el Intel 8080 al Intel 8086 . Intel simplificó el Intel 8086 para fabricar el Intel 8088 más económico . [38] IBM adoptó el Intel 8088 cuando ingresó al mercado de las computadoras personales (1981). A medida que aumentó la demanda de computadoras personales por parte de los consumidores , también lo hizo el desarrollo de microprocesadores de Intel. La sucesión de desarrollo se conoce como serie x86 . El lenguaje ensamblador x86 es una familia de instrucciones de máquina compatibles con versiones anteriores . Las instrucciones de la máquina creadas en microprocesadores anteriores se conservaron durante las actualizaciones de los microprocesadores. Esto permitió a los consumidores comprar computadoras nuevas sin tener que comprar software de aplicación nuevo . Las principales categorías de instrucciones son: [c]

Cambiando el entorno de programación

El DEC VT100 (1978) fue un terminal informático muy utilizado .

Los circuitos VLSI permitieron que el entorno de programación avanzara desde una terminal de computadora (hasta la década de 1990) a una computadora con interfaz gráfica de usuario (GUI). Los terminales de computadora limitaban a los programadores a un único shell que se ejecutaba en un entorno de línea de comandos . Durante la década de 1970, la edición del código fuente en pantalla completa se hizo posible a través de una interfaz de usuario basada en texto . Independientemente de la tecnología disponible, el objetivo es programar en un lenguaje de programación .

Paradigmas y lenguajes de programación.

Las características del lenguaje de programación existen para proporcionar bloques de construcción que se combinarán para expresar ideales de programación. [39] Idealmente, un lenguaje de programación debería: [39]

El estilo de programación de un lenguaje de programación para proporcionar estos componentes básicos se puede clasificar en paradigmas de programación . [40] Por ejemplo, diferentes paradigmas pueden diferenciar: [40]

Cada uno de estos estilos de programación ha contribuido a la síntesis de diferentes lenguajes de programación . [40]

Un lenguaje de programación es un conjunto de palabras clave , símbolos , identificadores y reglas mediante las cuales los programadores pueden comunicar instrucciones a la computadora. [41] Siguen un conjunto de reglas llamado sintaxis . [41]

Los lenguajes de programación obtienen su base de los lenguajes formales . [42] El propósito de definir una solución en términos de su lenguaje formal es generar un algoritmo para resolver el problema subrayado. [42] Un algoritmo es una secuencia de instrucciones simples que resuelven un problema. [43]

Generaciones de lenguaje de programación.

La evolución del lenguaje de programación comenzó cuando la EDSAC (1949) utilizó el primer programa informático almacenado en su arquitectura von Neumann . [44] La programación del EDSAC se produjo en la primera generación del lenguaje de programación .

  • La estructura básica de una declaración en lenguaje ensamblador es una etiqueta, operación , operando y comentario. [47]
  • Las etiquetas permiten al programador trabajar con nombres de variables . Posteriormente, el ensamblador traducirá las etiquetas a direcciones de memoria física .
  • Las operaciones permiten al programador trabajar con mnemónicos. Posteriormente, el ensamblador traducirá los mnemotécnicos en números de instrucción.
  • Los operandos le dicen al ensamblador qué datos procesará la operación.
  • Los comentarios permiten al programador articular una narrativa porque las instrucciones por sí solas son vagas.
La característica clave de un programa en lenguaje ensamblador es que forma un mapeo uno a uno con su correspondiente objetivo en lenguaje de máquina. [48]

Idiomas imperativos

Un programa de computadora escrito en un lenguaje imperativo.

Los lenguajes imperativos especifican un algoritmo secuencial utilizando declaraciones , expresiones y declaraciones : [52]

fortran

FORTRAN (1958) fue presentado como "El sistema de traducción de fórmulas matemáticas de IBM". Fue diseñado para cálculos científicos, sin instalaciones de manipulación de hilos . Junto con declaraciones , expresiones y declaraciones , admitía:

Tuvo éxito porque:

Sin embargo, los proveedores que no son de IBM también escribieron compiladores de Fortran, pero con una sintaxis que probablemente fallaría en el compilador de IBM. [54] El Instituto Nacional Estadounidense de Estándares (ANSI) desarrolló el primer estándar Fortran en 1966. En 1978, Fortran 77 se convirtió en el estándar hasta 1991. Fortran 90 admite:

COBOL

COBOL (1959) significa "Lenguaje común orientado a los negocios". Símbolos manipulados por Fortran. Pronto se dio cuenta de que los símbolos no tenían por qué ser números, por lo que se introdujeron cadenas . [55] El Departamento de Defensa de EE. UU. influyó en el desarrollo de COBOL, siendo Grace Hopper una de las principales contribuyentes. Las declaraciones eran parecidas al inglés y detalladas. El objetivo era diseñar un lenguaje para que los directivos pudieran leer los programas. Sin embargo, la falta de declaraciones estructuradas obstaculizó este objetivo. [56]

El desarrollo de COBOL estuvo estrictamente controlado, por lo que no surgieron dialectos que requirieran estándares ANSI. Como consecuencia, no se modificó durante 15 años, hasta 1974. La versión de la década de 1990 sí realizó cambios importantes, como la programación orientada a objetos . [56]

algol

ALGOL (1960) significa "Lenguaje ALGOrítmico". Tuvo una profunda influencia en el diseño del lenguaje de programación. [57] Surgiendo de un comité de expertos en lenguajes de programación europeos y estadounidenses, utilizaba notación matemática estándar y tenía un diseño estructurado y legible. Algol fue el primero en definir su sintaxis utilizando la forma Backus-Naur . [57] Esto condujo a compiladores dirigidos por sintaxis . Agregó características como:

Los descendientes directos de Algol incluyen a Pascal , Modula-2 , Ada , Delphi y Oberon en una rama. En otra rama, los descendientes incluyen C , C++ y Java . [57]

Básico

BASIC (1964) significa "Código de instrucción simbólica multiusos para principiantes". Fue desarrollado en Dartmouth College para que todos sus estudiantes aprendieran. [8] Si un estudiante no pasara a un idioma más potente, aún recordaría el Básico. [8] Se instaló un intérprete básico en las microcomputadoras fabricadas a finales de la década de 1970. A medida que crecía la industria de las microcomputadoras, también lo hacía el lenguaje. [8]

Basic fue pionero en la sesión interactiva . [8] Ofrecía comandos del sistema operativo dentro de su entorno:

Sin embargo, la sintaxis básica era demasiado simple para programas grandes. [8] Los dialectos recientes agregaron estructura y extensiones orientadas a objetos. Visual Basic de Microsoft todavía se utiliza ampliamente y produce una interfaz gráfica de usuario . [7]

C

El lenguaje de programación C (1973) recibió su nombre porque el lenguaje BCPL fue reemplazado por B , y AT&T Bell Labs llamó a la siguiente versión "C". Su propósito era escribir el sistema operativo UNIX . [50] C es un lenguaje relativamente pequeño, lo que facilita la escritura de compiladores. Su crecimiento reflejó el crecimiento del hardware en la década de 1980. [50] Su crecimiento también se debió a que tiene las facilidades del lenguaje ensamblador , pero utiliza una sintaxis de alto nivel . Agregó funciones avanzadas como:

Mapa de memoria de la computadora

C permite al programador controlar qué región de datos de la memoria se almacenarán. Las variables globales y las variables estáticas requieren la menor cantidad de ciclos de reloj para almacenarse. La pila se utiliza automáticamente para las declaraciones de variables estándar . La memoria del montón se devuelve a una variable de puntero de la malloc()función.

  • La región de datos globales y estáticos son técnicamente dos regiones. [58] Una región se llama segmento de datos inicializados , donde se almacenan las variables declaradas con valores predeterminados. La otra región se llama bloque iniciado por segmento , donde se almacenan las variables declaradas sin valores predeterminados.
  • Las variables almacenadas en la región de datos estática y global tienen sus direcciones configuradas en tiempo de compilación. Conservan sus valores durante toda la vida del proceso.
  • La región global y estática almacena las variables globales que se declaran encima (fuera) de la main()función. [59] Las variables globales son visibles para main()todas las demás funciones del código fuente.
Por otro lado, las declaraciones de variables dentro de main()otras funciones o dentro de { } delimitadores de bloque son variables locales . Las variables locales también incluyen variables de parámetros formales . Las variables de parámetros están encerradas entre paréntesis de las definiciones de funciones. [60] Proporcionan una interfaz para la función.
  • Las variables locales declaradas mediante el staticprefijo también se almacenan en la región de datos globales y estáticos . [58] A diferencia de las variables globales, las variables estáticas solo son visibles dentro de la función o bloque. Las variables estáticas siempre conservan su valor. Un ejemplo de uso sería la función int increment_counter(){static int counter = 0; counter++; return counter;}[f]
  • Las variables locales declaradas sin staticprefijo, incluidas las variables de parámetros formales, [62] se denominan variables automáticas [59] y se almacenan en la pila. [58] Son visibles dentro de la función o bloque y pierden su alcance al salir de la función o bloque.
  • C proporciona la malloc()función de biblioteca para asignar memoria de montón. [64] Llenar el montón con datos es una función de copia adicional. Las variables almacenadas en el montón se pasan económicamente a funciones mediante punteros. Sin punteros, todo el bloque de datos tendría que pasarse a la función a través de la pila.

C++

En la década de 1970, los ingenieros de software necesitaban soporte lingüístico para dividir grandes proyectos en módulos . [65] Una característica obvia era descomponer físicamente los proyectos grandes en archivos separados . Una característica menos obvia era descomponer lógicamente grandes proyectos en tipos de datos abstractos . [65] En ese momento, los lenguajes admitían tipos de datos concretos (escalares) como números enteros , números de punto flotante y cadenas de caracteres . Los tipos de datos abstractos son estructuras de tipos de datos concretos, a los que se les asigna un nuevo nombre. Por ejemplo, se podría llamar a una listainteger_list de números enteros .

En la jerga orientada a objetos, los tipos de datos abstractos se denominan clases . Sin embargo, una clase es sólo una definición; no se asigna memoria. Cuando la memoria se asigna a una clase y se vincula a un identificador , se denomina objeto . [66]

Lenguajes imperativos orientados a objetos desarrollados combinando la necesidad de clases y la necesidad de una programación funcional segura . [67] Una función, en un lenguaje orientado a objetos, se asigna a una clase. Una función asignada se denomina entonces método , función miembro u operación . La programación orientada a objetos consiste en ejecutar operaciones sobre objetos . [68]

Los lenguajes orientados a objetos admiten una sintaxis para modelar relaciones de subconjunto/superconjunto . En la teoría de conjuntos , un elemento de un subconjunto hereda todos los atributos contenidos en el superconjunto. Por ejemplo, un estudiante es una persona. Por tanto, el conjunto de estudiantes es un subconjunto del conjunto de personas. Como resultado, los estudiantes heredan todos los atributos comunes a todas las personas. Además, los estudiantes tienen atributos únicos que otras personas no tienen. Los lenguajes orientados a objetos modelan relaciones de subconjunto/superconjunto mediante herencia . [69] La programación orientada a objetos se convirtió en el paradigma del lenguaje dominante a finales de la década de 1990. [sesenta y cinco]

C++ (1985) originalmente se llamaba "C con clases". [70] Fue diseñado para ampliar las capacidades de C agregando las funciones orientadas a objetos del lenguaje Simula . [71]

Un módulo orientado a objetos se compone de dos archivos. El archivo de definiciones se llama archivo de encabezado . Aquí hay un archivo de encabezado C++ para la clase GRADE en una aplicación escolar simple:

// grado.h // -------// Se utiliza para permitir que varios archivos fuente incluyan // este archivo de encabezado sin errores de duplicación. // ---------------------------------------------- #ifndef GRADE_H #definir GRADE_Hclass GRADE { public : // Esta es la operación del constructor. // ---------------------------------- CALIFICACIÓN ( letra de carácter constante );           // Esta es una variable de clase. // ------------------------- letra de carácter ;    // Esta es una operación de miembro. // --------------------------- int grade_numeric ( letra de carácter constante );        // Esta es una variable de clase. // ------------------------- int numérico ; }; #terminara si   

Una operación de constructor es una función con el mismo nombre que el nombre de la clase. [72] Se ejecuta cuando la operación que llama ejecuta la newdeclaración.

El otro archivo de un módulo es el archivo fuente . Aquí hay un archivo fuente C++ para la clase GRADE en una aplicación escolar simple:

// grado.cpp // --------- #incluye "grado.h" GRADE :: GRADE ( const char letter ) { // Hace referencia al objeto usando la palabra clave 'this'. // ---------------------------------------------- este - > letra = letra ;          // Esto es Cohesión Temporal // ------------------------- esto -> numérico = grado_numérico ( letra ); }      int GRADE :: grade_numeric ( const char letra ) { if ( ( letra == 'A' || letra == 'a' ) ) return 4 ; de lo contrario si ( ( letra == 'B' || letra == 'b' ) ) devuelve 3 ; else if ( ( letra == 'C' || letra == 'c' ) ) devuelve 2 ; else if ( ( letra == 'D' || letra == 'd' ) ) devuelve 1 ; de lo contrario si ( ( letra == 'F' || letra == 'f' ) ) devuelve 0 ; de lo contrario , devuelve -1 ; }                                                                                  

Aquí hay un archivo de encabezado C++ para la clase PERSONA en una aplicación escolar simple:

// persona.h // -------- #ifndef PERSON_H #define PERSON_Hclase PERSONA { público : PERSONA ( const char * nombre ); carácter constante * nombre ; }; #terminara si           

Aquí hay un archivo fuente C++ para la clase PERSONA en una aplicación escolar simple:

// persona.cpp // ---------- #incluye "persona.h" PERSONA :: PERSONA ( const char * nombre ) { este -> nombre = nombre ; }        

Aquí hay un archivo de encabezado C++ para la clase ESTUDIANTE en una aplicación escolar simple:

// estudiante.h // --------- #ifndef ESTUDIANTE_H #define ESTUDIANTE_H#incluye "persona.h" #incluye "grado.h"  // UN ESTUDIANTE es un subconjunto de PERSONA. // -------------------------------- clase ESTUDIANTE : PERSONA pública { público : ESTUDIANTE ( const char * nombre ); CALIFICACIÓN * calificación ; }; #terminara si            

Aquí hay un archivo fuente C++ para la clase ESTUDIANTE en una aplicación escolar simple:

// estudiante.cpp // ----------- #incluye "estudiante.h" #incluye "persona.h"  ESTUDIANTE :: ESTUDIANTE ( const char * nombre ) : // Ejecuta el constructor de la superclase PERSONA. // ------------------------------------------------ - PERSONA ( nombre ) { // Nada más que hacer. // ------------------- }            

Aquí hay un programa de controlador para demostración:

// estudiante_dvr.cpp // --------------- #include <iostream> #incluye "estudiante.h"  int main ( void ) { ESTUDIANTE * estudiante = nuevo ESTUDIANTE ( "El Estudiante" ); estudiante -> calificación = nueva CALIFICACIÓN ( 'a' );                 std :: cout // Aviso que el estudiante hereda el nombre de la PERSONA << estudiante -> nombre << ": Calificación numérica = " << estudiante -> calificación -> numérico << " \n " ; devolver 0 ; }           

Aquí hay un archivo MAKE para compilar todo:

# makefile # -------- todo : estudiante_dvr limpio :  rm  estudiante_dvr  *.oestudiante_dvr : estudiante_dvr . grado cpp . Oh estudiante . Oh persona . o c++ estudiante_dvr.cpp grado.o estudiante.o persona.o -o estudiante_dvr           grado.o : grado . grado cpp . h c++ -c grado.cpp     estudiante.o : estudiante . estudiante del cpp . h c++ -c estudiante.cpp     persona.o : persona . persona cpp . h c++ -c persona.cpp     

Lenguajes declarativos

Los lenguajes imperativos tienen una crítica importante: asignar una expresión a una variable no local puede producir un efecto secundario no deseado . [73] Los lenguajes declarativos generalmente omiten la declaración de asignación y el flujo de control. Describen qué cálculo se debe realizar y no cómo calcularlo. Dos categorías amplias de lenguajes declarativos son los lenguajes funcionales y los lenguajes lógicos .

El principio detrás de un lenguaje funcional es utilizar el cálculo lambda como guía para una semántica bien definida . [74] En matemáticas, una función es una regla que asigna elementos de una expresión a un rango de valores . Considere la función:

times_10(x) = 10 * x

La función asigna la expresión a un rango de valores . Un valor resulta ser 20. Esto ocurre cuando x es 2. Entonces, la aplicación de la función se escribe matemáticamente como:10 * xtimes_10()

times_10(2) = 20

Un compilador de lenguaje funcional no almacenará este valor en una variable. En cambio, enviará el valor a la pila de la computadora antes de configurar el contador del programa nuevamente en la función de llamada. La función de llamada luego extraerá el valor de la pila. [75]

Los lenguajes imperativos admiten funciones. Por lo tanto, la programación funcional se puede lograr en un lenguaje imperativo, si el programador usa disciplina. Sin embargo, un lenguaje funcional impondrá esta disciplina al programador a través de su sintaxis. Los lenguajes funcionales tienen una sintaxis diseñada para enfatizar el qué . [76]

Un programa funcional se desarrolla con un conjunto de funciones primitivas seguidas de una única función controladora. [73] Considere el fragmento :

function max( a, b ){/* code omitted */}

function min( a, b ){/* code omitted */}

function range( a, b, c ) {

return max( a, max( b, c ) ) - min( a, min( b,c ) );

}

Las primitivas son max()y min(). La función del conductor es range(). Ejecutando:

put( range( 10, 4, 7) );generará 6.

Los lenguajes funcionales se utilizan en la investigación en informática para explorar nuevas características del lenguaje. [77] Además, su falta de efectos secundarios los ha hecho populares en la programación paralela y la programación concurrente . [78] Sin embargo, los desarrolladores de aplicaciones prefieren las características orientadas a objetos de los lenguajes imperativos . [78]

Ceceo

Lisp (1958) significa "Procesador LISt". [79] Está diseñado para procesar listas . Se forma una estructura completa de los datos mediante la creación de listas de listas. En la memoria, se construye una estructura de datos de árbol . Internamente, la estructura de árbol se presta muy bien para funciones recursivas . [80] La sintaxis para construir un árbol es encerrar los elementos separados por espacios entre paréntesis. La siguiente es una lista de tres elementos. Los dos primeros elementos son en sí mismos listas de dos elementos:

((A B) (HELLO WORLD) 94)

Lisp tiene funciones para extraer y reconstruir elementos. [81] La función head()devuelve una lista que contiene el primer elemento de la lista. La función tail()devuelve una lista que contiene todo menos el primer elemento. La función cons()devuelve una lista que es la concatenación de otras listas. Por lo tanto, la siguiente expresión devolverá la lista x:

cons(head(x), tail(x))

Una desventaja de Lisp es que cuando muchas funciones están anidadas, los paréntesis pueden parecer confusos. [76] Los entornos Lisp modernos ayudan a garantizar la coincidencia de paréntesis. Además, Lisp admite las operaciones de lenguaje imperativo de la declaración de asignación y los bucles goto. [82] Además, a Lisp no le preocupa el tipo de datos de los elementos en el momento de la compilación. [83] En cambio, asigna (y puede reasignar) los tipos de datos en tiempo de ejecución . La asignación del tipo de datos en tiempo de ejecución se denomina enlace dinámico . [84] Mientras que el enlace dinámico aumenta la flexibilidad del lenguaje, los errores de programación pueden persistir hasta el final del proceso de desarrollo de software . [84]

Escribir programas Lisp grandes, confiables y legibles requiere previsión. Si se planifica adecuadamente, el programa puede ser mucho más corto que un programa de lenguaje imperativo equivalente . [76] Lisp se utiliza ampliamente en inteligencia artificial . Sin embargo, su uso se ha aceptado sólo porque tiene operaciones de lenguaje imperativas , lo que hace posibles efectos secundarios no deseados. [78]

ml

ML (1973) [85] significa "Metalenguaje". ML verifica para asegurarse de que solo se comparen entre sí datos del mismo tipo. [86] Por ejemplo, esta función tiene un parámetro de entrada (un número entero) y devuelve un número entero:

 tiempos divertidos_10 ( n  :  int )  :  int  =  10  *  n ;

ML no es excéntrico entre paréntesis como Lisp . La siguiente es una aplicación de times_10():

veces_10 2

Devuelve "20: int". (Se devuelven tanto los resultados como el tipo de datos).

Al igual que Lisp , ML está diseñado para procesar listas. A diferencia de Lisp , cada elemento es del mismo tipo de datos. [87] Además, ML asigna el tipo de datos de un elemento en tiempo de compilación . Asignar el tipo de datos en tiempo de compilación se denomina enlace estático . El enlace estático aumenta la confiabilidad porque el compilador verifica el contexto de las variables antes de usarlas. [88]

Prólogo

Prolog (1972) significa "PROgramación en LOGic". Es un lenguaje de programación lógica , basado en la lógica formal . El lenguaje fue desarrollado por Alain Colmerauer y Philippe Roussel en Marsella, Francia. Es una implementación de la resolución de cláusulas selectiva lineal definida , iniciada por Robert Kowalski y otros en la Universidad de Edimburgo . [89]

Los componentes básicos de un programa Prolog son hechos y reglas . Aquí hay un ejemplo simple:

gato ( tom ).  % tom es un ratón gato ( jerry ).  % jerry es un ratónanimal ( X )  : -  gato ( X ).  % cada gato es un animal animal ( X )  :-  ratón ( X ).  % cada ratón es un animalgrande ( X )  : -  gato ( X ).  % cada gato es grande pequeño ( X )  : -  ratón ( X ).  % cada ratón es pequeñocomer ( X , Y )  : -  ratón ( X ),  queso ( Y ).  % cada ratón come cada queso come ( X , Y )  : -  grande ( X ),  pequeño ( Y ).  % cada animal grande se come a cada animal pequeño

Después de ingresar todos los hechos y reglas, se puede hacer una pregunta:

¿Tom se comerá a Jerry?
?-  comer ( tom , jerry ). verdadero

El siguiente ejemplo muestra cómo Prolog convertirá una calificación con letras a su valor numérico:

grado_numérico ( 'A' ,  4 ). grado_numérico ( 'B' ,  3 ). grado_numérico ( 'C' ,  2 ). grado_numérico ( 'D' ,  1 ). grado_numérico ( 'F' ,  0 ). grado_numérico ( X ,  - 1 )  : -  no  X  =  'A' ,  no  X  =  'B' ,  no  X  =  'C' ,  no  X  =  'D' ,  no  X  =  'F' . grado ( 'El Estudiante' ,  'A' ).
?-  calificación ( 'El estudiante' ,  X ),  calificación_numérica ( X ,  Y ). X  =  'A' , Y  =  4

Aquí hay un ejemplo completo: [90]

1) Todos los dragones lanzan fuego, o equivalentemente, una cosa lanza fuego si es un dragón:

billows_fire ( X )  : -  is_a_dragon ( X ).

2) Una criatura lanza fuego si uno de sus padres lanza fuego:

billows_fire ( X )  : -  is_a_creature ( X ),  is_a_parent_of ( Y , X ),  billows_fire ( Y ).

3) Una cosa X es padre de una cosa Y si X es la madre de Y o X es el padre de Y:

 es_un_padre_de ( X ,  Y ): -  es_la_madre_de ( X ,  Y ). es_un_padre_de ( X ,  Y ): -  es_el_padre_de ( X ,  Y ).

4) Una cosa es una criatura si es un dragón:

es_una_criatura ( X )  : -  es_un_dragón ( X ).

5) Norberta es un dragón y Puff es una criatura. Norberta es la madre de Puff.

es_a_dragon ( norberta ).  es_una_criatura ( soplo ). es_la_madre_de ( norberta ,  puff ).

La regla (2) es una definición recursiva (inductiva). Se puede entender de forma declarativa, sin necesidad de entender cómo se ejecuta.

La regla (3) muestra cómo se representan funciones mediante el uso de relaciones. Aquí, las funciones de madre y padre garantizan que cada individuo tenga una sola madre y un solo padre.

Prolog es un lenguaje sin escribir. No obstante, la herencia se puede representar mediante predicados. La regla (4) afirma que una criatura es una superclase de dragón.

Las preguntas se responden mediante razonamiento inverso . Dada la pregunta:

 ?-  olas_fuego ( X ).

Prolog genera dos respuestas:

X  =  norberta X  =  soplo

Las aplicaciones prácticas de Prolog son la representación del conocimiento y la resolución de problemas en inteligencia artificial .

Programación orientada a objetos

La programación orientada a objetos es un método de programación para ejecutar operaciones ( funciones ) sobre objetos . [91] La idea básica es agrupar las características de un fenómeno en un contenedor de objetos y darle un nombre al contenedor. Las operaciones sobre el fenómeno también se agrupan en el contenedor. [91] Programación orientada a objetos desarrollada combinando la necesidad de contenedores y la necesidad de programación funcional segura . [92] Este método de programación no necesita limitarse a un lenguaje orientado a objetos . [93] En un lenguaje orientado a objetos, un contenedor de objetos se llama clase . En un lenguaje no orientado a objetos, una estructura de datos (que también se conoce como registro ) puede convertirse en un contenedor de objetos. Para convertir una estructura de datos en un contenedor de objetos, las operaciones deben escribirse específicamente para la estructura. La estructura resultante se denomina tipo de datos abstracto . [94] Sin embargo, faltará la herencia . Sin embargo, esta deficiencia puede superarse.

Aquí hay un archivo de encabezado en lenguaje de programación C para el tipo de datos abstracto GRADE en una aplicación escolar simple:

/* grado.h */ /* ------- *//* Se utiliza para permitir que varios archivos fuente incluyan */ /* este archivo de encabezado sin errores de duplicación. */ /* ---------------------------------------------- */ #ifndef GRADE_H #definir GRADE_Hestructura typedef { letra de carácter ; } CALIFICACIÓN ;    /* Constructor */ /* ----------- */ GRADE * grade_new ( letra de carácter );    int grade_numeric ( letra de carácter ); #terminara si    

La grade_new()función realiza el mismo algoritmo que la operación del constructor de C++ .

Aquí hay un archivo fuente en lenguaje de programación C para el tipo de datos abstracto GRADE en una aplicación escolar simple:

/* grado.c */ /* ------- */ #include "grado.h" CALIFICACIÓN * calificación_nueva ( letra de carácter ) { CALIFICACIÓN * calificación ;       /* Asignar memoria de montón */ /* -------------------- */ if ( ! ( grado = calloc ( 1 , tamaño de ( GRADO ) ) ) ) { fprintf ( stderr , "ERROR en %s/%s/%d: calloc() devolvió vacío. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); salir ( 1 ); }                            calificación -> letra = letra ; calificación de retorno ; }    int grade_numeric ( letra char ) { if ( ( letra == 'A' || letra == 'a' ) ) return 4 ; de lo contrario si ( ( letra == 'B' || letra == 'b' ) ) devuelve 3 ; else if ( ( letra == 'C' || letra == 'c' ) ) devuelve 2 ; else if ( ( letra == 'D' || letra == 'd' ) ) devuelve 1 ; de lo contrario si ( ( letra == 'F' || letra == 'f' ) ) devuelve 0 ; de lo contrario , devuelve -1 ; }                                                                                 

calloc()En el constructor, se utiliza la función en lugar de malloc()porque cada celda de memoria se pondrá a cero.

Aquí hay un archivo de encabezado en lenguaje de programación C para el tipo de datos abstracto PERSONA en una aplicación escolar simple:

/* persona.h */ /* -------- */ #ifndef PERSON_H #define PERSON_Hestructura typedef { char * nombre ; } PERSONA ;    /* Constructor */ /* ----------- */ PERSONA * persona_nueva ( char * nombre ); #terminara si    

Aquí hay un archivo fuente en lenguaje de programación C para el tipo de datos abstracto PERSON en una aplicación escolar simple:

/* persona.c */ /* -------- */ #incluye "persona.h" PERSONA * persona_nueva ( char * nombre ) { PERSONA * persona ;       if ( ! ( persona = calloc ( 1 , tamaño de ( PERSONA ) ) ) ) { fprintf ( stderr , "ERROR en %s/%s/%d: calloc() devolvió vacío. \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ; salir ( 1 ); }                          persona -> nombre = nombre ; persona que regresa ; }    

Aquí hay un archivo de encabezado en lenguaje de programación C para el tipo de datos abstracto ESTUDIANTE en una aplicación escolar simple:

/* estudiante.h */ /* --------- */ #ifndef ESTUDIANTE_H #define ESTUDIANTE_H#incluye "persona.h" #incluye "grado.h"  typedef struct { /* UN ESTUDIANTE es un subconjunto de PERSONA. */ /* -------------------------------- */ PERSONA * persona ;      CALIFICACIÓN * calificación ; } ALUMNO ;  /* Constructor */ /* ----------- */ ESTUDIANTE * estudiante_nuevo ( char * nombre ); #terminara si    

Aquí hay un archivo fuente en lenguaje de programación C para el tipo de datos abstracto ESTUDIANTE en una aplicación escolar simple:

/* estudiante.c */ /* --------- */ #include "estudiante.h" #incluye "persona.h"  ESTUDIANTE * estudiante_nuevo ( char * nombre ) { ESTUDIANTE * estudiante ;       if ( ! ( estudiante = calloc ( 1 , tamaño de ( ESTUDIANTE ) ) ) ) { fprintf ( stderr , "ERROR en %s/%s/%d: calloc() devolvió vacío. \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ; salir ( 1 ); }                          /* Ejecutar el constructor de la superclase PERSONA. */ /* ---------------------------------------------- --- */ estudiante -> persona = persona_nueva ( nombre ); estudiante que regresa ; }        

Aquí hay un programa de controlador para demostración:

/* estudiante_dvr.c */ /* ------------- */ #include <stdio.h> #incluye "estudiante.h"  int main ( void ) { ESTUDIANTE * estudiante = estudiante_nuevo ( "El Estudiante" ); estudiante -> grado = grado_nuevo ( 'a' );               printf ( "%s: Calificación numérica = %d \n " , /* Mientras que existe un subconjunto, la herencia no. */ estudiante -> persona -> nombre , /* La programación funcional consiste en ejecutar funciones justo a tiempo (JIT ) */ grado_numérico ( estudiante -> grado -> letra ) );        devolver 0 ; } 

Aquí hay un archivo MAKE para compilar todo:

# makefile # -------- todo : estudiante_dvr limpio :  rm  estudiante_dvr  *.oestudiante_dvr : estudiante_dvr . grado c . Oh estudiante . Oh persona . o gcc estudiante_dvr.c grado.o estudiante.o persona.o -o estudiante_dvr           grado.o : grado . grado c . h gcc -c grado.c     estudiante.o : estudiante . c estudiante . h gcc -c estudiante.c     persona.o : persona . c persona . h gcc -c persona.c     

La estrategia formal para construir objetos orientados a objetos es: [95]

Por ejemplo:

Sintaxis y semántica

Las reglas de producción constan de un conjunto de terminales y no terminales.

La sintaxis de un lenguaje de programación es una lista de reglas de producción que forman su gramática . [96] La gramática de un lenguaje de programación coloca correctamente sus declaraciones , expresiones y enunciados . [97] Complementando la sintaxis de un lenguaje está su semántica . La semántica describe los significados adjuntos a diversas construcciones sintácticas. [98] Una construcción sintáctica puede necesitar una descripción semántica porque una regla de producción puede tener una interpretación no válida. [99] Además, diferentes idiomas pueden tener la misma sintaxis; sin embargo, sus comportamientos pueden ser diferentes.

La sintaxis de un lenguaje se describe formalmente enumerando las reglas de producción. Mientras que la sintaxis de un lenguaje natural es extremadamente complicada, un subconjunto del idioma inglés puede tener esta lista de reglas de producción: [100]

  1. una oración se compone de una frase nominal seguida de una frase verbal ;
  2. un sintagma nominal se compone de un artículo seguido de un adjetivo seguido de un sustantivo ;
  3. una frase verbal se compone de un verbo seguido de una frase nominal ;
  4. un artículo es 'el';
  5. un adjetivo es 'grande' o
  6. un adjetivo es "pequeño";
  7. un sustantivo es 'gato' o
  8. un sustantivo es 'ratón';
  9. un verbo es 'come';

Las palabras en negrita se conocen como "no terminales". Las palabras entre comillas simples se conocen como "terminales". [101]

A partir de esta lista de reglas de producción, se pueden formar oraciones completas utilizando una serie de reemplazos. [102] El proceso consiste en reemplazar los no terminales por un no terminal válido o por un terminal válido . El proceso de reemplazo se repite hasta que solo queden terminales . Una frase válida es:

Sin embargo, otra combinación da como resultado una sentencia inválida:

Por lo tanto, es necesaria una semántica para describir correctamente el significado de una actividad de comer .

Un método de listado de reglas de producción se llama forma Backus-Naur (BNF). [103] BNF describe la sintaxis de un lenguaje y él mismo tiene una sintaxis . Esta definición recursiva es un ejemplo de metalenguaje . [98] La sintaxis de BNF incluye:

Usando BNF, un subconjunto del idioma inglés puede tener esta lista de reglas de producción :

< oración >  ::=  < frase-sustantivo >< frase - verbo > < frase-sustantivo > ::= < artículo >< adjetivo >< sustantivo > < frase-verbo > ::= < verbo >< frase-sustantivo > < artículo > ::= el < adjetivo > ::= grande | pequeño < sustantivo > ::= gato | ratón < verbo > ::= come        

Usando BNF, un entero con signo tiene la lista de reglas de producción : [104]

< entero con signo >  ::=  < signo >< entero > < signo >  ::= + | - <entero> :: = < dígito > |< dígito >< entero > < dígito > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9   

Observe la regla de producción recursiva:

< entero >  ::=  < dígito > | < dígito >< entero >

Esto permite un número infinito de posibilidades. Por tanto, es necesaria una semántica para describir una limitación del número de dígitos.

Observe la posibilidad del cero inicial en las reglas de producción:

< entero >  ::=  < dígito > | < dígito >< entero > < dígito >  ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Por lo tanto, es necesaria una semántica para describir que los ceros a la izquierda deben ignorarse.

Hay dos métodos formales disponibles para describir la semántica . Son la semántica denotacional y la semántica axiomática . [105]

Ingeniería de software y programación informática.

Antes de los lenguajes de programación, Betty Jennings y Fran Bilas programaron el ENIAC moviendo cables y configurando interruptores.

La ingeniería de software es una variedad de técnicas para producir programas informáticos de calidad . [106] La programación informática es el proceso de escribir o editar código fuente . En un entorno formal, un analista de sistemas recopilará información de los gerentes sobre todos los procesos de la organización a automatizar. Luego, este profesional prepara un plan detallado para el sistema nuevo o modificado. [107] El plano es análogo al plano de un arquitecto. [107]

Objetivos de rendimiento

El analista de sistemas tiene como objetivo entregar la información correcta a la persona adecuada en el momento adecuado. [108] Los factores críticos para lograr este objetivo son: [108]

  1. La calidad de la salida. ¿El resultado es útil para la toma de decisiones?
  2. La precisión de la salida. ¿Refleja la situación real?
  3. El formato de la salida. ¿Se entiende fácilmente el resultado?
  4. La velocidad de la salida. La información urgente es importante cuando se comunica con el cliente en tiempo real.

Objetivos de costos

El logro de los objetivos de desempeño debe equilibrarse con todos los costos, incluidos: [109]

  1. Costos de desarrollo.
  2. Costos de unicidad. Un sistema reutilizable puede resultar caro. Sin embargo, podría preferirse a un sistema de uso limitado.
  3. Costos de hardware.
  4. Costos de operacion.

La aplicación de un proceso de desarrollo de sistemas mitigará el axioma: cuanto más tarde en el proceso se detecte un error, más costoso será corregirlo. [110]

Modelo de cascada

El modelo en cascada es una implementación de un proceso de desarrollo de sistemas . [111] Como lo implica la etiqueta de cascada , las fases básicas se superponen entre sí: [112]

  1. La fase de investigación es comprender el problema subyacente.
  2. La fase de análisis es comprender las posibles soluciones.
  3. La fase de diseño consiste en planificar la mejor solución.
  4. La fase de implementación consiste en programar la mejor solución.
  5. La fase de mantenimiento dura toda la vida del sistema. Es posible que sean necesarios cambios en el sistema después de su implementación. [113] Pueden existir fallas, incluidas fallas de especificación, fallas de diseño o fallas de codificación. Es posible que sean necesarias mejoras. Puede ser necesaria la adaptación para reaccionar ante un entorno cambiante.

Programador

Un programador informático es un especialista responsable de escribir o modificar el código fuente para implementar el plan detallado. [107] Es probable que se necesite un equipo de programación porque la mayoría de los sistemas son demasiado grandes para ser completados por un solo programador. [114] Sin embargo, agregar programadores a un proyecto puede no acortar el tiempo de finalización. En cambio, puede reducir la calidad del sistema. [114] Para que sean eficaces, los módulos del programa deben definirse y distribuirse a los miembros del equipo. [114] Además, los miembros del equipo deben interactuar entre sí de manera significativa y efectiva. [114]

Los programadores de computadoras pueden estar programando en lo pequeño : programando dentro de un solo módulo. [115] Es probable que un módulo ejecute módulos ubicados en otros archivos de código fuente. Por lo tanto, los programadores de computadoras pueden estar programando en módulos de programación grandes para que se combinen entre sí de manera efectiva. [115] La programación en general incluye contribuir a la interfaz de programación de aplicaciones (API).

Módulos del programa

La programación modular es una técnica para perfeccionar programas en lenguajes imperativos . Los programas refinados pueden reducir el tamaño del software, separar responsabilidades y, por lo tanto, mitigar el envejecimiento del software . Un módulo de programa es una secuencia de declaraciones que están delimitadas dentro de un bloque y juntas identificadas por un nombre. [116] Los módulos tienen una función , contexto y lógica : [117]

El nombre del módulo debe derivarse primero de su función y luego de su contexto . Su lógica no debería ser parte del nombre. [117] Por ejemplo, function compute_square_root( x )o function compute_square_root_integer( i : integer )son nombres de módulos apropiados. Sin embargo, function compute_square_root_by_division( x )no lo es.

El grado de interacción dentro de un módulo es su nivel de cohesión . [117] La ​​cohesión es un juicio de la relación entre el nombre de un módulo y su función . El grado de interacción entre módulos es el nivel de acoplamiento . [118] El acoplamiento es un juicio de la relación entre el contexto de un módulo y los elementos sobre los que se realiza.

Cohesión

Los niveles de cohesión de peor a mejor son: [119]

Acoplamiento

Los niveles de acoplamiento de peor a mejor son: [118]

Análisis de flujo de datos

Un ejemplo de diagrama de flujo de datos a nivel de función

El análisis de flujo de datos es un método de diseño utilizado para lograr módulos de cohesión funcional y acoplamiento de datos . [120] La entrada al método es un diagrama de flujo de datos . Un diagrama de flujo de datos es un conjunto de óvalos que representan módulos. El nombre de cada módulo se muestra dentro de su óvalo. Los módulos pueden estar en el nivel ejecutable o en el nivel de función.

El diagrama también tiene flechas que conectan los módulos entre sí. Las flechas que apuntan a los módulos representan un conjunto de entradas. Cada módulo debe tener solo una flecha apuntando para representar su único objeto de salida. (Opcionalmente, una flecha de excepción adicional lo señala). Una cadena de óvalos transmitirá un algoritmo completo . Los módulos de entrada deben iniciar el diagrama. Los módulos de entrada deben conectarse a los módulos de transformación. Los módulos de transformación deben conectarse a los módulos de salida. [121]

Categorías funcionales

Un diagrama que muestra que el usuario interactúa con el software de la aplicación . El software de la aplicación interactúa con el sistema operativo , el cual interactúa con el hardware .

Los programas informáticos pueden clasificarse según líneas funcionales. Las principales categorías funcionales son software de aplicación y software de sistema . El software del sistema incluye el sistema operativo , que combina el hardware de la computadora con el software de aplicación. [122] El propósito del sistema operativo es proporcionar un entorno donde el software de aplicación se ejecuta de manera conveniente y eficiente. [122] Tanto el software de aplicación como el software del sistema ejecutan programas de utilidad . A nivel de hardware, un programa de microcódigo controla los circuitos de toda la unidad central de procesamiento .

Software de la aplicacion

El software de aplicación es la clave para desbloquear el potencial del sistema informático. [123] El software de aplicaciones empresariales agrupa aplicaciones de contabilidad, personal, clientes y proveedores. Los ejemplos incluyen planificación de recursos empresariales , gestión de relaciones con los clientes y software de gestión de la cadena de suministro .

Las aplicaciones empresariales pueden desarrollarse internamente como un software propietario único en su tipo . [124] Alternativamente, pueden adquirirse como software disponible en el mercado . El software adquirido puede modificarse para proporcionar software personalizado . Si la aplicación está personalizada, entonces se utilizan los recursos de la empresa o se subcontratan. El desarrollo de software subcontratado puede ser del proveedor de software original o de un desarrollador externo. [125]

Las ventajas potenciales del software interno son las características y los informes que se pueden desarrollar exactamente según las especificaciones. [126] La dirección también puede participar en el proceso de desarrollo y ofrecer un nivel de control. [127] La ​​dirección puede decidir contrarrestar la nueva iniciativa de un competidor o implementar un requisito de un cliente o proveedor. [128] Una fusión o adquisición puede requerir cambios en el software empresarial. Las posibles desventajas del software interno son los costos de tiempo y recursos que pueden ser elevados. [124] Además, pueden surgir riesgos relacionados con las características y el rendimiento.

Las ventajas potenciales del software disponible en el mercado son que los costos iniciales son identificables, las necesidades básicas deben satisfacerse y su rendimiento y confiabilidad tienen un historial. [124] Las posibles desventajas del software comercial son que puede tener características innecesarias que confunden a los usuarios finales, puede carecer de características que la empresa necesita y el flujo de datos puede no coincidir con los procesos de trabajo de la empresa. [124]

Una forma de obtener económicamente una aplicación empresarial personalizada es a través de un proveedor de servicios de aplicaciones . [129] Las empresas especializadas proporcionan hardware, software personalizado y soporte al usuario final. Pueden acelerar el desarrollo de nuevas aplicaciones porque cuentan con personal capacitado en sistemas de información. La mayor ventaja es que libera recursos internos de la contratación de personal y la gestión de proyectos informáticos complejos. [129] Muchos proveedores de servicios de aplicaciones se dirigen a empresas pequeñas y de rápido crecimiento con recursos limitados de sistemas de información. [129] Por otro lado, las empresas más grandes con sistemas importantes probablemente tendrán su infraestructura técnica en su lugar. Un riesgo es tener que confiar información confidencial a una organización externa. Otro riesgo es tener que confiar en la confiabilidad de la infraestructura del proveedor. [129]

Sistema operativo

Programa versus proceso versus programación de subprocesos , preferencia y cambio de contexto

Un sistema operativo es el software de bajo nivel que respalda las funciones básicas de una computadora, como programar procesos y controlar periféricos . [122]

En la década de 1950, el programador, que también era el operador, escribía un programa y lo ejecutaba. Una vez que el programa terminó de ejecutarse, es posible que se haya impreso el resultado o que se haya perforado en cinta de papel o tarjetas para su posterior procesamiento. [28] La mayoría de las veces el programa no funcionó. Luego, el programador miró las luces de la consola y jugueteó con los interruptores de la consola. Si no había suerte, se hacía una copia impresa de la memoria para estudiarla más a fondo. En la década de 1960, los programadores redujeron la cantidad de tiempo perdido automatizando el trabajo del operador. En todo momento se mantuvo en la computadora un programa llamado sistema operativo . [130]

El término sistema operativo puede referirse a dos niveles de software. [131] El sistema operativo puede referirse al programa del núcleo que administra los procesos , la memoria y los dispositivos . En términos más generales, el sistema operativo puede referirse al paquete completo del software central. El paquete incluye un programa de núcleo, un intérprete de línea de comandos , una interfaz gráfica de usuario , programas de utilidad y un editor . [131]

Programa de núcleo

Un kernel conecta el software de la aplicación al hardware de una computadora.

El objetivo principal del kernel es gestionar los recursos limitados de una computadora:

La memoria física se encuentra dispersa entre la RAM y el disco duro. La memoria virtual es un bloque continuo.
  • Cuando el kernel carga inicialmente un ejecutable en la memoria, divide el espacio de direcciones de forma lógica en regiones . [133] El núcleo mantiene una tabla de región maestra y muchas tablas por región de proceso (preregión), una para cada proceso en ejecución . [133] Estas tablas constituyen el espacio de direcciones virtuales . La tabla de región maestra se utiliza para determinar dónde se encuentra su contenido en la memoria física . Las tablas de preregiones permiten que cada proceso tenga su propia preregión de programa (texto), preregión de datos y preregión de pila.
  • La preregión del programa almacena instrucciones de la máquina. Dado que las instrucciones de la máquina no cambian, la región previa del programa puede ser compartida por muchos procesos del mismo ejecutable. [133]
  • Para ahorrar tiempo y memoria, el kernel puede cargar sólo bloques de instrucciones de ejecución desde la unidad de disco, no todo el archivo de ejecución por completo. [132]
  • El kernel es responsable de traducir direcciones virtuales en direcciones físicas . El kernel puede solicitar datos del controlador de memoria y, en su lugar, recibir un error de página . [134] Si es así, el kernel accede a la unidad de administración de memoria para llenar la región de datos físicos y traducir la dirección. [135]
  • El núcleo asigna memoria del montón a petición de un proceso. [64] Cuando el proceso finaliza con la memoria, el proceso puede solicitar que se libere . Si el proceso sale sin solicitar que se libere toda la memoria asignada, entonces el kernel realiza una recolección de basura para liberar la memoria.
  • El kernel también garantiza que un proceso solo acceda a su propia memoria, y no a la del kernel u otros procesos. [132]

Originalmente, los sistemas operativos se programaban en ensamblador ; sin embargo, los sistemas operativos modernos suelen estar escritos en lenguajes de nivel superior como C , Objective-C y Swift . [h]

Programa de utilidad

Un programa de utilidad está diseñado para ayudar en la administración del sistema y la ejecución del software. Los sistemas operativos ejecutan programas de utilidad de hardware para verificar el estado de las unidades de disco, la memoria, los parlantes y las impresoras. [140] Un programa de utilidad puede optimizar la ubicación de un archivo en un disco lleno de gente. Los programas de utilidad del sistema monitorean el rendimiento del hardware y de la red. Cuando una métrica está fuera de un rango aceptable, se genera una alerta de activación. [141]

Los programas de utilidad incluyen programas de compresión para que los archivos de datos se almacenen en menos espacio en disco. [140] Los programas comprimidos también ahorran tiempo cuando los archivos de datos se transmiten a través de la red. [140] Los programas de utilidad pueden ordenar y fusionar conjuntos de datos. [141] Los programas de utilidad detectan virus informáticos . [141]

programa de microcódigo

NO puerta
puerta NAND
Puerta NOR
Y puerta
O puerta

Un programa de microcódigo es el intérprete de nivel inferior que controla la ruta de datos de las computadoras controladas por software. [142] (Los avances en hardware han migrado estas operaciones a circuitos de ejecución de hardware ). [142] Las instrucciones de microcódigo permiten al programador implementar más fácilmente el nivel lógico digital [143] : el hardware real de la computadora. El nivel de lógica digital es el límite entre la informática y la ingeniería informática . [144]

Una puerta lógica es un pequeño transistor que puede devolver una de dos señales: encendido o apagado. [145]

Estas cinco puertas forman los componentes básicos del álgebra binaria : las funciones lógicas digitales de la computadora.

Las instrucciones de microcódigo son mnemónicos que los programadores pueden utilizar para ejecutar funciones lógicas digitales en lugar de formarlas en álgebra binaria. Se almacenan en el almacén de control de una unidad central de procesamiento (CPU) . [146] Estas instrucciones a nivel de hardware mueven datos a lo largo de la ruta de datos .

El ciclo de microinstrucción comienza cuando el microsecuenciador utiliza su contador de microprogramas para recuperar la siguiente instrucción de la máquina de la memoria de acceso aleatorio . [147] El siguiente paso es decodificar la instrucción de la máquina seleccionando la línea de salida adecuada al módulo de hardware. [148] El paso final es ejecutar la instrucción utilizando el conjunto de puertas del módulo de hardware.

Una representación simbólica de una ALU.

Las instrucciones para realizar aritmética se pasan a través de una unidad lógica aritmética (ALU). [149] La ALU tiene circuitos para realizar operaciones elementales para sumar, desplazar y comparar números enteros. Al combinar y realizar bucles de operaciones elementales a través de la ALU, la CPU realiza su compleja aritmética.

Las instrucciones de microcódigo mueven datos entre la CPU y el controlador de memoria . Las instrucciones de microcódigo del controlador de memoria manipulan dos registros . El registro de dirección de memoria se utiliza para acceder a la dirección de cada celda de memoria. El registro de datos de la memoria se utiliza para configurar y leer el contenido de cada celda. [150]

Las instrucciones de microcódigo mueven datos entre la CPU y los numerosos buses de la computadora . El bus del controlador de disco escribe y lee desde unidades de disco duro . Los datos también se mueven entre la CPU y otras unidades funcionales a través del bus rápido de interconexión de componentes periféricos. [151]

Notas

  1. ^ El lenguaje Prolog permite ingresar una base de datos de hechos y reglas en cualquier orden. Sin embargo, al final debe haber una pregunta sobre una base de datos.
  2. ^ Un ejecutable tiene cada instrucción de máquina lista para la CPU .
  3. ^ Para obtener más información, visite Lenguaje ensamblador X86#Tipos de instrucciones .
  4. ^ introducido en 1999
  5. ^ Los operadores como x++normalmente compilarán en una sola instrucción.
  6. ^ Esta función podría escribirse de manera más concisa como int increment_counter(){ static int counter; return ++counter;}. 1) Las variables estáticas se inicializan automáticamente a cero. 2) ++counteres un operador de incremento de prefijo .
  7. ^ Esto a pesar de la metáfora de una pila, que normalmente crece de abajo hacia arriba.
  8. ^ El sistema operativo UNIX se escribió en C, macOS se escribió en Objective-C y Swift reemplazó a Objective-C.

Referencias

  1. ^ "ISO/IEC 2382:2015". YO ASI . 2020-09-03. Archivado desde el original el 17 de junio de 2016 . Consultado el 26 de mayo de 2022 . [El software incluye] todo o parte de los programas, procedimientos, reglas y documentación asociada de un sistema de procesamiento de información.
  2. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 7.ISBN 0-201-71012-9. Una alternativa a compilar un programa fuente es utilizar un intérprete. Un intérprete puede ejecutar directamente un programa fuente[.]
  3. ^ Silberschatz, Abraham (1994). Conceptos de sistemas operativos, cuarta edición . Addison-Wesley. pag. 98.ISBN 978-0-201-50480-4.
  4. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 32.ISBN 978-0-13-854662-5.
  5. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 7.ISBN 0-201-71012-9.
  6. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 30.ISBN 0-201-71012-9. Su intención era producir un lenguaje que fuera muy sencillo de aprender para los estudiantes[.]
  7. ^ abc Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 31.ISBN 0-201-71012-9.
  8. ^ abcdef Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 30.ISBN 0-201-71012-9.
  9. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 30.ISBN 0-201-71012-9. La idea era que los estudiantes pudieran ser usuarios meramente ocasionales o pasar de lenguajes Básicos a lenguajes más sofisticados y potentes[.]
  10. ^ ab McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 16.ISBN 978-0-8027-1348-3.
  11. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 14.ISBN 978-0-13-854662-5.
  12. ^ Bromley, Allan G. (1998). "Máquina analítica de Charles Babbage, 1838" (PDF) . Anales IEEE de la historia de la informática . 20 (4): 29–45. doi : 10.1109/85.728228. S2CID  2285332. Archivado (PDF) desde el original el 4 de marzo de 2016 . Consultado el 30 de octubre de 2015 .
  13. ^ ab Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 15.ISBN 978-0-13-854662-5.
  14. ^ J.Fuegi; J. Francis (octubre-diciembre de 2003), "Lovelace & Babbage y la creación de las 'notas' de 1843", Anales de la Historia de la Computación , 25 (4): 16, 19, 25, doi :10.1109/MAHC.2003.1253887
  15. ^ Rosen, Kenneth H. (1991). Matemática discreta y sus aplicaciones. McGraw-Hill, Inc. pág. 654.ISBN 978-0-07-053744-6. Las máquinas de Turing pueden modelar todos los cálculos que se pueden realizar en una máquina informática.
  16. ^ Linz, Peter (1990). Introducción a los lenguajes formales y los autómatas . DC Heath y compañía. pag. 234.ISBN 978-0-669-17342-0.
  17. ^ Linz, Peter (1990). Introducción a los lenguajes formales y los autómatas . DC Heath y compañía. pag. 243.ISBN 978-0-669-17342-0. [Todas] todas las funciones matemáticas comunes, sin importar cuán complicadas sean, son computables por Turing.
  18. ^ abc McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 102.ISBN 978-0-8027-1348-3.
  19. ^ McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 94.ISBN 978-0-8027-1348-3.
  20. ^ McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 107.ISBN 978-0-8027-1348-3.
  21. ^ McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 120.ISBN 978-0-8027-1348-3.
  22. ^ ab McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 118.ISBN 978-0-8027-1348-3.
  23. ^ McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 119.ISBN 978-0-8027-1348-3.
  24. ^ McCartney, Scott (1999). ENIAC: los triunfos y las tragedias de la primera computadora del mundo. Walker y compañía. pag. 123.ISBN 978-0-8027-1348-3.
  25. ^ ab Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición . Prentice Hall. pag. 21.ISBN 978-0-13-854662-5.
  26. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 27.ISBN 0-201-71012-9.
  27. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 29.ISBN 0-201-71012-9.
  28. ^ abc Silberschatz, Abraham (1994). Conceptos de sistemas operativos, cuarta edición . Addison-Wesley. pag. 6.ISBN 978-0-201-50480-4.
  29. ^ abcdefghi "Bill Pentz - Un poco de historia: la marcha de la posguerra hacia VLSI". Museo de la Computación Digibarn. Agosto de 2008. Archivado desde el original el 21 de marzo de 2022 . Consultado el 31 de enero de 2022 .
  30. ^ ab Hacia la era digital: laboratorios de investigación, empresas de nueva creación y el auge de MOS. Prensa de la Universidad Johns Hopkins. 2002.ISBN 9780801886393. Archivado desde el original el 2 de febrero de 2023 . Consultado el 3 de febrero de 2022 .
  31. ^ Chalamala, Babu (2017). "Fabricación de Materiales de Silicio para Microelectrónica y Energía Solar FV". Laboratorios Nacionales Sandia. Archivado desde el original el 23 de marzo de 2023 . Consultado el 8 de febrero de 2022 .
  32. ^ "Fabricación de circuitos integrados Fabricación de una oblea base". Británica. Archivado desde el original el 8 de febrero de 2022 . Consultado el 8 de febrero de 2022 .
  33. ^ "Introducción a los transistores NMOS y PMOS". Cualquier silicio. 4 de noviembre de 2021. Archivado desde el original el 6 de febrero de 2022 . Consultado el 5 de febrero de 2022 .
  34. ^ "definición de microprocesador". Británica. Archivado desde el original el 1 de abril de 2022 . Consultado el 1 de abril de 2022 .
  35. ^ "Salón de la fama del chip: microprocesador Intel 4004". Instituto de Ingenieros Eléctricos y Electrónicos. 2 de julio de 2018. Archivado desde el original el 7 de febrero de 2022 . Consultado el 31 de enero de 2022 .
  36. ^ "Revolución 360" (PDF) . Padre, hijo y compañía 1990. Archivado (PDF) desde el original el 10 de octubre de 2022 . Consultado el 5 de febrero de 2022 .
  37. ^ ab "Dentro de la primera microcomputadora del mundo perdida hace mucho tiempo". c/net. 8 de enero de 2010. Archivado desde el original el 1 de febrero de 2022 . Consultado el 31 de enero de 2022 .
  38. ^ "Bill Gates, Microsoft y la computadora personal IBM". Infomundo. 23 de agosto de 1982. Archivado desde el original el 18 de febrero de 2023 . Consultado el 1 de febrero de 2022 .
  39. ^ ab Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 10.ISBN 978-0-321-56384-2.
  40. ^ abc Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 11.ISBN 978-0-321-56384-2.
  41. ^ ab Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 159.ISBN 0-619-06489-7.
  42. ^ ab Linz, Peter (1990). Introducción a los lenguajes formales y los autómatas . DC Heath y compañía. pag. 2.ISBN 978-0-669-17342-0.
  43. ^ Weiss, Mark Allen (1994). Estructuras de datos y análisis de algoritmos en C++ . Benjamin/Cummings Publishing Company, Inc. pág. 29.ISBN 0-8053-5443-3.
  44. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 17.ISBN 978-0-13-854662-5.
  45. ^ Escalera abcdef, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 160.ISBN 0-619-06489-7.
  46. ^ abc Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 399.ISBN 978-0-13-854662-5.
  47. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 400.ISBN 978-0-13-854662-5.
  48. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 398.ISBN 978-0-13-854662-5.
  49. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 26.ISBN 0-201-71012-9.
  50. ^ abcd Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 37.ISBN 0-201-71012-9.
  51. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 160.ISBN 0-619-06489-7. Con los lenguajes de programación de tercera generación y de nivel superior, cada declaración del lenguaje se traduce en varias instrucciones en lenguaje de máquina.
  52. ^ Wilson, Leslie B. (1993). Lenguajes de programación comparativos, segunda edición . Addison-Wesley. pag. 75.ISBN 978-0-201-56885-1.
  53. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 40.ISBN 978-0-321-56384-2.
  54. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 16.ISBN 0-201-71012-9.
  55. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 24.ISBN 0-201-71012-9.
  56. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 25.ISBN 0-201-71012-9.
  57. ^ abcd Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 19.ISBN 0-201-71012-9.
  58. ^ abcd "Diseño de memoria de programas C". 12 de septiembre de 2011. Archivado desde el original el 6 de noviembre de 2021 . Consultado el 6 de noviembre de 2021 .
  59. ^ ab Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C, segunda edición . Prentice Hall. pag. 31.ISBN 0-13-110362-8.
  60. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 128.ISBN 0-201-71012-9.
  61. ^ abc Kerrisk, Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 121.ISBN 978-1-59327-220-3.
  62. ^ Kerrisk, Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 122.ISBN 978-1-59327-220-3.
  63. ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C, segunda edición . Prentice Hall. pag. 185.ISBN 0-13-110362-8.
  64. ^ ab Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C, segunda edición . Prentice Hall. pag. 187.ISBN 0-13-110362-8.
  65. ^ abc Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 38.ISBN 0-201-71012-9.
  66. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 193.ISBN 0-201-71012-9.
  67. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 39.ISBN 0-201-71012-9.
  68. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 35.ISBN 0-201-71012-9.
  69. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 192.ISBN 0-201-71012-9.
  70. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 22.ISBN 978-0-321-56384-2.
  71. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 21.ISBN 978-0-321-56384-2.
  72. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++, cuarta edición . Addison-Wesley. pag. 49.ISBN 978-0-321-56384-2.
  73. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 218.ISBN 0-201-71012-9.
  74. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 217.ISBN 0-201-71012-9.
  75. ^ Weiss, Mark Allen (1994). Estructuras de datos y análisis de algoritmos en C++ . Benjamin/Cummings Publishing Company, Inc. pág. 103.ISBN 0-8053-5443-3. Cuando hay una llamada a una función, es necesario guardar toda la información importante, como los valores de registro (correspondientes a los nombres de las variables) y la dirección de retorno (que se puede obtener del contador del programa)[.]... Cuando la función quiere para volver, ... restaura todos los registros. Luego da el salto de regreso. Claramente, todo este trabajo se puede realizar usando una pila, y eso es exactamente lo que sucede en prácticamente todos los lenguajes de programación que implementan la recursividad.
  76. ^ abc Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 230.ISBN 0-201-71012-9.
  77. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 240.ISBN 0-201-71012-9.
  78. ^ abc Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 241.ISBN 0-201-71012-9.
  79. ^ Jones, Robin; Maynard, Clive; Stewart, Ian (6 de diciembre de 2012). El arte de la programación Lisp . Medios de ciencia y negocios de Springer. pag. 2.ISBN 9781447117193.
  80. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 220.ISBN 0-201-71012-9.
  81. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 221.ISBN 0-201-71012-9.
  82. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 229.ISBN 0-201-71012-9.
  83. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 227.ISBN 0-201-71012-9.
  84. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 222.ISBN 0-201-71012-9.
  85. ^ Gordon, Michael JC (1996). "De LCF a HOL: una breve historia". Archivado desde el original el 5 de septiembre de 2016 . Consultado el 30 de octubre de 2021 .
  86. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 233.ISBN 0-201-71012-9.
  87. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 235.ISBN 0-201-71012-9.
  88. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 55.ISBN 0-201-71012-9.
  89. ^ Colmerauer, A.; Roussel, P. (1992). «El nacimiento de Prolog» (PDF) . Avisos ACM SIGPLAN . Asociación para Maquinaria de Computación. 28 (3): 5. doi :10.1145/155360.155362.
  90. ^ Kowalski, R., Dávila, J., Sartor, G. y Calejo, M., 2023. Inglés lógico para el derecho y la educación. En Prólogo: Los próximos 50 años (págs. 287-299). Cham: Springer Nature Suiza.
  91. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 35.ISBN 0-201-71012-9. Simula se basó en Algol 60 con una adición muy importante: el concepto de clase. ... La idea básica era que los datos (o estructura de datos) y las operaciones realizadas en ellos van de la mano[.]
  92. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 39.ISBN 0-201-71012-9. Originalmente, se diseñaron una gran cantidad de lenguajes experimentales, muchos de los cuales combinaban programación funcional y orientada a objetos.
  93. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 284.ISBN 0-256-08515-3. Si bien es cierto que OOD [(diseño orientado a objetos)] como tal no es compatible con la mayoría de los lenguajes populares, se puede utilizar un gran subconjunto de OOD.
  94. ^ Weiss, Mark Allen (1994). Estructuras de datos y análisis de algoritmos en C++ . Benjamin/Cummings Publishing Company, Inc. pág. 57.ISBN 0-8053-5443-3.
  95. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 285.ISBN 0-256-08515-3.
  96. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 290.ISBN 0-201-71012-9. La sintaxis (o gramática) de un lenguaje de programación describe la forma correcta en la que se pueden escribir los programas[.]
  97. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 78.ISBN 0-201-71012-9. Los componentes principales de un lenguaje imperativo son declaraciones, expresiones y enunciados.
  98. ^ ab Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 290.ISBN 0-201-71012-9.
  99. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 294.ISBN 0-201-71012-9.
  100. ^ Rosen, Kenneth H. (1991). Matemática discreta y sus aplicaciones. McGraw-Hill, Inc. pág. 615.ISBN 978-0-07-053744-6.
  101. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 291.ISBN 0-201-71012-9.
  102. ^ Rosen, Kenneth H. (1991). Matemática discreta y sus aplicaciones. McGraw-Hill, Inc. pág. 616.ISBN 978-0-07-053744-6.
  103. ^ Rosen, Kenneth H. (1991). Matemática discreta y sus aplicaciones. McGraw-Hill, Inc. pág. 623.ISBN 978-0-07-053744-6.
  104. ^ Rosen, Kenneth H. (1991). Matemática discreta y sus aplicaciones. McGraw-Hill, Inc. pág. 624.ISBN 978-0-07-053744-6.
  105. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 297.ISBN 0-201-71012-9.
  106. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. Prefacio. ISBN 0-256-08515-3.
  107. ^ Escalera abc, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 507.ISBN 0-619-06489-7.
  108. ^ ab Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 513.ISBN 0-619-06489-7.
  109. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 514.ISBN 0-619-06489-7.
  110. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 516.ISBN 0-619-06489-7.
  111. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 8.ISBN 0-256-08515-3.
  112. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 517.ISBN 0-619-06489-7.
  113. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 345.ISBN 0-256-08515-3.
  114. ^ abcd Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 319.ISBN 0-256-08515-3.
  115. ^ ab Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 331.ISBN 0-256-08515-3.
  116. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 216.ISBN 0-256-08515-3.
  117. ^ abc Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 219.ISBN 0-256-08515-3.
  118. ^ ab Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 226.ISBN 0-256-08515-3.
  119. ^ ab Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 220.ISBN 0-256-08515-3.
  120. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 258.ISBN 0-256-08515-3.
  121. ^ Schach, Stephen R. (1990). Ingeniería de software . Editores incorporados de Aksen Associates. pag. 259.ISBN 0-256-08515-3.
  122. ^ abc Silberschatz, Abraham (1994). Conceptos de sistemas operativos, cuarta edición . Addison-Wesley. pag. 1.ISBN 978-0-201-50480-4.
  123. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 147.ISBN 0-619-06489-7. La clave para desbloquear el potencial de cualquier sistema informático es el software de aplicación.
  124. ^ Escalera abcd, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 147.ISBN 0-619-06489-7.
  125. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 147.ISBN 0-619-06489-7. [Una] empresa de software de terceros, a menudo denominada proveedor de software de valor agregado, puede desarrollar o modificar un programa de software para satisfacer las necesidades de una industria o empresa en particular.
  126. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 148.ISBN 0-619-06489-7. Título: Software propietario; Subtítulo: Ventajas; Cita: Puede obtener exactamente lo que necesita en términos de funciones, informes, etc.
  127. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 148.ISBN 0-619-06489-7. Título: Software propietario; Subtítulo: Ventajas; Cita: Estar involucrado en el desarrollo ofrece un mayor nivel de control sobre los resultados.
  128. ^ Escalera, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 147.ISBN 0-619-06489-7. Título: Software propietario; Subtítulo: Ventajas; Cita: Hay más flexibilidad para realizar modificaciones que puedan ser necesarias para contrarrestar una nueva iniciativa de uno de sus competidores o para cumplir con los requisitos de nuevos proveedores y/o clientes.
  129. ^ Escalera abcd, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 149.ISBN 0-619-06489-7.
  130. ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición. Prentice Hall. pag. 11.ISBN 978-0-13-854662-5.
  131. ^ ab Kerrisk, Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 21.ISBN 978-1-59327-220-3.
  132. ^ abcdeKerrisk , Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 22.ISBN 978-1-59327-220-3.
  133. ^ abc Bach, Maurice J. (1986). El diseño del sistema operativo UNIX . Prentice-Hall, Inc. pág. 152.ISBN 0-13-201799-7.
  134. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 443.ISBN 978-0-13-291652-3.
  135. ^ Lacamera, Daniele (2018). Arquitectura de sistemas integrados . Paquete. pag. 8.ISBN 978-1-78883-250-2.
  136. ^ Kerrisk, Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 23.ISBN 978-1-59327-220-3.
  137. ^ Kernighan, Brian W. (1984). El entorno de programación Unix . Prentice Hall. pag. 201.ISBN 0-13-937699-2.
  138. ^ Kerrisk, Michael (2010). La interfaz de programación de Linux . Sin prensa de almidón. pag. 187.ISBN 978-1-59327-220-3.
  139. ^ Haviland, Keith (1987). Programación del sistema Unix . Compañía editorial Addison-Wesley. pag. 121.ISBN 0-201-12919-1.
  140. ^ Escalera abc, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 145.ISBN 0-619-06489-7.
  141. ^ Escalera abc, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thompson. pag. 146.ISBN 0-619-06489-7.
  142. ^ ab Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 6.ISBN 978-0-13-291652-3.
  143. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 243.ISBN 978-0-13-291652-3.
  144. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 147.ISBN 978-0-13-291652-3.
  145. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 148.ISBN 978-0-13-291652-3.
  146. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 253.ISBN 978-0-13-291652-3.
  147. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 255.ISBN 978-0-13-291652-3.
  148. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 161.ISBN 978-0-13-291652-3.
  149. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 166.ISBN 978-0-13-291652-3.
  150. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 249.ISBN 978-0-13-291652-3.
  151. ^ Tanenbaum, Andrew S. (2013). Organización informática estructurada, sexta edición . Pearson. pag. 111.ISBN 978-0-13-291652-3.