Entendiendo los Lenguajes de Programación

Los lenguajes de programación, forman parte del grupo de lenguajes informáticos. Ampliamente, puede decirse que un lenguaje informático es un idioma artificial, utilizado por ordenadores, cuyo fin es transmitir información de algo a alguien. Los lenguajes informáticos, pueden clasificarse en:

  • lenguajes de programación (Python, PHP, Perl, C, etc.);
  • lenguajes de especificación (UML);
  • lenguajes de consulta (SQL);
  • lenguajes de marcas (HTML, XML);
  • lenguajes de transformación (XSLT);
  • protocolos de comunicaciones (HTTP, FTP); entre otros.

Mientras que algunos lenguajes informáticos como (X)HTML o CSS, han sido diseñados para diagramar y decidir la forma en la cual la información será presentada al usuario, los lenguajes de programación, tienen como fin, expresar órdenes e instrucciones precisas, que deben ser llevadas a cabo por una computadora para realizar una o más tareas específicas. Se utilizan para crear programas que controlan el comportamiento físico o lógico de un ordenador. Están compuestos por una serie de símbolos, reglas sintácticas y semánticas que definen la estructura del lenguaje.

Lenguajes de Programación según su nivel de abstracción
En un primer estado de clasificación, los lenguajes de programación se dividen según su nivel de abstracción, en lenguajes de bajo nivel, lenguajes de medio nivel y lenguajes de alto nivel, dependiendo de su grado de “cercanía al hardware”.

Cuanto más cercano al hardware se encuentra el lenguaje, más bajo nivel posee éste. Mientras que cuanto más acercado al usuario se encuentre, más alejado del hardware estará y, en consecuencia, de mayor nivel será el lenguaje.

Lenguajes de Programación de Bajo Nivel
Los lenguajes de bajo nivel, son aquellos que dependen intrínsecamente del ordenador. Aquellos programas informáticos, programados con lenguajes de bajo nivel, al ser exclusivamente dependientes del hardware, no pueden migrarse, ya que están justamente diseñados, para un hardware específico.

Existen dos tipos de lenguajes de bajo nivel: el lenguaje máquina y el lenguaje ensamblador.

El lenguaje de máquina (también denominado lenguaje de primera generación) es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de una computadora o el microcontrolador de un autómata . Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina. Un programa consiste en una cadena de estas instrucciones de lenguaje de máquina (más los datos). Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas[0].

Función en 32-bits en código de maquina x86, para calcular el enésimo número de la serie de Fibonacci[1]

Un lenguaje ensamblador, o assembler (assembly language) es un lenguaje de programación de bajo nivel para los ordenadores, microprocesadores, microcontroladores, y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos[2] que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto, específico a cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que, idealmente son portables[3].
Este lenguaje, también es conocido como lenguaje de segunda generación.

Ejemplo desarrollado en lenguaje ensamblador que usa llamadas de MS-DOS (system calls) para imprimir el mensaje Hola mundo!! en pantalla. Extraído de http://homepage.mac.com/eravila/asmix862.html (para ver la explicación detallada del ejemplo, seguir el enlace anterior)

Para ampliar la información sobre los lenguajes de bajo nivel, puede leerse el siguiente artículo de Karmany.net.

También es recomendable, leer el siguiente artículo sobre Lenguaje Ensamblador en Wikipedia.

Lenguajes de Programación de Medio Nivel
La clasificación de lenguajes de programación, mediante un nivel de abstracción medio, es bastante discutible. Personalmente sostengo sólo por dos niveles de abstracción: bajo nivel y alto nivel. Sin perjuicio de ello, se plasmarán aquí, aquellos argumentos sostenidos, por quienes aceptan este tercer nivel de clasificación.

Quienes sostienen la clasificación de lenguajes de programación medio, argumentan que éstos, son aquellos lenguajes que se encuentran, justamente, entre los de bajo nivel y los de alto nivel, ya que poseen características que permiten interactuar directamente con el sistema. Un ejemplo de ello, sería el lenguaje C, el cual puede trabajar (entre otras características) con direcciones de memoria.
Sin embargo, dicho acceso, no es efectuado de forma directa (a través de lenguaje máquina o ensamblador), sino que requiere ser “traducido” previamente por su compilador. Por dicha razón, es que asumo a C como lenguaje de alto nivel y descarto la clasificación de lenguajes de medio nivel.

Suele colocarse como ejemplo de lenguaje de programación de medio nivel, anterior a C, a BCPL[4], diseñado para escribir Sistemas Operativos y Compiladores.

Ejemplo de código BCPL para impresión de factoriales[5]

Lenguajes de Programación de Alto Nivel
Los lenguajes de alto nivel, son aquellos cuya característica principal, consiste en una estructura sintáctica y semántica legible, acorde a las capacidades cognitivas humanas. A diferencia de los lenguajes de bajo nivel, son independientes de la arquitectura del hardware, motivo por el cual, asumen mayor portabilidad.

