einmal:
RDG Packer Detector
und PEID - sie scannen die Executable automatisch. Wobei die erkennung meistens recht zuverlässig ist (sogar der compiler wird erkannt

).
Zusätzlich besitzt jeder compiler seine Eigenheiten und "Gewohnheiten"
VB bindet logischerweise immer VB.DLL ein
Delphi (erkennungsmerkmal Nr1: es kommen Strings wie "boolean" und weitere Datentypen vor)
BC++ hinterlässt meistens eine "Visitenkarte" (also einen String "Borland C++ Compiler bla")
hm, C erkennt man (zumindest unter Windows) meistens am recht kleinen und klar strukturiertem Code - und an den C-Libs bzw. es kommen Strings aus C-StdFunktionen vor. Kommmt aber auf den Compiler/Linker an.
MSVC++ x: Aufgeblähter Code, sehr viele Prüfungen dring, Strings mit "ios::bla" (und dem üblichem C++ Zeug)
DJGPP: erstellt eine komische Exe (ein DOS-Wrapper der dann 32-Bit Code ausführt oder startet

)
Naja, und MASM/NASM erkennt man eben an extrem kleinen Exen bzw. sehr wenig Code.