怀孕了想打掉吃什么药| 糗大了是什么意思| 什么叫夏至| 六味地黄丸吃多了有什么副作用| 巳蛇五行属什么| 九七年属什么| 蝙蝠长什么样子图片| 八点半是什么时辰| 枕头太低有什么影响| 纯阴八字为什么要保密| 贵人命是什么意思| 精尽人亡什么意思| 十一月二十是什么星座| 舌系带长有什么影响吗| 生石灰是什么| 口苦口臭吃什么药效果最佳| 针对性是什么意思| 白蛋白偏低是什么意思| 震字五行属什么| 七喜是什么饮料| 什么是三伏天| 狭隘是什么意思| 头晕恶心想吐挂什么科| 短裙配什么鞋子好看| 小兔子吃什么食物| 舌头发黄是什么原因| 头发有点黄是什么原因| 胃胀气是什么原因| 白手起家是什么生肖| 非溶血是什么意思| rap什么意思| 月亮的肚子指的是什么| 吃什么不长肉还能瘦| 理想主义者是什么意思| 秀才相当于什么学历| 绞股蓝长什么样子| 白细胞低什么原因| 怀孕初期头晕是什么原因| 糜烂性胃炎有什么症状| 肛门坠胀是什么原因| 老人说胡话是什么征兆| 艾灸肚脐有什么好处| 癫痫病是什么原因引起的| 托是什么意思| 孜字五行属什么| 绝对值是什么| mmf是什么药| 40不惑什么意思| 女人的第二张脸是什么| 土豆不能和什么食物一起吃| 炸肺是什么意思| 胃息肉吃什么好| 什么水果可以降火| 挂什么科| 冷藏是什么意思| 梦见洗衣服是什么意思| 女同是什么意思| maxco是什么牌子| 急性肠胃炎吃什么药| 画龙点睛指什么生肖| 死鬼什么意思| 灯笼裤配什么鞋子好看| 棉涤是什么面料| 胆囊疼是什么原因| 生育险是什么| 石灰水是什么| 喝红枣水有什么好处和坏处| 洁面膏和洗面奶有什么区别| hr是什么| 早上四点是什么时辰| 甲状腺一般吃什么药| 菠菜不能和什么食物一起吃| 打完除皱针注意事项有什么| 毛孔粗大是什么原因引起的| 兔子尾巴像什么| 绿萝叶子发黄是什么原因| 养肝护肝吃什么食物好| 肠炎用什么药好| 小路像什么| 黄瓜为什么会苦| 助产学出来是干什么的| 低血压适合吃什么食物| po是什么| 轧戏是什么意思| 吃什么对牙齿有好处| 蒙脱石是什么东西| 男人断眉代表什么| 周星驰是什么星座| 胶原蛋白有什么作用| 头痛头晕吃什么药| 侧切是什么意思| 挂件是什么意思| 肝做什么检查最准确| 叶酸基因检测是什么| 什么能什么力| 牛肉与什么食物相克| 遇到黄鼠狼是什么征兆| 十二月份的是什么星座| 金箔金命是什么意思| 忧郁什么意思| 什么是抖m| 热感冒有什么症状| 14岁可以做什么工作| 吃什么能降甘油三酯| 壁是什么意思| 阳朔有什么好玩的| 卤水点豆腐是什么意思| 猫藓长什么样| 鱼油什么时候吃| 突然嗜睡是什么原因造成的| 车厘子什么时候成熟| 瑶柱是什么东西| 宫颈细胞学检查是什么意思| 眼睛飞蚊症用什么眼药水| 颈动脉强回声斑块是什么意思| 女人喝白茶有什么好处| 什么不什么干| 喉咙痒干咳吃什么药| 迎春花什么时候开| 头发长得快是什么原因| 维生素b不能和什么一起吃| skp是什么品牌| 知趣是什么意思| 卡西欧手表什么档次| 肺气肿是什么| 什么叫cd| 漫展是干什么的| 耳根疼是什么原因| 内膜厚是什么原因引起的| 属猪男配什么属相最好| 查肾功能需要做什么检查| 阿司匹林什么时间吃最好| 头孢治什么| 十岁女孩喜欢什么礼物| 肚脐周围疼痛是什么原因| 什么心什么力| 玻璃体切除后对眼睛有什么影响| 穿云箭是什么意思| 小暑是什么时候| 仁字五行属什么| 胸口正中间疼是什么病| 双肾钙化灶是什么意思| 生日派对是什么意思| 咽炎是什么原因引起的| 请丧假需要什么证明| 贾珍和贾政是什么关系| 阴囊瘙痒挂什么科室| 胆红素高是什么原因| 胸口不舒服是什么原因| 肌层回声欠均匀是什么意思| 秋葵有什么好处| dw手表是什么档次| 睾丸肿大是什么原因| 青少年手抖是什么原因| 爸爸的姐夫叫什么| 北属于五行的什么| 寻常疣是什么原因造成的| 口腔溃疡缺什么| 耳朵发痒是什么原因| 马蹄粉是什么粉| 欲盖弥彰是什么意思| 梦见捡菌子是什么预兆| 桃李满天下的桃李是什么意思| 炖鸡块放什么调料| 7月13日是什么节日| 丁香花什么颜色| 月经来了同房会导致什么后果| 玉镯子断了有什么预兆| 数字9像什么| 汗疱疹用什么药膏| 珀莱雅属于什么档次| 日本投降是什么时候| 大海是什么颜色| 宜家宜室什么意思| 高铁上为什么没有e座| marmot什么牌子| 压马路是什么意思| 孕妇梦到老公出轨什么意思| 冷暖自知上一句是什么| 挂妇科门诊都检查什么| 年纪是什么意思| 拔凉拔凉是什么意思| 牙膏洗脸有什么好处| 子宫腺肌症是什么意思| 优衣库属于什么档次| 有机酸是什么| 微尘是什么意思| 珍珠翡翠白玉汤是什么| 韦编三绝是什么意思| 爱出汗的人是什么原因| 红色尿液是什么原因| 为什么被蚊子咬了会起包| 胃窦病变意味着什么| 倒班是什么意思| 不干胶是什么| 胸前有痣代表什么意思| 什么食物容易消化| 嫁妆是什么意思| 黑米和紫米有什么区别| 机能鞋是什么意思| 七星伴月是什么意思| 身上无力是什么原因| 没什么大不了| 心肌病吃什么药| 为什么伤口愈合会痒| 吃什么可以增加抵抗力和免疫力| no医学上是什么意思| 行驶证和驾驶证有什么区别| 品相是什么意思| 灭蚂蚁什么药最有效| 香奶奶是什么牌子| 喉咙长期有痰是什么原因| 蜘蛛最怕什么| 基点是什么意思| 头疼嗓子疼吃什么药| 不典型血管瘤什么意思| 每天喝一杯豆浆有什么好处| 什么是夜店| 内射什么感觉| 什么是满汉全席| 手持吸尘器什么牌子好| 三七甘一是什么意思| 什么叫引产| utc是什么时间| 高明是什么意思| 璨字五行属什么| 为什么做爱那么舒服| 什么空调最省电| 十月五号是什么星座| 小孩子眼睛眨得很频繁是什么原因| 刘邦为什么要杀张良| 回民为什么不能吃猪肉| 月经来了吃什么好| 护资成绩什么时候出| 11是什么生肖| 皮肤糖化是什么意思| 胳膊上种花是什么疫苗| gm墨镜是什么牌子| 罗非鱼长什么样| 卡罗莱手表是什么档次| 三叉神经痛用什么药| 牙龈炎吃什么药最有效| 衣原体是什么| 混油皮是什么意思| 什么是童话故事| 为什么会长腋毛| 什么时候闰十二月| 脑震荡吃什么药| 梭边鱼是什么鱼| na是什么| 衾怎么读什么意思| 福建有什么好吃的| 叻叻是什么意思| 翔字五行属什么| 哥们是什么意思| 新鲜橄榄菜长什么样子| 矢车菊在中国叫什么名| 打磨工为什么没人干| 四物汤什么时候喝| 今天什么年| 遗传是什么意思| 蓝色加黄色等于什么颜色| venus是什么星球| 去台湾需要什么证件| 百度Jump to content

