19 de Diciembre de 2018
Sep
20

Usando compiladores: ¿Qué son?

 Bueno amigos, hoy vamos a aclarar qué es un compilador. De hecho, nosotros estamos usando ahora mismo 3 compiladores, el de VB 2008, el de C# y el Dev-C++. Sin embargo, a pesar de que estos programas los usamos a menudo, muchas veces no sabemos que es exáctamente lo que hacen. Hoy, vamos a estudiar su comportamiento.

 


 Según la wikipedia:

 

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar.

 Es decir, que cuando nosotros escribimos en el VB 2008, nosotros estamos escribiendo en el lenguaje Visual Basic .NET, y cuado compilamos (depuramos, ejecutamos etc) lo que hace el VB es traducir todo nuestro código a otro código que el PC entiendo, generalmente Ensamblador

 Entonces os estaréis preguntado, ¿por qué no se programa directamente en Ensamblador y a tomar viento fresco? La respuesta es que en un lenguaje como VB, llamado de Alto Nivel, la estructura del código es similiar a como piensa el ser humano. Sin embargo, en Ensamblador (lenguaje de Bajo Nivel) no tiene por qué tener lógica para el ser humano, sino ser manejable por la máquina.

 En base a esto, para crear un "Lenguaje de programación", lo único que deberíamos crear sería un compilador, y con eso estaría listo. Sin embargo, esto no es tan fácil como parece. Si volvemos a tomar prestado un detalle de la wikipedia, vemos las diferentes fases que debe de efectuar un compilador a la hora de traducir el código:

 

  
 Como podemos observar, la traducción semántica y léxica es algo muy avanzado y complicado. Por ello, cuantas más posibilidades da un lenguaje de programación, implica una mayor complejidad de los compiladores que lo manejan.

 

 Por último, os dejo el enlace al artículo de la wikipedia sobre los compiladores, por si queréis echar un vistazo a su historia, o por si queréis profundizar un poco más en el asunto: http://es.wikipedia.org/wiki/Compilador

 Un saludo, Btc Wink

 

5
Valoración media: 5 (3 votos)

5 Comentarios:

Esta entrada me ha

Esta entrada me ha recordado cuando era joven, estúpido y tentado por el reverso tenebroso de la fuerza (bueno, ahora tampoco es que sea viejo, listo, ni un caballero jedi ;)

Cuando abrías un ejecutable con el SoftICE, con el OllyDbg, o con el Win32dasm, podías "medio" adivinar con que compilador se había generado aquel programa. El código generado por WatcomC era totalmente distinto al código generado por Delphi o Visual Basic.

Al mirar las "tripas" al ejecutable te dabas cuenta que unos compiladores optimizaban más el código que otros.

Cómo bien apuntas en el post, cuando escribes un lenguaje, por ejemplo con Dev-C++, lo haces en un lenguaje "que entiende el ser humano", en este caso, C / C++. Si tienes un programa tipo:

For i As Integer = 0 To 10
   Debug.Print (5 * i)
Next

Este código de Visual Basic, al compilarlo genera "x" lineas en lenguaje de código máquina.

Si tienes el mismo programa en C (en sintaxis de C, logicamente), al compilarlo genera "y" lineas de código máquina.

Si el mismo programa en sintaxis Delphi lo compilas, generará "z" lineas de  código máquina.

Pues bien, a la postre, lo que va a ejecutar la CPU es ese "código máquina".

Es de cajón que se ejecutará mas "rápido" un código máquina de 10 lineas, que no otro que hace la misma función pero que tiene 100 lineas.

Pues esto es lo que ocurre, por ejemplo con Visual Basic (Hablo de Visual Basic, NO de VB.NET)

Para el ejemplo de arriba, el compilador de Visual Basic, puede generar perfectamente 70 lineas de código máquina para ejecutar ese bucle For.
Ahora bien, te coges el mismo programa y lo compilas en Delphi o en "C" y en lugar de 70 lineas, tienes 20.

¿Qué bucle For se ejecutará más rápido, el que tiene 70 lineas de código máquina o el que tiene 20?

Quizas hoy en día esto es algo a lo que no damos mucha importacia, pero esto no es  gracias a los compiladores, sino a que el hardware actual es increiblemente más rápido que antaño.

Saludos.
mov eax,ollydbg; Int 13h 

PD: Dónde digo código máquina, quería decir codigo en lenguaje ensamblador, que se me ha ido la olla y estaba pesando en los cerros de Úbeda ;) 

Venga, va...

...ahora vengo yo a meter la gamba XDXD

Veamos. ¿Si un lenguaje de bajo nivel sólo tiene sentido para una máquina pero no para un humano, es imposible programar en él?

¿Se puede hacer manualmente el proceso del compilador? ^^u

Es que eso de que carece de lógica para el ser humano me intriga. 

@Zerael:

Codigo maquina = 01001010101011100101010

Ni yo entiendo lo que hay ahi, aunque en su momento te podia decir: Este grupo de 5 digitos significa "A" y este otro grupo significa "+" y todo eso.

Solo lo entiende la maquina para la que lo escribes.

El compilador traduce cosas como
"2+2=4" que nosotros entendemos al lenguaje de cada maquina que no entiende eso, pero si lo entiende si esta escrito asi: 0100101010101

Programar en codigo maquina? Si, se puede, pero te vas a pasar la tira, es facil cometer fallos y dificil encontrarlos.

Un saludo

Muchas gracias...

Como ya te había comentado, hace poco me introduje en el mundo de la programación básica. Poco a poco, voy progresando en C++ y Java, pero el término "compilador" nunca lo había comprendido del todo, sabía que era algo útil y necesario para elaborar un programa, pero no cuál era su función real.

Estas entradas "educativas" me encantan. Muchas gracias por la información, Btc. Finalmente, te agradezco el haberme permitido descubrir el "directorio de blogs" (uno de los enlaces de tus bloques laterales); hay un apartado dedicado a los blogs de México y me ya me registré, estoy a la espera de que den de alta (o rechacen) mi blog.

Saludos,
Desmodius.

 Si bueno, yo tambien

 Si bueno, yo tambien estoy esperando, ya me estoy con la mosca detras de la oreja :S Me alegro de que te gusten las entradas ^^

 Salu2, Btc