lenguaje Compilado e Interpretado

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

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

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

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

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

Un lenguaje compilado es un lenguaje de programación cuyas implementaciones son normalmente compiladores (traductores que generan código de máquina a partir del código fuente) y no intérpretes (ejecutores paso a paso del código fuente, donde no se lleva a cabo una traducción en la preejecución).

El término es un tanto vago. En principio, cualquier lenguaje puede ser implementado con un compilador o un intérprete. Sin embargo, es cada vez más frecuente una combinación de ambas soluciones: un compilador puede traducir el código fuente en alguna forma intermedia (muchas veces llamado Bytecode), que luego se pasa a un intérprete que lo ejecuta.


Ventajas y desventajas

Los programas compilados a código nativo en tiempo de compilación tienden a ser más rápidos que los traducidos en tiempo de ejecución, debido a la sobrecarga del proceso de traducción. Sin embargo, las nuevas tecnologías como la compilación en tiempo de ejecución, y mejoras generales en el proceso de traducción están empezando a reducir esta brecha. En algún punto intermedio, tiende a ser más eficiente la solución mixta usando bytecode.

Los lenguajes de programación de bajo nivel son típicamente compilados, en especial cuando la eficiencia es la principal preocupación, en lugar de soporte de plataformas cruzadas. Para los lenguajes de bajo nivel, hay más correspondencias uno a uno entre el código programado y las operaciones de hardware realizadas por el código máquina, lo que hace que sea más fácil para los programadores controlar más finamente la CPU y uso de memoria.

Con un poco de esfuerzo siempre es posible escribir compiladores incluso para las lenguajes tradicionalmente interpretados. Por ejemplo, Common Lisp puede ser compilado a Java bytecode, que es interpretado por la máquina virtual de Java; a código C, que se compila a código máquina nativo; o es compilado directamente a código nativo. Los lenguajes de programación que soportan múltiples objetivos de compilación ofrecen un mayor control para que el desarrollador elija la velocidad de ejecución o la compatibilidad entre plataformas.

Algunos lenguajes que comúnmente se consideran compilados:

Ada
ALGOL
Algol 60
Algol 68
SMALL
BASIC
C
C++
Objective-C
C# (a bytecode)
D
CLEO
COBOL
Cobra
Common Lisp
Delphi
Eiffel
Sather
Ubercode
Factor (las últimas versiones)
Forth
Fortran
Go
Haskell
Haxe (to bytecode)
IBM RPG
Java (a bytecode)
JOVIAL
G
Lisp
Lush
Mercury
Meta Lenguaje
Standard ML
Alice
OCaml
Modula-2
Modula-3
Open-URQ
PureBasic
Pascal
PL/I
Rust
Scala
Seed7
Swift
Visual Basic
Visual Foxpro
Visual Prolog

Un lenguaje compilado es aquel cuyo código fuente, escrito en un lenguaje de alto nivel, es traducido por un compilador a un archivo ejecutable entendible para la máquina en determinada plataforma. Con ese archivo se puede ejecutar el programa cuantas veces sea necesario sin tener que repetir el proceso por lo que el tiempo de espera entre ejecución y ejecución es ínfimo.
Dentro de los lenguajes de programación que son compilados tenemos la familia C que incluye a C++, Objective C, C# y también otros como Fortran, Pascal, Haskell y Visual Basic.

Java es un caso particular ya que hace uso de una máquina virtual que se encarga de la traducción del código fuente por lo que hay veces es denominado compilado e interpretado. Otra ventaja de la máquina virtual que usar Java es que le permite ejecutar código Java en cualquier máquina que tenga instalada la JVM.
Principalmente vemos los lenguajes interpretados en el desarrollo de aplicaciones o sitios web que van acompañados de frameworks que facilitan en gran medida su programación. Esto se da ya que no es necesario que el usuario final posea, en el caso de los lenguajes compilados, el compilador instalado en su ordenador para ejecutar el programa o el archivo objeto que este produce. Mayoritariamente necesitan un navegador actualizado y conexión a Internet para acceder y usar de aplicaciones en línea.

A los lenguajes compilados los vemos más en software de escritorio ya que requieren de mayores recursos y de acceso a archivos determinados. También por el peso mayor que estos suelen tener en sus archivos ejecutables.