缅怀不朽 | 我们安稳的今天,是他们用生命点亮的明天

From Wikipedia, the free encyclopedia
百度 文丨特约评论员斯远虽然我行动不便,说话需要机器的帮助,但是,我的思想是自由的。

In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change. With this paradigm, it is possible to express static (e.g., arrays) or dynamic (e.g., event emitters) data streams with ease, and also communicate that an inferred dependency within the associated execution model exists, which facilitates the automatic propagation of the changed data flow.[citation needed]

For example, in an imperative programming setting, a := b + c would mean that a is being assigned the result of b + c at the instant the expression is evaluated, and later, the values of b and c can be changed with no effect on the value of a. On the other hand, in reactive programming, the value of a is automatically updated whenever the values of b or c change, without the program having to explicitly re-state the statement a := b + c to re-assign the value of a.[citation needed]

var b = 1
var c = 2
var a = b + c
b = 10
console.log(a) // 3 (not 12 because "=" is not a reactive assignment operator)

// now imagine you have a special operator "$=" that changes the value of a variable (executes code on the right side of the operator and assigns result to left side variable) not only when explicitly initialized, but also when referenced variables (on the right side of the operator) are changed
var b = 1
var c = 2
var a $= b + c
b = 10
console.log(a) // 12

Another example is a hardware description language such as Verilog, where reactive programming enables changes to be modeled as they propagate through circuits.[citation needed]

