【问题标题】:Functional code in assembly? (pure functions) [closed]汇编中的功能代码? (纯函数)[关闭]
【发布时间】:2017-08-09 00:38:14
【问题描述】:

我目前正在研究 TASM 16 位的国际象棋。

我最近了解了纯函数以及它们如何成为宇宙中最酷的东西,所以我的问题是,

是否应该竭尽全力使我的函数变得纯粹且自包含且没有副作用?

问题是这样做会使代码更加复杂,并且需要将更多参数传递给每个函数。

你们觉得我应该怎么做? 每一个答案都值得赞赏

================================================ =============

奖金问题: 什么是函数式编程?

我的理解是,这一切都是关于编写没有副作用的自包含、纯函数。

这样代码非常易于阅读和管理。 我错了吗?

【问题讨论】:

  • “宇宙中最酷的东西” ...显然不是。这些功能需要一些代码。哪里有代码,哪里有bug。请记住,最好的代码是根本不存在的代码。 (夸张..有点)
  • 用一种没有函数的语言进行函数式编程,而且基本上一切都是副作用,似乎做了大量工作却没有收获。
  • 你在讽刺吗?
  • 乔丹,我认为 molbdnilo 只是意味着汇编不太适合(甚至不能)表达功能程序
  • 但问题是整个程序不一定是功能性的,我在问程序(=函数)是否应该是纯的。但我认为组装确实不太适合这种事情。

标签: assembly functional-programming x86-16 tasm pure-function


【解决方案1】:

是否应该竭尽全力使我的函数纯粹且自包含且没有副作用?

我会以一些间接的方式回答,但具体到“组装”,希望它有所帮助。

任何不改变参数和结果集之外的东西的函数都是纯函数。 (定义比较宽松,但很好开始。)在汇编程序中编写纯函数没有障碍,只要纯动作的定义与函数调用约定和运行环境一致。

我的意思是:首先,想象一个函数

  • 在 R0 和 R1 中获取两个参数
  • 在 R2 中求和

如果它执行唯一的操作 - 两个值相加,这确实是一个纯粹的操作。

但是,假设调用约定需要在堆栈上传递参数。对于 x86-32,这将编译为类似

f:
    movl    8(%esp), %eax
    addl    4(%esp), %eax
    ret

this 执行纯粹的操作,从某种意义上说,除了返回值之外,它不会显式更改任何内容,但有一个例外:它的调用更改了内存(堆栈区域)中的 12 个字节:2 个参数和返回指针。这是另一种意义上的纯函数所允许的副作用。

但是[2],如果你改变它,它会将第一个参数添加到全局变量中:

f:
    movl    4(%esp), %eax
    addl    %eax, sum_a
    addl    8(%esp), %eax
    ret

这将在传统意义上是纯粹的:你添加了一个副作用。

但是[3],如果某些副作用被明确声明为不影响函数纯度 - 例如,添加到 sum_a 是为了调试而实现的,并且不会改变程序的目标功能 - 该函数可以再次被视为纯的。

所以,“纯度”并不是一个绝对的概念。只有当宣布现实世界的影响正在丢弃其纯度而哪些不是时,它才真正有意义。通常,保持纯度的效果如下:

  1. 执行时间。
  2. 执行系统实现(硬件)影响,如 RAM 访问、缓存填充(以及先前缓存状态的耗尽)。
  3. 操作系统(和其他软件)效果,如任务切换、分页/分页。
  4. 应用程序调试和监控(目标结果不变)。

允许的副作用取决于您。你要记住的主要一点是

  • 某些影响是设计无法避免的(如缓存更改)。
  • 尽管如此,您应该尽量减少所有其他副作用,因为它们很容易忘记,因此在写作时会让您感到困惑。有时它需要数小时的调试才能捕捉到你几年前编写的函数的一个微小副作用的全面召回。这通常与语言无关:汇编程序或 Java,甚至 LISP,您的函数都有重要的副作用,或者没有。

额外问题:什么是函数式编程?

我的理解是,这一切都是关于编写没有副作用的自包含、纯函数。

一般来说,它不是。但这在这里是题外话(我的意思是在这个主题和这个论坛中,你最好去SE 一个,除非通常的教科书、维基百科和谷歌搜索是不够的。)当你在意义上指定实现时,我最好将其描述为编程作为函数的基本动作及其参数-结果关系,没有指定操作顺序。但我不会坚持。

【讨论】:

  • 谢谢!你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 2016-12-22
  • 2010-10-01
  • 2014-06-21
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多