天道酬勤,学无止境

program-transformation

我如何使用 MVars 在我的 pingpong haskell 游戏中移动桨?(How can i use MVars to move paddles on my pingpong haskell game?)

问题 我已经有了一个功能,可以在 Haskell 的乒乓球游戏中移动 2 个桨。 我想改变,所以它现在使用 MVars。 我知道我需要将 wHeld、sHeld、downHeld 和 upHeld 更改为 MVars,但是关于如何更改 movePaddle 以处理 MVars 的任何想法? 此外,当我声明 wHeld 一个 MVars 时,它会在派生节目时显示错误(Non instance for (Show MVar Bool)) data PongGame = Game { ballLoc :: (Float, Float) -- ^ Pong ball (x, y) location. , ballVel :: (Float, Float) -- ^ Pong ball (x, y) velocity. , player1 :: Float -- ^ Left player paddle height. -- Zero is the middle of the screen. , player2 :: Float -- ^ Right player paddle height. , playerRPos :: Float -- posicao do player right , playerLPos :: Float --- posicao do player left

2021-10-25 00:41:43    分类:技术分享    multithreading   haskell   concurrency   io-monad   program-transformation

How can i use MVars to move paddles on my pingpong haskell game?

I already have a function that moves 2 paddles in a ping pong game in haskell. I want to change so it uses MVars now. I know that i need to change wHeld, sHeld, downHeld and upHeld to MVars but any ideas on how to change movePaddle to deal with MVars? Also when i declare wHeld an MVars it shows a error on deriving show (Non instance for (Show MVar Bool)) data PongGame = Game { ballLoc :: (Float, Float) -- ^ Pong ball (x, y) location. , ballVel :: (Float, Float) -- ^ Pong ball (x, y) velocity. , player1 :: Float -- ^ Left player paddle height. -- Zero is the middle of the screen. , player2

2021-10-23 03:31:42    分类:问答    multithreading   haskell   concurrency   io-monad   program-transformation

将 C 源代码转换为 C++(Converting C source to C++)

问题 您将如何将相当大(> 300K)、相当成熟的 C 代码库转换为 C++? 考虑到的 CI 类型被分成大致对应于模块的文件(即比典型的基于 OO 类的分解更细粒度),使用内部链接代替私有函数和数据,以及公共函数和数据的外部链接。 全局变量广泛用于模块之间的通信。 有一个非常广泛的集成测试套件可用,但没有单元(即模块)级别的测试。 我想到了一个总体策略: 编译 C++ 的 C 子集中的所有内容并使其工作。 将模块转换为巨大的类,以便所有交叉引用都由类名限定范围,但将所有函数和数据保留为静态成员,并使其正常工作。 使用适当的构造函数和初始化的交叉引用将庞大的类转换为实例; 适当地用间接访问替换静态成员访问; 并开始工作。 现在,将项目作为一个不良因素的 OO 应用程序来处理,并在依赖项易于处理的地方编写单元测试,并将它们分解成单独的类; 此处的目标是在每次转换时从一个工作程序转移到另一个工作程序。 显然,这将是相当多的工作。 有没有关于这种翻译的案例研究/战争故事? 替代策略? 其他有用的建议? 注 1:该程序是一个编译器,可能有数百万个其他程序依赖于它的行为不会改变,因此大规模重写几乎不是一种选择。 注 2:源代码已有近 20 年的历史,每年可能有 30% 的代码流失(修改的行数 + 添加的行数/以前的总行数)。 换句话说,它得到了大量维护和扩展。 因此,目标之一是提高可维护性。

2021-06-11 04:57:12    分类:技术分享    c++   c   refactoring   legacy   program-transformation

并行动态规划(Parallel Dynamic Programming)

问题 有没有讨论如何采用动态程序并将其并行化的好论文? 回答1 IIRC,您通常使用动态规划做的是将问题递归地划分为子问题,并从最佳子解决方案中组装最佳解决方案。 使其有效的原因是所有最佳子解决方案都内置在缓存中,因此无需重新计算。 如果问题可以分为几种方式,您可以为每个子解决方案分叉求解器。 如果每个(子)问题平均 1+epsilon(对于 epsilon 有趣的是大于零)可能的子解决方案,那么您将通过这种方式获得很多并行性。 您可能需要锁定缓存条目以保护单个解决方案不被多次构造。 您需要一种语言,在这种语言中,您可以比解决它们的工作更便宜地分叉子任务,并且很高兴同时拥有大量分叉任务。 大多数语言中典型的并行产品在这方面做得很糟糕; 在使用“大堆栈模型”的系统中不能有很多分叉任务(请参阅无堆栈语言如何工作?)。 我们实现了我们的并行编程语言 PARLANSE,以获得一种具有正确属性的语言。 回答2 我们最近发表了一篇论文,展示了如何通过共享无锁哈希表在共享内存多核计算机上并行化任何 dp: Stivala, A. 和 Stuckey, PJ 和 Garcia de la Banda, M. 和 Hermenegildo, M. 和 Wirth, A. 2010 “无锁并行动态编程” J. Parallel Distrib。 计算。 70:839-848 doi:10.1016/j

2021-06-02 22:56:43    分类:技术分享    parallel-processing   dynamic-programming   program-transformation

Parallel Dynamic Programming

Are there any good papers discussing how to take a dynamic program and parallelize it?

2021-05-18 02:19:25    分类:问答    parallel-processing   dynamic-programming   program-transformation

Converting C source to C++

How would you go about converting a reasonably large (>300K), fairly mature C codebase to C++? The kind of C I have in mind is split into files roughly corresponding to modules (i.e. less granular than a typical OO class-based decomposition), using internal linkage in lieu private functions and data, and external linkage for public functions and data. Global variables are used extensively for communication between the modules. There is a very extensive integration test suite available, but no unit (i.e. module) level tests. I have in mind a general strategy: Compile everything in C++'s C

2021-05-15 15:11:28    分类:问答    c++   c   refactoring   legacy   program-transformation

什么是消除尾递归?(What is tail-recursion elimination?)

问题 史蒂夫·耶格(Steve Yegge)在博客文章中提到了这一点,但我不知道这意味着什么,有人可以帮我吗? 它和尾部呼叫优化一样吗? 回答1 消除尾部调用是一种节省堆栈空间的优化。 它将函数调用替换为goto 。 尾递归消除是一回事,但附加的约束是该函数正在调用自身。 基本上,如果函数A做的最后一件事是return A(params...)则可以消除堆栈帧的分配,而是设置适当的寄存器并直接跳转到函数的主体中。 考虑一个(虚构的)调用约定,该约定在堆栈上传递所有参数并在某个寄存器中返回该值。 某些功能可以编译为(用虚构的汇编语言): function: //Reading params B, C, & D off the stack pop B pop C pop D //Do something meaningful, including a base case return ... //Pass new values for B, C, & D to a new invocation of function on the stack push D* push C* push B* call function ret 不管上面实际做什么,每次调用函数都会占用一个全新的堆栈帧。 但是,由于在尾部调用函数之后除了返回什么都没有发生,因此我们可以安全地优化这种情况。 导致:

2021-04-22 09:04:51    分类:技术分享    language-agnostic   recursion   tail-recursion   tail-call-optimization   program-transformation

What is tail-recursion elimination?

Steve Yegge mentioned it in a blog post and I have no idea what it means, could someone fill me in? Is it the same thing as tail call optimization?

2021-04-12 15:43:52    分类:问答    language-agnostic   recursion   tail-recursion   tail-call-optimization   program-transformation