Reactive programming has been proposed as a way to simplify the creation of interactive user interfaces and near-real-time system animation.[citation needed]

For example, in a model–view–controller (MVC) architecture, reactive programming can facilitate changes in an underlying model being reflected automatically in an associated view.[1]

Approaches to creating reactive programming languages

[edit]

Several popular approaches are employed in the creation of reactive programming languages. One approach is the specification of dedicated languages that are specific to various domain constraints. Such constraints usually are characterized by real-time, embedded computing or hardware description. Another approach involves the specification of general-purpose languages that include support for reactivity. Other approaches are articulated in the definition, and use of programming libraries, or embedded domain-specific languages, that enable reactivity alongside or on top of the programming language. Specification and use of these different approaches results in language capability trade-offs. In general, the more restricted a language is, the more its associated compilers and analysis tools are able to inform developers (e.g., in performing analysis for whether programs are able to execute in actual real-time). Functional trade-offs in specificity may result in deterioration of the general applicability of a language.

Programming models and semantics

[edit]

A variety of models and semantics govern reactive programming. We can loosely split them along the following dimensions:

  • Synchrony: synchronous versus asynchronous model of time
  • Determinism: deterministic versus non-deterministic evaluation process and results
  • Update process: callback versus dataflow versus actor

Implementation techniques and challenges

[edit]

Essence of implementations

[edit]

Reactive programming language runtimes are represented by a graph that identifies the dependencies among the involved reactive values. In such a graph, nodes represent the act of computing, and edges model dependency relationships. Such a runtime employs said graph, to help it keep track of the various computations, which must be executed anew, once an involved input changes value.

Change propagation algorithms

[edit]

The most common approaches to data propagation are:

  • Pull: The value consumer is in fact proactive, in that it regularly queries the observed source for values and reacts whenever a relevant value is available. This practice of regularly checking for events or value changes is commonly referred to as polling.
  • Push: The value consumer receives a value from the source whenever the value becomes available. These values are self-contained, e.g. they contain all the necessary information, and no further information needs to be queried by the consumer.
  • Push-pull: The value consumer receives a change notification, which is a short description of the change, e.g. "some value changed" – this is the push part. However, the notification does not contain all the necessary information (which means it does not contain the actual values), so the consumer needs to query the source for more information (the specific value) after it receives the notification – this is the pull part. This method is commonly used when there is a large volume of data that the consumers might be potentially interested in. So in order to reduce throughput and latency, only light-weight notifications are sent; and then those consumers which require more information will request that specific information. This approach also has the drawback that the source might be overwhelmed by many requests for additional information after a notification is sent.

What to push?

[edit]

