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

Assembly 汇编中的功能代码?(纯功能),assembly,functional-programming,x86-16,tasm,pure-function,Assembly,Functional Programming,X86 16,Tasm,Pure Function,我目前正在用TASM 16位开发国际象棋 我最近了解了纯函数以及它们是宇宙中最酷的东西,所以我的问题是 我应该不遗余力地使我的功能变得纯粹和独立,没有副作用吗 问题是这样做会使代码更加复杂,并且需要向每个函数传递更多的参数 你们觉得我该怎么办? 每一个答案都很感激 我应该不遗余力地使我的功能变得纯粹和独立,没有副作用吗 我将以一些间接的方式回答,但具体到“组装”,希望它能有所帮助 任何不改变参数和结果集之外内容的函数都是纯函数。(定义相当宽松,但一开始就很好。)只要纯操作的定义与函数调用约定和运

我目前正在用TASM 16位开发国际象棋

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

我应该不遗余力地使我的功能变得纯粹和独立,没有副作用吗

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

你们觉得我该怎么办? 每一个答案都很感激 我应该不遗余力地使我的功能变得纯粹和独立,没有副作用吗

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

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

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

  • 获取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中是为了调试而实现的,并且不会改变程序的目标功能-该函数可以再次被视为纯函数

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

  • 执行时间
  • 执行系统实现(硬件)效果,如RAM访问、缓存填充(和先前缓存状态的排空)
  • 操作系统(和其他软件)的影响,如任务切换、分页输入/输出
  • 应用程序调试和监视(目标结果不变)
  • 什么副作用是允许的取决于你。你要记住的主要事情是

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

    我的理解是,这一切都是关于编写独立的、纯粹的、没有副作用的函数


    一般来说,情况并非如此。但这是一个离题的话题(我的意思是,在这个话题和这个论坛中,你最好去一个,除非常用的教科书、维基百科和谷歌是不够的。)当你将基本动作的实现指定为函数及其参数-结果关系时,我最好将其描述为编程,无需指定操作顺序。但我不会坚持的。

    “宇宙中最酷的东西”。。。显然不是。这些函数需要一些代码。代码在哪里,有bug。记住,最好的代码是根本不存在的代码。(夸张一点)函数式编程在一种没有函数的语言中,本质上一切都是副作用,似乎是一大堆徒劳无益的工作。你是在讽刺吗?乔丹,我认为molbdnilo只是意味着汇编不太合适(甚至没有能力)表示函数式程序的方法但问题是整个程序不必是函数式的,我想问的是程序(=函数)是否应该是纯的。但我想这是真的,大会不适合这种事情。谢谢!你帮了大忙!