无输入程序是多余的吗?

是否有有用的程序不接受输入,例如: 用户的键盘输入; 来自时钟的中断; 其他服务器的数据等

计算/打印出预定义数据的程序可以转换成文件,对吧?

6
死人的开关,不需要配置。好吧,我想这可能需要一个计时器作为输入,尽管你可以坐在一个循环中近似一个计时器。真的,任何你硬连接输入数据的程序。
额外 作者 sgwill,
在它最简单的形式,骰子辊。它们通常具有用户输入,用于确定要滚动的内容,但是您当然可以有一个不能输入的用户输入,或者您可以在命令行上输入一个输入,并且可以使用提供预定义输入的批处理文件调用它 - 批处理文件因此将成为零输入的程序。
额外 作者 Sander Rijken,
计算pi数字的程序怎么样?一个程序如何计算某些数学问题的答案,其中“输入”被硬编码到程序本身(在编程或编译阶段)?
额外 作者 Ryan Cox,
那么,这是唯一的数学近似示例吗?
额外 作者 cmrhema,
在问题细节中使用“有用”一词表示如此。
额外 作者 cmrhema,
...来自用户,环境等的输入,例如键输入,或当前时间 [或服务器]”
额外 作者 cmrhema,
这个问题没有被搁置。
额外 作者 cmrhema,
答案是 yes(1) :-)
额外 作者 Schroeder,
当你说“多余”时,你的意思是“无用”吗?
额外 作者 whatsisname,
无输入程序可以产生有用的副作用。无输入的程序可能会转换为平面文件。
额外 作者 closeparen,
通过“输入”,来自服务器的数据也可以作为输入吗?因为我正在考虑一个不需要用户交互的纯信息应用程序,但是数据是从服务器提供的,以使其更易于管理。
额外 作者 Suraj,

7 答案

这样的程序可能有用的一个例子是当程序比其输出短得多时。这意味着该程序基本上是其输出的压缩版本。

一些实际用例:

  • 自解压zip文件
  • 其输出实际为无限的程序,例如 yes(1),其重复输出“y”。 (感谢blrfl在评论中提到这一点。)

The theoretical term for this concept (when the output is finite) is Kolmogorov complexity. From Wikipedia:

考虑以下两个32个小写字母和数字的字符串:

<�预> <�代码> abababababababababababababababab 4c1j5b2p0cv4w1x8rx2y39umgw5q85s7 </代码>      

第一个字符串有一个简短的英文描述,即“ab   16次“,由11个字符组成。第二个没有   明显的简单描述(使用相同的字符集)除了   写下字符串本身,有32个字符。

     

更正式地说,字符串的复杂性是长度   一些固定的通用字符串中最短的可能描述   描述语言[...]。

(注意:这种固定的通用描述语言通常是一些图灵完整的编程语言。)

9
额外

很多系统工具。 shutdown,reboot,poweroff命令。

我确信还有其他我现在想不到的。

4
额外

是的,单元测试(至少写得不错)。

编辑

To be less glib: There are a lot of different unit test setups but they effectively boil down to the following, the code base under test is treated as a library and your unit tests are essentially one big program that when run prints out something like

Test foo passed
Test bar passed
Test baz failed
     ...Details...
Test quux passed

如果您的单元测试是确定性的(通常它们应该是调试非确定性测试最差),这将只是一个常量字符串。

现在,一旦你进入现实世界,这里的边界确实很模糊,但我认为一个无输入程序是学习其他一些源代码的好方法。

3
额外
我糊涂了;单元测试不会测试你编写的代码,使其成为输入吗?
额外 作者 cmrhema,
我认为单元测试将代码作为输入,进行测试?
额外 作者 cmrhema,
@Tobi好,没有 ...单元测试不像输入或环境资源那样读取实现,他们在编译期间包含实现为了生成漂亮的交互式结果,测试套件通常与环境交互(如IDE或测试运行器)。但是,这是可选的,真的。它可以很容易地成为一个二进制文件,它自己执行并将结果转储到标准输出。事实上,我自己也在训练一些这种性质的跑步者......
额外 作者 svidgen,
@Tobi,希望编辑带来了重点。
额外 作者 walpen,

计算素数序列的程序。

1
额外

取决于多余的意思。以下是我在几分钟内可以想到的一些内容:

  • 创作音乐或艺术的节目

  • 向跳舞的机器人跳舞或发送指令的程序

  • 模拟虚拟社会并在不同条件下输出其可能寿命的程序

  • 无线电信标