At the implementation level, event reaction consists of the propagation across a graph's information, which characterizes the existence of change. Consequently, computations that are affected by such change then become outdated and must be flagged for re-execution. Such computations are then usually characterized by the transitive closure of the change (i.e. the full set of transitive dependencies a source affects) in its associated source. Change propagation may then lead to an update in the value of the graph's sinks.

Graph propagated information can consist of a node's complete state, i.e., the computation result of the involved node. In such cases, the node's previous output is then ignored. Another method involves delta propagation i.e. incremental change propagation. In this case, information is proliferated along a graph's edges, which consist only of deltas describing how the previous node was changed. This approach is especially important when nodes hold large amounts of state data, which would otherwise be expensive to recompute from scratch.

Delta propagation is essentially an optimization that has been extensively studied via the discipline of incremental computing, whose approach requires runtime satisfaction involving the view-update problem. This problem is infamously characterized by the use of database entities, which are responsible for the maintenance of changing data views.

Another common optimization is employment of unary change accumulation and batch propagation. Such a solution can be faster because it reduces communication among involved nodes. Optimization strategies can then be employed that reason about the nature of the changes contained within, and make alterations accordingly (e.g. two changes in the batch can cancel each other, and thus, simply be ignored). Yet another available approach, is described as invalidity notification propagation. This approach causes nodes with invalid input to pull updates, thus resulting in the update of their own outputs.

There are two principal ways employed in the building of a dependency graph:

  1. The graph of dependencies are maintained implicitly within an event loop. Registration of explicit callbacks then results in the creation of implicit dependencies. Therefore, control inversion, which is induced via callback, is thus left in place. However, making callbacks functional (i.e. returning state value instead of unit value) necessitates that such callbacks become compositional.
  2. A graph of dependencies is program-specific and generated by a programmer. This facilitates an addressing of the callback's control inversion in two ways: either a graph is specified explicitly (typically using a domain-specific language (DSL), which may be embedded), or a graph is implicitly defined with expression and generation using an effective, archetypal language.

Implementation challenges in reactive programming

[edit]

Glitches

[edit]

When propagating changes, it is possible to pick propagation orders such that the value of an expression is not a natural consequence of the source program. We can illustrate this easily with an example. Suppose seconds is a reactive value that changes every second to represent the current time (in seconds). Consider this expression:

t = seconds + 1
g = (t > seconds)

Because t should always be greater than seconds, this expression should always evaluate to a true value. Unfortunately, this can depend on the order of evaluation. When seconds changes, two expressions have to update: seconds + 1 and the conditional. If the first evaluates before the second, then this invariant will hold. If, however, the conditional updates first, using the old value of t and the new value of seconds, then the expression will evaluate to a false value. This is called a glitch.

Some reactive languages are glitch-free and prove this property[citation needed]. This is usually achieved by topologically sorting expressions and updating values in topological order. This can, however, have performance implications, such as delaying the delivery of values (due to the order of propagation). In some cases, therefore, reactive languages permit glitches, and developers must be aware of the possibility that values may temporarily fail to correspond to the program source, and that some expressions may evaluate multiple times (for instance, t > seconds may evaluate twice: once when the new value of seconds arrives, and once more when t updates).

Cyclic dependencies

[edit]

Topological sorting of dependencies depends on the dependency graph being a directed acyclic graph (DAG). In practice, a program may define a dependency graph that has cycles. Usually, reactive programming languages expect such cycles to be "broken" by placing some element along a "back edge" to permit reactive updating to terminate. Typically, languages provide an operator like delay that is used by the update mechanism for this purpose, since a delay implies that what follows must be evaluated in the "next time step" (allowing the current evaluation to terminate).

Interaction with mutable state

[edit]

Reactive languages typically assume that their expressions are purely functional. This allows an update mechanism to choose different orders in which to perform updates, and leave the specific order unspecified (thereby enabling optimizations). When a reactive language is embedded in a programming language with state, however, it may be possible for programmers to perform mutable operations. How to make this interaction smooth remains an open problem.

