2010-01-19 21 views
9

Duplicar posibles:
Why does C++ compilation take so long?Diferencia entre C++ y proceso de compilación de Java

Hola,

Busqué en Google para las diferencias entre C++ y proceso de compilación de Java, pero C++ y Java características del lenguaje y sus diferencias son devueltos.

Soy competente en Java, pero no en C++. Pero solucioné algunos errores en C++. Desde mi experiencia, noté que C++ siempre tardó más tiempo en compilar en comparación con Java para cambios menores.

Saludos Bala

+1

Lea la respuesta de jalf aquí: http://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –

+1

Es un problema de QoI (calidad de implementación). Algunos compiladores de C++ implementan "encabezados precompilados", lo que hace que la compilación sea mucho más rápida. –

+1

La misma pregunta que http://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –

Respuesta

10

Hay algunas diferencias de alto nivel que me vienen a la mente. Algunas de ellas son generalizaciones y deben ir precedidas de "A menudo ..." o "Algunos compiladores ...", pero por razones de legibilidad lo dejaré.

  • compilación C/C++ no ha leído ninguna información de los archivos binarios, pero lee las definiciones método/tipo sólo de los archivos de cabecera que necesitan ser analizado en su totalidad (excepción: los encabezados precompilados)
  • compilación
  • C/C++ incluye un paso de preprocesador que puede hacer una amplia gama de reemplazo de texto (lo que dificulta la compilación previa del encabezado)
  • La sintaxis de C++ es mucho más compleja que la sintaxis de Java
  • El sistema de tipo C++ es mucho más complejo que el sistema de tipo Java
  • compilación de C++ habitual produce código de ensamblador nativo, que es mucho más complejo de producir que el código de bytes relativamente simple
  • Los compiladores C++ deben hacer optimizaciones porque no hay otra cosa que los haga. El compilador de Java hace una simple traducción 1: 1 del código fuente de Java al código de bytes de Java, no se realizan optimizaciones en ese paso (eso queda para que lo haga la JVM).
  • C++ tiene un lenguaje de plantilla que está completo. (Así que, estrictamente hablando, el código C++ debe ser ejecutar para producir código ejecutable y un compilador C++ tendría que resolver el problema de detención para indicarle si el código C++ arbitrario es compilable).
8

Java compila código en el código de bytes, que es interpretado por la máquina virtual de Java. C++ debe compilarse en código de objeto, luego en lenguaje de máquina. Debido a esto, es posible que Java compile solo una clase para cambios menores, mientras que los archivos de objeto C++ deben volver a vincularse con otros archivos de objetos para ejecutar el código de máquina (o DLL). Esto puede hacer que el proceso tarde un poco más.

0

Un programa en C++ que utiliza todas las funciones del lenguaje es intrínsecamente más difícil de compilar. Algunas invocaciones de plantilla con varios tipos pueden duplicar o triplicar fácilmente la cantidad de código para generar.

0

Pasando por alto una gran cantidad de detalles, en Java compila archivos .java en uno o más archivos .class. En C++, compila archivos fuente .cc (o lo que sea) en archivos .o, y luego vincula los archivos .o en un archivo ejecutable o biblioteca. El proceso de vinculación es generalmente lo que lo mata, especialmente para cambios menores, ya que la cantidad de trabajo para vincular es más o menos proporcional al tamaño de todo el proyecto.(Esto está ignorando los enlaces incrementales, que están diseñados específicamente para no comportarse tan mal para pequeños cambios)

Otro factor es que el mecanismo #include significa que cada vez que cambie un archivo .h, todos los archivos .o que dependen en eso necesita ser reconstruido. En Java, un archivo .class puede depender de más de un archivo .java (por ejemplo, debido a la constante creación de líneas), pero tienden a haber muchos menos de estos "puntos calientes" donde cambiar un archivo fuente requiere muchos otros archivos fuente para ser reconstruido.

Además, si está utilizando un IDE como Eclipse, está construyendo su código de Java en segundo plano todo el tiempo, por lo que cuando le diga que compile ya está hecho (si no completamente) en su mayoría.

3

No estoy seguro de por qué espera que la velocidad de compilación de Java y C++ sea comparable, ya que son idiomas diferentes con implementaciones e implementaciones de diseño completamente diferentes.

Dicho esto algunas diferencias específicas a tener en cuenta son:

  • Java es compilado a código de bytes y no se bien Allá en código máquina. Compilar a esta máquina virtual abstracta es más simple.
  • La compilación C++ implica no solo compilation but also linking. Por lo general, es un proceso de varios pasos.
  • Java realiza un enlace tarde que es la asociación de una llamada a una función y el código real para ejecutar se realiza en tiempo de ejecución. Entonces, un pequeño cambio en un área no necesita desencadenar una compilación de todo el programa. En C++, esta asociación debe realizarse en tiempo de compilación; esto se denomina vinculación anticipada.
0

Java compila cualquier código fuente en bytecode, que es interpretado por JVM. Debido a esta característica, puede usarse en múltiples plataformas.

Cuestiones relacionadas