Son ejemplo de lenguajes de alto nivel: Python, Perl, PHP, Ruby, Lisp, Java, Fortran, C++, C#, entre otros.

Archivo: hola_mundo.py . Imprime Hola Python! En pantalla

Archivo: hola_mundo.php . Imprime Hola PHP! En pantalla

Archivo: hola_mundo.pl . Imprime Hola Perl! En pantalla

Hola Mundo en otros lenguajes (para curiosos): www.holamundo.es

Clasificación de Lenguajes de programación, según su forma de ejecución
Según su forma de ejecución, los lenguajes de programación pueden ser: compilados o interpretados.

Los lenguajes de programación compilados, son lenguajes de alto nivel que requieren que las instrucciones (código fuente del programa), sean traducidas a lenguaje máquina por un compilador, a fin de generar un ejecutable del programa. Ejemplo de lenguajes compilados son Pascal, C, C++, Ada, entre otros.

Ejemplo en C que imprimirá “Hola mundo” en pantalla tras ser compilado.

Mismo ejemplo, pero en Pascal.

Los lenguajes interpretados, a diferencia de los compilados, no requieren de un compilador para ser ejecutados sino de un intérprete. Un intérprete, actúa de manera casi idéntica a un compilador, con la salvedad de que ejecuta el programa directamente, sin necesidad de generar previamente un ejecutable. Ejemplo de lenguajes de programación interpretado son Python, PHP, Ruby, Lisp, entre otros.

Ejemplo de código Lisp que imprime “Hola Mundo!” en pantalla

Es importante además, hacer notar que la mayoría de los lenguajes de programación, puede ejecutarse tanto de modo compilado como interpretado.

[0] Fuente: http://es.wikipedia.org/wiki/Lenguaje_m%C3%A1quina
[1] Fuente: http://en.wikipedia.org/wiki/Low-level_programming_language
[2] En informática, un mnemónico es una palabra que sustituye a un código de operación (lenguaje de máquina), con lo cual resulta más fácil la programación, es de aquí de donde se aplica el concepto de lenguaje ensamblador. Fuente: http://es.wikipedia.org/wiki/Mnem%C3%B3nico
[3] Fuente: http://es.wikipedia.org/wiki/Lenguaje_ensamblador
[4] Ver manual de Referencias de BCPL
[5] Fuente: http://en.wikipedia.org/wiki/BCPL#Examples

eugeniabahit

GLAMP Hacker espcializada en Ingeniería Inversa de Código sobre entornos GNU/Linux. Programadora eXtrema con enfoque en TDD, Python, PHP y Shell Scripting. Miembro de la Free Software Foundation, de la Linux Foundation y parte del equipo de Debian Hackers.

