CS 6120: curso en línea autodirigido avanzado de compiladores
(cs.cornell.edu)- CS 6120, un curso de nivel doctoral de Cornell CS, se ofrece como un currículo autodirigido en línea que reúne videos de clases, apuntes, lectura de papers y tareas de implementación
- Cubre desde temas centrales de compiladores como representación intermedia, flujo de datos y optimización clásica, hasta paralelización, compilación JIT y recolección de basura
- Las prácticas usan LLVM y el IR educativo Bril, y continúan con tareas de hacking open source para implementar directamente conceptos abstractos
- La versión autodirigida permite ignorar las fechas límite, pero no participar en las discusiones de Zulip ni en el proyecto final del curso real
- Los materiales están publicados como open source en GitHub, por lo que se pueden reportar problemas, y al terminar se puede completar un formulario de retroalimentación
Cómo se toma el curso y qué cubre
- CS 6120 es un curso sobre implementación de lenguajes de programación creado por Adrian Sampson de Cornell CS
- El alcance del curso incluye tanto bases comunes de la implementación de compiladores como temas orientados a investigación
- representación intermedia
- flujo de datos
- optimización “clásica”
- paralelización
- compilación JIT
- recolección de basura
- El aprendizaje se desarrolla mediante lectura de papers y tareas de hacking open source
- El currículo autodirigido está organizado como una materia sin calificación de 4 créditos en una “universidad imaginaria”
- Las clases están ordenadas de forma lineal
- Cada lección incluye video y notas escritas
- Algunas lecciones incluyen tareas de implementación
- Hay un orden recomendado que mezcla ver videos y leer papers
En qué se diferencia de la clase real
- Quienes lo tomen de forma autodirigida pueden ignorar las fechas límite de las tareas
- No pueden participar en las discusiones de Zulip del curso real
- El CS 6120 real incluye un proyecto final semestral
- En la versión autodirigida, la tarea final del semestre es “cambiar el mundo con la magia de los compiladores”
- La calidad de producción de las clases puede ser baja, especialmente en las primeras lecciones
- Los materiales de CS 6120 están publicados como open source en GitHub, y si encuentras un problema puedes reportar un bug
- Al terminar, puedes completar este formulario de retroalimentación
Lecciones y materiales de lectura
- Lesson 1: Welcome & Overview
- Lesson 2: Representing Programs
- Lesson 3: Local Analysis & Optimization
- Lesson 4: Data Flow
- Lesson 5: Global Analysis
- Lesson 6: Static Single Assignment
- Lesson 7: LLVM
- Lesson 8: Loop Optimization
- Lesson 9: Interprocedural Analysis
- Lesson 10: Alias Analysis
- video
- A Unified Theory of Garbage Collection, OOPSLA 2004
- Fast Conservative Garbage Collection, OOPSLA 2014
- Lesson 11: Memory Management
- Lesson 12: Dynamic Compilers
- Lesson 13: Program Synthesis
- Lesson 14: Concurrency & Parallelism
1 comentarios
Comentarios de Hacker News
Al terminar la licenciatura y buscar mi primer empleo de tiempo completo, este curso me ayudó a pasar las entrevistas para equipos de ingeniería de compiladores en MANGA (Meta, Apple, NVIDIA, Google, Amazon)
El plan de estudios de sistemas de computación de bajo nivel de la University of Waterloo también era excelente y yo también contribuía a proyectos de compiladores de código abierto, pero este curso me ayudó muchísimo a responder las preguntas más difíciles de las entrevistas
Para que sonara más natural, algo como “my university has the low level computing systems curriculum par excellence” habría estado mejor
Antes de escribir un compilador, creo que primero hay que entender arquitectura de computadoras y saber qué debe generar un compilador para producir el código máquina más eficiente
Pero, por experiencia, las escuelas y universidades parecen estar relegando cada vez más la arquitectura de computadoras, e incluso la programación de sistemas, quizá porque la consideran demasiado técnica
Aun así, ese conocimiento es muy importante para conseguir buenos empleos en la industria
El problema de fondo que he visto al trabajar con universidades es que hay demasiado contenido potencial para cubrir en un tiempo limitado de clase
La cantidad de información que hay que conocer en nuestro campo crece de forma exponencial con el tiempo y ya superó el límite, así que que se reduzca el tiempo dedicado a programación de sistemas en el trayecto general es razonable, porque cada año es menos relevante para más estudiantes
Todavía hay mucho por hacer a nivel de compilador, pero una buena parte de eso no debería requerir preocuparse hasta el nivel de la microarquitectura de la computadora
Aunque no haga falta estudiar x86 o MIPS, CUDA muestra una arquitectura todavía más extraña que esas
La razón habitual para no enfatizar lo de bajo nivel es que depende de la implementación, envejece rápido y es difícil de generalizar
Además, no suele encajar bien con el tipo de “programador de sistemas”, porque tienden a convertir este tipo de conocimientos extremadamente específicos en toda su identidad profesional, así que termina habiendo gente que puede escribir ensamblador pero no sabe qué es un funtor
Parece que no hay buenos materiales académicos que profundicen en la optimización avanzada de compiladores
Busqué bastante, pero la mayoría de los cursos son introductorios, y me sorprendió bastante que para llegar a técnicas realmente interesantes haya que meterse a fondo en el código fuente de compiladores populares de código abierto
Creo que los compiladores son una de esas áreas que no avanzaron mucho en unos 30 años
Cuando di clases en la Perugia University entre 2004 y 2006, podía usar sin mayor problema materiales de 15 a 25 años de antigüedad
Últimamente parece que la situación cambió
Solo entre las cosas que se podían haber enseñado como contenido nuevo en 2004–2006, pero que probablemente no se cubrieron, están la construcción de SSA, la vectorización SLP y la superoptimización peephole automática; y esas son solo las que se me ocurren al momento
Lo que no cambió son los libros de texto de compiladores. Se concentran demasiado en cómo construir generadores de parsers y casi no cubren cómo diseñar realmente un compilador, por no hablar del diseño moderno de arquitectura de computadoras. Esta queja existe desde hace décadas
En los últimos 10 años, el panorama evolucionó mucho hacia técnicas de compilación incremental
Los avances teóricos se concentran sobre todo en los parsers, pero las implementaciones reales se aplican a todo el pipeline, hasta la optimización global de programas y la generación de código
Con cada nueva generación de procesadores aparecen más instrucciones y opciones, lo que parece crear nuevas optimizaciones o combinaciones que el compilador puede aprovechar
Para escribir un compilador para lenguajes puramente funcionales, definitivamente se necesitarían materiales nuevos
Me alegra que exista un curso así
Ahora puedo seguir temas avanzados a mi propio ritmo y con guía
Siempre quise una carrera como ingeniero de compiladores, pero donde vivo no hay muchas oportunidades de educación ni de empleo
Al ver Estados Unidos, el mercado de contratación parece abrumadoramente competitivo y, francamente, no sé cómo entrar
La experiencia que tengo es solo un curso que tomé en la licenciatura, aunque ese curso fue realmente excelente en todo
Creo que se debe a que hay que escribir código que manipula otro código, y normalmente la semántica y los objetivos de comportamiento son bastante distintos. Además hay mucho conocimiento oral y ruido
Por eso los equipos de compiladores prefieren especialmente a gente que ya lleva mucho tiempo construyendo compiladores. Pero, por supuesto, existe el problema de bootstrap, así que los equipos grandes también contratan egresados que parecen capaces de superar esa curva, y yo entré más o menos así
Si tienes experiencia profesional general pero no experiencia en compiladores, una estrategia clara es entrar a una empresa que haga algo que ya conoces y que también tenga un equipo de compiladores, más o menos una “empresa de software bastante grande”, y buscar una movilidad horizontal
Me gusta que también incluya “A Unified Theory of Garbage Collection”
Al menos estos estudiantes terminarán entendiendo correctamente la diferencia entre conteo de referencias y garbage collection por tracing
Si “CS 6120 es un curso de nivel doctorado de Cornell CS sobre implementación de lenguajes de programación, de Adrian Sampson”, ¿entonces es un curso bastante avanzado?
No creo estar a nivel doctorado en ciencias de la computación
Simplemente inténtalo; si puedes hacerlo, estás listo, y si no, todavía no
Solo pruébalo
Todavía parece, en general, bastante parecido al contenido que Gerhard Goos cubría hace 20 años en su curso general de construcción de compiladores
También hay enlaces a papers más recientes, así que quizá valga la pena echarles un vistazo
Me gustaba el libro Advanced Compiler Design and Implementation de Steven Muchnick
Hace 18 años que no veo código fuente de compiladores, así que siento que me quedé atrás, especialmente en profiling y optimizaciones basadas en rutas, y al ver el machine learning actual, imagino que también habrá mucho más contenido avanzado relacionado con SIMD
Hace algunos años seguí este curso en línea durante el verano y aprendí muchísimo
Abrir un PR para un pequeño issue de Bril IR y corregirlo junto con el profesor fue una experiencia muy inmersiva
Me pregunto si este curso tiene algún curso previo
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/