¿Qué es un compilador por lotes?

28

Tengo la siguiente cita del curso de mi compilador (en el contexto de la coloración de gráficos):

Debido a que es lento, la coloración de gráficos tiende a usarse en compiladores por lotes, mientras que el escaneo lineal tiende a usarse en compiladores JIT.

No pude encontrar una definición clara en línea. Entonces, ¿qué hace que un compilador sea un compilador por lotes?

Rodrigo
fuente
Esa pregunta está fuera de tema aquí. softwareengineering.stackexchange.com es un mejor lugar para preguntar
Basile Starynkevitch

Respuestas:

42

Un compilador JIT (Just-In-Time) compila el código en tiempo de ejecución, es decir, mientras el programa se está ejecutando. Por lo tanto, el costo de la compilación es parte del tiempo de ejecución del programa y, por lo tanto, debe minimizarse.

Lo opuesto a esto es un compilador anticipado (AOT) que es básicamente sinónimo de "compilador por lotes". Esto convierte el código fuente en código de máquina y luego solo se distribuye el código de máquina. Por lo tanto, el compilador puede ser muy lento ya que no afecta el tiempo de ejecución del programa resultante.

Hoy en día, cuando las personas dicen "compilador", generalmente se refieren a un compilador AOT. De hecho, el término "compilador AOT" solo comenzó a hacerse popular relativamente recientemente cuando la gente comenzó a hacer compiladores AOT para lenguajes compilados JIT, particularmente JavaScript. Muchos de estos lenguajes, por ejemplo, C #, se compilan en un lenguaje intermedio para una máquina virtual que luego se compila JIT al código de máquina en tiempo de ejecución. El término "compilador AOT" tiene la connotación de que el código fuente se compilará directamente al código de la máquina, por lo que no se requiere ninguna forma de compilación JIT en tiempo de ejecución.

"Compilador por lotes" es un término arcaico en este momento. El verdadero contraste con un compilador por lotes cuando el término era popular era un compilador incremental . La compilación incremental a menudo se asocia con lenguajes como Lisp donde tenía un REPL y podía solicitar interactivamente la implementación del lenguaje para compilar una función específica. Si se ejecutó una función cuya compilación no se había solicitado antes, normalmente se interpretaría. Un compilador por lotes, por el contrario, compiló todas las funciones a la vez, es decir, en un lote.

Derek Elkins
fuente
1
Y en los viejos tiempos, los cumplidores, donde no se ejecutaban de manera interactiva, tenían que enviar un trabajo a una cola por lotes para compilar su programa
Neuromancer
Y algunas implementaciones de lenguaje (awk de GNU, cpython, etc.) compilan toda la entrada en una representación interna como el primer paso en tiempo de ejecución, que combina algunas de las propiedades descritas aquí.
dmckee
1
@dmckee, la mayoría de las implementaciones de idiomas, si no todas, en realidad
user253751
Otra ambigüedad: existían herramientas llamadas compiladores por lotes para los sistemas operativos MSDOS, estos archivos por lotes compilados en archivos ejecutables ...
rackandboneman
Por supuesto, siempre hay una representación interna. Pero a veces es un lenguaje en sí mismo, como en Gcc, Llvm o .Net. Esto se debe a la arquitectura front-end / middle / back-end, el front-end que transforma el lenguaje (C, C ++, Java, fortran ...) en un lenguaje común de nivel inferior, luego se ejecutan los algoritmos de optimización y finalmente, este código optimizado en el lenguaje común es transformado por el back-end en bytecode o ensamblador, ejecutable o biblioteca estática o dinámica.
reúne el
11

¡El significado está implícito en la cita que das! Se deriva del término de procesamiento por lotes que se usa cuando la tarea no se realiza en tiempo real, pero está programada para su posterior ejecución por el sistema operativo cuando la carga (a menudo para actividades en tiempo real) es menor.

Un compilador por lotes es aquel que realiza la compilación cuando un usuario no está esperando el resultado de la compilación. Es uno que diríamos, usando una terminología más moderna, hecha en segundo plano.

Esto es lo contrario de un JIT (Just-In-Time) que se hace "en vivo" en el momento exacto en que se necesita sin el lujo de pasar el tiempo extra para hacer el procesamiento más a fondo.

Esto puede ilustrar la velocidad más lenta de la compilación por lotes:

ingrese la descripción de la imagen aquí

Fuente: https://xkcd.com/303/

O incluso esto:

ingrese la descripción de la imagen aquí

Fuente: http://dilbert.com/strip/2013-06-22

Brian Tompsett - 汤 莱恩
fuente