【问题标题】:How are streams (OOP) represented on the assembly level? [closed]流 (OOP) 在程序集级别上是如何表示的? [关闭]
【发布时间】:2020-01-15 05:59:43
【问题描述】:

Java 的 Stream API 或 RxJava 之类的流如何在程序集级别表示?

I.E.

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

【问题讨论】:

  • 问对象和方法是如何表示的比较合适。当你理解了这些——而且它们是大主题——你就会理解流,因为它们就是由这些构成的。考虑买一本关于编译器构造的好书。 SO 不是尝试学习整个本科 CS 课程所涵盖内容的最佳场所。
  • Java 流不是语言特性。它们是标准的 Java 代码,编写为标准的类和方法。他们没有什么特别的。流类有一个操作管道,它的许多方法(非终端方法)只是记住要在该管道中执行的操作。一旦您进行终端操作,它将简单地迭代数据集(可能是多线程的)并按顺序在每个元素上应用操作管道。就是这样。
  • 确定您是在询问流 api 而不是 lambdas 或方法引用?因为这两个是这里唯一的语言特征。流只是标准的 Java 方法和类。

标签: java assembly compiler-construction java-stream rx-java


【解决方案1】:

这是一个非常复杂的话题,几句话就可以涵盖。您可以从this articleBrian Goetz 开始研究以了解Java Stream API 的概念。之后,您将能够轻松深入。

首先仔细看看Spliterator抽象:

流源由称为 Spliterator 的抽象描述。顾名思义,Spliterator 结合了两种行为:访问源的元素(迭代),以及可能分解输入源以进行并行执行(拆分)。

然后看看 Stream flags :

在内部表示中,流水线的每个阶段都由流标志位图描述,该位图描述了流流水线该阶段元素的已知信息。 Streams 使用这些标志来优化流的构造和执行。

流管道的执行

当终端操作启动时,流实现选择一个执行计划。

对于顺序执行,Streams 构造了一个“机器”——其结构与管道结构相匹配的消费者对象链。这些消费者对象中的每一个都知道下一阶段;当它接收到一个元素(或被通知没有更多元素)时,它会将零个或多个元素发送到链中的下一个阶段。

然后您将能够了解每个中间操作和终端操作如何在汇编级别表示。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多