22、铁路模型模拟与Ada 95在计算机工程教育中的应用

铁路模型模拟与Ada 95在计算机工程教育中的应用

铁路模型模拟系统介绍

在铁路模型模拟系统中,每个模型由三种对象组成:一个或多个火车、道岔和触点,每个对象都由唯一的编号标识。 Train_Handler 包提供了处理火车、道岔和触点以及模型本身的常量、类型和过程。从 Train_Handler 导出的过程包括 Inquire_Train Init_Model Disable_Model Set_Switch Wait_Contact Stop_Train Set_Train_Speed 等。

火车由任务控制,关键资源(道岔、共享路段等)的管理由受保护对象完成。触点是被动实体,仅由火车激活。 Wait_Contact 过程特别重要,它会阻塞每个调用的 Ada 任务,直到火车经过作为参数指定的触点,这是检测火车位置的唯一方法。

一般来说,每个火车的编号和速度由用户在执行 Inquire_Train 时提供。火车会被放置在两个触点之间,第一个指定的触点定义了前进方向。

火车路线建模

学生工作的第一步主要是用 Ada 95 对火车的路线进行建模。这些路线可以分解为一系列触点,前提是该序列能完整定义路线。以下是相关代码示例:

Commercial_Speed: constant Speed_Type := 12;
Low_Speed:        constant Speed_Type := 6;
type Segm_Type is 
record
    Contact: Nb_Contact_Type;  -- At the end of the segment
    Speed:   Speed_Type;       -- Speed on the segment
end record;
type Journey_Type is array (Natural range <>) of Segm_Type;
First_Journey:  aliased Journey_Type:= 
( (Contact=>19, Speed=> Commercial_Speed),
  (Contact=>20, Speed=> Low_Speed),
  ...
  (Contact=>22, Speed=> Low_Speed),
  (Contact=>13, Speed=> Commercial_Speed) );
Second_Journey: aliased Journey_Type:= ...;
Third_Journey:  aliased Journey_Type:= ...;
Fourth_Journey: aliased Journey_Type:= ...;
火车行为建模

在示例中,每个火车由相同任务类型的任务对象建模,因为火车行为相同,只是路线不同。路线由一个判别式定义,其值是指向静态别名结构的指针。以下是火车任务的代码:

task type Train (Journey: access Journey_Type);  
task body Train is
    Nb_Train:    Nb_Train_Type;
    Speed_Train: Speed_Type;
    Next_Resource, -- A resource is always bounded by contacts
    Current_Resource: Model_Controller.Nb_Resource_Type;
begin
    Inquire_Train (Journey(Journey’First).Contact,
                   Journey(Journey’Last).Contact,
                   Nb_Train, Speed_Train);
    Model_Controller.Allocate (Journey(Journey’Last).Contact,
                               Journey(Journey’First).Contact,
                               Current_Resource);
    for Nb_Current_Journey in 1..Max_Journey loop
        for Index in Journey’First..Journey’Last loop
            declare
                Current_Segment:Segm_Type renames Journey(Index);
                Next_Segment: Segm_Type renames
                    Journey((Index+1) mod Journey’Length);
            begin
                Stop_Train(Nb_Train,Speed_Train);
                Model_Controller.Allocate
                    (Current_Segment.Contact,Next_Segment.Contact,
                     Next_Resource);
                -- Switches setting done in Model_Controller.
                Set_Speed_Train(Nb_Train,Speed_Train);
                Wait_Contact(Current_Segment.Contact);
                Model_Controller.Release(Current_Resource);
                Current_Resource := Next_Resource;
            end;
        end loop;
    end loop;
    Stop_Train(Nb_Train);
end Train;
begin
    Init_Model;
    declare            -- One task per train.
        Santa_Fe:        Train(First_Journey’Access);
        Western_Union:   Train(Second_Journey’Access);
        Union_Pacific:   Train(Third_Journey’Access);
        Western_Pacific: Train(Fourth_Journey’Access);
    begin
        null;
    end;
    Disable_Model;
end;

道岔的处理包含在 Model_Controller 中。如果由触点定义的资源已分配给火车,道岔将设置为火车行驶的方向。 Model_Controller 可以优化共享轨道段的分配。

模型和资源管理

路线可能有共同的路段,因此这些路段必须建模为以触点为边界的资源,以避免碰撞。路段资源的分配和释放必须作为关键资源处理。火车任务不知道资源的建模,它们唯一可用的信息是路线(触点序列)。

