在最近的一篇文章中,嵌入式系统顾问Jacob Beningo提出了一个问题,即是否是时候退役C编程语言了,因为它在复杂性和潜在错误以及C开发人员短缺方面的局限性。作为回应,Andrei Gorine 认为 C 的紧凑占用空间使其比 Java、C# 和 Go 等资源密集型现代语言更具竞争力。
此外,C 语言直接控制应用程序行为和内存的能力使其成为需要近距离访问硬件资源(如中断和外围设备)的系统的唯一可行选择。对于嵌入式设备尤其如此,因为它们的基础操作系统、驱动程序和相关 API 也倾向于用 C 语言编写。
但是,这种高度灵活的控制级别可能会导致运行时行为出现问题。无论 C 语言最终是否停用,开发人员都需要当今的工具来确保应用程序的安全性和可靠性不会因人为错误或嵌入式设备日益互联而受到损害。开发人员需要像管理高级语言一样管理 C,以增强应用程序的安全性和可靠性。
托管 C 与非托管 C
C 语言与现代语言(如 Java、JavaScript 和 Python)之间的主要区别之一是后者的实现是托管的。这意味着代码由运行时环境执行,该运行时环境确保其在内存边界、安全原则和优化范围内正确管理和执行。
相比之下,C 语言是非托管的,这意味着程序员必须手动管理内存分配和释放。这使得代码更容易受到安全漏洞的影响,例如缓冲区溢出和内存泄漏。权衡是 C 代码通常比托管代码更快、更高效,但需要更多的努力来编写和维护。
下面是托管 C 代码和非托管 C 代码之间主要区别的摘要:
托管代码 | 非托管代码 |
由公共语言基础结构(运行时)执行 | 由处理器编译和执行 |
不会发生内存缓冲区溢出 | 可能发生内存缓冲区溢出 |
提供内存保护并降低内存泄漏的风险 | 内存不受保护,分配函数和指针使用不当会导致内存损坏和系统崩溃 |
提供异常处理和内存清理等服务 | 不提供这些服务 |
可以轻松移植到不同的平台,因为运行时环境抽象了硬件和操作系统的细节 | 无法轻松移植,需要工程团队经常从头开始 |
运行时环境强制实施安全功能,例如类型安全和访问控制 | 开发人员负责编写安全可靠的代码,这可能会增加出错的风险 |
将两全其美相结合:C 应用程序与用高级语言编写的应用程序的可靠性
软件容器使开发人员能够在运行时环境中有效地管理 C 应用程序,尽管内存分配仍然需要手动管理。这是因为容器化为每个应用程序提供了一个安全且隔离的空间,从而降低了由于内存错误而导致系统崩溃的可能性。
托管 C 中的动态链接允许安装新包,而无需开发人员重新编译整个程序,从而节省开发时间。此功能传统上与 Linux 相关联,现在可以通过使用小型软件容器获得,并在支持热代码替换的同时提供增强的可移植性和安全性。
MICROEJ VEE是一个微型软件容器的一个例子,它为托管C,Java和JavaScript应用程序提供了沙盒机制。所有组件都由同一个运行时环境管理,确保安全可靠的共存。通过这种方法,工程师可以重复使用组件,确信它们将可靠、安全地工作。
使用安全软件容器来隔离每个应用程序,允许用不同编程语言编写的多个应用程序无缝共存,从而提供了显着的优势。通过将托管 C 与安全容器相结合,这种方法弥合了嵌入式和企业开发之间的差距。托管 C 提供了 C 的灵活性,同时使开发人员无需管理安全内存、多任务同步和执行其他低级任务。
这种方法还有助于在 C 语言中集成遗留代码和现有软件堆栈。这对于实现用嵌入式 C 语言编写的协议特别有用,包括云连接器、Matter、LWM2M 和 MQTT。它也是MISRA C指南的补充,因为它克服了低级健壮性和安全问题。最后,像 MICROEJ VEE 这样的容器允许动态链接,这意味着托管 C 可以动态链接和取消链接,就像用 VEE 容器支持的任何其他语言编写的代码一样。
将托管和非托管 C 组合在一起以获得最佳结果
使用安全软件容器并不意味着需要管理所有 C 代码。在像 MICROEJ VEE 这样的虚拟执行环境中,非托管 C 代码(也称为本机代码)仍然可以发挥作用。所有直接与硬件和CPU寄存器接口的低级驱动程序和板级支持包都应在C语言中保持不受管理的状态,以最好地利用C与硬件的紧密联系。
相比之下,对于更复杂的应用程序任务,使用托管代码更方便、更高效。由于关注点分离,托管代码提高了工作效率并减少了错误,并使代码更具可移植性。
托管和非托管代码库仍可以通过抽象层和本机接口以受控方式进行交互。它称为简单本机接口或 SNI,它允许任何托管代码调用本机函数、传递参数、获取返回值并在专用空间中操作共享内存。
托管代码中的高级堆栈和非托管代码中的低级别硬件接口的这种拆分提供了理想的组合。
托管 C:未来的 C 语言
在复杂且不断变化的开发环境中,开发人员必须能够访问利用最新硬件创新的尖端软件和语言解决方案。尽管 C 语言是嵌入式开发中的领先语言,但仍需要使用工具和流程来管理其运行时行为,这些工具和流程可以释放托管代码的所有优势,以加速创新。
通过简化开发过程并将安全性和可靠性卸载到运行时,托管 C 使开发人员能够提高其应用程序的健壮性、安全性和可移植性,同时保持熟悉的编程语言。随着技术的不断发展,采用托管 C 代码解决方案的开发人员将能够更好地创建创新、安全和可靠的连接产品。
全部0条评论
快来发表一下你的评论吧 !