Un lenguaje de programación es un lenguaje diseñado para describir el conjunto de acciones consecutivas que un equipo debe ejecutar. Por lo tanto, un lenguaje de programación es un modo práctico para que los seres humanos puedan dar instrucciones a un equipo.
Por otro lado, el término "lenguaje natural" define un medio de comunicación compartido por un grupo de personas (por ejemplo: inglés o francés).
Los lenguajes que los equipos usan para comunicarse entre ellos no tienen nada que ver con los lenguajes de programación; se los conoce como protocolos de comunicación. Se trata de dos conceptos totalmente diferentes. Un lenguaje de programación es muy estricto:
A CADA instrucción le corresponde UNA acción de procesador.
Características de los lenguajes
Compilado:
En un lenguaje compilado el código fuente antes de ser ejecutado es convertido a lenguaje máquina (C, C++) aunque también puede ser convertido a representación intermedia que posteriormente es interpretada y convertida a lenguaje máquina JIT (Java, C#). El compilador puede detectar una gran cantidad de errores que en un lenguaje interpretado o de tipado dinámico se descubrirían en tiempo de ejecución.
Interpretado:
En un lenguaje interpretado el código fuente es compilado a código máquina en el momento de su ejecución (Python, Ruby, PHP, JavaScript).
Orientado a objetos:
Parte del éxito de los lenguajes orientado a objetos se debe a conceptos como la herencia que es una forma de reutilizar el código de la clase de la que se hereda, el polimorfismo con la que un mismo método puede estar implementado de diferente forma en función de la clase que lo implementa en la jerarquía de clases construida con la herencia, la sobrecarga usar un mismo método con diferentes parámetros y también igual o más importante la encapsulación con la que se ocultan los detalles internos del funcionamiento de la clase siendo únicamente posible manejar la clase a través de la interfaz (métodos) que ofrece.
Tipado estático:
En un lenguaje de tipado estático las comprobaciones de tipos se realizan en tiempo de compilación (C, C++, Java). Los tipos pueden ser declarados de forma explícita o de forma inferida según el análisis del código fuente que realiza el compilador.
Static versus Dynamic typing
Tipado dinámico:
Por el contrario, el tipado dinámico comprueba los tipos en el momento de ejecución del programa (PHP, Python, Groovy, JavaScript). A esos lenguajes se les conoce como lenguajes dinámicos.
The Inconvenient Truth About Dynamic vs. Static Typing
Fuertemente y débilmente tipado
En un lenguaje fuertemente tipado un dato con un tipo no puede ser usado como si fuese de otro. Aunque algunos lenguajes como Java se dicen que son fuertemente tipado tienen algunas laxitudes. Por ejemplo, en Java un float puede usarse como si fuese un double y en otros lenguajes con menor grado de tipificación como PHP un string puede ser usado como un dato numérico.
Lenguajes fuertemente, débilmente, estáticamente y dinámicamente tipados
Otras características que se suelen mencionar al hablar de lenguajes de programación.
Inferencia de tipos
En base al análisis del código fuente se puede inferir el tipo de las variables evitando que el programador los declare explícitamente continuamente.
Closures y Lambdas
Un closure es una referencia a una función que puede referenciar las variables del contexto en el que está definida. Una lambda es simplemente una referencia a una función anónima. En Java las lambdas pueden referenciar variables declaradas como final, esto es, sean constantes.
Defaults methods y Traits
Un trait define una colección de métodos posiblemente incluyendo también su implementación, además, pueden definir propiedades. Los defaults methods de Java pueden definir implementaciones en algunos métodos de interfaces. Wikipedia.
High Order Functions
Las funciones de orden superior son funciones que toman como argumentos una o más funciones o devuelven como resultado otra función.
Currying
La currificación consiste en transformar una función con al menos dos argumentos en una función con al menos un argumento menos.
Duck typing
Este concepto es usado en los lenguajes de tipado dinámico tratando a las variables no por su tipo o herencia sino en base a las propiedades y métodos que soporta (Python, PHP, Groovy, JavaScript). Wikipedia.
Intersection types y Union types
Ceylon tiene un sistema de tipos más avanzado (y complejo) que Java, una expresión es asignable a un intersection types X & Y si esa expresión es asignable a X e Y individualmente. Una expresión es asignable a un union type X | Y si es asignable a X o Y.
Union, intersection, and enumerated types
Named arguments
Cuando invocamos un método con argumentos, los argumentos se asignan a los parámetros de la función según el orden en que son declarados. Los named arguments permiten asignar los argumentos a los parámetros de la función por sus nombres. Wikipedia.
Destructuring assignment
La asignación desestructurada permite extraer datos de arrays y objetos usando una sintaxis réplica de la construcción de arrays y literales de objetos. MDN.
Tuples
Las tuplas son una estructura de datos formada por varios tipos, en Java 8 puede usarse la librería vavr que añade esto y otras funcionalidades interesantes. En algunos lenguajes puede combinarse con la asignación desestructurada. Ceylon Tuples.
Lenguaje
Lenguaje imperativo:
Son un tipo de lenguaje de programación que tiene como característica es que se basa en procedimientos, o sea, dar instrucciones para que realice algo, su característica es el uso de comandos y variables, inició entre los años 50's.
Lenguaje funcional:
Se basa en la declaración de funciones aritméticas, trata de ser un lenguaje expresivo y matemáticamente elegante.
Lenguaje lógico:
Estudia el uso de la lógica para el planteamiento de problemas y el control sobre las reglas de inferencia para alcanzar la solución automática Es aquel tipo de programación que permite al software “razonar”, esto es, hacer razonamientos, por ejemplo, de tipo deductivo o inductivo.
Lenguaje orientado a objetos:
Tratan a los programas como conjuntos de objetos que se ayudan entre ellos para realizar acciones. Entendiendo como objeto a las entidades que contienen datos. Permitiendo que los programas sean más fáciles de escribir, mantener y reutilizar.
Entorno de programación
Un entorno de programación es un programa o conjunto de programas que engloban todas las tareas necesarias para el desarrollo de un programa o aplicación. Estas tareas son básicamente las siguientes: Edición del programa. Compilación y enlazado.
En lenguaje de programación debemos tener presente estas descripciones de lenguajes:
Sintaxis: es el conjunto de normas que regulan y coordinan las distintas variables y su asociación.
Semántica: es considerada una aplicación de la matemática lógica. La semántica refleja el significado de programas o funciones.
Programática: es el proceso por el cual se escribe, se prueba y se mantiene el código fuente de un programa informático.
Gramática: es un conjunto finito de reglas que describen toda la secuencia de símbolos pertenecientes a un lenguaje específico.
Notación BNF
Notación de Backus-Naur Form: es un metalenguaje usado para expresar gramáticas libres de contexto: es decir, una manera formal de describir lenguajes formales.
El BNF se utiliza extensamente como notación para las gramáticas de los lenguajes de programación de la computadora, de los sistemas de comando y de los protocolos de comunicación, así como una notación para representar partes de las gramáticas de la lengua natural.
Diagramas sintácticos
Es una representación gráfica de la sintaxis. Tiene la ventaja de ser más intuitivo. Representa una alternativa gráfica para Backus-Naur Form (BNF).
Procesador de lenguaje
Son todos los programas que a través de una entrada escrita en un lenguaje de programación pueden manipular herramientas de software y hardware de un computador.
Intérprete [no genera código adicional]: es un programa que simultáneamente analiza y ejecuta un programa escrito en lenguaje fuente. La primera fase de análisis es igual que el compilador.
• Es más sencillo de implementar.
• No es necesario tener en memoria todo el código fuente.
Intérprete puro: el proceso es a través del análisis de cada sentencia y su ejecución hasta finalizar todo el programa fuente.
• Pensado para maquinas con limitaciones de memoria.
• Si en cualquier momento se produce un error, se debe ejecutar desde el inicio.
Interprete avanzado: Incorporan un paso previo de análisis de todo el programa fuente.
• Generan posteriormente un lenguaje ejecutado por el parser.
• Usan lenguajes más avanzados ya permiten optimización de código.
Intérprete incrementales: Dirigidos a lenguajes que no pueden compilarse.
• Se pueden crear objetos y funciones en tiempo de ejecución.
• Se compilan las partes estáticas.
Aplicaciones de Interpretes:
Intérpretes de comandos: tomando el lenguaje fuente y ejecuta sobre el sistema operativo (C-SHELL, KORN-SHELL, JCL).
Entornos de programación: lenguajes con características especiales y cuya compilación no es efectiva. [Python, Ruby, Perl].
Compilador: los compiladores son programas que reciben un lenguaje fuente y lo transforman a un programa objeto, que puede ser ensamblador o de código máquina.
Tipos de Compiladores:
Compiladores cruzados: generan código para un sistema distinto del que están funcionando.
Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.
Compiladores de una sola pasada: generan el código maquina a partir de una única lectura del código fuente.
Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.
Compiladores JIT: forman parte de un intérprete y compilan partes del código según se necesitan.
Máquinas virtuales
Es una implementación de software de una máquina física ya sea un servidor o una pc. Es un contenedor de software perfectamente aislado que puede ejecutar sus propios sistemas operativos y aplicaciones como si fuera un ordenador físico. Crea un entorno virtual entre el sistema operativo y el hardware para que el usuario final pueda ejecutar aplicaciones en una máquina abstracta. Por decirlo de manera más sencilla, una máquina virtual es una aplicación que simula el funcionamiento de una máquina real sobre la que se pueden instalar sistemas operativos, aplicaciones, navegar de forma segura, imprimir desde alguna aplicación, usar los dispositivos USB, etc. La máquina virtual se comporta exactamente igual que un ordenador físico y contiene su propia CPU virtual, memoria, disco duro y tarjeta de interfaz de red. Una máquina virtual se compone exclusivamente de software y no contiene ninguna clase de componente de hardware.
Tipos de máquinas virtuales:
Máquinas virtuales de hardware también llamadas máquinas virtuales de sistema: son aplicaciones que tratan de emular directamente el hardware. Las llamadas al hardware del sistema operativo instalado serán capturadas y convertidas en llamadas al sistema del hardware emulado. En general, la emulación del hardware recibe el nombre de virtualización. Al emularse directamente el hardware, el usuario tiene la impresión de que la máquina sobre la que está trabajando es totalmente independiente. Estas máquinas virtuales, permiten a la máquina física subyacente multiplicarse entre varias máquinas virtuales, cada una ejecutando su propio sistema operativo. A la capa de software que permite la virtualización se la llama monitor de máquina virtual o hypervisor. Un monitor de máquina virtual puede ejecutarse o bien directamente sobre el hardware o bien sobre un sistema operativo ("host operating system").
Máquinas virtuales de software también llamadas como máquinas virtuales de proceso: este tipo de máquinas virtuales se sitúan por encima del sistema operativo y tratan de aislar a las aplicaciones del entorno sobre el que se ejecutan. La máquina se inicia automáticamente cuando se lanza el proceso que se desea ejecutar y se detiene para cuando éste finaliza. Su objetivo es el de proporcionar un entorno de ejecución independiente de la plataforma de hardware y del sistema operativo, que oculte los detalles de la plataforma subyacente y permita que un programa se ejecute siempre de la misma forma sobre cualquier plataforma. La máquina virtual de Java o la máquina virtual del entorno .NET son dos claros ejemplos de máquinas virtuales software.
Interpretadores
Es un software que recibe un programa en lenguaje de alto nivel, lo analiza y lo ejecuta. Para analizar el programa completo, va traduciendo sentencias de código y ejecutándolas si están bien, así hasta completar el programa origen.
Compiladores
Es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación.
Lenguaje de alto nivel
Se caracteriza por expresar los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de la capacidad con que los ejecutan las máquinas.
Surgimiento:
Los lenguajes de alto nivel, también denominados lenguajes evolucionados, surgen con posterioridad a los anteriores, con los siguientes objetivos, entre otros:
Lograr independencia de la máquina, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador, que lo suministra el fabricante, para obtener el programa ejecutable en lenguaje binario de la máquina que se trate. Además, no se necesita conocer el hardware específico de dicha máquina.
Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje máquina, ya que se utilizan palabras (en inglés) en lugar de cadenas de símbolos sin ningún significado aparente.
Incluir rutinas de uso frecuente como son las de entrada/salida, funciones matemáticas, manejo de tablas, etc, que figuran en una especie de librería del lenguaje, de tal manera que se pueden utilizar siempre que se quieran sin necesidad de programarlas cada vez.
Principal Problema:
Se puede decir que el principal problema que presentan los lenguajes de alto nivel es la gran cantidad de ellos que existen actualmente en uso (FORTRAN, LISP, ALGOL, COBOL, APL, SNOBOL, PROLOG, MODULA2, ALGOL68, PASCAL, SIMULA67, ADA, C++, LIS, EUCLID, BASIC), además de las diferentes versiones o dialectos que se han desarrollado de algunos de ellos.
Fortran: abreviatura de Fórmula Translator (traductor de fórmulas), fue definido alrededor del año 1955 en los Estados Unidos por la compañía IBM. Es el más antiguo de los lenguajes de alto nivel, pues antes de su aparición todos los programas se escribían en lenguaje ensamblador o en lenguaje máquina.
Es un lenguaje especializado en aplicaciones técnicas y científicas, caracterizándose por su potencia en los cálculos matemáticos, pero estando limitado en las aplicaciones de gestión, manejo de archivos, tratamiento de cadenas de caracteres y edición de informes.
A lo largo de su existencia han aparecido diferentes versiones, entre las que destaca la realizada en 1966 por ANSI (American National Standard Institute) en la que se definieron nuevas reglas del lenguaje y se efectuó la independencia del mismo con respecto a la máquina, es decir, comenzó la transportabilidad del lenguaje. Esta versión se denominó FORTRAN IV o FORTRAN 66. En 1977, apareció una nueva versión más evolucionada que se llamó FORTRAN V o FORTRAN 77, esta versión está reflejada en el documento «ANSI X3.9-1978: Programming Language FORTRAN» y define dos niveles del lenguaje denominados FORTRAN 77 completo y FORTRAN 77 básico, siendo el segundo un subconjunto del primero. Esta última versión incluye además instrucciones para el manejo de cadenas de caracteres y de archivos, así como otras para la utilización de técnicas de programación estructurada. Estas características hacen que el lenguaje también sea válido para determinadas aplicaciones de gestión.
Cobol: es el lenguaje más usado en las aplicaciones de gestión, creado en 1960 por un comité denominado CODASYL, patrocinado por el Departamento de Defensa de los Estados Unidos, a fin de disponer de un lenguaje universal para aplicaciones comerciales como expresa su nombre (COmmon Business Oriented Language).
Entre sus características se pueden citar su parecido al lenguaje natural (inglés), es auto- documentado y tiene gran capacidad en el manejo de archivos, así como en la edición de informes escritos. Entre sus inconvenientes están sus rígidas reglas de formatos de escritura, la necesidad de describir todos los elementos al máximo detalle, la extensión excesiva en sus sentencias e incluso duplicación en algunos casos, la inexistencia de funciones matemáticas y, por último, su no adecuación a las técnicas de programación estructurada.
Pl/1: fue creado a comienzos de los años 60 por IBM para ser usado en sus equipos del sistema 360. El PL/I (Programming Language 1) se desarrolló inspirándose en los lenguajes ALGOL, COBOL y FORTRAN, tomando las mejores características de los anteriores y añadiendo algunas nuevas, con el objetivo de obtener un lenguaje lo más general posible, útil para aplicaciones técnico-científicas, comerciales, de proceso de textos, de bases de datos y de programación de sistemas.
Entre sus novedades está su gran libertad en el formato de escritura de los programas, soportar la programación estructurada y el diseño modular. No obstante, no ha superado a sus progenitores en su aplicación específica debida en parte a su amplitud y por ello, al tamaño de su compilador, que hasta ahora sólo se podía instalar en grandes equipos.
Basic: fue diseñado por los profesores John G. Kemeny y Thomas E. Kurtz del Dartmouth College en 1965 con el objetivo principal de conseguir un lenguaje fácil de aprender para los principiantes, como se indica en su nombre Benginner’s All-purpose Symbolic Instruction Code (Código de instrucción simbólico de propósito general para principiantes).
Entre sus principales novedades están las de ser un lenguaje interpretado y de uso conversacional, útil para aplicaciones técnicas y de gestión. Estas características, unidas a la popularización de las microcomputadoras y computadoras personales, ha hecho que su utilización se haya extendido enormemente, a la vez que ha propiciado el surgimiento de una gran diversidad de versiones que extienden y adaptan a necesidades particulares el lenguaje original. Existen multitud de intérpretes y compiladores del lenguaje.
Pascal: fue creado por el matemático suizo Niklaus Wirth en 1970, basándose en el lenguaje AL-GOL, en cuyo diseño había participado en los años 60. Su nombre proviene del filósofo y matemático francés del siglo xvii Blaise Pascal, que inventó la primera máquina de tipo mecánico para sumar.
Aunque en principio la idea del diseñador era proporcionar un lenguaje adecuado para la enseñanza de los conceptos y técnicas de programación, con el tiempo ha llegado a ser un lenguaje ampliamente utilizado en todo tipo de aplicaciones, poseyendo grandes facilidades para la programación de sistemas y diseño de gráficos.
Aporta los conceptos de tipo de datos, programación estructurada y diseño descendente, entre otros, además de haberse convertido en predecesor de otros lenguajes más modernos, como MODULA-2 y ADA.
C: fue creado en 1972 por Dennis Ritchie a partir del trabajo elaborado por su colega de los Laboratorios Bell Telephone, Ken Thompson. Estos habían diseñado con anterioridad el sistema operativo UNIX, y su intención al desarrollar el lenguaje C fue la de conseguir un lenguaje idóneo para la programación de sistemas que fuese independiente de la máquina con el cual escribir su sistema UNIX.
Aunque fue diseñado inicialmente para la programación de sistemas, posteriormente su uso se ha extendido a aplicaciones técnico-científicas, de bases de datos, de proceso de textos, etc.
La utilización óptima de este lenguaje se consigue dentro de su entorno natural, que es el sistema operativo UNIX. Entre sus características destaca el uso de programación estructurada para resolver tareas de bajo nivel, así como la amplia librería de rutinas de que dispone.
Ada: es el último intento de obtener un único lenguaje para todo tipo de aplicaciones e incluye los últimos avances en técnicas de programación. Su diseño fue encargado por el Departamento de Defensa de los Estados Unidos a la empresa Honeywell-Bull después de una selección rigurosa entre varias propuestas realizadas sobre una serie de requerimientos del lenguaje y de haber evaluado negativamente veintitrés lenguajes existentes. De éstos se seleccionaron como base para la creación del nuevo lenguaje el PASCAL, el ALGOL y el PL/I. La estandarización del lenguaje se publicó en 1983 con el nombre de ADA en honor de la considerada primera programadora de la historia Augusta Ada Byron, condesa de Lovelace.
Entre las características del lenguaje se encuentran la compilación separada, los tipos abstractos de datos, programación concurrente, programación estructurada, libertad de formatos de escritura, etc., presentando como principal inconveniente su gran extensión.
Interesante información