# Intel C++ Compiler

Intel C++ Compiler (también conocido como ICC o ICL) es un conjunto de compiladores para los lenguajes C y C++, desarrollado por Intel. Los compiladores están disponibles para los Sistemas Operativos Linux, Microsoft Windows y Mac OS X.
Estos compiladores pueden funcionar sobre procesadores IA-32, Intel 64, Itanium 2, y otros procesadores ajenos a la marca, pero compatibles, como los de AMD. Los desarrolladores, eso sí, deben comprobar los requisitos del sistema. El Intel C++ Compiler para IA-32 e Intel 64 dispone de una vectorización automática que puede generar instrucciones SSE, SSE2, SSE3 y SSE4 SIMD , las variantes de Intel Wireless MMX y MMX 2 para sistemas embebidos. Desde su introducción, el Compilador de Intel de C++ para IA-32 ha aumentado considerablemente la adopción de SSE2 en el desarrollo de aplicaciones para Windows.
El Intel C++ Compiler soporta tanto OpenMP 3.0 como paralelización automática para el multiprocesamiento simétrico. Con el complemento Cluster OpenMP, el compilador también puede generar automáticamente llamadas de Interfaz de Paso de Mensajes para el multiprocesamiento de la memoria distribuida desde las directivas de OpenMP.
ICC pertenece a la familia de compiladores de los Frontend de Edison Design Group (como SGI MIPSpro, Comeau C++, Portland Group y otros más). El compilador es ampliamente utilizado por la SPEC CPU para pruebas de rendimiento de las arquitecturas IA-32, x86-64 e Itanium 2.
ICC puede presentarse de cuatro maneras diferentes. Dentro de Intel Parallel Studio, como paquete en Intel C++ Compiler Professional Edition, en Intel Compiler Suite y en Intel Cluster Toolkit, Compiler Edition. En el sitio Intel Software Products se proporciona mucha más información y recursos.

## Optimizaciones

Intel afina este compilador optimizándolo para plataformas de hardware, minimizando estancamientos y produciendo así un código que se ejecuta en un número menor de ciclos. El compilador C++ de Intel soporta tres técnicas de alto nivel por separado para optimizar los programas compilados: optimización interprocedimiento o interprocedural optimization (IPO), optimización guiada por perfil o profile-guided optimization (PGO), y optimización de alto nivel o high-level optimizations (HLO). También soporta técnicas y herramientas que agregan paralelismo en las aplicaciones.
Optimización guiada por perfil (o Profile-guided optimization en su versión original) se refiere a un modo de optimización donde el compilador es capaz de acceder a los datos desde una ejecución de ejemplo del programa a través de una entrada de datos representativa. Los datos indicarán que áreas del programa se ejecutan con mayor frecuencia, y que áreas son ejecutadas con menor frecuencia. Todas las optimizaciones se benefician de la realimentación (feedback) guiada por perfil porque dependen menos de la heurística al tomar decisiones de compilación.
Optimizaciones de alto nivel son aquellas que se realizan en una versión del programa que representa más exactamente el código fuente. Esto incluye bucles de intercambio, fusión de bucles, desenvoltura de bucles, distribución de bucles, prelectura de datos y más. Estas optimizaciones suelen ser muy agresivas y pueden llevar un considerable tiempo de compilación.
Interprocedural optimization applies typical compiler optimizations (such as constant propagation) but using a broader scope that may include multiple procedures, multiple files, or the entire program.
Los compiladores incluyen una extensión de depuración en paralelo, Bloques de Construcción de Hilos de Intel (Intel Threading Building Blocks), soporte para la función lambda, y una herramienta de comprobación de recursos para usar con el código en hilos.
El compilador de Intel ha sido criticado por aplicar, por defecto, optimizaciones de coma flotante no permitidas en el estándar de C y que requieren flags especiales o específicos con otros compiladores como el conocido GCC.

## Lenguajes

La suite de compiladores de Intel tiene frontends para C, C++, y Fortran.
Las versiones más tempranas de ICC que usan versiones anteriores al compilador GCC 3.x para Linux usan el esquema de coloreado de sintaxis de código de Dinkumware con el propósito de proveer una implementación más ajustada al estándar de C++ que GCC en sus versiones 2.x. Esto hace que su ABI incompatible con ambas versiones de GCC. Intel suprimió las bibliotecas de Dinkumware en la versión 10.0, la cual se lanzó en junio de 2007. Desde entonces, el compilador ha sido y sigue siendo compatible con GCC 3.2 y versiones posteriores.