有几种资源分配算法可以说明 Ada 的范式和特性:
- 第一种解决方案 :基于控制器任务的入口族,但需要先进行声明,如果路段资源已分配给其他火车任务,会出现延迟阻塞,这是典型的 Ada 83 算法。
- 第二种解决方案 :也基于控制器任务,使用该任务的私有入口重新排队,这是 Ada 95 引入的新功能。调用控制器处理更容易,但可能会阻塞。以下是相关代码:

Wait_Contact(Current_Segment.Contact);
Stop_Train(Nb_Train);
Controller.Allocate(Current_Segment.Contact,
                    Next_Segment.Contact);
-- Switches setting done in Controller.
Set_Speed_Train(Nb_Train,Speed_Train);
... -- Pass the railroad segment.
Wait_Contact(Current_Segment.Contact); 
Controller.Release;

Model_Controller 包体详细说明了这种控制器的内部结构、调用算法和重新排队机制。以下是 Model_Controller 的代码:

with Ada.Task_Identification;  use Ada.Task_Identification;
package body Model_Controller is
    type Path_Type is 
        record
            State:        State_Type := Free;
            -- Switches on the route crossing a resource:
            Nb_Switches:  Nb_Switches_Type := 0;
            Switches_List:Switches_List_Type;
        end record;
    type All_Paths_Type is array (Nb_Resource_Type) of Path_Type;
    All_Paths: All_Paths_Type;
    -------------------------------------------------------------
    protected Controller is
        entry Allocate (Entry_Contact, 
                        Exit_Contact: in     Nb_Contact_Type; 
                        Nb_Resource:     out Nb_Resource_Type); 
        procedure Release;
    private
        entry Wait_Resource (Nb_Resource_Type)
                       (Entry_Contact, 
                        Exit_Contact: in     Nb_Contact_Type; 
                        Nb_Resource:     out Nb_Resource_Type);
        ...
    end Controller;
    protected body Controller is
        function Search (Entry_Contact,
                         Exit_Contact: Nb_Contact_Type)
                         return Nb_Resource_Type is ...;
        procedure Hold(Nb_Resource  : in Nb_Resource_Type;
                       Calling_Task : in Task_Id) is ...;
        procedure Make_Free is ...;
        function  Path_Free (Path: Path_Type) return Boolean is...;
        entry Allocate(Entry_Contact,
                       Exit_Contact: in     Nb_Contact_Type; 
                       Nb_Resource:     out Nb_Resource_Type)
            when True is
        begin
            Nb_Resource := Search(Entry_Contact, Exit_Contact);
            if not Path_Free(All_Paths(Nb_Resource)) then
                requeue Wait_Resource(Nb_Resource);
            end if;
            Hold(Nb_Resource, Allocate’Caller);
        end Allocate;
        entry Wait_Resource (for Nb_Ress in Nb_Resource_Type)
                       (Entry_Contact, 
                        Exit_Contact: in     Nb_Contact_Type; 
                        Nb_Resource:     out Nb_Resource_Type)
            when Path_Free(All_Pathes(Nb_Ress)) is
        begin
            Hold(Nb_Ress, Wait_Resource’Caller);
            Nb_Resource := Nb_Ress;
        end Wait_Resource;   
        procedure Release is
        begin
            Make_Free;  -- Function Current_Task used.
        end Release;
    end Controller;
    -------------------------------------------------------------
    procedure Allocate(Entry_Contact,
                       Exit_Contact: in Nb_Contact_Type) is
        Nb_Resource: Nb_Resource_Type;
    begin
        Controller.Allocate(Entry_Contact, Exit_Contact,
                            Nb_Resource);
        Set_Resource_Switches(Nb_Resource);
    end Allocate;
    procedure Release is
    begin
        Controller.Release;
    end Release;
end Model_Controller;

在分配过程中, Search 函数返回由两个触点界定的资源。如果穿过资源的路径空闲, Hold 过程会分配该资源;否则,调用会重新排队到 Wait_Resource 私有入口,当资源空闲时调用会被接受。 Release 操作释放授予火车的互斥锁。

模拟器在实验室的应用

学生通常对模拟非常感兴趣。在铁路模型模拟器的情况下,游戏元素增强了软件的吸引力,许多学生非常热情。研究生经常将使用模拟器的编程工作视为一项有趣的活动。

指导火车的动态方面体现了并发编程领域的典型抽象现象。学生不仅在火车得到正确管理时欣赏这些情况,而且在不可避免地发生碰撞时,也能发现算法中潜在的概念或实现错误。

