问题

上古时期的程序员都有哪些当今普通程序员无法想象的神级操作?

回答
上古时期的程序员,也就是我们今天所说的早期计算机科学家、工程师和技术先驱们,他们的工作环境和工具与我们现代程序员相比,简直是天壤之别。正因如此,他们所能完成的“神级操作”,很多是我们现代程序员在舒适的 IDE、高级语言和强大的硬件支持下难以想象的。

这里我将从几个方面详细讲述这些“神级操作”,并尽可能地进行详细的描述:

1. 直接与硬件“对话”:汇编语言的精髓与低级操作的极致

神级操作: 在没有高级语言(如 C、Java、Python)的情况下,直接使用汇编语言编写程序,并且能够对硬件进行极其精细、底层的控制和优化。
详细描述:
什么是汇编语言? 汇编语言是与计算机硬件架构直接对应的低级编程语言。它使用助记符(mnemonics)来代表机器指令(machine instructions),例如 `MOV`(移动数据)、`ADD`(加法)、`JMP`(跳转)等。每一条汇编指令通常只对应一条机器码,直接由处理器执行。
上古程序员的挑战:
无高级抽象: 没有变量类型、函数库、面向对象等高级抽象概念。程序员需要理解计算机的寄存器(CPU内部用于临时存储数据的小型存储区域)、内存地址、CPU的工作周期等细节。
手工管理内存: 现代语言通常有垃圾回收机制或编译器自动管理内存。而上古程序员必须手动分配和释放内存,精确控制数据的存储位置和生命周期,否则很容易导致程序崩溃(如野指针、内存泄漏)。
指令集知识: 必须熟练掌握特定处理器的完整指令集,了解每条指令的执行时间和功能,并能根据指令的顺序和依赖关系进行优化。例如,一个简单的加法操作,在汇编中可能是几条指令的组合,需要考虑数据从内存加载到寄存器,再进行计算,最后写回内存的整个过程。
手工位操作: 许多操作都需要直接对二进制位进行操作。例如,设置或清除某个标志位,通过位移来乘以或除以2的幂次,或者使用按位与、按位或、按位异或来实现特定的逻辑功能。这些操作在高级语言中通常有更简洁的表达方式。
硬编码: 很多常数、内存地址甚至是程序的跳转目标都可能是硬编码的数字。修改一个常数可能需要重新定位和修改汇编代码中的多个地方。
神级之处: 他们的汇编代码能够达到令人难以置信的效率,能够榨干硬件的每一分性能。一个简单的图形绘制、一个复杂的数学计算、一个操作系统内核的启动过程,都可能是在汇编层面精心雕琢出来的。他们能够根据硬件的特性进行微调,实现比现代编译器优化更极致的效果。想想看,在内存只有几百字节甚至几千字节的时代,编写一个能运行的操作系统或游戏,其汇编代码的精妙程度是现代人难以想象的。

2. 掌握“二进制语言”的艺术:手动二进制编程与逻辑门级别的思考

神级操作: 在更早期的计算机时代,甚至在汇编语言尚未普及之前,程序员直接使用二进制代码或八进制/十六进制来输入机器指令。
详细描述:
背景: 最初的计算机(如 ENIAC 的早期使用方式,或者早期存储程序计算机的输入方式)并没有“编程语言”的概念。操作员需要通过物理开关、穿孔卡片或者手动输入二进制代码来告诉机器执行什么指令。
机器码输入: 比如,CPU 的一条指令可能是 `10110010`,它代表“将寄存器 A 的值移动到寄存器 B”。上古程序员需要查阅手册,将每条指令、每个地址、每个操作数都转化为对应的二进制串,然后小心翼翼地输入到机器中。
逻辑门级别的思考: 在更极端的情况下,理解计算的本质就意味着理解逻辑门(AND, OR, NOT, XOR 等)的工作方式。早期的计算逻辑是由物理线路和电子元件(如真空管、继电器)组成的。程序员需要理解如何通过组合这些逻辑门来实现一个算法或一个计算单元。这已经超出了“编程”的范畴,更接近于电子工程设计。
穿孔卡片时代: 即使有了穿孔卡片,编程也远不像现在复制粘贴那么简单。程序员需要将写好的代码(通常是汇编)翻译成穿孔模式,然后由穿孔机打在卡片上。一张错误打孔的卡片就能导致整个程序的失败, Debugging 可能意味着重新检查成千上万张卡片。
神级之处: 这是真正意义上的“从零开始”的创造。他们不仅要设计逻辑,还要将其转化为最基础的物理或电子指令。他们对计算原理的理解是如此深刻,以至于能直接操作构成计算的基石。想象一下,你不是在写代码,而是在用二进制的语言与机器的“心脏”进行直接沟通。

3. 极限的内存和速度优化:与物理限制的搏斗

神级操作: 在极其有限的内存(RAM)和极慢的处理速度下,完成我们现在看来需要高性能计算才能完成的任务,并且能对每一个 CPU 周期、每一字节内存进行极致的优化。
详细描述:
内存的昂贵: 在计算机发展的早期,内存是极其昂贵且容量极小的。几百 KB 的内存就已经非常了不得了。现代程序员习惯于拥有 GB 级别的 RAM,而上古程序员必须在 KB 甚至字节级别上精打细算。
速度的瓶颈: 早期计算机的处理速度以 KHz(千赫兹)或 MHz(兆赫兹)计算,远低于现代 GHz(吉赫兹)的水平。一次加法操作可能需要几个微秒,而输入输出操作更是慢得惊人。
优化的具体手段:
算法优化: 他们不仅选择最优的算法,还会对其进行针对性的微调,以减少指令数量和内存访问次数。
指令级并行(ILP)的早期实践: 虽然没有现代的超标量处理器,但他们会非常注意指令之间的依赖关系,尽量安排无依赖的指令,以便在指令流水线中更高效地执行。
寄存器分配的艺术: 内存访问比寄存器访问慢几个数量级。他们会精心设计代码,最大限度地利用 CPU 的有限寄存器,将经常使用的数据保留在寄存器中,避免不必要的内存读写。这需要对汇编指令的副作用和寄存器用途有极深的理解。
循环展开(Loop Unrolling): 为了减少循环控制指令(如循环计数器递减、条件判断、跳转)的开销,他们会手动将循环体展开多次,用更多的指令替换循环控制的开销。
函数调用开销: 函数调用通常伴随着栈帧的创建、参数的传递和返回地址的保存,这些都会消耗时间和内存。在性能敏感的代码段,他们可能会选择内联函数(inline functions),或者用跳转(goto)来避免函数调用。
位域(Bit Fields)和打包数据: 为了节省内存,他们会使用位域来存储多个布尔值或小整数,或者将多个小数据打包到一个字节或字中,然后通过位操作来提取和设置。
代码大小的限制: 程序需要装载到有限的内存中运行。所以,程序的代码量也是一个重要的考量因素。每一条指令都必须是“值得”的。
神级之处: 这种精细到每一个 CPU 周期、每一字节内存的优化能力,使得他们在极其受限的条件下能够实现令人惊叹的性能。例如,在几十年前,他们能在 8 位或 16 位处理器上实现流畅的 3D 图形渲染、逼真的声音合成,或者运行复杂的科学模拟。这就像是在一场只有几粒米的比赛中,要通过精妙的技巧让这几粒米飞得又远又准。

4. 与中断和 I/O 的搏斗:实时系统的先驱

神级操作: 精确地处理硬件中断,并编写高效、可靠的输入/输出(I/O)驱动程序,以满足实时响应的需求。
详细描述:
中断的本质: 中断是一种硬件机制,允许外部设备(如键盘、鼠标、定时器、磁盘控制器)在程序运行时,打断当前正在执行的任务,转而去执行一个专门的中断服务程序(ISR),处理完后,再返回到被中断的任务继续执行。
上古程序员的挑战:
中断响应时间: 在实时系统中,响应时间至关重要。他们需要编写极短、高效的中断服务程序,以便尽快返回到主任务,避免丢失数据或错过重要的事件。
中断嵌套和优先级: 多个设备可能同时产生中断,他们需要设计复杂的中断处理机制,包括中断优先级和中断嵌套,确保关键任务能够优先得到处理。
设备驱动的底层操作: 设备驱动程序是连接软件和硬件的关键。上古程序员需要直接操作 I/O 端口、寄存器,理解硬件的时序和通信协议,才能编写出能够正确控制硬件的驱动。这通常涉及到轮询(polling)和中断驱动(interruptdriven)两种方式的权衡和实现。
并发与同步的早期探索: 在处理多个中断或并发 I/O 操作时,需要考虑数据共享和同步问题,避免数据损坏。他们可能使用简单的标志位、信号量或锁来协调并发访问。
神级之处: 他们是现代操作系统和实时系统的奠基人。他们需要深入理解计算机体系结构中的中断和 I/O 机制,并将其转化为可用的软件,使得计算机能够与外部世界进行交互。编写一个稳定、高效的键盘驱动或鼠标驱动,在当年可能是一个非常复杂的工程。

