神奇的自产生程序

简介: 最近读到冯·诺依曼的《Theory of Self-Reproducing Automata》的中译本,被自复制自动机理论深深吸引了!

最近读到冯·诺依曼的《Theory of Self-Reproducing Automata》的中译本,被自复制自动机理论深深吸引了!

问题(自产生程序):编写一个程序,不读取任何输入,只把自己的源代码输出。

image.png

这个问题是个非常本质的问题,跟使用什么编程语言无关(不要想到使用反射之类的东西)。

试想,如果要输出自己的源代码,那么,显然,程序中应该有“print ...”语句。但 print 什么出来呢?如果硬要写的话就会变成:

print"print \\"print......\\""

最后是一个无限循环。

一般地,我们知道,如果程序 A 能产生程序 B ,那么 A 必须包含 B 的全部信息,而且应该比 B 的信息还多,因为还要包含额外的打印语句。也就是说,一般情况下,信息是减少的。而这个自产生程序,自己要包含自己的全部信息,从某种程度上已经具有生命的意味了。

下面列出一些自产生程序及其思路。

首先需要注意的是,使用编程语言本身的反射功能或者读取文件等做法都被视为 cheating ,比如这样的 bash 脚本:

#!/bin/sh

cat $0

或者像这样的 javascript :

functiona() { console.log(a.toString(), "a()"); } a()

因为这些程序没有体现出自产生程序的递归和自指特性,或者结果严重依赖于编程语言的具体实现。

不cheating的思路主要有以下几种:


输出源代码在该语言中的转义

Python :

s = "'s = ' + repr(s) + '\\nprint(' + s + ')'"

print('s = ' + repr(s) + '\nprint(' + s + ')')

Lua 5.1 :

s = "string.format('s = %q\\nprint(%s)', s, s)"

print(string.format('s = %q\nprint(%s)', s, s))

另一个 Lua 版:

s = "s = %q\

print(string.format(s, s))"

print(string.format(s, s))

Scala :

defe(s: String) = ("\""+s.replace("\\", "\\\\").replace("\"", "\\\"") +"\"")

vals="\"\"\"def e(s: String) = (\"\\\"\" + s.replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\") + \"\\\"\")\"\"\" + \"\\nval s = \" + e(s) + \"\\nprintln(\" + s + \")\""

println("""def e(s: String) = ("\""+s.replace("\\", "\\\\").replace("\"", "\\\"") +"\"")""" + "\nvals=" + e(s) + "\nprintln(" + s + ")")

用某种方法 encode 源代码,使之不包含引号,然后还原出源代码

Bash :

#!/bin/sh

s='\x22#!/bin/sh\ns=\x27$s\x27\necho $(echo -e $s)\x22'

echo"#!/bin/sh

s='$s'

echo $(echo -e $s)"

Lua 5.2 使用 load():

s = "a,q,b=string.char(39),string.char(34),string.char(92) return a..'s = '..q..a..'..s..'..a..q..b..'nprint('..a..'..load(s)()..'..a..')'..a"

print('s = "'..s..'"\nprint('..load(s)()..')')

Scala :

~~~~ {.hl}

val s = "%22val+s+%3D+%5C%22%22+%2B+s+%2B+%22%5C%22%5Cnprintln%28%22+%2B+java.net.URLDecoder.decode%28s%2C+%22UTF-8%22%29+%2B+%22%29%22"

println("val s = \"" + s + "\"\nprintln(" + java.net.URLDecoder.decode(s, "UTF-8") + ")")

~~~~

使用 eval :在 eval 的字符串中引用自己

-------------------------------------

Lua load() 的另一种用法:

