汇编中的功能代码? (纯功能)

时间:2017-08-09 00:38:15

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

我目前正在使用TASM 16bit进行国际象棋。

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

我应该不遗余力地使我的功能纯净且自我包含而没有副作用?

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

你们认为我应该怎么做? 每个答案都得到赞赏< 3

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

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

我理解它的方式是所有关于编写没有副作用的自包含的纯函数。

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

1 个答案:

答案 0 :(得分:3)

  

我应该不遗余力地使我的功能纯净且自我包含而没有副作用?

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

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

我的意思是:首先,设想一个

的功能
  • 在R0和R1
  • 中获取两个参数
  • 在R2中进行总结

这是非常纯粹的,如果只进行操作 - 添加两个值。

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

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

这确实是纯粹的行为,除了返回值之外它没有明确地改变任何东西,但是有异常:它的调用在内存中改变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. 应用程序调试和监控(目标结果未更改)。
  5. 允许哪些副作用取决于您。你要记住的主要事情是

    • 某些效果在设计中是不可避免的(作为缓存更改)。
    • 尽管如此,你应该尽量减少所有其他的副作用,因为它们很容易被遗忘,因此在写作时会让你感到困惑。有时需要数小时的调试才能捕获Total Recall,因为几年前你写的函数有很小的副作用。这通常与语言无关:汇编程序或Java,甚至是LISP,你的函数有重要的副作用,或者它们没有。
      

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

         

    我理解它的方式是所有关于编写没有副作用的自包含的纯函数。

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