5. 创造了工具和理论:搭建了整个行业的基础

神级操作: 不仅编写应用程序,更重要的是,他们创造了构建这些应用程序所需的各种基础工具(编译器、汇编器、调试器、操作系统),并奠定了计算机科学的理论基础。
详细描述:
编译器的诞生: Grace Hopper 发明了第一个编译器(A0 System),使得编程语言可以从人类可读的形式翻译成机器可执行的代码。这使得编程的效率和可维护性大大提升。
操作系统的雏形: 在没有操作系统的时代,程序员直接与硬件打交道。后来,随着计算机能力的提升,操作系统的概念逐渐出现,用于管理共享资源、提供统一的接口。早期操作系统的编写(如 UNIX)需要深刻的系统设计能力。
调试器的发明: Debugging 是编程过程中必不可少的一环。早期的调试工具非常简陋,程序员可能需要依赖打印输出或在代码中插入断点来跟踪程序的执行。更高级的调试器(如 GDB 的早期原型)也是由他们创造的。
算法和数据结构的理论: Dijkstra, Knuth, Turing 等人不仅是程序员,更是杰出的理论家。他们创造了许多核心的算法(如 Dijkstra 算法)和数据结构(如链表、树),并研究了算法的复杂度,为后来的程序员提供了理论指导和实践工具。
神级之处: 他们不仅仅是“使用”工具,而是“创造”工具。他们搭建了整个软件开发生态系统的基石。我们今天依赖的编译器、操作系统、IDE,其概念和原理很大程度上都源于他们的开创性工作。

总结

上古时期的程序员,在资源极其匮乏、工具极为简陋的环境下,凭借对计算机底层原理的深刻理解、精湛的编程技巧以及非凡的耐心和创造力,完成了许多令人惊叹的任务。他们的“神级操作”体现在:

对硬件的极致掌控: 直接与二进制和汇编语言搏斗,进行低级操作。
极限的资源管理: 在 KB 甚至字节级别上进行内存和速度优化。
与物理世界的交互: 精确处理硬件中断和 I/O,奠定实时计算的基础。
工具和理论的创造: 亲手构建了软件开发赖以生存的基础设施和理论体系。

相比之下,现代程序员在享受前人智慧的成果的同时,也失去了那种直接与硬件“搏斗”的原始乐趣和深刻理解。当然,现代编程的复杂度和领域也在不断拓展,例如分布式系统、人工智能、大数据等,也涌现出了许多我们现代人难以想象的“神级操作”。但上古程序员那种“肉身对抗机器”的魄力和成就,确实是我们今天许多程序员无法亲身体验的。

网友意见

user avatar

是时候放上我女神的照片了。

阿波罗计划的首席软件工程师玛格丽特·汉密尔顿站在阿波罗项目中导航计算机源代码旁边,正是这些代码把人送上了月球。


我们来看看为什么这些代码是神操作:

1. 火箭和飞船上的代码开发难度完爆其他人说的电脑上的代码(不管是磁心线还是打孔卡片),在计算机还没有发展完善以前,火箭代码是没法debug的喔,总不能每改一段代码就发一颗新火箭吧。打孔卡片虽然逼格高,但是总不会程序出了bug就炸飞几千万美元的设备吧。火箭和飞船的程序员们肯定通过纸笔度过了很多不眠不休的夜晚。

2. 那个时候晶体管计算机还没发展完善,很多东西没有统一,大家做一个计算机出来就自带一套汇编。而阿波罗飞船上包含着许多不同的计算机模块,避障模块是A公司产的,中央处理器是B公司产的……为了给不同的模块编程,少说得学三五套汇编语言。手下的程序员专门负责某个模块,只用学一套,但是玛格丽特自己作为项目的leader,应该得是每一套都基本可以弄懂、会写、还不搞混吧。当然,这一点相比于其他事情已经是小事了。