El uso de los lenguajes interpretados ha venido en crecimiento y cuyos máximos representantes son los lenguajes usados para el desarrollo web entre estos Ruby, Python, PHP (se interpreta del lado del servidor), JavaScript y otros como Perl, Smalltalk, MATLAB, Mathematica (el que usan en Wolfram Alpha). Básicamente un lenguaje interpretado es aquel en el cual sus instrucciones o más bien el código fuente, escrito por el programador en un lenguaje de alto nivel, es traducido por el interprete a un lenguaje entendible para la máquina paso a paso, instrucción por instrucción. El proceso se repite cada vez que se ejecuta el programa el código en cuestión.

Los lenguajes interpretados permiten el tipado dinámico de datos, es decir, no es necesario inicializar una variable con determinado tipo de dato sino que esta puede cambiar su tipo en condición al dato que almacene entre otras características más.
También tienen por ventaja una gran independencia de la plataforma donde se ejecutan de ahí que los tres primeros mencionados arriba sean multiplataforma comparándolos con algunos lenguajes compilados como Visual Basic, y los programas escritos en lenguajes interpretados son más livianos.

La principal desventaja de estos lenguajes es el tiempo que necesitan para ser interpretados. Al tener que ser traducido a lenguaje máquina con cada ejecución, este proceso es más lento que en los lenguajes compilados, sin embargo, algunos lenguajes poseen una máquina virtual que hace una traducción a lenguaje intermedio con lo cual el traducirlo a lenguaje de bajo nivel toma menos tiempo.

 

interpretado

Un lenguaje interpretado es un lenguaje de programación para el que la mayoría de sus implementaciones ejecuta las instrucciones directamente, sin un previa compilación del programa a instrucciones en lenguaje máquina. El intérprete ejecuta el programa directamente, traduciendo cada sentencia en una secuencia de una o más subrutinas ya compiladas en código máquina.

Los términos lenguaje interpretado y lenguaje compilado1 no son correctos porque, en teoría, cualquier lenguaje de programación puede ser interpretado o compilado. Cada vez es más popular, en las implementaciones más modernas de un lenguaje de programación, ofrecer ambas opciones.

Los lenguajes interpretados también pueden diferenciarse de los lenguajes de máquina. Funcionalmente, tanto la ejecución y la interpretación significan lo mismo -obtener la siguiente instrucción/sentencia del programa y su ejecución-. Aunque el bytecode (código byte) interpretado es además idéntico a su forma en código máquina y tiene una representación en ensamblador, el término "interpretado" se reserva en la práctica para lenguajes "procesados por software" (como las máquinas virtuales o emuladores) por encima del procesado nativo (por ejemplo, por hardware).

En principio, los programas de muchos lenguajes se pueden compilar o interpretar, emular o ejecutar nativamente, así que esta designación se aplica solamente a la implementación práctica más usual, en vez de representar una propiedad esencial del lenguaje. De forma parecida al microcódigo del procesador, muchos intérpretes, internamente recaen en una compilación en tiempo de ejecución.

Evitando la compilación, los programas interpretados son más fáciles de evolucionar durante el desarrollo y la ejecución (transformándose en ocasiones de uno en la otra). De otra parte, ya que la compilación implica una traducción a un formato más amigable con la máquina, los programas interpretados corren más lentamente y menos eficientemente (es decir, gastan considerablemente más energía). Esto es especialmente verdad para los lenguajes de guion, cuyas sentencias son más complejas de analizar comparadas con las instrucciones máquina.

Muchos lenguajes se han implementado usando tanto compiladores como intérpretes, incluyendo BASIC, C, Lisp, Pascal y Python. Java y C# se compilan a código byte, el lenguaje interpretado específico para la máquina virtual. Muchas implementaciones de Lisp pueden mezclar libremente código interpretado y compilado.


Antecedentes históricos de interpretado y compilado

En los comienzos de la computación, el diseño de lenguajes fue fuertemente influenciado por la decisión de usar la compilación o la interpretación como modos de ejecución. Por ejemplo, algunos lenguajes compilados requieren que los programas deban indicar explícitamente el tipo de dato de una variable en el momento en que sea declarada o al ser usada por primera vez, mientras que algunos lenguajes interpretados toman ventaja de los aspectos dinámicos de la interpretación para hacer tales declaraciones innecesarias. Por ejemplo, Smalltalk (1980), que fue diseñado para ser interpretado en tiempo de ejecución, permite a objetos genéricos interactuar dinámicamente entre sí.

