Una buena prueba para la eficiencia de traducción de un compilador es la autocompilación: ¿cuánto tiempo tarda un compilador determinado en compilarse? Para C ++ lleva mucho tiempo (¿horas?). En comparación, un compilador Pascal / Modula-2 / Oberon se compilaría en menos de un segundo en una máquina moderna [1].
Go se ha inspirado en estos idiomas, pero algunas de las razones principales de esta eficiencia incluyen:
Una sintaxis claramente definida que es matemáticamente sólida, para un escaneo y análisis eficiente.
Un lenguaje compilado de forma segura y estático que utiliza compilación separada con dependencia y verificación de tipo a través de los límites del módulo, para evitar la relectura innecesaria de los archivos de encabezado y la compilación de otros módulos, en lugar de la compilación independiente como en C / C ++ donde el compilador no realiza tales comprobaciones de módulo cruzado (de ahí la necesidad de volver a leer todos esos archivos de encabezado una y otra vez, incluso para un simple programa "hello world" de una línea).
Una implementación eficiente del compilador (p. Ej., Análisis de arriba a abajo recursivo de un solo paso), que por supuesto es de gran ayuda en los puntos 1 y 2 anteriores.
Estos principios ya se conocían y se implementaron por completo en los años setenta y ochenta en idiomas como Mesa, Ada, Modula-2 / Oberon y varios otros, y solo ahora (en los años 2010) están llegando a idiomas modernos como Go (Google) , Swift (Apple), C # (Microsoft) y varios otros.
Esperemos que esto sea pronto la norma y no la excepción. Para llegar allí, deben suceder dos cosas:
Primero, los proveedores de plataformas de software como Google, Microsoft y Apple deberían comenzar alentando a los desarrolladores de aplicaciones a usar la nueva metodología de compilación, mientras les permiten reutilizar su base de código existente. Esto es lo que Apple ahora está tratando de hacer con el lenguaje de programación Swift, que puede coexistir con Objective-C (ya que usa el mismo entorno de tiempo de ejecución).
En segundo lugar, las plataformas de software subyacentes deberían reescribirse eventualmente con el tiempo utilizando estos principios, mientras se rediseña simultáneamente la jerarquía de módulos en el proceso para hacerlos menos monolíticos. Por supuesto, esta es una tarea gigantesca y bien puede llevar la mayor parte de una década (si son lo suficientemente valientes como para hacerlo realmente, lo cual no estoy del todo seguro en el caso de Google).
En cualquier caso, es la plataforma la que impulsa la adopción del lenguaje, y no al revés.
Referencias
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , página 6: "El compilador se compila en unos 3 segundos". Esta cita es para una placa de desarrollo Xilinx Spartan-3 FPGA de bajo costo que funciona a una frecuencia de reloj de 25 MHz y presenta 1 MByte de memoria principal. A partir de este, se puede extrapolar fácilmente a "menos de 1 segundo" para un procesador moderno que funcione a una frecuencia de reloj muy superior a 1 GHz y varios GBytes de memoria principal (es decir, varios órdenes de magnitud más potentes que la placa FPGA Xilinx Spartan-3), incluso cuando se tienen en cuenta las velocidades de E / S. Ya en 1990, cuando Oberon se ejecutaba en un procesador NS32X32 de 25MHz con 2-4 MB de memoria principal, el compilador se compiló en solo unos segundos. La noción de esperar realmentepara el programador terminar un ciclo de compilación era completamente desconocido para los programadores de Oberon incluso en aquel entonces. Para los programas típicos, siempre lleva más tiempo quitar el dedo del botón del mouse que activó el comando de compilación que esperar a que el compilador complete la compilación que acaba de activarse. Fue realmente una gratificación instantánea, con tiempos de espera cercanos a cero. Y la calidad del código producido, aunque no siempre estuvo completamente a la par con los mejores compiladores disponibles en ese momento, fue notablemente buena para la mayoría de las tareas y bastante aceptable en general.