Full stack dev
Этап Code Generation - самый интересный этап, давайте освежим в памяти весь pipline: 0. Source code 1. Lexer 2. Parser 3. AST 4. Semantic Analysis 5. IR 6. Optimization 7. Code Generation * Есть несколько вариантов генерации: - Assembly (x86-64) - Bytecode…
Реализация в коде:
Интепритатор(core.intepritator.py):
self.variables: Dict = {} и
self.temps: Dict = {} выглядят примерно так:
Точка входа:
main.py
Тест:
IR Optimize:
Результат:
Интепритатор(core.intepritator.py):
from typing import Dict
class IRInterpreter:
def __init__(self):
self.variables: Dict = {}
self.temps: Dict = {}
def get_value(self, name):
if isinstance(name, (int, float)):
return name
if name in self.temps:
return self.temps[name]
if name in self.variables:
return self.variables[name]
raise Exception(f"Unknown value {name}")
def execute(self, instructions):
for instr in instructions:
op = instr.op
if op == "LOAD_CONST":
self.temps[instr.result] = instr.arg1
elif op == "ADD":
self.temps[instr.result] = self.get_value(instr.arg1) + self.get_value(
instr.arg2
)
elif op == "SUB":
self.temps[instr.result] = self.get_value(instr.arg1) - self.get_value(
instr.arg2
)
elif op == "MUL":
self.temps[instr.result] = self.get_value(instr.arg1) * self.get_value(
instr.arg2
)
elif op == "DIV":
self.temps[instr.result] = self.get_value(instr.arg1) / self.get_value(
instr.arg2
)
elif op == "STORE":
self.variables[instr.result] = self.get_value(instr.arg1)
else:
raise Exception(f"Unknown op {op}")
return self.variables
self.variables: Dict = {} и
self.temps: Dict = {} выглядят примерно так:
variables = {
"a": 12
}
temps = {
"t1": 10,
"t2": 12
}Точка входа:
main.py
from core.interpreter import IRInterpreter
from core.ir import IRBuilder
from core.lexer import Lexer
from core.optimizations.pipline import Optimizer
from core.parser import Parser
from core.semantic import SemanticAnalyzer
def main():
code = """
int b = 3;
int a = 10 + b;
int c = a * 2;
"""
lexer = Lexer(code)
tokens = lexer.tokenize()
for token in tokens:
print(token)
parser = Parser(tokens)
ast = parser.parse()
print(ast)
semantic = SemanticAnalyzer()
semantic.analyze(ast)
print("Semantic analysis passed")
print("Symbol table:", semantic.symbol_table)
ir_builder = IRBuilder()
ir = ir_builder.build(ast)
print("IR:")
for instr in ir:
print(instr)
optimizer = Optimizer()
ir = optimizer.optimize(ir)
print("Optimized IR:")
for instr in ir:
print(instr)
print("Generate code")
interpreter = IRInterpreter()
result = interpreter.execute(ir)
print("Program result:")
print(result)
if __name__ == "__main__":
main()
Тест:
source code
int b = 3;
int a = 10 + b;
int c = a * 2;
IR Optimize:
IRInstruction(op='STORE', arg1=3, arg2=None, result='b')
IRInstruction(op='ADD', arg1=10, arg2='b', result='t3')
IRInstruction(op='STORE', arg1='t3', arg2=None, result='a')
IRInstruction(op='MUL', arg1='a', arg2=2, result='t5')
IRInstruction(op='STORE', arg1='t5', arg2=None, result='c')
Результат:
...
Generate code
Program result:
{'b': 3, 'a': 13, 'c': 26}
🔥2❤1
Full stack dev
Работа языко программирования №1 Многие из вас, сейчас читающих данный пост, умеют писать код на разных языках. Но немногие понимают и знают работу этих языков, то, как они реализованы, и то, что происходит, когда вы запускаете свой код. Данный пост открывает…
Конец ? Да, но только для этого канала. Данный ряд постов, была тестовая для этого канала, и подобного кантетна тут больше не будет, подобное перемещается на другой канал https://t.me/freyzanIT. Тут же возвращается контет связанный именно по full stack разработке.
👍2
Весь контент переходит сюда: https://t.me/morilogos
Telegram
morilogos
youtube: https://www.youtube.com/channel/UCzl6mFsCUU1i33QJUAIVQ-Q
❤2