## Arquitecturas

* IA-32
* x86-64 (Intel 64 and AMD64)
* IA-64 y/o "Itanium"

## Versiones

Las siguientes versiones del Intel C++ Compiler han sido publicadas:
| Versión del compilador | Fecha de publicación | Principales nuevas características |
| Intel C++ Composer XE 2011 Update 6 y posteriores (compiler 12.1) | 8 de septiembre de 2011 | Extensiones del lenguaje Intel Cilk Plus actualizadas para soportar la especificación del mismo en su versión 1.1 y disponible ahora en Mac OS X, Windows y Linux, Intel Threading Building Blocks actualizada a la versión 4.0, bloques Apple soportados en Mac OS X, mejorado el soporte para C++11 incluyendo soporte para plantillas Variadic, soporte para OpenMP 3.1. |
| Intel C++ Composer XE 2011 hasta Update 5 (compiler 12.0) | 7 de noviembre de 2010 | Extensiones del lenguaje Intel Cilk Plus, Auto-Paralelismo guiado, soporte de C++0x mejorado. |
| Intel C++ Compiler 11.1 | 23 de junio de 2009 | Soporte para el último Intel SSE SSE4.2, instrucciones AVX y AES. Extensión de compilación paralela. Mejor integración con Microsoft Visual Studio, Eclipse CDT 5.0 y Mac XCode. |
| Intel C++ Compiler 11.0 | 6 de noviembre de 2008 | Soporte inicial para C++0x (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).. Integración con VS2008 en Windows. OpenMP 3.0. Comprobación en el código fuente de memoria estática/diagnósticos paralelos. |
| Intel C++ Compiler 10.1 | 7 de noviembre de 2007 | Nueva compatibilidad con la biblioteca de ejecución OpenMP (OpenMP RTL): si usas la nueva OpenMP RTL, puedes mezclar y unir bibliotecas y objetos construidos con Visual C++. Para usar las nuevas bibliotecas, tienes que usar la nueva opción para compilar escribiendo como sigue: "-Qopenmp /Qopenmp-lib:compat" en Windows, y: "-openmp -openmp-lib:compat" en Linux. Esta versión de ICC soporta más intrínsecos de Visual Studio 2005. Para VS2008 el soporte se reduce a la línea de comandos. La integración con el IDE aún no está soportada. |
| Intel C++ Compiler 10.0 | 5 de junio de 2007 | Mejorado el paralelizador y el vectorizador, Streaming SIMD Extensions 4 (SSE4), nueva y mejorada optimización de informes para transformaciones avanzadas de bucles, nueva implementación de manejo de excepciones optimizada. |
| Intel C++ Compiler 9.0 | 14 de junio de 2005 | Arquitectura AMD64 (para Windows), optimización SSP (pre-computación especulativa basada en software), mejorada la optimización de informes de bucles. |
| Intel C++ Compiler 8.1 | Septiembre de 2004 | Arquitectura AMD64 (para Linux). |
| Intel C++ Compiler 8.0 | 15 de diciembre de 2003 | Cabeceras precompiladas, herramientas de cobertura de código. |
| Intel C++ Compiler 7.1 | Marzo de 2003 | Soporte parcial para Intel Pentium 4 con Streaming SIMD Extensions 3 (SSE3). |
| Intel C++ Compiler 7.0 | 25 de noviembre de 2002 | |
| Intel C++ Compiler 6.0 | 24 de abril de 2002 | Ahora disponible para Windows y Linux. El compilador para Linux provee más alta compatibilidad con GCC, incluyendo el próximo GCC-3.1 C++-ABI (compatibilidad binaria) y soporta muchas GNU-ismos (extensiones del lenguaje C que soporta GCC, pero que no están estandarizadas) en la sintaxis. La versión 6.0 de ICC ha mejorado el soporte para las extensiones del lenguaje GNU C y ahora es capaz de construir el núcleo Linux con menores tasas de trabajo para las arquitecturas IA-32 e Itanium. |

## Prototipos

