El procesador de una computadora solo entiende código máquina: largas secuencias de instrucciones binarias específicas de ese procesador. Las personas no lo escriben directamente. En su lugar, escribes código fuente (source code) en un lenguaje de programación de alto nivel como Python, y un programa lo traduce a algo que la máquina puede ejecutar. El examen PCEP espera que conozcas el vocabulario de cómo ocurre esa traducción y de las reglas que impone un lenguaje.
Hay dos estrategias clásicas de traducción. La compilación traduce todo el programa por adelantado a un archivo ejecutable separado (código máquina), que luego puede ejecutarse muchas veces sin el compilador. La interpretación lee el código fuente y lo ejecuta instrucción por instrucción cada vez que el programa se ejecuta, así que siempre necesitas que el intérprete esté presente. Los programas compilados suelen ejecutarse más rápido y pueden distribuirse sin el código fuente; los programas interpretados son más fáciles de probar y de mover entre plataformas, porque el mismo código fuente se ejecuta en cualquier lugar donde exista un intérprete. Python se considera un lenguaje interpretado: ejecutas python3 script.py y el intérprete lo ejecuta. (Internamente, CPython primero convierte el código fuente en bytecode para su máquina virtual, pero para el examen, Python es interpretado.)
Todo lenguaje, humano o de computadora, tiene tres capas de reglas. El léxico (lexis) es el vocabulario: el conjunto de palabras y símbolos válidos, como palabras clave, operadores y literales. La sintaxis (syntax) es la gramática: las reglas sobre cómo se pueden combinar esas palabras en instrucciones válidas. La semántica (semantics) es el significado: si una instrucción bien formada realmente tiene sentido. Por ejemplo, print("hi" es un error de sintaxis porque falta un paréntesis, mientras que print(10 / 0) es sintácticamente correcto pero falla en tiempo de ejecución porque dividir entre cero no tiene significado.
El intérprete revisa tu código en momentos distintos. Los errores de sintaxis se detectan antes de que se ejecute cualquier línea; el intérprete informa la línea y normalmente marca la posición con un acento circunflejo (^). Los errores en tiempo de ejecución (excepciones) aparecen solo cuando realmente se llega a la línea defectuosa, así que las líneas anteriores pueden haber producido salida ya. Los errores de lógica son los más difíciles: el programa se ejecuta sin quejarse pero da una respuesta incorrecta, y ninguna herramienta te los va a señalar.
CPython es la implementación de referencia de Python, escrita en C, y es lo que obtienes de python.org. Puedes usarlo en dos modos: el modo interactivo (el REPL, o ciclo leer-evaluar-imprimir, que se reconoce por el prompt >>>), donde cada línea se evalúa de inmediato, y el modo script, donde guardas el código en un archivo .py y ejecutas el archivo completo. Los archivos fuente de Python son texto plano, así que cualquier editor sirve, aunque un editor como VS Code agrega resaltado de sintaxis y sugerencias de errores.
Términos clave
- Source code (código fuente)
- El texto del programa, legible por humanos, que escribes; en Python se guarda como un archivo .py de texto plano.
- Compiler (compilador)
- Un programa que traduce todo el código fuente a código máquina por adelantado, produciendo un ejecutable separado.
- Interpreter (intérprete)
- Un programa que lee y ejecuta el código fuente cada vez que se ejecuta, instrucción por instrucción; CPython es el intérprete de referencia de Python.
- Lexis (léxico)
- El vocabulario de un lenguaje: las palabras y símbolos válidos que reconoce.
- Syntax (sintaxis)
- Las reglas gramaticales para combinar los elementos léxicos en instrucciones válidas.
- Semantics (semántica)
- Las reglas que deciden si una instrucción bien formada tiene sentido y qué significa.
Guardas un archivo con tres llamadas a print(), pero a la tercera le falta el paréntesis de cierre. Cuando lo ejecutas, no se imprime nada: el intérprete informa un SyntaxError antes de ejecutar cualquier cosa. Corrige eso, pero haz que la segunda línea sea print(1 / 0), y ahora la primera línea se imprime y luego un ZeroDivisionError detiene el programa.
Comprueba lo que sabes
¿Cuál es la diferencia práctica clave entre compilar e interpretar?
Un compilador traduce todo el programa una sola vez a un ejecutable que funciona sin el compilador; un intérprete traduce y ejecuta el código fuente cada vez, así que el intérprete debe estar presente.
¿print("a" + 5) es un error de sintaxis o un error en tiempo de ejecución?
Un error en tiempo de ejecución (TypeError). La línea es gramaticalmente válida, pero sumar una cadena y un entero no tiene significado, así que falla solo cuando se ejecuta.
¿Cuál de léxico, sintaxis o semántica se viola al escribir prnt en lugar de print?
Ninguna al momento del análisis; prnt es un nombre válido, así que el código se analiza sin problema. Falla en tiempo de ejecución con NameError porque el nombre no está definido, lo cual es un problema semántico.