Como desarrollador de software, ¿por qué debería aprender sobre compiladores? ¿Es aplicable en el trabajo en, por ejemplo, una tienda de aplicaciones móviles o inicio de Internet?

Repetiré textualmente lo que mi profesor, amigo y mentor de compiladores me dijo una vez: Los compiladores es LA clase para aprender realmente bien a comprender y vincular profundamente los conceptos de informática.

Tiene muchos conocimientos básicos que no se enseñan ni se aprenden desde el principio, ya que primero debes conocer muchas otras cosas.

Puedes sobrevivir como un buen desarrollador toda tu vida sin tener que escribir un compilador. La mayoría del mundo realmente no sabe lo increíble que es simplemente presionar F5 y obtener un programa de trabajo. Escribir un compilador, o al menos aprender a hacerlo, le mostrará cuántas cosas funcionan en una computadora.

Déjame dar un ejemplo:

Orden de operadores y cómo la computadora realiza la aritmética.
Puede memorizar el orden de las operaciones, / y * vienen antes de + o -.
Si intenta usar 1/0 + 2, dará como resultado un error de división por cero a menos que agregue una parentesis y haga 1 / (0 + 2).

Ahora, esto se puede saber memorizándolo literalmente de la tabla de precedencia de operadores en un libro, pero por qué fue elegido y por qué funciona puede parecer mágico.

Al escribir un compilador e intentar analizar una cadena escrita humana en algo que la máquina puede resolver, aprenderá que se puede hacer convirtiéndola en un árbol de sintaxis abstracta a través de un algoritmo como el algoritmo de desviación de Dijkstra . La razón de la precedencia del operador es porque los operadores están desglosados ​​en un árbol.

Entonces aprenderá cómo y por qué funciona la precedencia del operador, resolverá un problema complejo que lo convierte en un mejor desarrollador y se dará cuenta humildemente de que Dijkstra derrotaría a Chuck Norris cualquier día.

Hay muchos detalles como este: sintaxis de idioma, administración de memoria, cómo funcionan los ejecutables, velocidad de ejecución, optimizaciones, por qué necesita escribir un punto y coma al final de las líneas en muchos idiomas, etc.

Le facilitará la vida a largo plazo y lo ayudará a ver con mayor claridad cómo funcionan las computadoras. Incluso si no trabaja en compiladores, hace que muchos conceptos dejen de ser confusos o confusos.

[EDITAR (16 de febrero de 2012): aunque disfruté escribiendo esta respuesta y contiene información útil, ahora considero que es una respuesta bastante torpe a la pregunta original.]

Respuesta corta: si sus objetivos principales son programar aplicaciones móviles o hacer diseño web, probablemente haya mejores maneras de usar su tiempo.

PERO

Resulta que los compiladores son uno de los temas de informática que me parecen más interesantes y aprender sobre ellos puede ser … esclarecedor. Estoy bastante seguro de que alguien que pueda escribir un compilador estaría sobrecalificado para hacer la mayoría de la programación habitual.

Voy a seguir algunos de los pasos principales que un compilador simple podría llevar a cabo sin explicar realmente nada. Enumeraré las habilidades que alguien tendría que aprender mínimamente para comprender cualquiera de estos pasos.

Considere este fragmento de código C.

  int main ()
 {
     int x, suma;
     x = 4;
     suma = x * x + x * x;
     suma de retorno;
 }

Primero, un compilador probablemente tomaría esa cadena cruda y crearía una lista que es un poco más fácil de manejar.

[ tipo (int)
, id (principal)
l_paren
r_paren
, l_squiggle
, tipo (int)
, id (x)
coma
, etc …]

Necesitas:

  • Habilidades básicas de programación
  • Conocimiento de expresiones regulares.

A continuación, un compilador generalmente creará algún tipo de representación intermedia. Esto podría ser un árbol de sintaxis abstracta y una tabla de símbolos.


Es posible que el árbol nunca se construya explícitamente, pero eso realmente no importa. Necesitarías:

  • Conocimiento de algún tipo de análisis
  • Una buena comprensión de la recursividad.
  • Conocimientos básicos de estructuras de datos (específicamente árboles, recorridos de árboles y tablas)

Además del árbol o en lugar del árbol, podría haber algún lenguaje intermedio de comandos de máquina virtual.

  llamada principal

 función principal 2 // 2 variables locales
 empuje constante 4
 pop local 0
 empujar local 0
 empujar local 0
 mult
 empujar local 0
 empujar local 0
 mult
 añadir
 pop local 1
 empujar local 1
 regreso

Una vez más, aunque es posible que nunca haga explícitamente esta lista de comandos, necesitará saber sobre:

  • pilas
  • cómo se utilizan las pilas para controlar el flujo de un programa
  • ¿Cómo puedo usar las pilas para mover datos?
  • pila aritmética
  • punteros

A partir de ahí, un compilador podría generar código máquina directamente, pero podría generar ensamblado. Hubiera escrito un ensamblaje más simple, pero me estoy quedando sin vapor, así que esto es lo que gcc compiló el código C original.

  .archivo "test.c"
      .texto
  .globl principal
      .type main, @function
  principal:
  .LFB0:
      .cfi_startproc
      pushq% rbp
      .cfi_def_cfa_offset 16
      movq% rsp,% rbp
      .cfi_offset 6, -16
      .cfi_def_cfa_register 6
      movl $ 4, -4 (% rbp)
      movl -4 (% rbp),% eax
      addl% eax,% eax
      imull -4 (% rbp),% eax
      movl% eax, -8 (% rbp)
      movl -4 (% rbp),% eax
      salir
      jubilado
      .cfi_endproc
  .LFE0:
      .size main,.-main
      .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
      .section .note.GNU-stack, "", @ progbits

De todos modos, necesitaría saber sobre:

  • El conjunto de instrucciones del procesador de su computadora
  • Probablemente el propio procesador (registros, predicción de ramificaciones, captación previa, cachés)
  • De las últimas tres líneas del ensamblaje anterior, supongo que probablemente también necesite saber un poco sobre el sistema operativo que está ejecutando.

Esta es una TONELADA de conocimiento útil para un desarrollador de software y omití por completo una de las funciones más importantes de un compilador moderno (optimización) porque en realidad nunca he escrito una y no sé lo suficiente para escribir algo remotamente inteligente. Nuevamente, si su objetivo es crear aplicaciones para iOS, es probable que le sirva mejor un tutorial del Objetivo C y mucha motivación.