# MinGW

MinGW (Minimalist GNU for Windows), anteriormente conocido como MinGW32, es una implementación de los compiladores GCC para la plataforma Win32, que permite migrar la capacidad de este compilador en entornos Windows. Es un fork de Cygwin en su versión 1.3.3. Además MinGW incluye un conjunto de la API de Win32, permitiendo un desarrollo de aplicaciones nativas para esa plataforma, pudiendo generar ejecutables y bibliotecas usando la API de Windows.

## Historia

MinGW fue creado por Colin Peters, el 1 de julio de 1998, compilándolo con Cygwin. MinGW se llamaba originariamente mingw32; se quitaron los números del nombre para evitar la implicación que tendría el limitarlo a sistemas de 32 bits. La primera versión nativa para Windows de MinGW fue realizada por Jan-Jaap van der Heijden, quien también tuvo participación en el proyecto GCC; añadiendo también binutils y make. Mumit Khan estuvo a cargo del mantenimiento del proyecto e incluyó al compilador algunas características propias de Windows. Los archivos de cabecera del API de Windows fueron provistos por Anders Norlander. En 2000, el proyecto se trasladó a SourceForge.net para pedir asistencia de la comunidad y centralizar su desarrollo.
MinGW fue seleccionado como Project of the Month en SourceForge en septiembre de 2005.

## Características
### Soporte de lenguaje de programación

Para lenguajes de programación distintos de C, MinGW utiliza las bibliotecas de tiempo de ejecución GNU (por ejemplo, GNU libstdc ++ para C++).
Sin embargo, como GCC no proporciona su propia biblioteca C de tiempo de ejecución, el compilador C de MinGW tiene como objetivo la antigua Biblioteca de tiempo de ejecución de C Visual de Microsoft, MSVCRT, que fue lanzado en 1998 y por lo tanto, no incluye soporte para funciones de C99 (ni siquiera la especificación C89 completa); aunque el uso de MSVCRT permite producir programas nativos que no requieren instalar componentes adicionales, la falta de soporte de C99 ha causado problemas de portabilidad, en particular en lo concerniente a los especificadores de conversión tipo printf. Estos problemas se han atenuado parcialmente mediante la implementación de una biblioteca de compatibilidad de C99, libmingwex, pero la amplia labor requerida está lejos de completarse y no parece que pueda realizarse plenamente. Mingw-w64 ha resuelto estos problemas, y proporciona funcionalidad conforme a POSIX en las funciones tipo printf.

### Componentes de MinGW

El proyecto de MinGW mantiene y distribuye un número de diferentes componentes y paquetes complementarios, incluidos los diversos puertos de GNU toolchain, tales como GCC y binutils, traducido en paquetes equivalentes. Estas utilidades pueden utilizarse desde la línea de comandos de Windows o integradas en un IDE. MinGW admite bibliotecas nombradas de acuerdo con los convenios "<name>.lib" y "<name>.dll" además de la habitual convención "lib<name>.a" común en sistemas UNIX-like.
Además, un componente de MinGW, conocido como MSYS (Minimal SYStem) proporciona ports de win32 de un entorno de shell ligero de tipo Unix que incluye rxvt y una selección de herramientas POSIX suficientes para permitir a las secuencias de comandos (scripts) de autoconf ejecutarse.
Los mingwPORTs son añadidos de usuario (contribuciones) a la colección de software MinGW. En lugar de proporcionar estos "complementos" como paquetes binarios precompilados, se suministran en forma de scripts interactivos de shell Bourne, que guía al usuario final a través del proceso de descarga y revisiones (parcheo) del código fuente original automáticamente, para a continuación compilarlo e instalarlo. Los usuarios que deseen construir cualquier aplicación desde un mingwPORT deben instalar primero MinGW y CYGWIN.
La ejecución de archivos de cabecera de Win32 y bibliotecas de importación de Win32 para vincular el tiempo de ejecución son liberados bajo una licencia permisiva, mientras que los portes de GNU se liberan bajo licencia GNU. Están disponibles en el hogar web de MinGW descargas binarias del paquete completo de CYGWIN y utilidades de GNU MinGW individuales.

## Comparación con Cygwin

MinGW surgió de una bifurcación de la versión 1.3.3 de Cygwin. Aunque Cygwin y MinGW pueden utilizarse para portar software de Unix a Windows, tienen diferentes enfoques: Cygwin pretende ofrecer una capa POSIX completa (similar a la encontrada en otros sistemas de Unix o Linux) de Windows, sacrificando el rendimiento cuando sea necesario para optimizar la compatibilidad. En consecuencia, este enfoque requiere programas Win32 escritos con Cygwin para ejecutar sobre una biblioteca de compatibilidad copyleftada que debe ser distribuida con el programa, junto con el código fuente del mismo. MinGW pretende proporcionar funcionalidad nativa y rendimiento a través de llamadas a la API de Windows directamente. A diferencia de Cygwin, MinGW no requiere una capa de compatibilidad DLL y por lo tanto los programas no necesitan distribuirse con el código fuente.
Como MinGW depende de llamadas a la API de Win32, no puede proporcionar una API completa POSIX; es incapaz de compilar algunas aplicaciones de Unix que se pueden compilar con Cygwin. Específicamente, esto se aplica a las aplicaciones que requieren la funcionalidad POSIX como fork, mmap o ioctl y aquellos que se espera poder ejecutar en un entorno de POSIX. Las aplicaciones escritas con una biblioteca de plataforma cruzada que sí se han portado a MinGW, como SDL, wxWidgets, Qt, o GTK+ se suelen compilar fácilmente en MinGW como se haría en Cygwin.
La combinación de MinGW y CYGWIN proporciona un entorno pequeño e independiente que puede cargarse en medios extraíbles sin dejar entradas en el registro de Windows o archivos en el equipo. Al proporcionar más funcionalidad, Cygwin es más complicado de instalar y mantener.