Además, las siguientes ediciones "prototipo" están disponibles:
| Versión de Compilador | Fecha de publicación | Principales nuevas características |
| Intel Concurrent Collections for C/C++ 0.3 | Septiembre de 2008 | "Intel Concurrent Collections for C/C++" provee un mecanismo para construir programas basados en C++ y que se ejecutan en paralelo. Esto permite a los desarrolladores ignorar los problemas del paralelismo, como puede ser al construir hilos en bajo nivel o en la planificación y distribución de computaciones. El modelo permite a los desarrolladores especificar pasos computacionales en alto nivel, incluyendo entradas y salidas (inputs y outputs) sin imponer necesariamente un orden en su ejecución. El código dentro de estos pasos computacionales se escribe usando como referencia el estándar de construcción propio del lenguaje C++. Los datos son locales en pasos computacionales o son explícitamente producidos y consumidos por ellos. Este prototipo de software soporta múltiples estilos de paralelismo, como puede ser de datos, de tareas, o segmentación en paralelo (pipeline). |
| Intel STM Compiler Prototype Edition | 17 de septiembre de 2007 | Versión prototipo del compilador de Intel que implementa soporte para Software de Memoria Transaccional (STM). El compilador STM de Intel soporta Linux y Windows, y produce código de 32 bit para arquitecturas de procesadores x86 (Intel y AMD). Intel dijo que cree que "la disponibilidad de algún prototipo de compilador permite una exploración sin precedentes por parte de los desarrolladores de software en C/C++ que apunta a una técnica prometedora de hacer que la programación multi-núcleo resulte más fácil". El compilador STM requiere la instalación previa del compilador de Intel. |

## Documentación

Esta documentación puede encontrarse en Intel Software Technical Documentation site.
| Windows | Linux | Comentarios |
| /Od | -O0 | Sin optimización |
| /O1 | -O1 | Optimizar en tamaño |
| /O2 | -O2 | Optimizar en velocidad y activar algunas optimizaciones |
| /O3 | -O3 | Activa todas las optimizaciones como en el código O2, además de optimizaciones de bucles intensivas |
| /QxO | -xO | Activa las optimizaciones de las instrucciones SSE3, SSE2 y SSE para CPUs distintas a Intel |
| /fast | -fast | Shorthand (método rápido). En Windows esto equivale a "/O3 /Qipo /xT /no-prec-div"; en Linux es "-O3 -ipo -static -xHOST -no-prec-div". Nótese que el flag de la optimización específica del procesador (-xHOST) será optimizado para el mismo procesador. Este el único flag de -fast, el cual puede ser anulado. |
| /Qprof-gen | -prof_gen | Compila el programa y lo instrumenta en armonía con el perfil de ejecución. |
| /Qprof-use | -prof_use | Debe usarse solamente después de ejecutar un programa que previamente ha sido compilado usando prof_gen. Usa la información del perfil durante cada paso en el proceso de compilación. |

## Depuración

El compilador de Intel provee información de depuración que es estándar para los depuradores comunes (DWARF 2 en Linux, similar a gdb, y COFF para Windows). Los flags para compilar con la información de depuración son /Zi en Windows y -g en Linux.
Intel también provee su propio debugger llamado idb, el cual puede ser ejecutado tanto en dbx como en gdb en modo de comandos compatible.
Aunque que el compilador de Intel puede generar una salida de profiling compatible con gprof, Intel también provee un nivel en kernel, un perfilador estadístico de sistema completo como producto separado llamado VTune. VTune ofrece una GUI de fácil manejo (integrada en Visual Studio para Windows, Eclipse para Linux) tan buena como la línea de comandos.
Las versiones 11.x del compilador introducen la Extensión de Depuración en Paralelo (Parallel Debugger Extension), la cual provee técnicas de depuración para aplicaciones con hilos de trabajo. Puede ser usada con otros compiladores compatibles, como Microsoft Visual C++ en Windows, que está Visual Studio 2005, 2008 y 2010 y gcc en Linux.

## Críticas

Intel y terceros han publicado resultados de estudios de rendimiento a fin de corroborar los anuncios de liderazgo en desempeño sobre otros compiladores y librerías comerciales, de código abierto y de AMD por encima de procesadores Intel y no-Intel. Intel y AMD han documentado indicadores de uso en compiladores Intel para obtener rendimiento óptimo en procesadores Intel y AMD. Sin embargo, los compiladores Intel han sido acusados de producir código sub-óptimo con propósitos mercenarios. En 2009, un desarrollador había escrito en un blog al respecto:
Este despachamiento de CPU específico a un fabricante disminuye el desempeño en procesadores no-Intel de software construido con un compilador Intel o una biblioteca de funciones de Intel - posiblemente sin el conocimiento del programador. Esto ha conducido a estudios de desempeño errados. En noviembre de 2009 se acordó una batalla legal entre AMD e Intel sobre este y otros asuntos. A finales de 2010, AMD interpuso una investigación anti-monopolio contra Intel.
El acuerdo de la FTC incluyó una disposición de revelación en donde Intel debe: