stringtranslate.com

Programa de computadora

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

Un programa informático es una secuencia o conjunto de instrucciones en un lenguaje de programación que un ordenador debe ejecutar . Es un componente del software , que también incluye documentación y otros componentes intangibles. [1]

Un programa informático en su forma legible por humanos se denomina código fuente . El código fuente necesita otro programa informático para ejecutarse porque los ordenadores solo pueden ejecutar sus instrucciones de máquina nativas . Por lo tanto, el código fuente puede traducirse a instrucciones de máquina utilizando un compilador escrito para el lenguaje. ( Los programas en lenguaje ensamblador se traducen utilizando un ensamblador ). El archivo resultante se denomina ejecutable . Alternativamente, el código fuente puede ejecutarse dentro de un intérprete escrito para el lenguaje. [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 que pueda 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. A continuación, el intérprete carga el código fuente en la memoria para traducir y ejecutar cada instrucción . La ejecución del código fuente es más lenta que la de un ejecutable . [5] [b] Además, el intérprete debe estar instalado en la computadora.

Ejemplo de programa informático

El programa "¡Hola, mundo!" 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 ser utilizadas. [7] Además, las variables se inicializan automáticamente a cero. [7] A continuación se muestra un programa de computadora de ejemplo, en Basic, para promediar una lista de números: [8]

10 INPUT "¿Cuántos números hay que promediar?" , A 20 FOR I = 1 TO A 30 INPUT "Ingrese el 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 aprenden los mecanismos de la programación informática básica, se dispone de lenguajes más sofisticados y potentes para construir grandes sistemas informáticos. [9]

Historia

Las mejoras en el desarrollo de software son el resultado de mejoras en el hardware de las computadoras . En cada etapa de la historia del hardware, la tarea de la programación de computadoras 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 almacén que consistía en una memoria para almacenar 1.000 números de 50 dígitos decimales cada uno. [11] Los números del almacén se transferían al molino para su procesamiento. Se programaba utilizando dos juegos de tarjetas perforadas. Un juego dirigía la operación y el otro juego introducía las variables. [10] [12] Sin embargo, las miles de ruedas dentadas y engranajes nunca funcionaron completamente juntos. [13]

Ada Lovelace trabajó para Charles Babbage en la creación de una descripción de la máquina analítica (1843). [14] La descripción contenía la Nota G, que detallaba por completo un método para calcular números de Bernoulli utilizando la máquina analítica. Algunos historiadores reconocen esta nota 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 cada cálculo. [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 comienza en el estado inicial, pasa por una secuencia de pasos y se detiene cuando encuentra el estado de detención. [16] Todas las computadoras actuales son completas de Turing . [17]

ENIAC

Glenn A. Beck cambiando un tubo en ENIAC

El Integrador Numérico Electrónico y Computador (ENIAC) fue construido entre julio de 1943 y otoño de 1945. Era un computador completo de Turing , de propósito general, que usaba 17,468 tubos de vacío para crear los circuitos . En esencia, era una serie de Pascalines conectados entre sí. [18] Sus 40 unidades pesaban 30 toneladas, ocupaban 1,800 pies cuadrados (167 m 2 ) y consumían $650 por hora ( en la moneda de la década de 1940 ) en electricidad cuando estaban inactivas. [18] Tenía 20 acumuladores de base 10. Programar el ENIAC llevaba hasta dos meses. [18] Tres mesas de funciones estaban sobre ruedas y necesitaban ser trasladadas a paneles de funciones fijos. Las mesas de funciones se conectaban a los paneles de funciones enchufando cables negros pesados ​​en tableros de conexiones . Cada mesa de funciones tenía 728 perillas giratorias. Programar el ENIAC también implicaba configurar algunos de los 3,000 interruptores. La depuración de un programa llevó una semana. [19] Funcionó desde 1947 hasta 1955 en el campo de pruebas de Aberdeen , 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 programa almacenado

En lugar de enchufar cables y activar interruptores, una computadora con programa almacenado carga sus instrucciones en la memoria de la misma manera 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 de la computadora con las estructuras del cerebro humano. [22] El diseño se conoció como la arquitectura de 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 podí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] —tener múltiples procesos en memoria a la vez. Cuando un proceso estaba esperando entrada/salida , otro podía computar.

IBM planeó que cada modelo se programara utilizando 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 completo, fácil de usar, extensible y que reemplazara a Cobol y Fortran. [26] El resultado fue un lenguaje grande y complejo que tardaba mucho tiempo en 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 la programación manual. [28] El programa de computadora se escribía en papel para su consulta. Una instrucción se representaba mediante una configuración de opciones de encendido y apagado. Después de establecer la configuración, se presionaba un botón de ejecución. Este proceso se repetía a continuación. Los programas de computadora también se ingresaban automáticamente a través de cinta de papel , tarjetas perforadas o cinta magnética . Después de cargar el medio, se establecía la dirección de inicio a través de interruptores y se presionaba 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) e Intel (1968), logró una mejora tecnológica para refinar 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 . Primero, los minerales de silicato naturales se convierten en varillas de polisilicio utilizando el proceso Siemens . [31] Luego, el proceso Czochralski convierte 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 unipolares, capacitores , diodos y resistencias en la oblea para construir una matriz de transistores de metal-óxido-semiconductor (MOS). [33] [34] El transistor MOS es el componente principal en 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 solo lectura (ROM). La matriz se parecía a una matriz bidimensional de fusibles. [29] El proceso para incrustar instrucciones en la matriz consistía 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 quema. [29] La tecnología se conoció como ROM programable . En 1971, Intel instaló el programa de computadora en el chip y lo denominó microprocesador Intel 4004. [35]

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

En la actualidad, los términos microprocesador y unidad central de procesamiento (CPU) se utilizan 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 circuitos que contenían componentes discretos sobre sustratos cerámicos . [36]