与真实模型相比,模拟器提供了调试功能,因为模拟和应用程序代码之间有很强的交互,错误检测更容易。使用模拟器还可以显著减少为真实模型开发应用程序的时间和测试时间,这对于作业的构思和修正也是如此。

Ada 95 在乌克兰计算机工程教育中的应用

乌克兰位于东欧,计算机科学和计算机行业有着悠久的传统。该国在计算机领域有很大的发展潜力,目前计算机行业正在迅速发展,需要大量计算机科学和计算机工程方面的专业人才。

乌克兰的计算机工程教育由多所技术大学提供,提供的学位包括计算机工程学士(4 年)、专家(工程师,1 - 1.5 年)和硕士(1.5 - 2 年)。目前,计算机工程课程中使用的编程语言多样,如下表所示:
| 课程 | 语言 |
| ---- | ---- |
| 编程 | Pascal, C |
| 系统编程 | 汇编器, C |
| 建模 | Pascal |
| 并行编程 | Ada |
| 面向对象编程 | C++ |
| 数值方法 | Pascal |
| 实时系统 | Pascal |
| 嵌入式系统 | 汇编器, Pascal |
| 安全 | Pascal |
| 分布式计算 | Ada, Java |

Ada 在乌克兰越来越受欢迎,应用领域包括航空电子、航天、银行系统、医学、冶金、地铁和铁路等。乌克兰的教师和研究人员正在关注国外的 Ada 95 材料,并且正在创建 “Ada in Ukraine” 协会。

目前,Ada 仅在并行和分布式计算课程中使用。建议将 Ada 95 作为乌克兰计算机工程的核心语言,因为它可以改善学生在计算机科学方面的基础,帮助他们更好地理解现代软件概念。在 “系统编程”、“建模” 和 “数值方法” 等课程中使用 Ada 也会有很好的效果。

项目主要目标

“将 Ada 95 作为乌克兰计算机工程教育的基础语言” 项目的目标包括:
- 研究欧美大学在教学中使用 Ada 语言的经验。
- 在乌克兰大学中适应 Ada。
- 开发在计算机工程课程中教授 Ada 95 的方法。
- 合作编写并在乌克兰出版新的 Ada 95 教科书。

综上所述,铁路模型模拟系统展示了 Ada 95 在并发编程和资源管理方面的强大功能,而将 Ada 95 引入乌克兰计算机工程教育有望提升学生的编程能力和对现代软件概念的理解。

铁路模型模拟与Ada 95在计算机工程教育中的应用(续)

选择 Ada 95 作为核心语言的优势分析

将 Ada 95 作为乌克兰计算机工程教育的核心语言,具有多方面的显著优势。下面从不同课程角度进行详细分析:
- 编程课程 :编程课程是计算机工程学生接触的第一门编程课程,选择合适的编程语言至关重要。根据美国军事学院的研究,在该课程中使用 Ada 能有效提升学生在计算机科学方面的基础。学生可以更好地理解不同类型的抽象概念、模块和库的使用、面向对象编程思想、异常处理以及分离编译等现代软件概念。这些概念是后续深入学习和实际项目开发的基石。
- 系统编程课程 :Ada 具有强大的系统编程能力。它可以直接操作底层硬件,对内存和资源进行精细控制。在系统编程中,需要处理复杂的硬件交互和资源管理,Ada 的强类型检查和严格的语法规则能有效减少错误,提高代码的可靠性和可维护性。
- 建模和数值方法课程 :Ada 丰富的数据类型和强大的运算能力使其在建模和数值计算方面表现出色。它可以方便地定义复杂的数据结构,进行高精度的数值计算。在建模过程中,能够准确地模拟各种系统的行为;在数值方法课程中,能高效地实现各种算法。
- 并行编程和分布式计算课程 :Ada 本身就是为并发编程设计的,具有内置的任务和同步机制。在并行编程中,可以轻松创建多个任务并发执行,提高程序的执行效率。在分布式计算中,能够方便地处理不同节点之间的通信和同步,确保系统的稳定性和可靠性。

Ada 95 教学方法的探讨

