Un compilador es un tipo de programa informático que convierte código de un lenguaje de programación (el lenguaje de origen) a otro lenguaje de programación (el lenguaje de destino).
Los compiladores se utilizan para transformar código fuente de alto nivel en código de destino de bajo nivel (como lenguaje ensamblador, código objeto o código de máquina) mientras se preserva la funcionalidad del programa.
Una herramienta crítica para la programación informática moderna y práctica, los compiladores permiten a los programadores trabajar en código de alto nivel legible por humanos y luego convertir su código fuente en código de destino ejecutable. Los compiladores también ayudan a los desarrolladores de software a crear programas ejecutables eficientes con seguridad, estabilidad y portabilidad mejoradas. Esto se debe a que los compiladores ayudan a identificar y abordar errores, creando así aplicaciones portátiles ejecutables.
Aunque todos los compiladores convierten el código de alto nivel en código ejecutable de bajo nivel, se utilizan diferentes tipos de compiladores para diferentes lenguajes de programación y aplicaciones. Por ejemplo, un compilador cruzado se utiliza para producir código para un tipo de CPU o sistema operativo diferente al que se ejecuta.
Cuando el compilador ideal no está disponible o aún no se ha creado, se utiliza un compilador de Bootstrapping temporal para compilar un compilador más permanente que está mejor optimizado para compilar cualquier lenguaje de programación específico.
Una breve lista de otro software relacionado incluye:
Boletín de la industria
Manténgase al día sobre las tendencias más importantes e intrigantes de la industria sobre IA, automatización, datos y más con el boletín Think. Consulte la Declaración de privacidad de IBM.
Su suscripción se entregará en inglés. En cada boletín, encontrará un enlace para darse de baja. Puede gestionar sus suscripciones o darse de baja aquí. Consulte nuestra Declaración de privacidad de IBM para obtener más información.
En la práctica, usar un compilador puede ser tan simple como ingresar un comando en una línea de comandos en cualquier sistema Linux (o equivalente), especificando el archivo ejecutable del compilador y los archivos fuente que se compilarán. Este comando indica al sistema que procese el código fuente, compilándolo en un código de máquina de destino y dando como resultado los archivos de objeto necesarios para producir un programa ejecutable.
Los compiladores de código abierto como GNU Compiler Collection (GCC), una robusta colección de compiladores de C comúnmente utilizada para compilar código C en programas C, o la alternativa Clang están disponibles en repositorios como GitHub. Otros compiladores pueden instalar libremente o adquirir a una amplia gama de distribuidores. También se pueden integrar en entornos de desarrollo integrado (IDE) populares, que agrupan varias compañías de servicios públicos para el desarrollo de software, incluidos editores de texto, documentación API y herramientas de depuración .
Independientemente del compilador específico que se emplee, el proceso de compilación de código implica pasar el código fuente a través de varios niveles de análisis, optimización y, en última instancia, generación de código. El código fuente pasa por las diferentes capas analíticas secuencialmente y se evalúa en cada paso del proceso.
Si el compilador reconoce algún problema con el código fuente, podría devolver un mensaje de error, lo que indica a los desarrolladores que corrijan los errores identificados antes de continuar con la compilación del resto del código. Generalmente, los compiladores proceden a través de los siguientes pasos:
Es posible que algunos compiladores no se adhieran estrictamente a la estructura anterior. Sin embargo, aunque algunos compiladores pueden contener más o menos pasos, todas las fases de compilación se pueden atribuir a una de tres etapas: un front end, un middle end y un back end.
Esta estructura de tres etapas permite a los compiladores adoptar un enfoque modular. Permite combinar múltiples front-end para diferentes lenguajes con backend para diferentes CPU, al tiempo que comparte las capacidades de optimización de varios middle end aplicables.
Las tres etapas de un compilador implican la siguiente distribución:
Si bien los compiladores no son explícitamente necesarios para producir código viable, la amplia variedad y complejidad tanto de los lenguajes de programación como de los entornos de máquina hacen que los compiladores sean una necesidad práctica para crear software ejecutable. Estos son los cuatro beneficios principales de emplear compiladores de software.
Los lenguajes de programación de alto nivel utilizan una sintaxis y palabras clave más cercanas a los lenguajes hablados, lo que facilita mucho su uso para los desarrolladores. Los compiladores convierten este código legible por humanos en el código de máquina más complejo necesario para ejecutar aplicaciones de software optimizadas.
Algunos ejemplos de lenguajes de alto nivel incluyen los siguientes lenguajes:
Los compiladores ayudan a mejorar la eficiencia al convertir código de alto nivel en código de máquina ejecutable. La salida del compilador se almacena con un archivo .exe extensión de archivo, que luego es ejecutada directamente por una computadora. Debido al compilador, escribir un programa ejecutable se convierte en una tarea de esfuerzo único.
Una vez completado, el código compilado se puede ejecutar tantas veces como sea necesario. Este proceso ayuda a que los programas generalmente se ejecuten de manera más rápida y eficiente, ya que ciertas aplicaciones o partes de las aplicaciones se pueden ejecutar por separado de las tareas de software en tiempo de ejecución.
No todos los sistemas pueden ejecutar todos los tipos de código de programación. Los compiladores se emplean para convertir los tipos de código que los desarrolladores prefieren emplear en los tipos de código que los sistemas necesitan para funcionar. De este modo, los compiladores mejoran la portabilidad de los programas al convertir el software en una amplia variedad de lenguajes compatibles que pueden almacenar, transferir y ejecutar fácilmente en diversos sistemas operativos y arquitecturas de hardware.
Durante el proceso de compilación, los compiladores se pueden utilizar para identificar y abordar errores y fallas de software, lo que da como resultado programas más estables y mejor optimizados. Los compiladores también pueden ayudar a mejorar la seguridad del software al prevenir errores relacionados con la memoria, como desbordamientos de búfer, y generar advertencias si se detectan posibles problemas de memoria.
Mientras que los compiladores se emplean para convertir el código fuente en código máquina ejecutable, los intérpretes son otro tipo de programa que puede proporcionar una funcionalidad similar, pero a través de un mecanismo diferente.
En lugar de convertir el código fuente, los intérpretes ejecutan directamente el código fuente o utilizan un código intermedio conocido como bytecode, una representación del código fuente de bajo nivel e independiente de la plataforma. Bytecode sirve como intermediario entre el código fuente legible por humanos y el código de máquina, diseñado para ser ejecutado por una máquina virtual (VM) en lugar de directamente en el hardware de una computadora.
En teoría, cualquier lenguaje de programación se puede ejecutar con un compilador o un intérprete. Sin embargo, los lenguajes de programación individuales tienden a ser más adecuados para la compilación o la interpretación.
En la práctica, la distinción entre lenguajes compiladores y lenguajes de intérprete a veces puede ser borrosa, al igual que la distinción entre compiladores e intérpretes mismos, ya que ambos tipos de programas pueden presentar funcionalidades superpuestas. Si bien algunos lenguajes son más comúnmente compilados y otros más comúnmente interpretados, es posible escribir un compilador para un lenguaje que se interpreta comúnmente y viceversa.
Los lenguajes de alto nivel generalmente se crean con un tipo de conversión (ya sea compilación o interpretación) en mente, pero estas son más sugerencias que limitaciones estrictas. Por ejemplo, BASIC a menudo se conoce como un lenguaje interpretado y C un lenguaje compilado, pero existen compiladores para BASIC al igual que hay intérpretes de C.
La principal diferencia entre intérpretes y compiladores radica en el tiempo y la optimización. Ambos tipos de programas intentan convertir el código fuente en código de destino que primero sea funcional y luego optimizado.
Dependiendo del entorno operativo, el código compilado o interpretado puede ser más adecuado para ejecutar de manera eficiente teniendo en cuenta la capacidad del hardware, la memoria y la capacidad de almacenamiento. Dependiendo de las limitaciones de cada programa, aplicación y hardware específico, la compilación, la interpretación o una combinación de ambas podrían producir los mejores resultados.
Como tal, la interpretación no puede sustituir por completo a la compilación, pero puede mover las tareas de compilación a un segundo plano a través de un proceso de conversión gradual. Los compiladores emplean una estrategia de conversión anticipada (AOT) que convierte el código fuente en código de destino por completo antes de crear un archivo ejecutable.
Los intérpretes, alternativamente, ejecutan el código directamente como lo requiere una aplicación o utilizan bytecode como intermediario para generar el código fuente ejecutable de las máquinas virtuales. De esta manera, los intérpretes pueden proporcionar algunas aceleraciones o flexibilidad, pero en algún momento, se debe proporcionar un conjunto de instrucciones de máquina ejecutadas directamente hacia el final de la pila de ejecución.
En algunos casos, cuando la eficiencia ligera es una prioridad, los intérpretes especiales pueden ser preferibles a los compiladores por su capacidad para realizar la conversión justo a tiempo (JIT). JIT es una estrategia que compila fragmentos de código fuente en código de destino en un búfer de memoria para su ejecución inmediata. La interpretación JIT compila código a pedido, combinando la eficiencia de compilación única de un compilador tradicional con la flexibilidad de ejecutar código repetidamente, a menudo más rápido que los intérpretes de código de bytes estándar.
Sin embargo, a medida que aumentan las tendencias modernas hacia la compilación JIT junto con la interpretación del código de bytes dependiente de la situación, muchos compiladores están siendo diseñados para ofrecer características de compilación e interpretación. Esta superposición difumina aún más las líneas entre estas dos categorías.
IBM Cloud Infrastructure Center es una plataforma de software compatible con OpenStack para gestionar la infraestructura de nubes privadas en IBM zSystems e IBM LinuxONE.
Descubra los servidores, el almacenamiento y el software diseñados para la nube híbrida y su estrategia de IA.
Encuentre una solución de infraestructura en la nube que sea adecuada para las necesidades de su negocio y escale los recursos bajo demanda.