Estado de Saskatoon 8008

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

El Intel 4004 (1971) fue 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 el primer microordenador que utilizaba el Intel 8008: el Sac State 8008 (1972). [37] Su propósito era almacenar registros médicos de pacientes. El ordenador 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 que estaban empaquetados en una única consola. El sistema operativo de disco se programó utilizando el lenguaje ensamblador básico (BAL) de IBM . La aplicación de registros médicos se programó utilizando un intérprete BASIC . [29] Sin embargo, el ordenador era un callejón sin salida evolutivo porque era extremadamente caro. Además, se construyó en un laboratorio de una universidad pública para un propósito específico. [37] Sin embargo, 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 más económico Intel 8088. [ 38] IBM adoptó el Intel 8088 cuando entró en el mercado de las computadoras personales (1981). A medida que la demanda de computadoras personales por parte de los consumidores aumentó, también lo hizo el desarrollo de microprocesadores de Intel. La sucesión de desarrollo se conoce como la serie x86 . El lenguaje ensamblador x86 es una familia de instrucciones de máquina compatibles con versiones anteriores . Las instrucciones de máquina creadas en microprocesadores anteriores se conservaron a lo largo de las actualizaciones de microprocesadores. Esto permitió a los consumidores comprar nuevas computadoras sin tener que comprar nuevo software de aplicación . Las principales categorías de instrucciones son: [c]

Cambio del entorno de programación

El DEC VT100 (1978) fue un terminal de computadora ampliamente 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). Las terminales de computadora limitaban a los programadores a un solo shell que se ejecutaba en un entorno de línea de comandos . Durante la década de 1970, la edición de 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 puedan combinar 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 bloques de construcción 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 los cuales los programadores pueden comunicar instrucciones a la computadora. [41] Siguen un conjunto de reglas llamadas 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 subyacente. [42] Un algoritmo es una secuencia de instrucciones simples que resuelven un problema. [43]

Generaciones de lenguajes de programación

Monitor de lenguaje de máquina en un microprocesador W65C816S

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

  • La estructura básica de una declaración en lenguaje ensamblador es una etiqueta, una operación , un operando y un comentario. [47]
  • Las etiquetas permiten al programador trabajar con nombres de variables . El ensamblador traducirá posteriormente las etiquetas en direcciones de memoria física .
  • Las operaciones permiten al programador trabajar con mnemónicos. El ensamblador traducirá posteriormente los mnemónicos en números de instrucciones.
  • 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 una correspondencia uno a uno con su destino en lenguaje máquina correspondiente. [48]

Lenguas imperativas

Un programa de computadora escrito en un lenguaje imperativo.

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

Fortran

FORTRAN (1958) se presentó como "El sistema de traducción de fórmulas matemáticas de IBM". Fue diseñado para cálculos científicos, sin funciones de manejo de cadenas . Junto con declaraciones , expresiones y sentencias , admitía:

Tuvo éxito porque:

Sin embargo, otros proveedores que no eran IBM también escribieron compiladores Fortran, pero con una sintaxis que probablemente no sería compatible con 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". Fortran manipulaba símbolos. Pronto se comprendió que los símbolos no tenían por qué ser números, por lo que se introdujeron las cadenas . [55] El Departamento de Defensa de los EE. UU. influyó en el desarrollo de COBOL, y Grace Hopper fue una de las principales contribuyentes. Las instrucciones eran similares a las del inglés y verbosas. El objetivo era diseñar un lenguaje para que los gerentes pudieran leer los programas. Sin embargo, la falta de instrucciones estructuradas impidió este objetivo. [56]

El desarrollo de COBOL estuvo muy 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 los años 1990 sí introdujo 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 de lenguajes de programación. [57] Surgió 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 los compiladores dirigidos por sintaxis . Añadió características como:

Los descendientes directos de Algol incluyen 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 multipropósito para principiantes". Fue desarrollado en el Dartmouth College para que lo aprendieran todos sus estudiantes. [8] Si un estudiante no pasaba a un lenguaje más potente, seguiría recordando Basic. [8] Se instaló un intérprete de Basic en los microordenadores fabricados a finales de los años 70. A medida que la industria de los microordenadores crecía, 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 más recientes añadieron estructura y extensiones orientadas a objetos. El Visual Basic de Microsoft todavía se utiliza ampliamente y produce una interfaz gráfica de usuario . [7]

do

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ó características avanzadas como:

Mapa de memoria de la computadora

C permite al programador controlar qué región de la memoria se va a almacenar. Las variables globales y 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 desde la malloc()función.

  • La región de datos globales y estáticos son técnicamente dos regiones. [58] Una región se denomina segmento de datos inicializados , donde se almacenan las variables declaradas con valores predeterminados. La otra región se denomina bloque iniciado por segmento , donde se almacenan las variables declaradas sin valores predeterminados.
  • Las direcciones de las variables almacenadas en la región de datos globales y estáticos se configuran en el momento de la compilación y conservan sus valores durante toda la vida del proceso.
  • La región global y estática almacena las variables globales que se declaran encima de (fuera de) la main()función. [59] Las variables globales son visibles para main()todas las demás funciones en el código fuente.
Por otra parte, las declaraciones de variables dentro de main(), otras funciones o dentro de { } delimitadores de bloques son variables locales . Las variables locales también incluyen variables de parámetros formales . Las variables de parámetros se encierran dentro de los paréntesis de una definición de función. [60] Los parámetros proporcionan una interfaz a 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 el 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;}[g]
  • 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. [i] [64] Llenar el montón con datos es una función de copia adicional. [j] Las variables almacenadas en el montón se pasan de manera económica a las 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 de lenguaje para dividir proyectos grandes en módulos . [65] Una característica obvia era descomponer proyectos grandes físicamente en archivos separados . Una característica menos obvia era descomponer proyectos grandes lógicamente 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, con un nuevo nombre asignado. Por ejemplo, una lista de números enteros podría llamarse integer_list.

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

Los lenguajes imperativos orientados a objetos se desarrollaron 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 subconjuntos/superconjuntos . 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 lo 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 subconjuntos/superconjuntos utilizando la herencia . [69] La programación orientada a objetos se convirtió en el paradigma de lenguaje dominante a fines de la década de 1990. [65]

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

Un módulo orientado a objetos se compone de dos archivos. El archivo de definiciones se denomina archivo de encabezado . A continuación, se muestra un archivo de encabezado de C++ para la clase GRADE en una aplicación escolar sencilla:

// grado.h // -------// Se utiliza para permitir que varios archivos de origen incluyan este archivo de encabezado sin errores de duplicación. // ---------------------------------------------- #ifndef GRADE_H #define GRADE_Hclase GRADE { public : // Esta es la operación del constructor. // ---------------------------------- GRADE ( const char letter );           // Esta es una variable de clase. // ------------------------- char letra ;    // Esta es una operación miembro. // --------------------------- int grade_numeric ( const char letter );        // Esta es una variable de clase. // ------------------------- int numérico ; }; #endif   

Una operación constructora 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 . A continuación, se muestra un archivo fuente de C++ para la clase GRADE en una aplicación escolar sencilla:

// calificación.cpp // --------- #include "calificación.h" GRADE :: GRADE ( const char letter ) { // Hacer referencia al objeto usando la palabra clave 'this'. // ---------------------------------------------- this -> letter = letter ;          // Esto es cohesión temporal // ------------------------- this -> numeric = grade_numeric ( letter ); }      int CALIFICACIÓN :: calificación_numérica ( const char letra ) { if ( ( letra == 'A' || letra == 'a' ) ) return 4 ; else if ( ( letra == 'B' || letra == 'b' ) ) return 3 ; else if ( ( letra == 'C' || letra == 'c' ) ) return 2 ; else if ( ( letra == 'D' || letra == 'd' ) ) return 1 ; else if ( ( letra == 'F' || letra == 'f' ) ) return 0 ; else return -1 ; }                                                                                  

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

// persona.h // -------- #ifndef PERSONA_H #define PERSONA_Hclase PERSONA { público : PERSONA ( const char * nombre ); const char * nombre ; }; #endif           

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

// persona.cpp // ---------- #include "persona.h" PERSONA :: PERSONA ( const char * nombre ) { this -> 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#include "persona.h" #include "calificación.h"  // Un ESTUDIANTE es un subconjunto de PERSONA. // -------------------------------- class ESTUDIANTE : public PERSONA { public : ESTUDIANTE ( const char * nombre ); CALIFICACIÓN * calificación ; }; #endif            

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

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

A continuación se muestra un programa de controlador para demostración:

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

Aquí hay un makefile para compilar todo:

# makefile # -------- todos : student_dvr limpio :  rm  student_dvr  *.oestudiante_dvr : estudiante_dvr . cpp grado . o estudiante . o persona . o c++ estudiante_dvr.cpp grado.o estudiante.o persona.o -o estudiante_dvr           grado.o : grado .cpp grado .h c ++ -c grado.cpp     estudiante.o : estudiante . cpp estudiante . h c++ -c estudiante. cpp     persona.o : persona . cpp persona . 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 amplias categorías 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 expresión 10 * x se asigna mediante la función times_10()a un rango de valores . Un valor es 20. Esto ocurre cuando x es 2. Por lo tanto, la aplicación de la función se escribe matemáticamente como:

times_10(2) = 20

Un compilador de lenguaje funcional no almacenará este valor en una variable, sino que lo colocará en la pila de la computadora antes de volver a poner el contador del programa en la función que lo llamó. La función que lo llamó 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 utiliza 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 controladora es range(). Ejecutando:

put( range( 10, 4, 7) );salida 6.

Los lenguajes funcionales se utilizan en la investigación 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 "LISt Processor" (Procesador de listas). [79] Está diseñado para procesar listas . Se forma una estructura completa de los datos mediante la construcción de listas de listas. En la memoria, se construye una estructura de datos en forma de árbol . Internamente, la estructura en forma 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 primeros dos 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 excepto 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 se anidan muchas funciones, los paréntesis pueden parecer confusos. [76] Los entornos Lisp modernos ayudan a garantizar la coincidencia de paréntesis. Como acotación al margen, Lisp admite las operaciones de lenguaje imperativo de la declaración de asignación y los bucles goto. [82] Además, Lisp no se preocupa por el tipo de datos de los elementos en tiempo de 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 llama 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, fiables y legibles requiere previsión. Si se planifica adecuadamente, el programa puede ser mucho más corto que un programa equivalente en lenguaje imperativo . [76] Lisp se utiliza ampliamente en inteligencia artificial . Sin embargo, su uso ha sido aceptado solo porque tiene operaciones de lenguaje imperativo , lo que hace posibles efectos secundarios no deseados. [78]

Ml

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

diversión  veces_10 ( n  :  int )  :  int  =  10  *  n ;

ML no es excéntrico en cuanto a 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 . La asignación del 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 que se utilicen. [88]

Prólogo

Prolog (1972) significa "PROgramming in LOGic" (PROgramación en lógica). 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 definidas lineales selectivas , iniciada por Robert Kowalski y otros en la Universidad de Edimburgo . [89]

Los elementos básicos de un programa Prolog son hechos y reglas . A continuación se muestra un ejemplo sencillo:

gato ( tom ).  % tom es un gato ratón ( 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 comer ( X , Y )  :-  grande ( X ),  pequeño ( Y ).  % cada animal grande come cada animal pequeño

Una vez introducidos todos los hechos y reglas, se puede plantear una pregunta:

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

El siguiente ejemplo muestra cómo Prolog convertirá una calificación de letra en su valor numérico:

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

He aquí un ejemplo completo: [90]

1) Todos los dragones arrojan fuego, o equivalentemente, una cosa arroja fuego si la cosa es un dragón:

olas_de_fuego ( X )  :-  es_un_dragon ( X ).

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

billows_fire ( X )  :-  es_una_criatura ( X ),  es_un_padre_de ( 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_padre_de ( X ,  Y ):-  es_la_madre_de ( X ,  Y ). es_padre_de ( X ,  Y ):-  es_el_padre_de ( X ,  Y ).

4) Una cosa es una criatura si la cosa 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_un_dragón ( norberta ). es_una_criatura ( puff ). es_la_madre_de ( norberta ,  puff ).

La regla (2) es una definición recursiva (inductiva). Puede entenderse de manera declarativa, sin necesidad de entender cómo se ejecuta.

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

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

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

 ?-  olas_de_fuego ( X ).

Prolog genera dos respuestas:

X  =  norberta X  =  puff

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] La programación orientada a objetos se desarrolló combinando la necesidad de contenedores y la necesidad de una 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, es necesario escribir operaciones específicamente para la estructura. La estructura resultante se llama tipo de datos abstracto . [94] Sin embargo, faltará la herencia . No obstante, esta deficiencia se puede superar.

A continuación se muestra 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 de origen incluyan */ /* este archivo de encabezado sin errores de duplicación. */ /* ---------------------------------------------- */ #ifndef GRADE_H #define GRADE_Htypedef struct { char letra ; } CALIFICACIÓN ;    /* Constructor */ /* ----------- */ CALIFICACIÓN * calificación_nueva ( char letra );    int grado_numérico ( char letra ); #endif    

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

A continuación se muestra un archivo fuente del lenguaje de programación C para el tipo de datos abstracto GRADE en una aplicación escolar simple:

/* calificación.c */ /* ------- */ #include "calificación.h" CALIFICACIÓN * calificación_nueva ( char letra ) { CALIFICACIÓN * calificación ;       /* Asignar memoria de montón */ /* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ERROR en %s/%s/%d: calloc() devolvió vacío. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }                            calificación -> letra = letra ; devolver calificación ; }    int grado_numérico ( char letra ) { if ( ( letra == 'A' || letra == 'a' ) ) devuelve 4 ; de lo contrario if ( ( letra == 'B' || letra == 'b' ) ) devuelve 3 ; de lo contrario if ( ( letra == 'C' || letra == 'c' ) ) devuelve 2 ; de lo contrario if ( ( letra == 'D' || letra == 'd' ) ) devuelve 1 ; de lo contrario if ( ( letra == 'F' || letra == 'f' ) ) devuelve 0 ; de lo contrario devuelve -1 ; }                                                                                 

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

A continuación se muestra 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 PERSONA_H #define PERSONA_Htypedef struct { char * nombre ; } PERSONA ;    /* Constructor */ /* ----------- */ PERSONA * persona_nueva ( char * nombre ); #endif    

A continuación se muestra un archivo fuente del lenguaje de programación C para el tipo de datos abstracto PERSONA en una aplicación escolar simple:

/* persona.c */ /* -------- */ #include "persona.h" PERSONA * persona_nueva ( char * nombre ) { PERSONA * persona ;       if ( ! ( person = calloc ( 1 , sizeof ( PERSON ) ) ) ) { fprintf ( stderr , "ERROR en %s/%s/%d: calloc() devolvió vacío. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }                          persona -> nombre = nombre ; devolver persona ; }    

A continuación se muestra 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#include "persona.h" #include "calificación.h"  typedef struct { /* Un ESTUDIANTE es un subconjunto de PERSONA. */ /* -------------------------------- */ PERSONA * persona ;      CALIFICACIÓN * calificación ; } ESTUDIANTE ;  /* Constructor */ /* ----------- */ ESTUDIANTE * estudiante_nuevo ( char * nombre ); #endif    

A continuación se muestra un archivo fuente del lenguaje de programación C para el tipo de datos abstracto ESTUDIANTE en una aplicación escolar simple:

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

A continuación se muestra un programa de controlador para demostración:

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

Aquí hay un makefile para compilar todo:

# makefile # -------- todos : student_dvr limpio :  rm  student_dvr  *.ostudent_dvr : student_dvr . c grado . o estudiante . o persona . o gcc student_dvr.c grado.o estudiante.o persona.o -o student_dvr           grado.o : grado.c grado.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 programa de computadora 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 asociados a varias 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 inválida. [99] Además, diferentes lenguajes pueden tener la misma sintaxis; sin embargo, sus comportamientos pueden ser diferentes.

La sintaxis de un idioma se describe formalmente mediante la enumeración de las reglas de producción. Mientras que la sintaxis de un idioma 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 un sintagma nominal seguido de un sintagma verbal ;
  2. un sintagma nominal se compone de un artículo seguido de un adjetivo seguido de un sustantivo ;
  3. un sintagma verbal se compone de un verbo seguido de un sintagma 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 con un no terminal válido o con un terminal válido . El proceso de reemplazo se repite hasta que solo queden terminales . Una oración válida es:

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

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

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

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

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

Usando BNF, un entero con signo tiene la regla de producción que se indica: [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

Tenga en cuenta la regla de producción recursiva:

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

Esto permite un número infinito de posibilidades, por lo que es necesaria una semántica que describa 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 iniciales deben ignorarse.

Existen dos métodos formales para describir la semántica : 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 colocando 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 que se van a automatizar. Luego, este profesional prepara un plan detallado para el sistema nuevo o modificado. [107] El plan es análogo al plano de un arquitecto. [107]

Objetivos de desempeño

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

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

Objetivos de costes

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 ser costoso, pero puede ser preferible a un sistema de uso limitado.
  3. Costos de hardware.
  4. Costos de operación.

La aplicación de un proceso de desarrollo de sistemas mitigará el axioma: cuanto más tarde en el proceso se detecta un error, más costoso es 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 consiste en 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 útil del sistema. Es posible que sea necesario realizar 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 sea necesario realizar mejoras. Es posible que sea necesario realizar adaptaciones para reaccionar ante un entorno cambiante.

Programador de computadoras

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 que un solo programador los complete. [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 sea eficaz, 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 una manera significativa y eficaz. [114]

Los programadores informáticos pueden programar en lo pequeño : programar 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 informáticos pueden programar en lo grande : programar módulos para que se acoplen entre sí de manera efectiva. [115] La programación en lo grande incluye contribuir a la interfaz de programación de aplicaciones (API).

Módulos del programa

La programación modular es una técnica para refinar programas en lenguaje imperativo . 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 instrucciones que están delimitadas dentro de un bloque y que se identifican entre sí mediante un nombre. [116] Los módulos tienen una función , un contexto y una lógica : [117]

El nombre del módulo debe derivarse primero de su función y luego de su contexto . Su lógica no debe ser parte del nombre. [117] Por ejemplo, function compute_square_root( x )o function compute_square_root_integer( i : integer )son nombres de módulo 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 la ejecución.

Cohesión

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

Enganche

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

Análisis del 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 hacia los módulos representan un conjunto de entradas. Cada módulo debe tener solo una flecha que apunta hacia afuera para representar su único objeto de salida. (Opcionalmente, una flecha de excepción adicional señala hacia afuera). 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

Diagrama que muestra cómo el usuario interactúa con el software de aplicación . El software de aplicación interactúa con el sistema operativo , que interactúa con el hardware .

Computer programs may be categorized along functional lines. The main functional categories are application software and system software. System software includes the operating system, which couples computer hardware with application software.[122] The purpose of the operating system is to provide an environment where application software executes in a convenient and efficient manner.[122] Both application software and system software execute utility programs. At the hardware level, a microcode program controls the circuits throughout the central processing unit.

Application software

Application software is the key to unlocking the potential of the computer system.[123] Enterprise application software bundles accounting, personnel, customer, and vendor applications. Examples include enterprise resource planning, customer relationship management, and supply chain management software.

Enterprise applications may be developed in-house as a one-of-a-kind proprietary software.[124] Alternatively, they may be purchased as off-the-shelf software. Purchased software may be modified to provide custom software. If the application is customized, then either the company's resources are used or the resources are outsourced. Outsourced software development may be from the original software vendor or a third-party developer.[125]

The potential advantages of in-house software are features and reports may be developed exactly to specification.[126] Management may also be involved in the development process and offer a level of control.[127] Management may decide to counteract a competitor's new initiative or implement a customer or vendor requirement.[128] A merger or acquisition may necessitate enterprise software changes. The potential disadvantages of in-house software are time and resource costs may be extensive.[124] Furthermore, risks concerning features and performance may be looming.

The potential advantages of off-the-shelf software are upfront costs are identifiable, the basic needs should be fulfilled, and its performance and reliability have a track record.[124] The potential disadvantages of off-the-shelf software are it may have unnecessary features that confuse end users, it may lack features the enterprise needs, and the data flow may not match the enterprise's work processes.[124]

One approach to economically obtaining a customized enterprise application is through an application service provider.[129] Specialty companies provide hardware, custom software, and end-user support. They may speed the development of new applications because they possess skilled information system staff. The biggest advantage is it frees in-house resources from staffing and managing complex computer projects.[129] Many application service providers target small, fast-growing companies with limited information system resources.[129] On the other hand, larger companies with major systems will likely have their technical infrastructure in place. One risk is having to trust an external organization with sensitive information. Another risk is having to trust the provider's infrastructure reliability.[129]

Operating system

Program vs. Process vs. Thread
Scheduling, Preemption, Context Switching

An operating system is the low-level software that supports a computer's basic functions, such as scheduling processes and controlling peripherals.[122]

In the 1950s, the programmer, who was also the operator, would write a program and run it. After the program finished executing, the output may have been printed, or it may have been punched onto paper tape or cards for later processing.[28] More often than not the program did not work. The programmer then looked at the console lights and fiddled with the console switches. If less fortunate, a memory printout was made for further study. In the 1960s, programmers reduced the amount of wasted time by automating the operator's job. A program called an operating system was kept in the computer at all times.[130]

The term operating system may refer to two levels of software.[131] The operating system may refer to the kernel program that manages the processes, memory, and devices. More broadly, the operating system may refer to the entire package of the central software. The package includes a kernel program, command-line interpreter, graphical user interface, utility programs, and editor.[131]

Kernel Program

A kernel connects the application software to the hardware of a computer.

The kernel's main purpose is to manage the limited resources of a computer:

Physical memory is scattered around RAM and the hard disk. Virtual memory is one continuous block.
  • When the kernel initially loads an executable into memory, it divides the address space logically into regions.[133] The kernel maintains a master-region table and many per-process-region (pregion) tables—one for each running process.[133] These tables constitute the virtual address space. The master-region table is used to determine where its contents are located in physical memory. The pregion tables allow each process to have its own program (text) pregion, data pregion, and stack pregion.
  • The program pregion stores machine instructions. Since machine instructions do not change, the program pregion may be shared by many processes of the same executable.[133]
  • To save time and memory, the kernel may load only blocks of execution instructions from the disk drive, not the entire execution file completely.[132]
  • The kernel is responsible for translating virtual addresses into physical addresses. The kernel may request data from the memory controller and, instead, receive a page fault.[134] If so, the kernel accesses the memory management unit to populate the physical data region and translate the address.[135]
  • The kernel allocates memory from the heap upon request by a process.[64] When the process is finished with the memory, the process may request for it to be freed. If the process exits without requesting all allocated memory to be freed, then the kernel performs garbage collection to free the memory.
  • The kernel also ensures that a process only accesses its own memory, and not that of the kernel or other processes.[132]

Originally, operating systems were programmed in assembly; however, modern operating systems are typically written in higher-level languages like C, Objective-C, and Swift.[k]

Utility program

A utility program is designed to aid system administration and software execution. Operating systems execute hardware utility programs to check the status of disk drives, memory, speakers, and printers.[140] A utility program may optimize the placement of a file on a crowded disk. System utility programs monitor hardware and network performance. When a metric is outside an acceptable range, a trigger alert is generated.[141]

Utility programs include compression programs so data files are stored on less disk space.[140] Compressed programs also save time when data files are transmitted over the network.[140] Utility programs can sort and merge data sets.[141] Utility programs detect computer viruses.[141]

Microcode program

NOT gate
NAND gate
NOR gate
AND gate
OR gate

A microcode program is the bottom-level interpreter that controls the data path of software-driven computers.[142](Advances in hardware have migrated these operations to hardware execution circuits.)[142] Microcode instructions allow the programmer to more easily implement the digital logic level[143]—the computer's real hardware. The digital logic level is the boundary between computer science and computer engineering.[144]

A logic gate is a tiny transistor that can return one of two signals: on or off.[145]

These five gates form the building blocks of binary algebra—the digital logic functions of the computer.

Microcode instructions are mnemonics programmers may use to execute digital logic functions instead of forming them in binary algebra. They are stored in a central processing unit's (CPU) control store.[146]These hardware-level instructions move data throughout the data path.

The micro-instruction cycle begins when the microsequencer uses its microprogram counter to fetch the next machine instruction from random-access memory.[147] The next step is to decode the machine instruction by selecting the proper output line to the hardware module.[148]The final step is to execute the instruction using the hardware module's set of gates.

A symbolic representation of an ALU

Instructions to perform arithmetic are passed through an arithmetic logic unit (ALU).[149] The ALU has circuits to perform elementary operations to add, shift, and compare integers. By combining and looping the elementary operations through the ALU, the CPU performs its complex arithmetic.

Microcode instructions move data between the CPU and the memory controller. Memory controller microcode instructions manipulate two registers. The memory address register is used to access each memory cell's address. The memory data register is used to set and read each cell's contents.[150]

Microcode instructions move data between the CPU and the many computer buses. The disk controller bus writes to and reads from hard disk drives. Data is also moved between the CPU and other functional units via the peripheral component interconnect express bus.[151]

Notes

  1. ^ The Prolog language allows for a database of facts and rules to be entered in any order. However, a question about a database must be at the very end.
  2. ^ An executable has each machine instruction ready for the CPU.
  3. ^ For more information, visit X86 assembly language#Instruction types.
  4. ^ introduced in 1999
  5. ^ Operators like x++ will usually compile to a single instruction.
  6. ^ The line numbers were typically incremented by 10 to leave room if additional statements were added later.
  7. ^ This function could be written more concisely as int increment_counter(){ static int counter; return ++counter;}. 1) Static variables are automatically initialized to zero. 2) ++counter is a prefix increment operator.
  8. ^ This is despite the metaphor of a stack, which normally grows from bottom to top.
  9. ^ C also provides the calloc() function to allocate heap memory. It provides two additional services: 1) It allows the programmer to create an array of arbitrary size. 2) It sets each memory cell to zero.
  10. ^ For string variables, C provides the strdup() function. It executes both the allocation function and the copy function.
  11. ^ The UNIX operating system was written in C, macOS was written in Objective-C, and Swift replaced Objective-C.

References

  1. ^ "ISO/IEC 2382:2015". ISO. 2020-09-03. Archived from the original on 2016-06-17. Retrieved 2022-05-26. [Software includes] all or part of the programs, procedures, rules, and associated documentation of an information processing system.
  2. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 7. ISBN 0-201-71012-9. An alternative to compiling a source program is to use an interpreter. An interpreter can directly execute a source program[.]
  3. ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 98. ISBN 978-0-201-50480-4.
  4. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 32. ISBN 978-0-13-854662-5.
  5. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 7. ISBN 0-201-71012-9.
  6. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9. Their intention was to produce a language that was very simple for students to learn[.]
  7. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 31. ISBN 0-201-71012-9.
  8. ^ a b c d e f Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9.
  9. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9. The idea was that students could be merely casual users or go on from Basic to more sophisticated and powerful languages[.]
  10. ^ a b McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 16. ISBN 978-0-8027-1348-3.
  11. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 14. ISBN 978-0-13-854662-5.
  12. ^ Bromley, Allan G. (1998). "Charles Babbage's Analytical Engine, 1838" (PDF). IEEE Annals of the History of Computing. 20 (4): 29–45. doi:10.1109/85.728228. S2CID 2285332. Archived (PDF) from the original on 2016-03-04. Retrieved 2015-10-30.
  13. ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 15. ISBN 978-0-13-854662-5.
  14. ^ J. Fuegi; J. Francis (October–December 2003), "Lovelace & Babbage and the creation of the 1843 'notes'", Annals of the History of Computing, 25 (4): 16, 19, 25, doi:10.1109/MAHC.2003.1253887
  15. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6. Turing machines can model all the computations that can be performed on a computing machine.
  16. ^ Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 234. ISBN 978-0-669-17342-0.
  17. ^ Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 243. ISBN 978-0-669-17342-0. [A]ll the common mathematical functions, no matter how complicated, are Turing-computable.
  18. ^ a b c McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 102. ISBN 978-0-8027-1348-3.
  19. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 94. ISBN 978-0-8027-1348-3.
  20. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 107. ISBN 978-0-8027-1348-3.
  21. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 120. ISBN 978-0-8027-1348-3.
  22. ^ a b McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 118. ISBN 978-0-8027-1348-3.
  23. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 119. ISBN 978-0-8027-1348-3.
  24. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 123. ISBN 978-0-8027-1348-3.
  25. ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 21. ISBN 978-0-13-854662-5.
  26. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 27. ISBN 0-201-71012-9.
  27. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 29. ISBN 0-201-71012-9.
  28. ^ a b c Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 6. ISBN 978-0-201-50480-4.
  29. ^ a b c d e f g h i "Bill Pentz — A bit of Background: the Post-War March to VLSI". Digibarn Computer Museum. August 2008. Archived from the original on March 21, 2022. Retrieved January 31, 2022.
  30. ^ a b To the Digital Age: Research Labs, Start-up Companies, and the Rise of MOS. Johns Hopkins University Press. 2002. ISBN 9780801886393. Archived from the original on February 2, 2023. Retrieved February 3, 2022.
  31. ^ Chalamala, Babu (2017). "Manufacturing of Silicon Materials for Microelectronics and Solar PV". Sandia National Laboratories. Archived from the original on March 23, 2023. Retrieved February 8, 2022.
  32. ^ "Fabricating ICs Making a base wafer". Britannica. Archived from the original on February 8, 2022. Retrieved February 8, 2022.
  33. ^ "Introduction to NMOS and PMOS Transistors". Anysilicon. 4 November 2021. Archived from the original on 6 February 2022. Retrieved February 5, 2022.
  34. ^ "microprocessor definition". Britannica. Archived from the original on April 1, 2022. Retrieved April 1, 2022.
  35. ^ "Chip Hall of Fame: Intel 4004 Microprocessor". Institute of Electrical and Electronics Engineers. July 2, 2018. Archived from the original on February 7, 2022. Retrieved January 31, 2022.
  36. ^ "360 Revolution" (PDF). Father, Son & Co. 1990. Archived (PDF) from the original on 2022-10-10. Retrieved February 5, 2022.
  37. ^ a b "Inside the world's long-lost first microcomputer". c/net. January 8, 2010. Archived from the original on February 1, 2022. Retrieved January 31, 2022.
  38. ^ "Bill Gates, Microsoft and the IBM Personal Computer". InfoWorld. August 23, 1982. Archived from the original on 18 February 2023. Retrieved 1 February 2022.
  39. ^ a b Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 10. ISBN 978-0-321-56384-2.
  40. ^ a b c Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 11. ISBN 978-0-321-56384-2.
  41. ^ a b Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 159. ISBN 0-619-06489-7.
  42. ^ a b Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 2. ISBN 978-0-669-17342-0.
  43. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 29. ISBN 0-8053-5443-3.
  44. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 17. ISBN 978-0-13-854662-5.
  45. ^ a b c d e f Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 160. ISBN 0-619-06489-7.
  46. ^ a b c Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 399. ISBN 978-0-13-854662-5.
  47. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 400. ISBN 978-0-13-854662-5.
  48. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 398. ISBN 978-0-13-854662-5.
  49. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 26. ISBN 0-201-71012-9.
  50. ^ a b c d Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 37. ISBN 0-201-71012-9.
  51. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 160. ISBN 0-619-06489-7. With third-generation and higher-level programming languages, each statement in the language translates into several instructions in machine language.
  52. ^ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 75. ISBN 978-0-201-56885-1.
  53. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 40. ISBN 978-0-321-56384-2.
  54. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 16. ISBN 0-201-71012-9.
  55. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 24. ISBN 0-201-71012-9.
  56. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 25. ISBN 0-201-71012-9.
  57. ^ a b c d Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 19. ISBN 0-201-71012-9.
  58. ^ a b c d "Memory Layout of C Programs". 12 September 2011. Archived from the original on 6 November 2021. Retrieved 6 November 2021.
  59. ^ a b Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 31. ISBN 0-13-110362-8.
  60. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 128. ISBN 0-201-71012-9.
  61. ^ a b c Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 121. ISBN 978-1-59327-220-3.
  62. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 122. ISBN 978-1-59327-220-3.
  63. ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 185. ISBN 0-13-110362-8.
  64. ^ a b Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 187. ISBN 0-13-110362-8.
  65. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 38. ISBN 0-201-71012-9.
  66. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 193. ISBN 0-201-71012-9.
  67. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 39. ISBN 0-201-71012-9.
  68. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 35. ISBN 0-201-71012-9.
  69. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 192. ISBN 0-201-71012-9.
  70. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 22. ISBN 978-0-321-56384-2.
  71. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 21. ISBN 978-0-321-56384-2.
  72. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 49. ISBN 978-0-321-56384-2.
  73. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 218. ISBN 0-201-71012-9.
  74. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 217. ISBN 0-201-71012-9.
  75. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 103. ISBN 0-8053-5443-3. When there is a function call, all the important information needs to be saved, such as register values (corresponding to variable names) and the return address (which can be obtained from the program counter)[.] ... When the function wants to return, it ... restores all the registers. It then makes the return jump. Clearly, all of this work can be done using a stack, and that is exactly what happens in virtually every programming language that implements recursion.
  76. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 230. ISBN 0-201-71012-9.
  77. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 240. ISBN 0-201-71012-9.
  78. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 241. ISBN 0-201-71012-9.
  79. ^ Jones, Robin; Maynard, Clive; Stewart, Ian (December 6, 2012). The Art of Lisp Programming. Springer Science & Business Media. p. 2. ISBN 9781447117193.
  80. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 220. ISBN 0-201-71012-9.
  81. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 221. ISBN 0-201-71012-9.
  82. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 229. ISBN 0-201-71012-9.
  83. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 227. ISBN 0-201-71012-9.
  84. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 222. ISBN 0-201-71012-9.
  85. ^ Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Archived from the original on 2016-09-05. Retrieved 2021-10-30.
  86. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 233. ISBN 0-201-71012-9.
  87. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 235. ISBN 0-201-71012-9.
  88. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 55. ISBN 0-201-71012-9.
  89. ^ Colmerauer, A.; Roussel, P. (1992). "The birth of Prolog" (PDF). ACM SIGPLAN Notices. 28 (3). Association for Computing Machinery: 5. doi:10.1145/155360.155362.
  90. ^ Kowalski, R., Dávila, J., Sartor, G. and Calejo, M., 2023. Logical English for law and education. In Prolog: The Next 50 Years (pp. 287-299). Cham: Springer Nature Switzerland.
  91. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 35. ISBN 0-201-71012-9. Simula was based on Algol 60 with one very important addition — the class concept. ... The basic idea was that the data (or data structure) and the operations performed on it belong together[.]
  92. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 39. ISBN 0-201-71012-9. Originally, a large number of experimental languages were designed, many of which combined object-oriented and functional programming.
  93. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 284. ISBN 0-256-08515-3. While it is true that OOD [(object oriented design)] as such is not supported by the majority of popular languages, a large subset of OOD can be used.
  94. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 57. ISBN 0-8053-5443-3.
  95. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 285. ISBN 0-256-08515-3.
  96. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 290. ISBN 0-201-71012-9. The syntax (or grammar) of a programming language describes the correct form in which programs may be written[.]
  97. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 78. ISBN 0-201-71012-9. The main components of an imperative language are declarations, expressions, and statements.
  98. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 290. ISBN 0-201-71012-9.
  99. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 294. ISBN 0-201-71012-9.
  100. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 615. ISBN 978-0-07-053744-6.
  101. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 291. ISBN 0-201-71012-9.
  102. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 616. ISBN 978-0-07-053744-6.
  103. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 623. ISBN 978-0-07-053744-6.
  104. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 624. ISBN 978-0-07-053744-6.
  105. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 297. ISBN 0-201-71012-9.
  106. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. Preface. ISBN 0-256-08515-3.
  107. ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 507. ISBN 0-619-06489-7.
  108. ^ a b Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 513. ISBN 0-619-06489-7.
  109. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 514. ISBN 0-619-06489-7.
  110. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 516. ISBN 0-619-06489-7.
  111. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 8. ISBN 0-256-08515-3.
  112. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 517. ISBN 0-619-06489-7.
  113. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 345. ISBN 0-256-08515-3.
  114. ^ a b c d Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 319. ISBN 0-256-08515-3.
  115. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 331. ISBN 0-256-08515-3.
  116. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 216. ISBN 0-256-08515-3.
  117. ^ a b c Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 219. ISBN 0-256-08515-3.
  118. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 226. ISBN 0-256-08515-3.
  119. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 220. ISBN 0-256-08515-3.
  120. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 258. ISBN 0-256-08515-3.
  121. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 259. ISBN 0-256-08515-3.
  122. ^ a b c Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 1. ISBN 978-0-201-50480-4.
  123. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. The key to unlocking the potential of any computer system is application software.
  124. ^ a b c d Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7.
  125. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. [A] third-party software firm, often called a value-added software vendor, may develop or modify a software program to meet the needs of a particular industry or company.
  126. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 148. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: You can get exactly what you need in terms of features, reports, and so on.
  127. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 148. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: Being involved in the development offers a further level of control over the results.
  128. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: There is more flexibility in making modifications that may be required to counteract a new initiative by one of your competitors or to meet new supplier and/or customer requirements.
  129. ^ a b c d Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 149. ISBN 0-619-06489-7.
  130. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 11. ISBN 978-0-13-854662-5.
  131. ^ a b Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 21. ISBN 978-1-59327-220-3.
  132. ^ a b c d e Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 22. ISBN 978-1-59327-220-3.
  133. ^ a b c Bach, Maurice J. (1986). The Design of the UNIX Operating System. Prentice-Hall, Inc. p. 152. ISBN 0-13-201799-7.
  134. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 443. ISBN 978-0-13-291652-3.
  135. ^ Lacamera, Daniele (2018). Embedded Systems Architecture. Packt. p. 8. ISBN 978-1-78883-250-2.
  136. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 23. ISBN 978-1-59327-220-3.
  137. ^ Kernighan, Brian W. (1984). The Unix Programming Environment. Prentice Hall. p. 201. ISBN 0-13-937699-2.
  138. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 187. ISBN 978-1-59327-220-3.
  139. ^ Haviland, Keith (1987). Programación de sistemas Unix . Addison-Wesley Publishing Company. pág. 121. ISBN. 0-201-12919-1.
  140. ^ abc Stair, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thomson. pág. 145. ISBN 0-619-06489-7.
  141. ^ abc Stair, Ralph M. (2003). Principios de los sistemas de información, sexta edición . Thomson. pág. 146. ISBN 0-619-06489-7.
  142. ^ ab Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 6. ISBN 978-0-13-291652-3.
  143. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 243. ISBN 978-0-13-291652-3.
  144. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 147. ISBN 978-0-13-291652-3.
  145. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 148. ISBN 978-0-13-291652-3.
  146. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 253. ISBN 978-0-13-291652-3.
  147. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 255. ISBN 978-0-13-291652-3.
  148. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 161. ISBN 978-0-13-291652-3.
  149. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 166. ISBN 978-0-13-291652-3.
  150. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 249. ISBN 978-0-13-291652-3.
  151. ^ Tanenbaum, Andrew S. (2013). Organización de computadoras estructuradas, sexta edición . Pearson. pág. 111. ISBN 978-0-13-291652-3.