虽然理论上可以用任何一种语言编写BIOS,但现代现实是大多数BIOS是使用Assembly,C或两者的结合编写的。
BIOS必须以可以编译为机器代码的语言编写,物理硬件机器可以理解。这消除了适合编写BIOS的直接或中间解释的语言(Perl,Python,PHP,Ruby,Java,C#,JavaScript等)。(尽管从理论上讲,一种可以实现这些语言中的一种,以直接编译为静态机器代码,或者可以某种方式将解释器嵌入BIOS中。例如,有一个Java 的废弃GCJ项目。)
大多数OEM通过扩展American Megatrends和Phoenix Techologies等公司的专有通用BIOS实现来实现BIOS 。(您以前可能已经在计算机的第一个启动屏幕上看到过这些公司中的一个。)这些实现的源代码不是公开可用的,但是其中一些已经泄漏。我不想直接将其链接到C和汇编源代码,但是Internet上有很多地方可以讨论此源代码,以供那些希望窥视的人参考。
一些硬件制造商,例如那些针对高性能和游戏市场的制造商,其BIOS实现以定制功能,统计数据和为其确切实现而设计的有吸引力的用户界面饱和。其中许多功能超出了American Megatrends和其他公司生产的通用产品所提供的功能。不幸的是,这些公司经常将其源代码的发布视为安全隐患,因此对这些高端实现知之甚少,因为对其的了解很少。当然可以找到访问和反编译此类BIOS实现的方法,但是这样做可能很困难,甚至可能是非法的。
回到最初的问题,由于需要产生本机代码,因此必须以本机代码编译器支持的编程语言来实现BIOS 。尽管有许多种这样的语言,并且我确定在过去的几十年中,已经在实验中使用了几种语言,但我能够找到的每种开放BIOS实现都特别依赖于C和/或汇编的结合。我研究过的开源BIOS实现包括OpenBIOS,tinyBIOS,coreboot,Intel BIOS和Libreboot。。我还研究了一些非常旧的BIOS实现,这些实现今天不相关,但也遵循C和/或汇编规则。
我认为查看其他直接与硬件交互的软件也很重要。例如,我们知道Linux内核,OS X内核和Windows内核在很大程度上是C语言,具有用于某些特定任务的某些汇编语言和一些高级语言。我们也知道,在Linux硬件驱动程序,并在Windows硬件驱动程序在很大程度上C.写
回到BIOS,我认为考虑所选编程语言的经济性也很重要。通常写BIOS是补充硬件销售的必要条件。众所周知,现代BIOS系统很大程度上是用C和/或汇编语言编写的。转向其他工具会给通常被认为是商品的产品增加可观的成本,这可能对销售产生非常不利的影响。在不涉足经济学101的情况下,我可以向您保证,偏离OEM已经偏离数十年来久经考验的可靠工具,这可能不值得。
当然也有并且还将有爱好者项目来编写BIOS。到目前为止,这些似乎也选择了C和/或汇编。也许有一天将使用其他技术。但是,今天,选择已经很明确了。