Изначально файл .COM
представлял собой буквенный двоичный объект с кодом 8086 (то есть 16-разрядным x86). Он предназначен для загрузки по фиксированному адресу, и загрузчик сразу переходит к первому байту своего адреса. Размер также ограничен.
Файл .EXE
содержит больше информации заголовка. Поэтому ему необходимы структуры для таких вещей, как динамическое связывание, когда код из DLL может быть исправлен в область памяти .EXE
во время загрузки. Первоначально он был получен из DOS, но сегодня используется в Windows.
Однако DOS и Windows в конечном итоге обратились к модели, в которой расширение файла в .COM
и .EXE
ничего не значило. Загрузчик программы сначала проверяет первые два байта файла. Если это будет строка MZ
(в легенде это означает инициалы раннего сотрудника Microsoft ), она будет обрабатываться как EXE
, в противном случае она будет загружаться так, как если бы она были COM
файл. Так как MZ
не соответствует разумной инструкции x86 для запуска программы, они могут сойти с рук. Чистый эффект: в некоторых версиях DOS / Windows имя .EXE
может быть названо .COM
и наоборот. Например, во многих версиях DOS / Windows знаменитая COMMAND.COM
была на самом деле EXE
.
Я не уверен, насколько предыдущий абзац применим к версиям Windows на базе NT. Я предполагаю, что к настоящему времени они вообще отказались от .COM
.
Наконец, файл .BAT
представляет собой список команд, которые должны быть выполнены, как если бы вы вводили их в командной строке. Однако в наши дни большинство людей называют их .CMD
.