80 年代的计算机程序怎么这么小?
How were 80s computer programmes so small in size?
当您查看为 commodore64、atari 和 NES 等几台 80 年代的旧计算机编写的程序时,它们的大小非常小,most 范围为几百千字节。
更不用说这些计算机在 运行 上的内存非常小,例如 Commodore 64 有 64KB 的 RAM,但设法 运行 一个 GUI os!
这些程序是如何写得这么小的?
考虑到他们的硬件限制,他们中的许多人似乎令人难以置信。
在 commodore 64 上,其 320 x 200 @4bpp 的分辨率会吃掉其 64k 内存的一半
而 Atari 2600 只有 128 字节的内存
在当今的应用程序中,80% 或更多的磁盘大小是图形元素。
当 space 相对于程序员的时间而言是昂贵的时,程序员花费更多的时间来优化大小,并且经常去原始汇编。今天,space便宜,所以不花钱给一家公司省space。
将记事本与 Edlin 进行比较。两者都是针对其范例的最简单合理的文本编辑器。 Edlin 可以轻松地将程序和数据放入小于 64 K 的空间中。但是没有人可以声称记事本是图形化的 Edlin。
C64 没有 gui os。它有一个基本的菜单系统,熟练的程序员可以使用自定义硬件精灵来覆盖小图形图标。
在低分辨率模式下,每个像素有 4 位(16 种颜色)。在高分辨率模式下,每个像素有 1 位(单色)。今天的系统假设在 1080p(大约 1900 x 1080 像素)下每像素 16 位或更好。甚至单色显示器也从 8k 膨胀到我们将超过 1MB。对于期望 24 位色深或更好的现代显示器,单帧所需的最小存储空间为数兆字节。再加上 space 用于缓冲和现代图形卡所做的其他事情,您的图形不需要很长时间就需要 运行 千兆字节。那一代计算机上的高分辨率模式很少使用是有原因的。
加载程序时,卸载了 os。您 运行 一次只有一个程序。今天,我经常 运行 一次使用 20 个或更多应用程序,更不用说完成我的工作所需的数十个后台进程了。
我不能代表其他系统,但是对于 C64(和 C128)...
正如@pojo-guy 所说,我们经常直接进行汇编,这减少了操作系统的开销,因为 OS 在 ROM 中,所以它不使用 RAM。此外,您可以通过使用内存寄存器来翻转 ROM,实际上 "doubling" 可用内存(尽管其中一些 "available" 内存是只读的,关键是您没有在 OS 例程上浪费宝贵的 RAM)。通过使用 ROM 例程并使用直接汇编,消除了大量(内存)开销。
对于位图,您有两个选择:高分辨率或多色模式。在高分辨率 (320 x 200) 中,每个像素显示前景或背景颜色 - 因此您只需要 320 x 200 = 64,000 位或 8000 字节。
标准多色模式以水平分辨率为代价提供四种颜色。引用C64程序员参考手册:
Each dot in multi-colour mode can be one of 4 colours: screen colour (background colour register #0), the colour in background colour register #1, the colour in background colour register #2, or character colour. The only sacrifice is the horizontal resolution, because each multi-colour mode dot is twice as wide a a high-resolution dot. The minimal resolution is more than compensated for by the extra capabilities of multi-colour mode.
开销的减少、更简单的 OS(可以完全换出)和更简单的功能(例如 2 位颜色允许您有四种颜色),使事情变得更小。随着技术的改进,编码人员还应用了叠加:在播放其他部分的同时加载部分。
此外,更高级的体系结构(例如 C128)具有单独的视频 RAM(16K 或 64K,具体取决于您的 C128 型号),这提供了更多 space 来锻炼您的编码能力,因为图形(或text) 没有占用处理 space。
查看任何一个 4k 演示竞赛,看看内存占用如此小的机器到底能做什么。
由于C64是8位计算机,所有的汇编语言命令都是8位长。除此之外,它们后面可能还有 0-2 个数据字节。所以每个命令占用1-3个字节的ram。
现在,当我们转向更现代的系统时,CPU 通常已经是 64 位了。
基本上,所有 CPU 都有一些 "preferred sizes" 变量(它可以有效处理),通常,它与处理器的 "bits" 数量完全相同有。这通常是 "int" 在 C 中的含义(除了例外,它保证始终至少为 16 位,而显然 8 位 CPUs 上的 "preferred" 大小是 8 位)
所以对于一个整数,不管它有多小,使用这个"preferred size"是最有效的。
所以在 8 位系统上,那将是 8 位(显然不能是 int),而在 64 位系统上,那将是 64 位。所以大小是原来的 8 倍。
当然你可以使用更小的类型,但通常效率较低,而且通常,这也会影响结构填充。
但是对于指针,您经常受制于 CPU 的位数(因为您需要能够寻址整个内存范围)
虽然数据值通常更大,但汇编语言命令也更大。另一方面,这允许更复杂的命令,可以执行操作,这将需要更多的 8 位命令。
当然也有例外,比如ARM上设置的thumb命令
我的意思是,现代平台上的高效汇编语言代码比 C64 汇编语言需要更多 space(但限制较少,并且可以做一些奇特的事情,例如乘法/除法等)
至于 C64 上的图形操作系统,最著名的两个是 GEOS and Contiki。 Final Cartridge 3 也有一个内置的 windowing 系统,但是 iirc,只允许内置程序,而且没有任何有用的东西。
GEOS 相当 "restricted",不执行任何真正的多任务处理(您可以 select 哪个程序显示在 window 的主要区域,但是 f.ex.clock 总是 运行),基本上就是这样。而且就算限制了,也有f.ex。相当不错的文字处理器 (GEOWrite),我以前用过它。
Contiki 更 "modern"(实际上大部分是用 C iirc 编写的),而且它实际上比您想象的要简单得多。它以字符 gfx 模式运行(因此 1000 字节用于屏幕图形 0 2k 用于字符集,1k 颜色 ram),所以那里只浪费了 4k。
我想说 Contiki 比实际有用的操作系统更 "proof of concept",但与 GEOS 不同的是,它执行真正的(合作)多任务处理。
我猜您严重高估了真正简单的图形操作系统所需的条件。相反,您可以与 AmigaOS 进行比较,它在当时非常现代,但仍然相当小,并且在 CPU 上运行(内部)32 位,非常接近现代处理器。
当您查看为 commodore64、atari 和 NES 等几台 80 年代的旧计算机编写的程序时,它们的大小非常小,most 范围为几百千字节。
更不用说这些计算机在 运行 上的内存非常小,例如 Commodore 64 有 64KB 的 RAM,但设法 运行 一个 GUI os!
这些程序是如何写得这么小的?
考虑到他们的硬件限制,他们中的许多人似乎令人难以置信。 在 commodore 64 上,其 320 x 200 @4bpp 的分辨率会吃掉其 64k 内存的一半
而 Atari 2600 只有 128 字节的内存
在当今的应用程序中,80% 或更多的磁盘大小是图形元素。
当 space 相对于程序员的时间而言是昂贵的时,程序员花费更多的时间来优化大小,并且经常去原始汇编。今天,space便宜,所以不花钱给一家公司省space。
将记事本与 Edlin 进行比较。两者都是针对其范例的最简单合理的文本编辑器。 Edlin 可以轻松地将程序和数据放入小于 64 K 的空间中。但是没有人可以声称记事本是图形化的 Edlin。
C64 没有 gui os。它有一个基本的菜单系统,熟练的程序员可以使用自定义硬件精灵来覆盖小图形图标。
在低分辨率模式下,每个像素有 4 位(16 种颜色)。在高分辨率模式下,每个像素有 1 位(单色)。今天的系统假设在 1080p(大约 1900 x 1080 像素)下每像素 16 位或更好。甚至单色显示器也从 8k 膨胀到我们将超过 1MB。对于期望 24 位色深或更好的现代显示器,单帧所需的最小存储空间为数兆字节。再加上 space 用于缓冲和现代图形卡所做的其他事情,您的图形不需要很长时间就需要 运行 千兆字节。那一代计算机上的高分辨率模式很少使用是有原因的。
加载程序时,卸载了 os。您 运行 一次只有一个程序。今天,我经常 运行 一次使用 20 个或更多应用程序,更不用说完成我的工作所需的数十个后台进程了。
我不能代表其他系统,但是对于 C64(和 C128)...
正如@pojo-guy 所说,我们经常直接进行汇编,这减少了操作系统的开销,因为 OS 在 ROM 中,所以它不使用 RAM。此外,您可以通过使用内存寄存器来翻转 ROM,实际上 "doubling" 可用内存(尽管其中一些 "available" 内存是只读的,关键是您没有在 OS 例程上浪费宝贵的 RAM)。通过使用 ROM 例程并使用直接汇编,消除了大量(内存)开销。
对于位图,您有两个选择:高分辨率或多色模式。在高分辨率 (320 x 200) 中,每个像素显示前景或背景颜色 - 因此您只需要 320 x 200 = 64,000 位或 8000 字节。
标准多色模式以水平分辨率为代价提供四种颜色。引用C64程序员参考手册:
Each dot in multi-colour mode can be one of 4 colours: screen colour (background colour register #0), the colour in background colour register #1, the colour in background colour register #2, or character colour. The only sacrifice is the horizontal resolution, because each multi-colour mode dot is twice as wide a a high-resolution dot. The minimal resolution is more than compensated for by the extra capabilities of multi-colour mode.
开销的减少、更简单的 OS(可以完全换出)和更简单的功能(例如 2 位颜色允许您有四种颜色),使事情变得更小。随着技术的改进,编码人员还应用了叠加:在播放其他部分的同时加载部分。
此外,更高级的体系结构(例如 C128)具有单独的视频 RAM(16K 或 64K,具体取决于您的 C128 型号),这提供了更多 space 来锻炼您的编码能力,因为图形(或text) 没有占用处理 space。
查看任何一个 4k 演示竞赛,看看内存占用如此小的机器到底能做什么。
由于C64是8位计算机,所有的汇编语言命令都是8位长。除此之外,它们后面可能还有 0-2 个数据字节。所以每个命令占用1-3个字节的ram。
现在,当我们转向更现代的系统时,CPU 通常已经是 64 位了。
基本上,所有 CPU 都有一些 "preferred sizes" 变量(它可以有效处理),通常,它与处理器的 "bits" 数量完全相同有。这通常是 "int" 在 C 中的含义(除了例外,它保证始终至少为 16 位,而显然 8 位 CPUs 上的 "preferred" 大小是 8 位)
所以对于一个整数,不管它有多小,使用这个"preferred size"是最有效的。 所以在 8 位系统上,那将是 8 位(显然不能是 int),而在 64 位系统上,那将是 64 位。所以大小是原来的 8 倍。
当然你可以使用更小的类型,但通常效率较低,而且通常,这也会影响结构填充。
但是对于指针,您经常受制于 CPU 的位数(因为您需要能够寻址整个内存范围)
虽然数据值通常更大,但汇编语言命令也更大。另一方面,这允许更复杂的命令,可以执行操作,这将需要更多的 8 位命令。
当然也有例外,比如ARM上设置的thumb命令
我的意思是,现代平台上的高效汇编语言代码比 C64 汇编语言需要更多 space(但限制较少,并且可以做一些奇特的事情,例如乘法/除法等)
至于 C64 上的图形操作系统,最著名的两个是 GEOS and Contiki。 Final Cartridge 3 也有一个内置的 windowing 系统,但是 iirc,只允许内置程序,而且没有任何有用的东西。
GEOS 相当 "restricted",不执行任何真正的多任务处理(您可以 select 哪个程序显示在 window 的主要区域,但是 f.ex.clock 总是 运行),基本上就是这样。而且就算限制了,也有f.ex。相当不错的文字处理器 (GEOWrite),我以前用过它。
Contiki 更 "modern"(实际上大部分是用 C iirc 编写的),而且它实际上比您想象的要简单得多。它以字符 gfx 模式运行(因此 1000 字节用于屏幕图形 0 2k 用于字符集,1k 颜色 ram),所以那里只浪费了 4k。
我想说 Contiki 比实际有用的操作系统更 "proof of concept",但与 GEOS 不同的是,它执行真正的(合作)多任务处理。
我猜您严重高估了真正简单的图形操作系统所需的条件。相反,您可以与 AmigaOS 进行比较,它在当时非常现代,但仍然相当小,并且在 CPU 上运行(内部)32 位,非常接近现代处理器。