前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust 视界】为什么要在医学成像中使用Rust?对下一代系统的现代技术的思考

【Rust 视界】为什么要在医学成像中使用Rust?对下一代系统的现代技术的思考

作者头像
张汉东
发布2021-10-13 11:35:06
1.1K0
发布2021-10-13 11:35:06
举报
文章被收录于专栏:Rust 编程Rust 编程

原文来自于 BMD Software[1]

“BMD 软件有一款远程诊疗软件产品叫 NeoScreen,是基于MS/MS技术的新生儿筛查项目决策支持的完整平台,可以检测与代谢性疾病相关的异常。

现代数字成像技术带来了大量的创新和巨大的有用的应用。从医疗研究到达的那一刻起,医生就可以在他们的工作站上,甚至是在医疗中心以外的地方通过移动设备轻松方便地看到高质量的成像系列。联合图片存档和通信系统(PACS)可以从多个登记处收集病人的全部历史,并通过电子邮件向病人发送摘要。在几秒钟内,计算机辅助诊断系统通过人工智能提供对临床病例和第二意见的洞察力,以帮助决策支持过程。

与此同时,由于采集设备供应的增加、图像质量的提高以及COVID-19大流行期间健康问题的加剧,对医学成像的需求也全面增加。同样不局限于放射科,随着时间的推移,新的成像模式的涌现和接受也是有目共睹的,如病理科,这些也为医疗信息系统的实施者带来了他们自己的要求和挑战。

在这些期望下,总是有机会评估我们的软件所基于的底层技术栈,作为提供高质量系统的持续努力,同时改善关键特性,如效率、性能、稳定性和功能交付周期的快速性。在开发新的或现有的软件时,决定采用何种编程语言对这些特性有直接影响。在接下来的几节中,我将介绍医学影像系统中经常使用的一些技术的优点和局限性,并解释 Rust 如何能很好地适合你即将到来的项目。

对 Rust 的宣传

那么,为什么Rust是这篇文章的重点呢?虽然大多数技术都选择了不同层次的语言复杂性和运行时要求来实现它们的目标,但在极大程度上,Rust是能够“吃到蛋糕的”。Rust通过实现以下三方面的目标,获得了几个方面的优点。

没有垃圾收集器的内存安全和并发性

许多企业系统使用Java作为语言和基础生态系统。他们对Java虚拟机的依赖提供了一种统一的软件交付方式,因为编译后的软件包可以在任何支持的平台上执行。这很少是一种负担,但如果有必要,解耦是特别棘手的。Java内存模型在处理类值时引入了许多低效率,一旦程序需要大量使用内存,这些低效率就会增加。随着时间的推移,垃圾收集已经有了很大的发展,但它仍然是一个不受欢迎的开销的来源,不仅在Java中,而且在其他依赖它的运行时,如Go和JavaScript。

相比之下,在嵌入式系统和老式软件中更常见的层面上,C++仍然是医学成像中非常相关的编程语言。它的核心原则能够以最小的开销编写强大的抽象,使它适合于需要高性能和资源效率的操作。它的表达能力也是严重问题的窗口,因为该语言并不阻止程序员编写内存不安全的代码。未定义行为是一个大多数程序员不必担心的概念,但在C或C++中,它是一段代码中的一个小错误会造成不可预知的灾难的原因。在医疗成像系统中,一个被利用的不良内存访问的漏洞可能会转化为停机时间,提供不准确的信息,甚至是受损的医疗数据。

Rust 展示了如何在没有动态垃圾收集器或大量运行时组件的情况下,通过在编译时跟踪资源作用域来实现内存安全。任何一种资源,无论是内存中的向量、文件描述符、网络套接字,还是其他任何东西,一旦超出其范围,就会被自动管理和释放,而不会引入非确定性的开销。

由于编译器的借用检查系统,资源可以被安全地共享给程序的各个部分,而没有引入不一致、数据竞赛或在资源已经被释放后使用的风险。"无畏的并发 "这个说法有点过时了,但仍然可以描述Rust中并发编程的体验,因为所有产生数据竞赛的企图都被编译器阻止了,而且由于有Rayon这样的库,现有代码的并行化往往是一件容易的事情。

没有开销的生产力(Productivity)和能力(Power)

Rust包含了许多我们在编程语言生态系统中学过且期待的资源,即一个标准的构建工具、提示和格式化工具,以及一个包管理器。Cargo,标准的Rust构建工具,准备用来构建项目,通过可扩展的子命令以多种方式维护项目,并管理依赖树。因此,在一个Rust软件项目上工作通常是一种非常精简和统一的体验。

