17、JR 扩展与开发执行全解析

JR 扩展与开发执行全解析

1. JR 扩展语法

JR 在 Java 基础上进行了扩展,增加了额外的语句、类型等。其扩展语法采用了类似 Java 语言规范(JLS)第 18 章的表示方法,遵循以下约定:
- BNF 符号用斜体表示,终结符号(即标记)用等宽字体表示。例如,括号作为 BNF 符号表示为 ( ) ,作为标记表示为 ( )
- [x] 表示 x 出现零次或一次。
- {x} 表示 x 出现零次或多次。
- x|y 表示 x 或 y 中的一个。
- 每个规则的多个可选部分放在不同行,行之间默认有隐式的 |
- 每个规则中定义的非终结符有后缀:
- (JLS) 表示该非终结符在 JLS BNF 中定义,此处的规则是对 JLS BNF 的补充。
- (new) 表示该非终结符在 JLS BNF 中未定义,完全在此处定义。

部分语法相关说明如下:
- 该 BNF 与 JLS BNF 类似,具有“覆盖性”。例如,JLS BNF 允许冲突的修饰符,但在语言定义中不允许,会由翻译器检查。JR BNF 也有类似情况,如 receive 1;
- 调用调用发生在通过调用语句调用操作或作为表达式的一部分时,如 f() x = g(3)/10 ,其中 f g 是操作或能力。
- InniArmOp (或接收语句)中的表达式通常是直接命名要服务操作的标识符,也可以是命名能力变量的标识符,其值是要服务的操作,还可以是计算为操作能力的任何表达式。
- CapOrOpDeclFormalParameters FormalParameters 类似,只是标识符是可选的。而 OpMethodDecl 要求指定标识符。
- 量词的第一个表达式必须指定一个新变量。
- 有趣的是,所有尝试过的 Java 实现都允许在形式参数规范中混合使用标识符和括号,JR 实现遵循 Java 实现,也允许这种混合。

2. 额外关键字

以下是 JR 相对于 Java 的额外关键字及其简要用途说明:
| 关键字 | 用途 |
| — | — |
| as | 调用视图语句的分支 |
| by | 输入语句中的调度表达式 |
| call | 同步调用 |
| cap | 能力类型声明 |
| forward | 转发调用 |
| handler | 异常操作处理程序指定符 |
| inni | 输入语句(用于会合和接收) |
| no op | 能力常量值(不执行任何操作) |
| op | 操作声明 |
| over | 选择方法 |
| P | 信号量原语 |
| process | 进程缩写 |
| receive | 接收语句 |
| remote | 远程对象指定符 |
| reply | 回复语句 |
| sem | 信号量声明 |
| send | 异步调用 |
| st | 输入语句中的同步表达式 |
| V | 信号量原语 |
| view | 视图调用 |
| vm | 虚拟机 |
| with | 选择方法 |

3. 额外类

以下额外类的详细信息见附录 B:
| 类 | 用途 |
| — | — |
| ArmEnumeration | 选择方法 |
| Invocation | 选择方法 |
| InvocationEnumeration | 选择方法 |
| Timestamp | 选择方法 |