Inicialmente, los lenguajes interpretados eran compilados línea por línea, es decir, cada línea era compilada a medida que estaba a punto de ser ejecutada, y si un bucle o una subrutina hicieran que ciertas líneas se ejecutaran múltiples veces, serían recompiladas repetidamente. Esto ha llegado a ser mucho menos común. La mayoría de los lenguajes interpretados usan una representación intermedia, que combina tanto la compilación como la interpretación. En este caso, un compilador puede producir el código byte o el código enhebrado, que entonces es ejecutado por un intérprete de código byte.

Los ejemplos incluyen:

Java
Python
Ruby (de forma similar, utiliza un árbol de sintaxis abstracta como representación intermedia)
Forth
La representación intermedia se puede compilar una sola vez (como en Java), cada vez que se vaya a ejecutar (como en Perl o Ruby), o cada vez que se detecte un cambio en el código fuente antes de la ejecución (como en Python).

Ventajas de interpretar un lenguaje

Interpretar un lenguaje da a las implementaciones una flexibilidad adicional sobre las implementaciones compiladas. Algunas características son más fáciles de implementar en intérpretes que en compiladores son (pero no se limitan a estas):

Independencia de la plataforma (por ejemplo el bytecode de Java)
Reflexión y uso reflexivo del evaluador (por ejemplo, una función eval de primer orden)
Tipos dinámicos
Un tamaño del programa más pequeño (puesto que las implementaciones tienen la flexibilidad de elegir el conjunto de instrucciones)
Ámbito dinámico
Facilidad en la depuración (es más fácil obtener información del código fuente en lenguajes interpretados)
Desventajas de los lenguajes interpretados[editar]
La principal desventaja de la interpretación es una velocidad de ejecución del programa mucho más lenta, comparada con la ejecución directa del código máquina en la CPU del ordenador. Una técnica utilizada para mejorar las prestaciones es la compilación en tiempo de ejecución, que convierte las secuencias ejecutadas más frecuentes en código máquina del ordenador.

Lista de lenguajes más usados de forma interpretada

APL Un lenguaje orientado a vectores que usa un conjunto de caracteres inusual
J Una variante de APL en el que la definición tácita ofrece algunos de los beneficios de la compilación
BASIC (aunque la versión original, Dartmouth BASIC, era compilada, así como muchos BASIC modernos)
thinBasic
ECMAScript
ActionScript (versión 3.0 no es interpretado, por lo que se eliminó la función eval())
E4X (ECMAScript for XML)
JavaScript (primero se llamó Mocha, y luego LiveScript)
JScript
Manipulación de ecuaciones y sistemas de resolución
GNU Octave
IDL (Interactive Data Language)
TK Solver
Mathematica
MATLAB
Euphoria interpretado o compilado
Forth
Game Maker Language
Lava
Madness Script
Perl
PHP
PostScript
Python
Lisp
Logo
Scheme
MUMPS (tradicionalmente interpretado, compilado en las versiones modernas)
REXX
Ruby
JRuby (una implementación Java de Ruby)
Seed7 interpretado o compilado
Smalltalk
Bistro
Dolphin Smalltalk
F-Script
Little Smalltalk
Squeak
VisualAge
VisualWorks
Lenguajes de scripting
WebDNA
Hojas de cálculo
Excel almacena fórmulas, y las interpreta desde un formato simbólico
S
R
Tcl
XOTcl
VBScript
PowerShell
XMLmosaic Un lenguaje de programación interpretado parecido a C# escrito en Visual Basic .NET


Lenguajes normalmente compilados a código byte

Muchos lenguajes interpretados son primero compilados a código byte, que luego es normalmente interpretado por la máquina virtual usando la compilación en tiempo de ejecución, del código byte a código nativo. Sin embargo, algunas veces, el código byte también puede ser compilado a un binario nativo usando un compilador Ahead-of-time compilation (compilación por adelantado), o ejecutado nativamente, por el procesador hardware.

Java (se compila en código byte Java para que sea interpretado por la JVM)
Groovy
Join Java
ColdFusion
Scala
Lua
.NET Framework (traducidos a código byte, llamado CIL)
C++/CLI
C#
Visual Basic .NET
Pike
Python
Squeak Smalltalk
Visual FoxPro
Lisp
AppleScript