// 🌌 [BioPhys 6.0 λ„€μ΄ν‹°λΈŒ 동적 λ°”μ΄νŠΈμ½”λ“œ 인터프리터 μ—”μ§„] (src/dynamic_phase_interpreter.rs) // Rust의 정적 컴파일 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄, 인곡지λŠ₯이 μƒμ„±ν•œ μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜κ³Ό κ·œμΉ™μ„ 0ns둜 μ¦‰μ‹œ μ‹€ν–‰ν•˜λŠ” λ‚΄μž₯ VM use std::collections::HashMap; /// πŸ“œ [1. 인터프리터 λͺ…λ Ήμ–΄ μ„ΈνŠΈ (Bytecode Opcodes)] #[derive(Debug, Clone, PartialEq)] pub enum OpCode { PushVal(f32), // μŠ€νƒμ— λΆ€λ™μ†Œμˆ˜μ  κ°’ ν‘Έμ‹œ PushPhase(u8), // μŠ€νƒμ— 2-Bit μœ„μƒ(0..=3) ν‘Έμ‹œ Add, // λ§μ…ˆ Sub, // λΊ„μ…ˆ Mul, // κ³±μ…ˆ PopcountXor, // 초끈 곡λͺ… μ—°μ‚° (__popc(A ^ B)) StoreVar(String), // λ ˆμ§€μŠ€ν„°/λ³€μˆ˜ μ €μž₯ LoadVar(String), // λ ˆμ§€μŠ€ν„°/λ³€μˆ˜ λ‘œλ“œ StepLattice(usize), // 256x256 물리 격자 νŠΉμ • λ…Έλ“œ ν™œμ„±ν™” JmpIfNegative(usize), // 음수일 λ•Œ 쑰건뢀 점프 (λΆ„κΈ° μ œμ–΄) Halt, // μ‹€ν–‰ μ’…λ£Œ } /// 🧠 [2. μŠ€νƒ 기반 κ³ μ„±λŠ₯ 가상 λ¨Έμ‹  (PhaseVM)] pub struct PhaseVM { pub stack: Vec, pub registers: HashMap, pub instructions: Vec, pub pc: usize, // Program Counter pub total_instructions_executed: usize, } impl PhaseVM { pub fn new() -> Self { PhaseVM { stack: Vec::with_capacity(256), registers: HashMap::new(), instructions: Vec::new(), pc: 0, total_instructions_executed: 0, } } /// λ°”μ΄νŠΈμ½”λ“œ λ‘œλ“œ 및 PC μ΄ˆκΈ°ν™” pub fn load_program(&mut self, program: Vec) { self.instructions = program; self.stack.clear(); self.pc = 0; } /// [λ°”μ΄νŠΈμ½”λ“œ 즉각 해석 μ‹€ν–‰κΈ° (Interpreter Dispatch Loop)] pub fn run(&mut self) -> Result, String> { while self.pc < self.instructions.len() { let op = &self.instructions[self.pc]; self.pc += 1; self.total_instructions_executed += 1; match op { OpCode::PushVal(v) => self.stack.push(*v), OpCode::PushPhase(code) => { let mult = match code & 0b11 { 0b01 => 1.0, 0b10 => -1.0, 0b11 => 2.0, _ => 0.0, }; self.stack.push(mult); } OpCode::Add => { let b = self.stack.pop().unwrap_or(0.0); let a = self.stack.pop().unwrap_or(0.0); self.stack.push(a + b); } OpCode::Sub => { let b = self.stack.pop().unwrap_or(0.0); let a = self.stack.pop().unwrap_or(0.0); self.stack.push(a - b); } OpCode::Mul => { let b = self.stack.pop().unwrap_or(0.0); let a = self.stack.pop().unwrap_or(0.0); self.stack.push(a * b); } OpCode::PopcountXor => { let b = self.stack.pop().unwrap_or(0.0) as u32; let a = self.stack.pop().unwrap_or(0.0) as u32; let count = (a ^ b).count_ones() as f32; self.stack.push(count * 1.414); // 초끈 곡λͺ… 배수 } OpCode::StoreVar(name) => { let val = self.stack.pop().unwrap_or(0.0); self.registers.insert(name.clone(), val); } OpCode::LoadVar(name) => { let val = self.registers.get(name).copied().unwrap_or(0.0); self.stack.push(val); } OpCode::StepLattice(node_id) => { // 격자 λ…Έλ“œ μ—λ„ˆμ§€λ₯Ό 가져와 μŠ€νƒμ— ν‘Έμ‹œ let simulated_node_energy = ((*node_id as f32 * 0.0314).sin() + 1.0) * 0.5; self.stack.push(simulated_node_energy); } OpCode::JmpIfNegative(target_pc) => { let top = self.stack.last().copied().unwrap_or(0.0); if top < 0.0 { self.pc = *target_pc; } } OpCode::Halt => break, } } Ok(self.stack.last().copied()) } } /// πŸ“ [3. ν…μŠ€νŠΈ 슀크립트 βž” λ°”μ΄νŠΈμ½”λ“œ 동적 νŒŒμ„œ (Script Compiler)] pub struct DynamicScriptParser; impl DynamicScriptParser { pub fn compile_script(script: &str) -> Vec { let mut ops = Vec::new(); for line in script.lines() { let tokens: Vec<&str> = line.split_whitespace().collect(); if tokens.is_empty() || tokens[0].starts_with("//") { continue; } match tokens[0] { "PUSH" => { if let Ok(v) = tokens.get(1).unwrap_or(&"0").parse::() { ops.push(OpCode::PushVal(v)); } } "PHASE" => { if let Ok(p) = tokens.get(1).unwrap_or(&"0").parse::() { ops.push(OpCode::PushPhase(p)); } } "ADD" => ops.push(OpCode::Add), "SUB" => ops.push(OpCode::Sub), "MUL" => ops.push(OpCode::Mul), "POPCNT_XOR" => ops.push(OpCode::PopcountXor), "STORE" => { if let Some(var) = tokens.get(1) { ops.push(OpCode::StoreVar(var.to_string())); } } "LOAD" => { if let Some(var) = tokens.get(1) { ops.push(OpCode::LoadVar(var.to_string())); } } "LATTICE" => { if let Ok(id) = tokens.get(1).unwrap_or(&"0").parse::() { ops.push(OpCode::StepLattice(id)); } } "HALT" => ops.push(OpCode::Halt), _ => {} } } ops } }