27 thoughts on “Entendiendo los Lenguajes de Programación

  1. Te traiciono el teclado:
    lenguajes de programación (Python, PHP, Pearl, C, etc.);
    Pusiste Pearl en vez de Perl, eso te pasa por no poner Pascal :P

  2. Muy buen artículo, cuando alguien me pregunte sobre el tema ya se dónde dirigirle. Solamente echo en falta situar al lenguaje Java en la segunda clasificación, tal vez como algo híbrido entre los lenguajes compilados y los interpretados, pues primeramente se compila y el código generado es interpretado después por la máquina virtual (dicho a grandes rasgos, sin entrar mucho en detalles).
    Un saludo.

  3. Muy buen articulo, tampoco creo que existan lenguajes de medio nivel, habitualmente uso lenguajes de alto nivel ( lease Java) y otros de consulta (SQL, PL/SQL).
    Una cosa que no me queda nada clara es ¿ a que te refieres con los protocolos de comunicaciones clasificandolos como lenguajes?

  4. @cnicolas sucede que en informática, un lenguaje, es todo aquello que mediante una serie de reglas, se utiliza para “comunicar algo” (más allá del qué). Y los protocolos de comunicaciones, entran en esta clasificación a nivel global, como lenguaje informático (pero no, dentro de los lenguajes de programación, ya que éstos, son otra subclasificación de lenguajes informáticos).

    Es decir, la idea es poder diferenciar con claridad, los lenguajes de programación, de otros tipos de lenguajes informáticos. Por ejemplo, un lenguaje de marcado como HTML, TAMPOCO es un lenguaje de programación, sino que representa otra subclasificación más, de lenguajes informáticos.

    Justamente el objetivo de este artículo, es diferenciar los lenguajes de programación, del resto de lenguajes informáticos y prevenir la confusión más común que se da en el ámbito de la informática, de utilizar el término “lenguaje”, como sinónimo de “lenguaje de programación” (lo cual es un error garrafal, ya que como vemos aquí, los protocolos de comunicaciones también son un lenguaje informático, que dista muchísimo de los lenguajes de programación.

    Espero haber aclarado la duda :)
    Un abrazo!

  5. Vale, aceptamos los protocolos como lenguajes informáticos, pero como en el resto del articulo se habla de lenguajes de programación me habia liado.
    La distinción es buena, aunque tambien segun esa distincion que haces, donde quedaria PL/SQL por ejemplo es tanto programacion como consulta, a veces intentar definir y compartimentar algo no es tán sencillo

  6. @cnicolas PL/SQL está considerado un lenguaje de programación. Personalmente, creo que es sumamente discutible, ya que en sí mismo, es una variante más del Lenguaje SQL, adaptada a una base de datos (de la misma forma que MS SQL Server modifica y adapta su propio SQL e incluso el mismo MySQL).

    PL/SQL tiene elementos como funciones propias (que también las tienen los lenguajes de consulta de la mayoría de bases de datos) y estructuras de procedimientos ¿eso lo convierte en un lenguaje de programación? Qué Oracle lo “venda” como lenguaje de programación, es muy relativo.

    Insisto: oficialmente, está considerado lenguaje de programación. Desde mi punto de vista, no es más que una adaptación del SQL, con funciones propios incrustadas que solo son algo más complicadas (no dije complejas, sino complicadas) que las incorporadas por MS SQL Server, por ejemplo.

    Y por cierto, sencillo no significa simple. Razón por la cual hago también la distinción entre complejo y complicado.

    Las convenciones no son sencillas, sin embargo, están hechas para “simplificar” nuestra forma de comunicarnos y entendernos. Son complejas, pero sin embargo, no están hechas para “complicarnos”.

    Qué empresas como Oracle, Microsoft, Apple “and company” pretendan trasgredir (o mejor dicho, trasgredan) toda convención, no convierte a las convenciones en complicadas. Por el contrario, demuestra lo complicadas que son esas empresas. Y recordemos, que generalmente, cuando uno “se complica la vida”, sin ánimo de hacer un estudio freudiano de esto, lo hace debido a un conflicto interno que le impide llevar a cabo, acciones de manera natural. Desde mi punto de vista, si estas empresas se complican, es debido a la “complicada” psiquis de sus responsables pero nada tiene que ver con la “compleja simplicidad” de las convenciones ;)

  7. Hola.
    Es todo un placer aprender y comprender la diferencia entre los lenguajes de programación. Es la primera vez que he entendido verdaderamente algo, desde que comencé a estudiar Python como autodidacta.
    Muchas gracias.
    Saludos…

  8. Ahh.. todo es un lenguaje !! la musica es un lenguaje, el Arte es el lenguaje. Nuestras manos son un lenguaje. Tu boca es una lenguaje (ehh.perdon, nuestras bocas.. {ehh. perdon.. las bocas de todos los seres humanos}). Y no nos olvidemos de la fisica del ese lenguaje: El binario, la dualidad! el cero y el uno, la luz y la oscuridad, AMD e Intel, Peronistas y Radicales, Pearl Jam o Soundgarden. El benefactor de la humanidad: Richard Stallman, y su oscura contraparte: El tio Bill. Les pido disculpas, no se nada de programacion. saludos.

  9. @Euge la verdad es que la distincion entre categorias siempre me ha resultado complicado, intentar distinguir entre negro y blanco cuando existen grises me resulta complicado, por ponerte otro ejemplo xslt es lenguaje de transformacion, pero es análogo a lenguajes de marcas como xml y en otros aspectos se parece a lenguajes de programacion, pero no es ni lo uno ni lo otro, ¿es una mezcla de ambos? NO, sencillamente es distinto.
    Completamente de acuerdo en la distincion de sencillo y simple y complejo y complicado.
    ¿Que decir de empresas que se saltan los estandares a la torera y pretenden imponer sus estandares por que si?

  10. Ciertamente, en cuanto a los niveles de abstracción, yo soy de los que opinan que se deberían clasificar en más de dos, si quieres a lo mejor subdivisiones dentro de los que se denominan de alto nivel. Creo que al magen ya del uso o no de punteros, los lenguajes fuertemente tipados como C o C++ no están en mismo nivel que Java o no digamos ya Javascript o PHP.

    Pero vamos, que esto entra ya dentro de las discusiones del olor de las nubes. Estupendo artículo.

  11. Que buena nota, hacia tiempo que no leía algo bueno de hacking “no comercial” jajaja es como ver una película de cine independiente!
    Grande Euge!

  12. Bueno, muchísimas gracias a todos por los mensajes y por el gran intercambio de ideas. Sin dudas, son estas cosas, las que ayudan a enriquecer nuestros conocimientos :)

Comments are closed.