为了在乌克兰大学中更好地教授 Ada 95,需要开发合适的教学方法。以下是一些可行的教学方法建议:
1. 案例教学法 :通过实际的铁路模型模拟系统等案例进行教学。让学生在实际项目中学习 Ada 95 的使用,了解如何运用 Ada 95 解决实际问题。例如,在教学过程中,详细讲解铁路模型模拟系统中火车路线建模、行为建模以及资源管理等部分的代码实现,让学生在实践中掌握 Ada 95 的语法和编程技巧。
2. 项目驱动教学法 :布置相关的项目任务,让学生以小组形式完成。在项目实施过程中,学生需要自主查阅资料、设计算法、编写代码并进行调试。教师在项目过程中提供指导和反馈,帮助学生解决遇到的问题。通过项目驱动,学生能够提高自己的实践能力和团队协作能力。
3. 对比教学法 :将 Ada 95 与其他编程语言进行对比教学。例如,在讲解 Ada 95 的面向对象编程特性时,可以与 C++ 进行对比,让学生了解不同语言在实现相同功能时的差异和优缺点。通过对比,学生能够更好地理解 Ada 95 的特点和优势。

新 Ada 95 教科书的编写思路

编写新的 Ada 95 教科书是项目的重要目标之一。以下是编写教科书的一些思路:
- 内容全面性 :教科书应涵盖 Ada 95 的基础知识、语法规则、高级特性以及实际应用等方面。不仅要详细讲解语言本身的知识,还要结合计算机工程领域的实际需求,介绍如何运用 Ada 95 进行系统开发。
- 案例丰富性 :书中应包含大量的实际案例,如铁路模型模拟系统、航空电子系统等。通过这些案例,让学生更好地理解 Ada 95 在不同领域的应用,提高学生的实践能力。
- 教学适用性 :教科书的编写应符合教学规律,内容由浅入深,循序渐进。每章应包含学习目标、重点难点、例题讲解和课后练习等部分,方便教师教学和学生学习。

项目实施的流程规划

为了确保 “将 Ada 95 作为乌克兰计算机工程教育的基础语言” 项目的顺利实施,需要制定详细的流程规划。以下是项目实施的主要步骤:
1. 研究阶段(第 1 - 3 个月)
- 组建研究团队,包括乌克兰各大学的教师和研究人员。
- 收集欧美大学在教学中使用 Ada 语言的相关资料,进行深入研究和分析。
- 总结欧美大学的成功经验和不足之处,为后续的教学方法开发和课程改革提供参考。
2. 适应阶段(第 4 - 6 个月)
- 在乌克兰部分大学进行 Ada 95 教学试点。
- 根据试点情况,对 Ada 95 课程进行调整和优化,使其更符合乌克兰大学的教学实际。
- 建立 Ada 95 教学资源库,包括教学课件、案例代码、在线测试等,为教师教学和学生学习提供支持。
3. 教学方法开发阶段(第 7 - 9 个月)
- 基于研究阶段的成果和适应阶段的反馈,开发适合乌克兰大学的 Ada 95 教学方法。
- 组织教师进行教学方法培训,提高教师的教学水平。
- 在部分课程中应用新的教学方法,进行教学效果评估。
4. 教科书编写和出版阶段(第 10 - 12 个月)
- 组建教科书编写团队,根据编写思路进行教科书的编写工作。
- 邀请专家对教科书进行审核和修改,确保教科书的质量。
- 联系出版社进行教科书的出版发行。

项目实施的预期效果

通过实施该项目,预期将取得以下效果:
- 学生能力提升 :学生在计算机科学方面的基础将得到显著改善,能够更好地理解现代软件概念,提高编程能力和解决实际问题的能力。
- 课程质量提高 :计算机工程课程的质量将得到提升,课程内容更加符合实际需求,教学方法更加科学有效。
- 行业影响力增强 :Ada 95 在乌克兰计算机工程领域的应用将得到推广,提高乌克兰在计算机工程领域的国际影响力。

mermaid 格式流程图:项目实施流程
graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A([开始]):::startend --> B(研究阶段):::process
    B --> C(适应阶段):::process
    C --> D(教学方法开发阶段):::process
    D --> E(教科书编写和出版阶段):::process
    E --> F([结束]):::startend
总结

铁路模型模拟系统充分展示了 Ada 95 在并发编程和资源管理方面的强大功能。将 Ada 95 引入乌克兰计算机工程教育,不仅能够提升学生的编程能力和对现代软件概念的理解,还能推动乌克兰计算机工程教育的发展,为乌克兰培养更多适应现代社会需求的计算机专业人才。通过实施 “将 Ada 95 作为乌克兰计算机工程教育的基础语言” 项目,有望实现教学质量的提升和行业影响力的增强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值