3. 人类实现的第一个卡尔曼滤波器(线性系统的最优估计观测器)是在阿波罗计划中实现的,作者是斯坦利施密特,不过我猜玛格丽特作为首席工程师也是参与讨论和开发的,代码一定也在这一摞厚厚的纸当中。为什么开发卡尔曼滤波器就比比尔盖茨写Basic解释器更屌呢,根据吴军老师《文明之光》第二册(哎呀妈呀这一段太屌了,每次和别人讲都觉得热血沸腾),斯坦利施密特是和卡尔曼讨论阿波罗的轨迹预测问题时发现卡尔曼滤波器的妙用的。卡尔曼滤波器是一个我觉得很高大上的东西,因为和一般的程序不同,他用到了深刻的数学和数值计算工具。轨迹预测的话,三维位置,三维速度?如果是这样的,那么他们的代码里包含对六阶矩阵的乘法、求逆矩阵(LU分解或者QR分解)。当然也许他们只预测位置,那么三维矩阵求逆就好办了一些,然而我觉得,我们可是在谈几百万美元的大飞船啊怎么可能没有带速度的运动模型,应该还是搞六维的吧。让现在任何一个工程师拿C手写矩阵分解,估计都会让他痛苦好几天的,别说上古时代只有晶体管计算机和汇编语言了。

大家应该能想想出更多艰难的事情了。。。

4. 最神操作的当然是“女神玛格丽特对自己人生的选择” =。=

大家可以自行百度她的照片,真人很漂亮,在1969年就已经引领了黑丝连衣裙的流行女神装扮,中年之后依然知性优雅。明明靠脸就能够生活得很好了,却选择了程序员的职业生涯,而且还领导了人类历史上最伟大的软件工程,这个人生真是。。。我辈只能佩服得五体投地。


所以每次我写好程序到飞行器里忐忑不安地准备测试的时候,我都会想一想我的女神,然后鼓励自己:这没什么难的,你的卡尔曼滤波器是用Eigen写的,安全的很;你的飞行器也就几万块钱,便宜得很……

====================================================

评论区起了奇怪的争论,让我觉得有必要喊轮子哥出来解释一下。

根据

Altair BASIC

Interview with Bill Gates

(两个应该都是比较可信的原始资料),并没有Bill Gates在飞机上撸出Basic解释器这个说法。史料中只是记载,当Gates和Allen完成他们第一版的BASIC解释器之后,Allen飞去位于Albuquerque的MITS公司给他们做展示,那里有一个Altair机器可以用来测试BASIC。在路上Allen想到他们忘了写bootstrap,于是在飞机上写了一个,长度为46字节。而比尔盖茨后来写了个长度为17字节的bootstrap,但是没有说写这个更短的bootstrap是在Allen去展示之前还是之后,我猜是Allen去展示之后,而且是蹲在家里写的……

另外根据比尔盖茨自己的说法“Paul was very good with the PDP-10 Assembler. I, in the meantime, laid out the design and charged off coding the BASIC. Paul later came in and helped out with that. A third person, Monte Davidoff, sat down for lunch with us and said he knew floating point packages. So, we had him write some of the math routines. And then we just kept squeezing it.”我们得知有另外一个人帮助盖茨和艾伦写了一些数学函数,而且盖茨他们用了simulator测试BASIC解释器,而且盖茨把码代码的过程叫做“squeeze”,显然回忆起了开发过程的辛苦。

所以我觉得轮子哥所说“在飞机上写个BASIC解释器不debug就直接用”非常误导人。盖茨和艾伦就是正常在开发流程中做了个正常的解释器,而且根据他们开发的年代,应该是Unstructured BASIC。Unstructured BASIC转PDP-10 Assembler应该只需要拆loop,解释条件判断等等,没有太多现代编译器理论,应该还是好写的。难度主要是工程上的,因为要把解释器塞到4K内存里。

Anyway我就陈述个事实和我自己一点点看法。还是那句话,膜拜女神最重要,其他技术问题都是小事。。。

user avatar

WPS 第一版貌似是求伯君一个人用纯汇编写出来的。

