红色和蓝色功能是一件好事

2021-04-26 17:46:43

通过避免效果意识,职业职业工程师,并使节目比它们更滑坡。

大多数技术世界现在熟悉描述红色/蓝色函数(打开新窗口)及其缺点的帖子,特别是在异步的背景下。许多人已经加入,通常是颂扬或酏剂或erlang。尽管MEME扩展了远远广泛,但许多语言在他们的语言中使用异步/等待语法来处理异步,将红色/蓝色函数引入语言。锈是一个值得注意的且最近的例子。

我的职位在讨论时长期以来一直是红色/蓝色函数是一个很好的设计选择,应该在基本上所有静态类型的语言中使用(我也碰巧觉得基本上所有语言都应该静态键入(打开新窗口),但是#39;另一天的SA主题)。一种成熟和严重的语言,如铁锈切选,让我感到觉得我的立场普遍被接受,我没有担心它。

但是我一直跑进帖子恢复相同的谈话点,当我遇到这篇文章时,我终于不能待命,当我遇到这个帖子是彩色的,而#34;那个'不是一个大交易&# 34; (打开新窗口)。

我不认为这个职位足够强大!不仅是红色/蓝色功能可以容忍和良好的设计选择,但避免它们的唯一效益是方便,并且其后果超过了这种好处。通过隐藏有关该计划的真实性质的重要信息,打开了许多不必要的潜在陷阱。当然,某些语言仍然可以做出这种选择,但我认为他们是他们的用户陷入困境。我个人只会为不重要的程序使用这样的语言,或者根本不使用它们。

彩色功能揭示了一个计划的重要现实。彩色函数本质上是一个类型系统的程序效果,所有这些都可以对性能的巨大后果(未组织的IO调用可以是延迟灾难),安全性(IO可以触摸文件系统或网络和开放安全差距),全局状态一致性(异步函数经常变异全局状态,文件系统也是唯一的示例)和正确性/可靠性(抛出异常也是一个程序效果,结果函数是另一种颜色)。彩色功能Don' T"毒药"您的计划,他们通知您您的计划本身已被这些效果中毒的现实。

Sandely设计的系统始终具有逃生舱口,以使程序更方便,如未来阻塞功能或rust包装()。这些功能基本上丢弃了程序效果信息,但显然和有意识地这样做。程序员可以选择在他们觉得它有理由时这样做,同时保持选择后来改变主意。当程序开始在病理上进行病理或不可靠时,它仍然可以清楚地开始寻找。

效果意识功能最明显和琐碎的例子,鼓励更好的程序是当可以同时调度几个异步动作时。假设我们有一些愚蠢的功能,在&#34中处理了异步;去常规"时尚:

fn bundle_letters() - > {//每个函数中的每一个都在内部创建绿色线程//并使用频道或互斥锁定与它协调,让a = fetch_a();设b = fetch_b();让c = fetch_c(); {A,B,C}}

请注意,如果不添加更多代码,则绝对无法使这些获取调用真正并发。由于像Go&#39一样的语言。它保证了绿色线程won' t引入同步错误,程序员必须用频道或互斥锁手动同步。你可以&#34的功能;只需打电话"就像上面的那些必须暂停,如果他们将保持安全。如果没有添加待存组并为每个获取创建新的绿色线程,那么上面的代码等同于此:

async fn bundle_letters() - > {让a = fetch_a()。等待;设b = fetch_b()。等待;让c = fetch_c()。等待; {A,B,C}}

重要的是,语言本身无需通知我们这就是这种情况。如果我们aren' t熟悉这些特定的获取功能,我们只会错过真正的并发的机会。

但是,随着天真的等待代码在我们身上,我们只需要了解语言以了解我们'重新留下表现。重构是显而易见的:

async fn bundle_letters() - > {让(a,b,c)=加入! (fetch_a(),fetch_b(),fetch_c(),)。等待; {A,B,C}}

(PS,在TypeScript中,可以使用通用元组(打开新窗口)使用相当于期货::加入的完全排版功能)

Elixir似乎让我们处于类似的情况。我们必须使用task.await(打开新窗口),但(动态)类型系统中没有任何内容需要使用任意任意函数.Await必须标记。当其他程序员使用我们的等待呼叫功能而不知道时,这再次邀请了相同的效率顺序等待。

&#34的任何代码;感觉同步"必须通过偷窃你的真正并发来为您支付这种感觉。它起初可能似乎更方便,但第二个你需要更多的控制,你必须使用太多的笨蛋抽象。

获得异步的常规风格的明显简单的唯一方法以及对齐的等待点的效率是构建一个非常复杂的优化编译器,可以跟踪异步获取值的活力和重新排序甚至插入操作。即使在这种情况下,程序员仍然可能对底层的异步感到沮丧。

Rust已经证明,通过Clever Compiler设计,基于未来的系统可以为我们提供干净的语法和令人难以置信的性能。 Rust Async ISN' T完全完成,但实际创新的价格是暂时的痛苦。一旦创新完成了我们' LL非常少的实际权衡。

程序基本上可以始终构造为具有纯IO包装的功能核心(打开新窗口)。这样做比允许跨同步/异步函数的代码重复使用更好的方式更好。允许程序员编写混合同步/异步代码,' s所有"相同的颜色"不可避免地邀请了差的结构。

职能之间的效果边界的认识允许您提高您设计的清晰度,并惩罚您的邋..这几乎总是一件好事,并且通常必须提供强大,表演,正确的程序的工程师更喜欢他们的语言是一个谨慎的合作伙伴,他们认为他们对他们的设计决策负责。

随意创建和使用具有隐形程序效果或异步的语言,我'当你这样做时,我会随意不关注。