4. 额外预定义方法
方法 用途
oper.length() 返回操作 oper 的挂起调用数量
JR.exit(int status) status 作为退出状态退出程序
JR.registerQuiescenceAction(cap void() q) q 注册为静止操作
5. 额外预定义字段
字段 用途
r.remote 对象引用 r 的远程引用(通常用作 this.remote
vm.thisvm 此对象所在虚拟机的引用
6. 额外预定义异常
异常 抛出情况
edu.ucdavis.jr.QuiescenceRegistrationException JR.registerQuiescenceAction 失败
7. 调用和枚举类

这些类用于实现操作间调用选择机制,属于 edu.ucdavis.jr 包,提供了便于实现不同选择算法的方法。

7.1 ArmEnumeration 方法
  • hasMoreElements() :测试此枚举是否包含更多元素。如果包含至少一个更多元素返回 true ,否则返回 false
  • nextElement() :如果此枚举对象有至少一个更多元素,则返回下一个元素。如果没有更多元素,抛出 NoSuchElementException
  • reset() :将枚举重置到基础元素组的开头。
  • size() :返回基础容器中的元素数量。
7.2 InvocationEnumeration 方法
  • hasMoreElements() :测试此枚举是否包含更多元素。如果包含至少一个更多元素返回 true ,否则返回 false 。如果发生 RemoteException 则抛出。
  • nextElement() :如果此枚举对象有至少一个更多元素,则返回下一个元素。如果没有更多元素,抛出 NoSuchElementException ;如果发生 RemoteException 则抛出。
  • reset() :将枚举重置到基础元素组的开头。如果发生 RemoteException 则抛出。
  • size() :返回基础容器中的元素数量。如果发生 RemoteException 则抛出。
7.3 Invocation 方法
  • getTimestamp() :返回调用的逻辑时间戳。
7.4 Timestamp 方法
  • equals(Object obj) :将此对象与指定对象进行比较。如果参数不为 null 且是包含相同逻辑时间戳值的 Timestamp 对象,则结果为 true
  • compareTo(Timestamp anotherTimestamp) :对两个 Timestamp 对象进行数值比较。如果此 Timestamp 等于参数 Timestamp ,返回 0;如果此 Timestamp 在时间上先于参数 Timestamp ,返回小于 0 的值;如果此 Timestamp 在时间上后于参数 Timestamp ,返回大于 0 的值。
  • compareTo(Object obj) :将此 Timestamp 对象与另一个对象进行比较。如果对象是 Timestamp ,行为与 compareTo(Timestamp) 相同;否则抛出 ClassCastException
8. 程序开发与执行
8.1 翻译和执行基础

JR 程序代码存于 .jr 后缀的文件中,开发和执行步骤如下:

graph LR
    A[.jr 文件] --> B[jrc 工具]
    B --> C[Java 代码]
    C --> D[Java 翻译器]
    D --> E[Java 字节码]
    E --> F[jr_rmic 工具]
    F --> G[适配 RMI 的字节码]
    G --> H[jrrun 工具]
    H --> I[在 JVM 上执行]

此外,还有简化工具:
- jr :结合基本翻译和执行步骤。
- jrgo jrgox :是 jr jrrun 更简单的版本,适用于大多数程序。具体使用细节可参考 JR 网页。

8.2 预处理器

有三个预处理器用于 JR:
- ccr2jr :将使用条件临界区(CCRs)形式编写的源代码转换为 JR 代码。
- m2jr :将使用监视器形式编写的源代码转换为 JR 代码,支持多种不同的监视器信号机制。
- csp2jr :将用通信顺序进程(CSP)变体编写的源代码转换为 JR 代码。具体命令行选项可参考手册页。

8.3 多处理器程序

在单处理器上执行 JR 程序时,JR 进程以交错方式一次执行一个。在共享内存多处理器上,JR 实现支持真正的并发,两种情况都使用底层 Java 实现。

8.4 分布式程序

如果 JR 程序显式使用虚拟机,则被视为分布式程序,与执行时管理器 jrx 协作执行。当 JR 程序首次创建 vm 实例时, jrx 自动启动。
创建新虚拟机的方式有两种:
- 最简单的方式是使用字符串表达式给出机器的符号名称。
- 指定现有虚拟机,新虚拟机将与现有虚拟机共置。

分布式 JR 程序只能使用用户有权限访问的网络主机,用户在所有这些主机上的登录名必须相同,且程序可分布在运行相同版本 JR 实现的机器上。当在主机上创建虚拟机时, jrx 管理器使用 rsh 命令在远程主机上启动 JR 程序的执行,代码根据需要从启动程序执行的主机加载到远程主机。

8.5 自动终止

JR 程序的默认行为是在程序静止时终止,可通过 jr jrrun 的命令行选项 -implicit -explicit 控制:
- -implicit 指定默认行为。
- -explicit 要求程序自行终止,如通过 JR.exit(0)

默认情况下,程序终止时不输出任何内容,可通过 jrrun -verbosity 选项指定正的“详细程度”级别来改变。这些选项不能与 jrgo jrgox 一起使用。

8.6 注意事项和陷阱
  • 调用 noop 的返回值未定义。
  • 静态与非静态进程的区别。
  • 量词中变量不匹配。
  • 传递对象引用。
  • 跨虚拟机传递对象引用和可序列化性。
  • 新虚拟机执行开始的目录。
  • 同步和调度表达式中的副作用。
  • GUI 程序过早自动终止。
  • 在操作超出作用域后使用操作。
9. 实现与性能

JR 实现主要有两个组件:翻译器和运行时系统(RTS)。

9.1 翻译器

JR 翻译器扩展了 SUN 的 JDK 1.2.1 中的 Java 编译器,以支持 JR 特定功能。此扩展大部分较为直接,但需要修改以允许将变量用作方法来支持能力。翻译器将 JR 程序转换为标准 Java 程序,由 JR 运行时系统支持。

9.2 运行时系统(RTS)

RTS 用标准 Java 实现,为编译后的程序提供执行环境,支持创建虚拟机、远程对象、调用和服务操作以及通过网络加载类文件。
当用户启动 JR 程序时,RTS 在本地物理机上创建一个 JR 虚拟机(JRVM),初始化后执行程序的 main 方法。每个 JRVM 在单个 Java 虚拟机中执行,JRVM 之间使用 Java 的远程方法调用(RMI)交换消息。RTS 对可执行程序隐藏网络细节,当发起对另一台机器上服务的请求时,通过 RMI 在远程机器上远程执行相应方法,请求结果通过标准 RMI 方法返回。

以下是 RTS 对不同组件的具体实现:
- JR 虚拟机 :每个 JR 虚拟机是一个小型 Java 程序,在标准 Java 虚拟机之上提供一层薄的封装以允许远程对象创建。创建新虚拟机时,线程需联系集中式虚拟机管理器 JRX,JRX 联系物理主机并启动 jrvm 程序。虚拟机创建后,通过远程方法调用联系 JRX 注册自己,然后将虚拟机引用返回给实例化线程,以便后续在该虚拟机上创建远程对象。

graph LR
    A[线程] --> B[联系 JRX]
    B --> C[JRX 联系物理主机]
    C --> D[启动 jrvm 程序]
    D --> E[虚拟机注册到 JRX]
    E --> F[返回虚拟机引用给线程]
  • 远程对象 :使用 new 表达式在本地或远程虚拟机上创建。执行 new 表达式时,通过 RMI 联系要创建对象的虚拟机,传递对象类型、构造函数参数类型和参数。虚拟机使用 Java 反射创建对象实例,创建后返回远程“引用对象”给实例化线程。这些“引用对象”是 java.io.Serializable 代理对象,包含对远程对象类中定义的每个操作的引用,操作引用实际上是实现了 java.io.Serializable 接口的操作能力。
    • 远程类加载 :JR 运行时系统要求程序所需的类文件可通过发起主机(程序最初执行的主机)的 CLASSPATH 访问。创建远程对象时,通过自定义网络类加载器从发起主机的 JRX 对象获取必要的类文件,减少用户设置工作量,无需单独的服务器提供文件访问。
  • 操作和操作能力
    • 由方法服务的操作实现为 ProcOp 对象,操作调用转换为 ProcOp 对象中相应方法的调用。
    • inni 语句服务的操作实现为 InOp 对象,包含一个消息队列,用于存储每次调用的参数。所有操作都实现 java.rmi.Remote 接口,允许从远程主机调用方法。
    • 操作能力是实现 java.io.Serializable 接口的对象,包含对相应签名特定操作的引用,可在网络上传递,调用操作原语时会转发到实际操作对象。
  • 调用语句
    • 同步调用 :操作的同步调用(即 call )直接转换为等效的 Java RMI 语句,调用目标操作对象支持的 call 方法。如果操作由方法服务, call 方法调用实际服务方法;如果由 inni 语句服务, call 方法将包含调用实际参数的消息放入操作的调用队列并阻塞,直到消息被服务。
    • 异步调用 send 语句实际上是半同步的,实现为对对应操作对象的 send 方法的 RMI 调用。 ProcOp send 方法生成一个新线程执行关联方法后返回,释放调用线程; InOp send 方法将包含实际参数的消息放入调用队列后返回,此策略会使调用者暂时阻塞。
  • 输入语句 :输入语句是语言中最复杂的语句,实现也最复杂。它可以服务多个操作之一,使用同步和调度表达式或 with/over 子句选择要处理的调用。操作可以由多个线程中的输入语句服务,这些线程会竞争处理调用。
    • 类用于识别和控制试图服务相同调用的线程之间的冲突,根据 inni 语句中操作的存在动态创建。操作类是“由相同输入语句服务”关系的传递闭包的等价类。
    • 运行时,执行 inni 语句时,确定其操作类,RTS 用一个公共锁表示每个类,同一类中的操作共享此锁,用于同步消息到达并存储等待访问该类的线程列表。
    • 一次最多允许一个线程访问给定类结构中操作的挂起调用,线程按先来先服务的顺序访问类中的挂起和新调用。同步和调度表达式以及 with/over 子句由可执行程序评估,而非 RTS,这样做可减少 RTS 处理复杂度,且只有使用这些表达式的线程会承担评估开销。
  • 静止检测 :JR 支持自动静止检测机制,当所有线程阻塞时,可导致程序终止或调用操作。由于 Java 未提供简单可靠的检测方法,且当前 JR 实现未修改 Java 虚拟机,静止检测在用户级别实现。在生成的代码中,异步调用创建线程时记录“线程诞生”,线程终止时记录“线程死亡”。如果 JR 虚拟机空闲,通知 JRX,JRX 确定所有 JR 虚拟机空闲且无消息在传输时,执行静止操作(默认是程序终止)。
9.3 性能结果

使用多个微基准测试研究 JR 程序相对于等效 RMI 程序的性能,实验在 2 GHz Intel Pentium 4 工作站集群上通过 10 Mbps 以太网网络进行,使用 SUN 的 JDK 1.4.2.01 和 Linux 内核 2.4.20 - 8。
- 空方法调用
| 测试内容 | 结果 |
| — | — |
| 多次调用 JR 中的空 ProcOp 和 Java 中的空方法 | JR 方法调用比标准方法调用大约慢十四倍,这是因为当前 JR 实现中 ProcOp (或 InOp )的调用需要额外的方法调用来支持操作的动态分派、消息的因果排序、静止检测和通信异常处理。通过类似方法的实现技术可减少操作动态分派的开销,编译器级别的进一步优化可消除因果排序调用,减少本地操作调用的开销。 |
- 远程对象中的空方法调用
| 测试内容 | 结果 |
| — | — |
| 多次调用 JR 中的空 ProcOp 和使用标准 RMI 的空方法 | 性能差异归因于当前 JR 实现中方法调用的固有开销。远程方法调用开始时,调用操作能力的 call 方法,该方法再调用 ProcOp call 方法,通过 RMI 将参数传输到远程主机,在远程主机上, ProcOp call 方法调用用户定义的实际方法。 |
- 读者 - 写者程序
| 解决方案 | 性能情况 |
| — | — |
| JR 中使用 inni 语句的解决方案 | 性能不如其他两种解决方案,性能差异归因于当前 inni 语句公平性语义的实现。在读者 - 写者实验中,很大比例的时间用于从当前挂起的调用中选择要服务的调用,因为所有调用都要检查直到找到满足分支 st 子句的调用,而在该程序中 st 子句不引用调用参数,若 st 子句为 false ,会不必要地检查操作中的所有调用。可将 st 子句从生成代码的选择循环中提取出来进行优化。 |
| JR 中类似信号量的解决方案 | 使用 JR 的信号量缩写,这些缩写转换为对 InOp send receive 操作。进一步优化 InOp 进程公平性代码可提高此解决方案的性能。当 RMI 服务器在每次测试之间重启时,JR 信号量解决方案性能优于 RMI 解决方案,因为重启服务器会降低 Java 即时编译器(JIT)对 RMI 解决方案的有效性。 |
| RMI 解决方案 | 使用类似信号量的方法解决读者 - 写者问题。 |
- Java Grande 论坛傅里叶基准测试
| 程序版本 | 执行方式 |
| — | — |
| 标准顺序版本 | Java 实现 |
| JR 分布式版本 | 使用异步消息传递启动每个计算,然后使用 inni 语句收集结果 |
| RMI 分布式版本 | 使用线程并发启动远程方法调用并收集结果 |

通过对 JR 扩展语法、关键字、类、方法、程序开发执行以及实现和性能的详细分析,我们可以更全面地了解 JR 语言及其应用,在实际开发中根据需求合理选择和使用 JR 相关特性,同时可以根据性能测试结果对程序进行优化。

提供了一个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值