compilador

TANTOR
24 de Junio del 2005
Hola!
pregunta de trivial: ¿puedo saber con un .exe en que lenguaje se realizó?
muchas gracias de antemano.
salud!

hiei
24 de Junio del 2005
en principio, si el programa no posee los simbolos de depuracion, no... pero si eres avido en mirar el codigo desensamblado, determinados lenguajes (compiladores) generan un codigo caracteristico.
C y Pascal por ejemplo se diferencian en el orden en que ponen los parametros y como retornan los valores (hablando de Turbo/Borland C/C++/Pascal)
Un codigo en Visual Basic que muy facil de reconocer porque su ejecutable necesita las librerias VBRUNXX.DLL dnde XX corresponde con el numero d vercion (60, 50, 32 etc.)
Un programa en Deplhi o C++ Builder (o alguno que use las VCL o las CLX) se caracteriza por tener una tabla de simbolos (casi al final del archivo EXE) con nombres del tipo: _TForm...algo... o _TFileDialog...algo...

Hay compiladores que dejan su marca muy claramente y de forma explicita en su codigo (a menos que el desarrollador sea lo suficientemente avil como para desactivar esa opcion...)
Por ejemplo el programa MPLAB de la empresa Microchip en su vercion 4.00.00.00 tiene una cadena de caracteres que dice algo asi:
"this program is compiled with Visual C++ 5.0"
...aunque aviso que esta muy (pero muy) escondida entre los datos binarios...
Los compiladores de C de Borland ponian algo como esto:
"this program is compiled with Turbo C++ 1.01"
Era una cadena de caracteres que estaba en el modulo crt0.obj (el modulo principal que llama al main del programa) y que se podia reemplazar con espacios sin problema...

Un programa echo en DJGPP puede ser reconocido pus casi al principio de la cavecera dice algo como esto:
"DPMI extender .... v1.XX"
O algun tipo de informacion relacionada con los modulos DPMI aunque esto tambien se da en todos los ejecutables que usan DPMI (DOS protected mode interfaz, o interfaz para modo protejido en DOS)

Un programa compilado en Quick C se diferencia de otro en Turbo C porque los simbolos de depuracion son por ejemplo:
Turbo C: _printf
Quick C: printf_
Aunque en Turbo C (y creo que en QC tambien) se puede determinar que esto no sea asi.

Pero la mejor manera de saver en que lenguaje esta hecho un programa es con su codigo fuente... el ejecutable es solo un producto secundario...

Cmo dato interesante, compilar un programa con GCC (C) en Linux y con GPC (Pascal) eliminando los simbolos de depuracion (-O3) deja un binario tan limpio que es casi imposible distingir en que lenguaje esta hecho, es mas, el codigo se le parece mucho (bucles for (...;...;...) contra For .... to ... do... y otros)

A este arte se le llama ingenieria inversa...