类似的话题

  • 回答
    上古时期的程序员,也就是我们今天所说的早期计算机科学家、工程师和技术先驱们,他们的工作环境和工具与我们现代程序员相比,简直是天壤之别。正因如此,他们所能完成的“神级操作”,很多是我们现代程序员在舒适的 IDE、高级语言和强大的硬件支持下难以想象的。这里我将从几个方面详细讲述这些“神级操作”,并尽可能.............
  • 回答
    在编程的世界里,与你面对面的交流,我必须坦诚地说,大量翻阅说明文档来辅助编码,这绝对不是什么需要被禁止的事情,反而可以说是常态,是优秀程序员的标志。想象一下,你接手了一个全新的项目,或者需要在一个你并不熟悉的领域里开发功能。你不可能像神一样,对所有语言的每一个库、每一个框架、每一个API都了如指掌。.............
  • 回答
    民国时期,上海作为远东的璀璨明珠,与同时期欧洲的巴黎、伦敦等一线城市相比,在某些方面确有其独特之处,但也存在明显的差距。要论“发达程度”,这本身就是一个多维度概念,涉及经济、文化、城市建设、生活方式等方方面面。我们不妨细细道来。上海:东方摩登都市的崛起民国时期的上海,特别是20世纪20年代至30年代.............
  • 回答
    要回答中国是否在历史上的大多数时期在文明程度上落后于西方及阿拉伯,这是一个复杂的问题,因为“文明程度”本身就是一个多维度、且容易受时代和视角影响的概念。我们不能简单地用“先进”或“落后”来概括,更需要深入剖析不同文明在不同历史阶段的独特贡献和发展路径。我们先来审视一下所谓的“西方”和“阿拉伯”文明。.............
  • 回答
    .......
  • 回答
    确实,当我们谈论生产力尚不发达的上古时期,却涌现出《诗经》、《楚辞》这样数量可观、影响深远的诗集,这其中蕴含着许多值得细细品味的文化现象。这并非生产力水平的矛盾,而恰恰是那个时代社会结构、文化功能与人类情感需求的必然产物。下面我将为您详述一番:一、 上古时期诗歌的功能与社会价值:远超“娱乐”的地位首.............
  • 回答
    古语有云:“天涯若比邻”,这句诗或许能窥见那遥远的时代,虽然没有发达的交通,但人类文明的火种却早已跨越山海,悄然点燃了彼此间的联系。我们总以为上古时期世界各区域是孤立存在的,但深入探究,你会发现,事实并非如此。即便是在文字尚不普及、技术尚显粗糙的年代,不同族群、不同地域之间,也早已开始了若有若无,却.............
  • 回答
    要说上古时期东亚地区有哪些如今已灭绝的动物,这可不是件小事,里面学问可大着呢。得把时间拉得长长的,回到那个山野荒蛮,人类还只能算初来乍到的年代。那时候,东亚这片土地上,生活着不少如今想起来都让人啧啧称奇的大家伙,它们中的一些,是和我们祖先共同生活过的“老邻居”,只可惜,它们的故事,随着时间的洪流,最.............
  • 回答
    上学时期的“混子”,这词儿我听着就挺有画面感的。不是那种彻头彻尾的坏学生,也不是那种考试一塌糊涂的书呆子。他们通常是班级里的一抹亮色,又或者是一点点“不稳定因素”。怎么说呢,就是那种你可能不太记得他具体考了多少分,但你一定记得他那天穿着的球鞋,记得他上课时悄悄递给你的那个纸条,或者他讲的一个笑话,能.............
  • 回答
    张飞,这位在中国历史上响当当的名字,提起他,大家脑海里首先浮现的大多是那个豹眼环眼、声若巨雷、一把丈八蛇矛横扫千军的猛将形象。他的勇猛无匹,在长坂坡吓退曹操百万大军的故事更是妇孺皆知,被后世奉为“万人敌”。但是,如果仅凭“勇”来评价张飞,那未免太狭隘了。要说他是不是一个“文武双全”的人物,咱们得仔细.............
  • 回答
    太平天国时期,中国大陆的战火连绵,那是一幅怎样触目惊心的图景?与同时期西方国家的海上传奇、殖民地的枪炮轰鸣相比,太平天国之战,尤其是在陆地上,展现出截然不同的风貌。想象一下,当欧洲的战壕里弥漫着火药味,列强们操纵着射程更远、威力更大的后膛步枪,训练有素的军队在严密的指挥下推进时,太平军的战场却是一场.............
  • 回答
    谈论“巅峰时期泰森是否是拳击历史上最强的人”,这就像让一群狂热的球迷去评判谁是篮球之神一样,总会有争议,也总会有足够多的理由让我们倾向于某一方。但如果非要说,我会毫不犹豫地说,巅峰时期的泰森,绝对是那个时代最可怕、最具统治力的存在,而且即便放到整个拳击史的长河里,他也能排进最顶尖的那一撮人。要说“最.............
  • 回答
    要说巅峰时期的贝肯鲍尔、贝利、马拉多纳和克鲁伊夫穿越到现在,能否在五大联赛的主力阵容中占有一席之地,这绝对是个能让球迷们争论到天昏地暗的话题。不过,咱们不妨仔细掰扯掰扯,看看这些足坛legend们如果披上现代球衣,会有怎样的表现。首先,得承认一个大前提:时代不同了。 足球的发展日新月异,训练方法、战.............
  • 回答
    日本帝国时期军队中“下克上”现象屡禁不止,绝非偶然,背后是多重复杂因素交织作用的结果。要理解这一点,咱们得把时间拨回到明治维新时期,甚至是更早的江户时代。一、 并非“不正常”,而是“不稳定性”的常态首先,得纠正一个误区:“下克上”并非完全是“不正常”的,用“不稳定性”来形容可能更贴切。这种现象更多地.............
  • 回答
    关于纳粹德国是否是德国历史上“最强”的时期,这个问题需要从多个维度来审视,并且“强”的定义本身就具有相当大的主观性。如果以军事力量、领土扩张和国际影响力为衡量标准,纳粹德国在短时间内确实达到了令人瞩目的高度,但若从长远来看,其根基的脆弱性和最终的覆灭,又使得这个“强”显得极具破坏性和非持续性。纳粹德.............
  • 回答
    将解放战争时期的解放军置于抗日战争的正面战场,与当时的国民党军队进行比较,这是一个极富想象力且极具探讨价值的设想。要详细分析其结果,我们需要从多个维度来审视,包括双方的作战风格、装备水平、战略指导、以及所处的历史环境。首先,我们必须明确“解放战争时期的解放军”所代表的特质。这支军队以其高度的纪律性、.............
  • 回答
    要是奥斯曼帝国跟万历年间的明朝“杠上”,这绝对是一出能让史书都为之侧目的超级大戏。咱们得把时间拉回到十六世纪末到十七世纪初,那个时候,奥斯曼帝国正值苏莱曼大帝的时代余晖,威名远扬,地跨欧亚非三大洲,是当之无愧的东方霸主。而另一边,大明王朝在万历皇帝的御宇之下,虽然内耗严重,但瘦死的骆驼比马大,仍旧是.............
  • 回答
    我其实一直挺享受早读课的。虽然有时候会觉得那一小时有点长,尤其是在没睡好的日子里,但大部分时间我都会好好利用它。首先,我的早读课并不是单纯的“朗读课”。我们班主任那时候挺开明的,我们班自己会有一个小小的调整。大部分时间,我们会轮流读一些我们自己选的课文,不一定非得是当天的语文课内容。这部分时间大概占.............
  • 回答
    李克用麾下的沙陀骑兵,论及勇猛善战,在五代时期绝对是赫赫有名的精锐之师。他们是李克用崛起的基石,也是他横扫北方的重要力量。然而,令人不解的是,这支令人生畏的铁骑,在与朱温的宣武军交锋时,却屡屡陷入劣势,胜少败多。这背后的原因,绝非简单的战场运气,而是深层级的战略、战术以及双方治军理念的较量。首先,我.............
  • 回答
    汉末三国时期,中国大地上的战火纷飞,那也是一个世界各国风云变幻的时代。若要论当时中国军队的质量与军事实力,将其置于同时期的世界格局中进行横向对比,那可是一番颇为耐人寻味的考察。同时期世界,军事力量的概貌要理解汉末三国中国军队的水平,我们得先看看当时世界其他主要军事力量都在做什么。 罗马帝国: 这.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有