这些东西都是多余的吗?

1
额外
#1:什么意思“创造音乐或艺术”?随机=由输入#2播种:这将是控制机器人运动的解释器的输入。 #3:输入的社会还是随机生成的社会?后者将播种#4:“无线电信标”是什么意思?
额外 作者 cmrhema,
所有这些东西都会有输入,即使它来自随机种子。
额外 作者 RubberDuck,
不正确;我列出的所有项目都不需要 in ,就像从系统外部到系统内部的东西一样。我不知道你在哪里认为随机性是任何一个的要求。
额外 作者 John Wu,
#1我的意思是字面上组成一段音乐或画一幅画。它不一定是非常好的音乐或非常有趣的图片。无论是随机性还是原创性都不是必需品。 #2。不,这将是一个 out 投入控制机器人运动的翻译。 #3。无论;一个决定自己的社会,从一个基本的初始条件开始,然后发展。 #4。通过我们程序的输出调制的电磁频谱中的连续传输,可能根据预定模式。
额外 作者 John Wu,

像这样的程序偶尔出现并且有用,例如通过执行一些计算来回答特定问题。但是一旦程序正常工作并产生结果,就不再需要运行它了。

作为一个例子,我曾经写过这样一个程序来产生一组矩阵,它们将欧拉角转换为所有可能的欧拉角系统的正交矩阵。输入基本上是在程序内生成的(一组排列)。对于每个可能的欧拉角系统,程序象征性地将3或2个矩阵相乘,并产生具有所得矩阵的TeX文件。编写程序比使用数学手动更少工作且更不容易出错。但是,没有来自环境的输入。您刚刚运行该命令并写出了该文件。一旦我对它工作正常感到满意,我就再也没有再次运行了。

1
额外

绝对没有来自用户或环境的输入的程序将给出非常可预测的结果。如果结果只是数据,您确实可以将其存储在文件中,而不是一次又一次地运行程序。它将不断传播到最高级别。

尽管如此,可预测并不意味着相同。没有任何输入的程序在每次计算时都会产生不同的结果。典型的例子是使用随机数的模拟应用程序。尽管如此,这种情况仍然是边缘的,因为您可能会争辩说随机数生成器(或其种子)是环境输入的一种特殊形式。

但是程序可能会产生副作用。例如,它可以打开和关闭一些LED(或交通信号灯)。或者在窗口中显示倒计时。这种“副作用”可能无法由文件中的预先计算结果替换。所以没有:即使没有任何输入,程序也不一定是“多余的”!

0
额外
哎呀,我想这里的每个人都失败了基本的系统理论。您可以拥有不可预测的确定性(非随机)输出。 C.F. 混沌理论
额外 作者 John Wu,
这是教科书的例子。无需外部系统。 var x = 0.002; for(int t = 0; t 看看你是否可以预测给定t的x。
额外 作者 John Wu,
所以你从来没有听过两次同一首歌?
额外 作者 John Wu,
@JohnWu“高度依赖于初始条件”意味着从环境中获得某种输入(例如未初始化变量的状态)。如果程序是更大的动态系统的一部分,它将不得不与其他程序通信以产生混乱的结果:IPC也是一种输入形式。
额外 作者 Christophe,
@JohnWu对不起,如果我的答案中不清楚:我的观点是,在同一台计算机上,这种计算在每次执行时都会产生相同的结果。所以我可以运行一个,记录结果并使用之后记录的结果(这就是我如何解释问题中模糊的“冗余”)。当然,如果打算为用户查看关于结果是否会收敛的结果产生不耐烦和热情,则无法再现,这就是我所说的“副作用”。如果循环永远不会结束,我们仍然是我的答案的副作用部分
额外 作者 Christophe,
@JohnWu是的,我这样做:-)我喜欢对我情绪的副作用。就个人而言,我从来没有保留数据,我可以在更好的硬件上更精确地重新计算。我只是回答理论问题。并分享了我30年前第一次模拟程序的挫败感,当时我发现承诺的随机数只是伪随机数,并且程序需要一些外部输入来做可能让我感到惊讶的事情。老实说,你是否使用了许多有趣的程序,这些程序没有从他们的环境中得到一些输入,事件或反馈;-)
额外 作者 Christophe,