In some cases, it is possible to have principled partial solutions. Two such solutions include:

  • A language might offer a notion of a "mutable cell". A mutable cell is one that the reactive update system is aware of, so that changes made to the cell propagate to the rest of the reactive program. This enables the non-reactive part of the program to perform a traditional mutation while enabling reactive code to be aware of and respond to this update, thus maintaining the consistency of the relationship between values in the program. An example of a reactive language that provides such a cell is FrTime.[2]
  • Properly encapsulated object-oriented libraries offer an encapsulated notion of state. In principle, it is therefore possible for such a library to interact smoothly with the reactive portion of a language. For instance, callbacks can be installed in the getters of the object-oriented library to notify the reactive update engine about state changes, and changes in the reactive component can be pushed to the object-oriented library through getters. FrTime employs such a strategy.[3]

Dynamic updating of the graph of dependencies

[edit]

In some reactive languages, the graph of dependencies is static, i.e., the graph is fixed throughout the program's execution. In other languages, the graph can be dynamic, i.e., it can change as the program executes. For a simple example, consider this illustrative example (where seconds is a reactive value):

t =
  if ((seconds mod 2) == 0):
    seconds + 1
  else:
    seconds - 1
  end
t + 1

Every second, the value of this expression changes to a different reactive expression, which t + 1 then depends on. Therefore, the graph of dependencies updates every second.

Permitting dynamic updating of dependencies provides significant expressive power (for instance, dynamic dependencies routinely occur in graphical user interface (GUI) programs). However, the reactive update engine must decide whether to reconstruct expressions each time, or to keep an expression's node constructed but inactive; in the latter case, ensure that they do not participate in the computation when they are not supposed to be active.

Concepts

[edit]

Degrees of explicitness

[edit]

Reactive programming languages can range from very explicit ones where data flows are set up by using arrows, to implicit where the data flows are derived from language constructs that look similar to those of imperative or functional programming. For example, in an implicitly lifted functional reactive programming (FRP), a function call might implicitly cause a node in a data flow graph to be constructed. Reactive programming libraries for dynamic languages (such as the Lisp "Cells" and Python "Trellis" libraries) can construct a dependency graph from runtime analysis of the values read during a function's execution, allowing data flow specifications to be both implicit and dynamic.

Sometimes the term reactive programming refers to the architectural level of software engineering, where individual nodes in the data flow graph are ordinary programs that communicate with each other.

Static or dynamic

[edit]

Reactive programming can be purely static where the data flows are set up statically, or be dynamic where the data flows can change during the execution of a program.

The use of data switches in the data flow graph could to some extent make a static data flow graph appear as dynamic, and blur the distinction slightly. True dynamic reactive programming however could use imperative programming to reconstruct the data flow graph.

Higher-order reactive programming

[edit]

Reactive programming could be said to be of higher order if it supports the idea that data flows could be used to construct other data flows. That is, the resulting value out of a data flow is another data flow graph that is executed using the same evaluation model as the first.

Data flow differentiation

[edit]

Ideally all data changes are propagated instantly, but this cannot be assured in practice. Instead, it might be necessary to give different parts of the data flow graph different evaluation priorities. This can be called differentiated reactive programming.[citation needed]

For example, in a word processor, the marking of spelling errors need not be totally in sync with the inserting of characters. Here differentiated reactive programming could potentially be used to give the spell checker lower priority, allowing it to be delayed while keeping other data-flows instantaneous.

However, such differentiation introduces additional design complexity. For example, deciding how to define the different data flow areas, and how to handle event passing between different data flow areas.

Evaluation models of reactive programming

[edit]

Evaluation of reactive programs is not necessarily based on how stack-based programming languages are evaluated. Instead, when some data is changed, the change is propagated to all data that is derived partially or completely from the data that was changed. This change propagation could be achieved in a number of ways, where perhaps the most natural way is an invalidate/lazy-revalidate scheme.

It could be problematic simply to naively propagate a change using a stack, because of potential exponential update complexity if the data structure has a certain shape. One such shape can be described as "repeated diamonds shape", and has the following structure: An→Bn→An+1, An→Cn→An+1, where n=1,2... This problem could be overcome by propagating invalidation only when some data is not already invalidated, and later re-validate the data when needed using lazy evaluation.

