Declaración y Gestión de Variables en Lenguajes de Programación
Clase 49 de 58 • Curso de Creación de Lenguajes de Programación: Intérpretes
Contenido del curso
- 3

Análisis Léxico: Construcción de un Léxer para Intérpretes
05:36 - 4

Definición de Tokens en Lenguaje de Programación Platzi
11:53 - 5

Desarrollo de un Lexer con Test-Driven Development
15:43 - 6

Pruebas de Operadores, Delimitadores y Fin de Archivo en Lexer Python
10:01 - 7

Lexer: Identificación de Keywords y Tokens Complejos
18:57 - 8

Reconocimiento de Funciones en Lexer de Lenguaje de Programación
07:46 - 9

Implementación de Operadores y Condicionales en Lexer de Platzi
12:38 - 10

Implementación de Operadores de Dos Caracteres en Lexer
12:08 - 11

Creación de un REPL en Python para Lenguaje de Programación
12:35
- 12

Construcción de un Parser para el Lenguaje Platzi
05:22 - 13

Definición de Nodos Abstractos para Árbol de Sintaxis (AST) en Python
09:14 - 14

Desarrollo de un AST en Python: Creación de la Clase Programa
12:49 - 15

Parseo de Let Statements en Lenguaje Platzi
20:21 - 16

Implementación de funciones advanced y expected tokens
08:26 - 17

Manejo de Errores en Parsers con Test Driven Development
11:06 - 18

Parseo de Return Statements en Lenguaje Platzi
12:42 - 19
Técnicas de Parsing: Top-Down y Bottom-Up
01:46 - 20

Pruebas de AST para Let y Return Statements en Parsers
12:06 - 21

Pratt Parsing: Implementación y Registro de Funciones en Python
11:47 - 22

Parseo de Identificadores en Lenguajes de Programación
13:29 - 23

Parseo de Expression Statements en Platzi Parser
16:34 - 24

Parseo de Enteros en Lenguaje Platzi
14:03 - 25

Implementación de Operadores Prefijo en Parsers
16:43 - 26

Operadores InFix en Expresiones: Implementación y Pruebas
10:40 - 27

Implementación de Operadores InFix en un Parser
20:20 - 28

Expresiones Booleanas en el Lenguaje de Programación Platzi
13:00 - 29

Evaluación de Precedencia y Testeo de Booleanos en Parsers
08:39 - 30

Evaluación de Expresiones Agrupadas en un Parser
10:16 - 31

Parseo de Condicionales en Lenguaje Platzi
13:50 - 32

Implementación de Condicionales en Parser de Lenguaje
12:05 - 33

Parsing de Funciones en Lenguaje Platzi: Creación de Nodos AST
15:51 - 34

Construcción de nodos de función en un parser AST
15:43 - 35

Llamadas a Funciones en Lenguajes de Programación
13:05 - 36

Implementación de llamadas a funciones en un parser con AST
12:21 - 37

Parseo de Expresiones en LET y RETURN Statements
07:58 - 38

Implementación de REPL para Árbol de Sintaxis Abstracta
08:59
- 39

Evaluación Semántica en Lenguajes de Programación
03:42 - 40

Estrategias de Evaluación en Lenguajes de Programación
09:18 - 41

Representación de Nodos AST y Objetos en Python
14:17 - 42

Evaluación de Expresiones en JavaScript y Python
19:39 - 43

Implementación del Patrón Singleton para Booleanos y Nulos
11:52 - 44

Evaluación de Prefijos en Lenguaje de Programación Platzi
14:41 - 45

Evaluación de Expresiones Infix en Lenguaje Platzi
18:07 - 46

Evaluación de Condicionales en Lenguaje de Programación Platzi
13:50 - 47

Evaluación y Uso del Return Statement en Programación
14:42 - 48

Manejo de Errores Semánticos en Lenguaje Platzi
21:05 - 49

Declaración y Gestión de Variables en Lenguajes de Programación
13:55 - 50

