cmd.exe 是用哪种编程语言编写的?

4

命令提示符,也称为cmd.exe或cmd(根据其可执行文件名),是Windows NT、Windows CE、OS/2和eComStation操作系统上的命令行解释器。它是DOS和Windows 9x系统中COMMAND.COM的对应物(在这些系统中也称为“MS-DOS提示符”),类似于Unix-like系统上使用的Unix shell。

来源:维基百科

我已经到处搜索,但无法得到这个问题的答案。

每个网站都专注于cmd.exe中使用批处理语言,但我找不到它所写的语言。


所以我的问题是:

Windows命令提示符或cmd.exe是用哪种语言编写的?


1
可能是C或C++,但你为什么想知道呢?你打算用这个答案做什么? - CodeCaster
1
你可能会对ReactOS感兴趣,它有一个用C语言编写的cmd源代码版本:https://doxygen.reactos.org/db/d4f/base_2shell_2cmd_2cmd_8c_source.html - L. Scott Johnson
2
他们几乎完全使用C、C++和C#来开发Windows。一些代码区域是手工调整/手写汇编的。相对于CMD,C#是新技术,用于最新的层次,使用汇编语言创建CMD并不是一个好主意,所以很可能是C或C++,正如@CodeCaster所说。当你阅读Windows操作系统的故事时,你会看到Unix对Windows内核的重要影响,并且你会得出结论,CMD是用C编写的,现在可能开始使用C++(或两者都有)。如果你找到了答案,请给我们一个链接,我想确认我的结论:p - Mabrouki Fakhri
4
它所依赖的导入文件很可能是C和C++混合编写的。CRT函数(如longjmp,calloc,free)表明它包含C代码,可能很古老,可以追溯到command.com时代。它显然还使用了C++异常处理,C++是他们最近的代码开发选择。混合编写并不罕见。 - Hans Passant
1
CMD是为OS/2编写的(由微软和IBM合作开发)。最初NT应该是NT OS/2,但IBM和微软之间的业务合作结束了。微软将主用户界面切换到Windows,然后将CMD移植到其新的Win32 API。cmd.exe很可能不与用汇编语言编写的DOS COMMAND.COM共享代码,而CMD需要用可移植的C语言编写。 - Eryk Sun
显示剩余4条评论
2个回答

4
打开文本编辑器后,该文件包含路径onecore\base\cmd\maxpathawarestring.cpp,这表明至少有一个源文件是用C++编写的。 Hans Passant的补充说明:

它所依赖的导入使它很可能是C和C++混合编程。CRT函数如longjmpcallocfree表明它是C代码,可能是古老的,回溯到command.com时代。显然,它还使用了C++异常处理,C++是他们所有最近代码开发的首选武器。混合编程并不罕见。

以及eryksun
在调试器下很明显,CMD的最新添加是用C++编写的。x cmd!*::*显示了大量使用C++的std命名空间。
但CMD仍然主要是C而不是C++。它的命令和支持函数是实现为C函数,例如eExiteChdirParseStatementSearchForExecutableExecPgm。他们没有将所有这些旧的C代码移植到面向对象的设计中。
因此,我会选择C和C++混合使用。

我想补充一下,旧代码库中存在某些已成为事实上功能的错误,这些错误可能永远不会被修复,并且在进行完整的C++重构时可能很难复制。 - jwdonahue

2
根据微软的 Rich Turner 的官方确认,Cmd最初是用C语言编写的。

Cmd是一个完全用'C'编写的Win32应用程序-这很重要,因为NT的一个关键目标是在许多不同的处理器和机器架构之间实现可移植性。

https://devblogs.microsoft.com/commandline/rumors-of-cmds-death-have-been-greatly-exaggerated/

但是现在有部分代码已经迁移到了C++。
在Windows控制台内部
Windows控制台是一个传统的Win32可执行文件,虽然它最初是用'C'编写的,但随着团队对控制台代码库进行现代化和模块化,许多代码正在迁移到现代C++。
对于那些关心这些事情的人:许多人问Windows是用C还是C++编写的。答案是尽管NT采用了面向对象的设计,但与大多数操作系统一样,Windows几乎完全是用'C'编写的。为什么?C++会在内存占用和代码执行开销方面增加成本。即使在今天,用C++编写的代码的隐藏成本也可能会令人惊讶,但在20世纪90年代末,当内存成本约为每MB 60美元(是的...每兆字节60美元!)时,vtables等隐藏的内存成本是相当显著的。此外,虚方法调用间接引用和对象解引用的成本可能导致C++代码在当时受到非常显著的性能和规模惩罚。虽然仍需要小心谨慎,但现代计算机上现代C++的性能开销已经不再是一个太大的问题,通常可以作为安全、可读性和可维护性方面的权衡考虑。这就是为什么我们正在逐步升级控制台的代码到现代C++的原因。 Windows命令行:在Windows控制台内部 如果你深入研究最新的 Windows 控制台内部结构,你会发现它使用了MapCollection,这表明它可能使用了一些C++/CX

Windows Console Text Buffer Architecture

从上到下(原始缓冲区的蓝色方框): - `ScreenInfo` - 维护有关视口等的信息,并包含一个`TextBuffer` - `TextBuffer` - 将控制台文本区域表示为行的集合 - `Row` - 唯一地表示控制台中的每个`CharRow`和应用于每行的格式属性 - `CharRow` - 包含一组`CharRowCells`,以及处理行包装和导航的逻辑和状态 - `CharRowCell` - 包含实际单元格的文本,以及包含特定单元格标志的`DbcsAttribute`字节
如果您感兴趣,则`conhost.exe`也已经开源,以新的Windows终端的形式。
Windows控制台主机conhost.exe是Windows原始的命令行用户体验。它实现了Windows的命令行基础结构,并负责托管Windows控制台API、输入引擎、渲染引擎和用户首选项。此存储库中的控制台主机代码是Windows自身中conhost.exe构建的实际源代码。
您可以在https://github.com/microsoft/terminal找到更多详细信息的很好的文章。
Windows命令行博客中也可以找到更多详细信息的好文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接