One inherent problem for reactive programming is that most computations that would be evaluated and forgotten in a normal programming language, needs to be represented in the memory as data-structures.[citation needed] This could potentially make reactive programming highly memory consuming. However, research on what is called lowering could potentially overcome this problem.[4]

On the other side, reactive programming is a form of what could be described as "explicit parallelism"[citation needed], and could therefore be beneficial for utilizing the power of parallel hardware.

Similarities with observer pattern

[edit]

Reactive programming has principal similarities with the observer pattern commonly used in object-oriented programming. However, integrating the data flow concepts into the programming language would make it easier to express them and could therefore increase the granularity of the data flow graph. For example, the observer pattern commonly describes data-flows between whole objects/classes, whereas object-oriented reactive programming could target the members of objects/classes.

Approaches

[edit]

Imperative

[edit]

It is possible to fuse reactive programming with ordinary imperative programming. In such a paradigm, imperative programs operate upon reactive data structures.[5] Such a set-up is analogous to imperative constraint programming; however, while imperative constraint programming manages bidirectional data-flow constraints, imperative reactive programming manages one-way data-flow constraints. One reference implementation is the proposed Quantum runtime extension to JavaScript .

Object-oriented

[edit]

Object-oriented reactive programming (OORP) is a combination of object-oriented programming and reactive programming. Perhaps the most natural way to make such a combination is as follows: instead of methods and fields, objects have reactions that automatically re-evaluate when the other reactions they depend on have been modified.[citation needed]

If an OORP language maintains its imperative methods, it would also fall under the category of imperative reactive programming.

Functional

[edit]

Functional reactive programming (FRP) is a programming paradigm for reactive programming on functional programming.

Actor based

[edit]

Actors have been proposed to design reactive systems, often in combination with Functional reactive programming (FRP) and Reactive Streams to develop distributed reactive systems.[6][7][8][9]

Rule based

[edit]

A relatively new category of programming languages uses constraints (rules) as main programming concept. It consists of reactions to events, which keep all constraints satisfied. Not only does this facilitate event-based reactions, but it makes reactive programs instrumental to the correctness of software. An example of a rule based reactive programming language is Ampersand, which is founded in relation algebra.[10]

Implementations

[edit]
  • ReactiveX, an API for implementing reactive programming with streams, observables and operators with multiple language implementations including RxJs, RxJava, Rx.NET, RxPy and RxSwift.
  • Elm, a reactive composition of web user interfaces.
  • Reactive Streams, a JVM standard for asynchronous stream processing with non-blocking backpressure
  • ObservableComputations, a cross-platform .NET implementation.
  • Svelte, brings reactivity in the form of a variant JavaScript syntax that looks like JavaScript but is naturally reactive where JavaScript normally isn't.
  • Solid.js brings reactivity to JavaScript without changing JavaScript syntax semantics, along with reactive JSX templating.
  • Quantum JS, a runtime extension to JavaScript that brings imperative reactive programming to the language, creating a whole new category in the reactivity spectrum.
  • Rimmel.js, a modern functional-reactive JavaScript UI library designed with RxJS streams in mind.

See also

[edit]

References