即使只是在语言层面,你也会发现强大的结构,如和类型、模式匹配、闭包、类型推理、泛型编程和宏。像C++一样,在纯Rust中创建的许多抽象被优化到完成任务所需的最小机器代码,就像在更高层次上没有使用抽象一样。这种现象被称为 "零成本抽象"。一个强大的语言可以被用来编写任何领域的优秀API和终端用户应用程序,同时考虑到性能问题。

这就与依赖重度运行时的技术形成了对比,如Java,它不仅内存效率低下,而且缺乏许多其他语言中常有的构造和保证,如元组类型、内联数组切片、常数正确性以及对原始值的可变引用。其他有用的功能,如变量类型推导和记录,只是在最近才被引入该语言。

稳定(Stability)但不停滞(Stagnation)

Java现代迭代的缓慢采用也是技术债务的潜在来源:据估计,超过80%的生产中的Java软件在2020年仍然使用Java 8,一个7年多前发布的主要版本。在撰写本文时,Java 16是最新的稳定版本,每六个月就会有新的版本发布。

Rust编译器每六周有新版本发布,几乎总是与为以前版本编写的代码完全兼容。还实施了一个版次(Edition)机制,这样就可以在一个新的版次下对语言进行实质性的修改(比如引入新的关键字和语法),而不会破坏与另一个版本编写的组件的兼容性。截至今天,"2015 "和 "2018 "版次已经到位,"2021 "版次即将到来。

虽然它被描绘成一种现代技术,但Rust在创建生产软件领域肯定不是不成熟的。大大小小的公司都对Rust进行了投资,通常都取得了明显的积极成果。此外,一些公司已经将Rust用于与医学成像信息学有关的各种任务,如成像数据处理管道和可视化的体素渲染器。`DICOM-rs`[2]是一个正在积极开发的开源项目,旨在成为 DICOM 标准 在纯Rust中的参考性开放实现,并与其他知名的DICOM框架一样实用(仅举几例:Java的 dcm4che;C++的DCMTKGDCM;python的pydicom)。总的来说,用于处理 DICOM数据 的各种技术有时可能感觉不是很成熟,但仍然是成熟的实验,充满了机会。

另一个经常被提起的问题是Rust的非典型的学习曲线。一般来说,该语言特有的概念可能会让人觉得有点难以掌握,特别是一旦编译器开始拒绝代码,通常与生命周期、借用检查器或UTF-8字符串操作有关,而这些代码在第一眼看去似乎没有问题。例如,试图在同一个结构中存储一个值和对该值的引用是被编译器禁止和阻止的,因为仅仅移动结构的行为就会使引用无效。再比如,大多数语言都会让你轻松地获取一个字符串中的第n个字符,但有可能碰到字符边界或在非ASCII字符的字符串中获取错误的信息,而Rust要求你遍历一个字符的迭代器。随着经验的积累,这些障碍会变得更容易克服,在开发过程中也会更早地遵循避免这些障碍的惯用模式。在这一过程中,Rust编译器配备了友好的、阐明性的错误信息,这也是其他技术中很少见的主要好处。

结论

像任何工程尝试一样,应该确定或估计项目中某个特定决定的好处和坏处,技术栈就是其中之一。在决定是否在一个即将到来的项目中使用Rust时,要考虑以下问题。

  • 关键业务逻辑是否主要是I/O密集,或者也是CPU密集。
  • 从长远来看,你的项目在扩展时是否会面临性能问题。
  • 软件将在什么样的设备上有效运行。
  • 你目前的开发团队在Rust方面的经验如何,以及你是否愿意投入时间和金钱进行培训。

你今天就可以通过一些很好的资源开始学习Rust,包括在线免费提供的官方书籍。Stack Overflow上也有各种有趣的Q&A。Rust社区也有几个值得关注的场所。

参考资料

[1]

原文来自于 BMD Software: https://www.bmd-software.com/news/why-rust-in-medical-imaging-a-reflection-on-modern-technologies-for-next-generation-systems/

[2]

DICOM-rs: https://github.com/Enet4/dicom-rs

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 觉学社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对 Rust 的宣传
    • 没有垃圾收集器的内存安全和并发性
      • 没有开销的生产力(Productivity)和能力(Power)
        • 稳定(Stability)但不停滞(Stagnation)
        • 结论
          • 参考资料
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档