```lua

s = "print(string.format('s = %q load(s)()', s))" load(s)()

js 的 eval()

s="q = String.fromCharCode(34); console.log('s = ' + q + s + q + '; eval(s)')"; eval(s)


使用语言中的更强的转义机制

类似上面的第二种,但不用引号。

Lua 的 long string :

x = [["x = [".."["..x.."]".."]\nprint("..x..")"]]

print("x = [".."["..x.."]".."]\nprint("..x..")")

Scala 的三引号:

val s = """"val s = \"\"\"" + s + "\"\"\"\nprintln(" + s + ")""""

println("val s = \"\"\"" + s + "\"\"\"\nprintln(" + s + ")")

使用 C 的宏

先执行传入的参数,再把参数变成字符串。

gcc :

#definep(a) int main(){a;puts("p("#a")");return 0;}

p(puts("#definep(a) int main(){a;puts(\"p(\"#a\")\");return 0;}"))

至于它们是怎么实现的,就留给读者自己琢磨了。自产生程序也称为 Quine ,可以参考 Quine Page

相关文章
|
数据可视化 算法 数据挖掘
基于python的笔记本电脑购买意愿影响因素分析,包括情感分析和聚类分析
本文通过Python大数据技术对笔记本电脑评论数据进行情感分析和聚类分析,揭示了产品性能、外观设计和用户地区等因素对购买意愿的重要影响,并为企业提供了优化产品设计和销售策略的参考。
546 2
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
651 0
|
Kubernetes 网络协议 Ubuntu
Kubeadm 快速搭建 k8s v1.19.1 集群(Ubuntu Server 20.04 LTS)
安装准备工作安装环境要求:角色 实验环境 生产环境 操作系统 master cpu/内存:2 Core/2G cpu/内存:2 Core/4G linux 内核 4.4+ node cpu/内存:1 Core/2G cpu/内存:4 Core/16G linux 内核 4.4+ 备注 Node:应根据需要运行的容器数量进行配置; Linux 操作系统基于 x86_64 架构的各种 Linux 发行版...
1653 2
Kubeadm 快速搭建 k8s v1.19.1 集群(Ubuntu Server 20.04 LTS)
|
设计模式 移动开发 IDE
淘宝短视频流工程重构(上):理论篇
淘宝短视频流工程重构(上):理论篇
309 7
|
机器学习/深度学习 人工智能 编解码
【AI系统】轻量级CNN模型新进展
本文继续探讨CNN模型的小型化,涵盖ESPNet、FBNet、EfficientNet和GhostNet系列。ESPNet系列通过高效空间金字塔卷积减少运算量;FBNet系列采用基于NAS的轻量化网络设计;EfficientNet系列通过复合缩放方法平衡网络深度、宽度和分辨率;GhostNet系列则通过Ghost模块生成更多特征图,减少计算成本。各系列均旨在提升模型效率和性能,适用于移动和边缘设备。
1100 6
|
存储 数据可视化 大数据
大数据平台架构设计与实施
【7月更文挑战第3天】本文探讨了大数据平台的关键技术,包括数据采集(如Kafka、Flume)、存储(HDFS、HBase、Cassandra)、处理(Hadoop、Spark)、分析挖掘及可视化工具。架构设计涉及数据收集、存储、处理、分析和应用层,强调各层次的协同与扩展性。实施步骤涵盖需求分析、技术选型、架构设计、系统部署、数据迁移、应用开发测试及上线运维,旨在为企业决策提供强有力的数据支持。
1041 3
|
人工智能 算法 数据挖掘
技术沙龙直播|3D-Speaker多模态说话人开源详解
技术沙龙直播|3D-Speaker多模态说话人开源详解
|
SQL 关系型数据库 MySQL
在Linux中,如何实现数据备份和恢复?
在Linux中,如何实现数据备份和恢复?
|
缓存 JavaScript
computed/watch深度监听
computed/watch深度监听
574 1
解决helm部署报错Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress
在使用helm install 或者helm upgrade的时候,如果出现了异常中断操作, 经常会出现UPGRADE FAILED并且导致后续无法更新,那我们该如何处理呢?
5988 0