gpt4 book ai didi

rust - 就我的 PDP 模拟器的数据结构建模寻求建议

转载 作者:行者123 更新时间:2023-12-03 11:37:06 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

1年前关闭。




Improve this question




(请不要作为一个主观问题来结束 - 我在“发现使用rust 成语”的轨道上征求其他旅行者的建议)
我正在将我的 PDP11 模拟器从 c++ 移植到 rust。我正在尝试获得正确的数据结构。
从逻辑上讲,PDP11 系统由 CPU、总线(拥有所有 IO 设备)和一些 RAM 组成。每个组件都需要相互通信。所以我从这个开始

pub struct System {
ram: Memory,
cpu: Cpu,
bus: Bus,
}
让我们看一个功能
impl Cpu{
pub fn step(&self) -> (){
let inst = ram.get_word(self.pc);
// decode inst
// execute it
}
}
一小步。模拟器的核心。它需要访问 ram(和总线,但此处未显示)。当然,这是不完整的,也没有办法到达 ram
我的第一个努力是如何连接这些“子”结构以使指针返回到这个系统对象。不行,他们需要在两个方向都保持沉默,困惑随之而来。
然后我想,既然每个东西只有一个,我只是把整个东西扁平化成一个对象,所有的方法和数据都存在于系统对象上。但这并不干净,这些是逻辑上不同的子系统,我真的想将它们建模为单独的实体。
然后我有一个启示。使用rust 要我做什么?传入函数调用它需要的数据。像这样
impl System{  
pub fn step(&mut self){
self.cpu.step(&mut self)
}
}
impl Cpu{
pub fn step(&self, &mut sys:System) -> (){
let inst = sys.ram.get_word(self.pc);
// decode inst
// execute it
}
}
(有一个 UI 通过 FFI 调用堆栈更高的这些系统方法)。现在我知道这不起作用并且已经阅读了它为什么起作用。
我已经被困了一个星期,试图找出安排这些结构的最佳方式。请问有什么建议吗?

最佳答案

My first effort was then to some how wire up these 'child' structs to have pointers back to this system object


这在 C++(或任何语言,真的)中也是一个坏主意。循环不好!

Pass into the function calls the data it needs.


是的,这是一个可以在许多项目中看到的解决方案,但要考虑到您也在创建一个循环。在这种情况下,循环是暂时的而不是永久的,但它仍然是一个循环。
相反,您可以做的是只传递第一个子系统需要的子系统。这消除了循环。甚至只是您可能需要的子系统的一部分。

Then I thought that since there is only one of each thing I just flatten the whole thing into one object, all the methods and data exist on the system object. But thats just not clean, these are logically distinct subsystems that I really want to model as separate entities .


也许吧,但要考虑到在许多情况下,现实生活中的实体并不是系统建模时的最佳划分点。
当您的子系统依赖于许多其他子系统甚至整个系统时,可能会产生循环,那么这可能是您选择的分区不是最好的一个症状。
如果您想将子系统保持原样并且避免循环是不可能的,您可以求助于 RefCell 之类的解决方案。或复制语义。

关于rust - 就我的 PDP 模拟器的数据结构建模寻求建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63310836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com