[edit]
  1. ^ Trellis, Model-view-controller and the observer pattern, Tele community, archived from the original on 2025-08-07, retrieved 2025-08-07.
  2. ^ "Embedding Dynamic Dataflow in a Call-by-Value Language". cs.brown.edu. Archived from the original on 2025-08-07. Retrieved 2025-08-07.
  3. ^ "Crossing State Lines: Adapting Object-Oriented Frameworks to Functional Reactive Languages". cs.brown.edu. Archived from the original on 2025-08-07. Retrieved 2025-08-07.
  4. ^ Burchett, Kimberley; Cooper, Gregory H; Krishnamurthi, Shriram, "Lowering: a static optimization technique for transparent functional reactivity", Proceedings of the 2007 ACM SIGPLAN symposium on Partial evaluation and semantics-based program manipulation (PDF), pp. 71–80, archived (PDF) from the original on 2025-08-07, retrieved 2025-08-07.
  5. ^ Demetrescu, Camil; Finocchi, Irene; Ribichini, Andrea (22 October 2011), "Reactive Imperative Programming with Dataflow Constraints", Proceedings of the 2011 ACM international conference on Object-oriented programming systems languages and applications, Oopsla '11, pp. 407–26, arXiv:1104.2293, doi:10.1145/2048066.2048100, ISBN 9781450309400, S2CID 7285961.
  6. ^ Van den Vonder, Sam; Renaux, Thierry; Oeyen, Bjarno; De Koster, Joeri; De Meuter, Wolfgang (2020), "Tackling the Awkward Squad for Reactive Programming: The Actor-Reactor Model", Leibniz International Proceedings in Informatics (LIPIcs), vol. 166, pp. 19:1–19:29, doi:10.4230/LIPIcs.ECOOP.2020.19, ISBN 9783959771542, S2CID 260445152, archived from the original on 2025-08-07, retrieved 2025-08-07.
  7. ^ Van den Vonder, Sam; Renaux, Thierry; De Meuter, Wolfgang (2022), "Topology-Level Reactivity in Distributed Reactive Programs: Reactive Acquaintance Management using Flocks", The Art, Science, and Engineering of Programming, vol. 6, pp. 14:1–14:36, arXiv:2202.09228, doi:10.22152/programming-journal.org/2022/6/14, archived from the original on 2025-08-07, retrieved 2025-08-07
  8. ^ Shibanai, Kazuhiro; Watanabe, Takuo (2018), "Distributed Functional Reactive Programming on Actor-Based Runtime", Proceedings of the 8th ACM SIGPLAN International Workshop on Programming Based on Actors, Agents, and Decentralized Control, Agere 2018, pp. 13–22, doi:10.1145/3281366.3281370, ISBN 9781450360661, S2CID 53113447, archived from the original on 2025-08-07, retrieved 2025-08-07
  9. ^ Roestenburg, Raymond; Bakker, Rob; Williams, Rob (2016). "13: Streaming". Akka in Action. Greenwich, Connecticut, USA: Manning Publications Co. p. 281. ISBN 978-1-61729-101-2.
  10. ^ Joosten, Stef (2018), "Relation Algebra as programming language using the Ampersand compiler", Journal of Logical and Algebraic Methods in Programming, vol. 100, pp. 113–29, doi:10.1016/j.jlamp.2018.04.002, S2CID 52932824.
[edit]


沙眼衣原体是什么 床垫什么样的好 错构瘤是什么 长脸适合什么发型女 栩是什么意思
双氧水又叫什么名字 打卤面都有什么卤 敏感肌是什么样的 睡觉总是做梦是什么原因 拉绿色大便是什么原因
五月11号是什么星座 恭喜什么意思 晚上吃什么有助于减肥 1979属什么 为什么一直咳嗽
什么原因 断层是什么意思 喷塑工是干什么的 什么虫子有毒 胃痛可以吃什么
995是什么意思hcv9jop2ns5r.cn 鼻子上长脓包型痘痘是什么原因hcv8jop1ns6r.cn 尿频繁吃什么药最见效xianpinbao.com 峦读什么hcv8jop9ns7r.cn sherry是什么意思hcv8jop1ns3r.cn
舌尖发麻是什么问题hcv8jop0ns9r.cn 阅读有什么好处hcv8jop9ns5r.cn 沙棘原浆什么人不能喝tiangongnft.com blub是什么意思hcv9jop5ns7r.cn 黑蝴蝶代表什么hcv8jop6ns2r.cn
台湾为什么叫4vff14chat.com 冠心病是什么病hcv9jop4ns1r.cn 龙虾不能和什么一起吃hcv7jop9ns2r.cn 2月18号是什么星座hcv9jop2ns2r.cn 吃什么可以降火hcv8jop7ns3r.cn
什么是血脂高hcv9jop1ns4r.cn 五行缺什么怎么查询hcv8jop7ns1r.cn 胸部发炎是什么症状hcv9jop5ns9r.cn 阿拉是什么意思hcv9jop5ns6r.cn 植物纤维是什么面料naasee.com
百度