Manejo de Ambientes y Variables en Lenguajes de Programación
11:57 - 51

Declaración de Funciones en Lenguaje de Programación Platzi
12:26 - 52

Implementación de Llamadas a Funciones en PlatziLang
23:55
¿Cómo se implementa un ambiente en un lenguaje de programación?
Estás a punto de embarcarte en un viaje de implementación de ambientes en lenguajes de programación, un aspecto crucial si deseas que tu lenguaje evolucione de las simples evaluaciones de expresiones a un sistema más versátil y robusto. Un ambiente es, esencialmente, una estructura de datos que guarda el estado del programa, permitiéndote declarar variables y almacenar sus valores para ser referenciados posteriormente.
¿Cuál es la estructura básica del ambiente?
Primero, es importante entender que un ambiente en lenguajes de programación se asemeja a un diccionario. Esto se debe a que está compuesto por una serie de llaves y valores, lo que permite una asignación y recuperación eficiente de datos. En este contexto, se extiende de la estructura diccionario en Python y se usa un enfoque de programación orientada a objetos para su implementación.
¿Cómo se implementa la clase Environment?
Veamos cómo se hace esto en un lenguaje como Python:
from typing import Dict
class Environment(dict):
def __init__(self):
self.store = dict() # Diccionario interno
def __getitem__(self, key):
return self.store[key]
def __setitem__(self, key, value):
self.store[key] = value
def __delitem__(self, key):
del self.store[key]
__init__: Inicializa una estructurastorecomo un diccionario.__getitem__: Permite recuperar un valor usando una llave.__setitem__: Asigna un valor a una llave específica.__delitem__: Elimina un valor específico del diccionario.
¿Cómo se modifican las evaluaciones para incluir el ambiente?
Para integrar este nuevo concepto en un lenguaje, se debe modificar la función evaluate para que ahora acepte un ambiente. Esto implica ajustar todas las llamadas a evaluate a lo largo del código para que reciban este nuevo parámetro.
def evaluate(node, environment):
if isinstance(node, Program):
return evaluate_program(node, environment)
# Otras evaluaciones...
Y así para cada función que dependa de evaluate.
¿Qué implicaciones tiene este cambio en las pruebas?
Implementar un ambiente significa también modificar las pruebas para comprobar que este se comporta como es esperado:
- Pruebas de Declaración de Variables: Debes verificar que al declarar una variable, su valor se puede obtener correctamente del ambiente.
- Pruebas de Reasignación: Al reasignar una variable, el nuevo valor debe reflejarse al recuperar la variable.
- Pruebas de Expresiones Asignadas a Variables: Las expresiones que asignas deben ser evaluadas correctamente y reflejarse en la variable.
¿Por qué usar métodos mágicos (Dunder Methods) en Python?
Los métodos mágicos en Python, como __getitem__ y __setitem__, permiten personalizar el comportamiento de operadores y acceso a elementos de maneras que respetan la sintaxis del lenguaje, lo cual mejora la legibilidad y mantenibilidad del código. Aunque podríamos haber implementado esto con funciones de obtención y establecimiento, utilizar los métodos mágicos nos mantiene en línea con las buenas prácticas de Python.
¿Cómo puedes aplicar estos conocimientos en otros lenguajes?
Este principio de utilizar un ambiente no es exclusivo de Python. Las ideas fundamentales pueden ser aplicadas a otros lenguajes como JavaScript usando objetos o Java usando HashMaps para representar este tipo de estructuras. Te animo a que explores cómo otros lenguajes implementan sus ambientes y compartas tus descubrimientos.
Recuerda que, aunque esta implementación específica es en Python, los conceptos de diseño de un ambiente son universales en el mundo de la programación. Siguiendo este camino, convertirás tu lenguaje de un simple intérprete a un intérprete poderoso capaz de manejar variables y mantener el estado del programa. Sigue aprendiendo y investigando más sobre este emocionante tema. ¡Buena suerte!