你知道任何用于编写任何实际使用的真实世界程序的深奥语言的例子吗?是否存在任何计算机科学领域(无论多么晦涩),其中深奥的语言实际上已被证明可用于解决特定问题?
17 回答
几乎按照定义,深奥的编程语言没有实际用途。但是,不能使用它们并不意味着它们没有用。
tl;博士:
- 非确定性 esolangs突出了所有基于线程的编程的非确定性
- 图灵 tarpits强调了没有一种编程语言比任何其他语言都更强大(如果两者都是图灵完备的),从而将“计算能力”与“表达能力”区分开来。
- 他们强迫横向思考并且是脑筋急转弯
例如,当您查看深奥的编程语言时,您可以将它们大致分为几类:有些是为了玩笑而创建的,有些是为了好玩而创建的,有些是作为图灵 tarpit 而创建的,但也有一些是为了证明而创建的或说明一点。这些实际上是有用的:说明一个点,可能在编程语言课上,可能对社区或行业。尽管它们对实际目的没有用,但它们对教育目的很有用。
采用非确定性深奥的编程语言。这些是编程语言,某些表达式的评估语义不是确定性地定义的,而是例如概率地或基于月相或类似的东西。如果你看这种语言的定义,你会立即认为:“好吧,那只是愚蠢。” 它是!(例如,Java2k 中的 Hello World 程序几乎是一页代码,甚至不能保证每次都打印“Hello World”,只有大部分时间。)然而,当今大多数主流编程语言都有非确定性并发模型。IOW:只要你在 Java、C#、Python、Ruby、Perl,甚至 Erlang 或 Clojure 中启动一个线程,你的程序就会变得和在深奥的 Java2k 语言中一样随机。所以,为什么我们认为一个是愚蠢的并接受另一个是正常的,即使它们本质上是一样的?通过将不确定性发挥到极致,并以一种有趣的方式将其包装起来,esolangs 允许我们提出这个问题。
另一个例子是图灵沥青坑。图灵 tarpit 是一个 esolang,它几乎没有任何特性,但仍然是图灵完备的。这样的图灵 tarpit 可用于演示两种不同的事情:您可以使用它来演示究竟是什么使某些语言比其他语言更“强大”(在表达能力的意义上)。如果你在网上四处搜索,你会发现有人问“如果 Lisp 比 Java 好得多,为什么不给我看一些你可以用 Lisp 编写但我不能用 Java 编写的程序”。而且,当然,这很愚蠢:两种语言都是图灵完备的,所以没有这样的程序。但是,通过将 Java 与 Brainfuck 进行对比,您可以表明这不是一个有意义的问题。
你可以用 Turing tarpits 证明的另一件事是,你永远无法通过删除特征来使语言更强大(在这个词的两个意义上:计算能力和表达能力)。这听起来很明显,但有些人实际上认为微软应该从 C# 中删除可变状态,它会神奇地变得更强大。
一般来说,图灵 tarpit 可以很好地展示编程语言的计算能力和表达能力之间的区别。
esolang 的其他有用方式是它们可以作为编程语言研究的灵感。想想 Unlambda,顾名思义,它是一种不基于 lambda 演算的函数式语言。换句话说:它是一种没有函数的函数式语言。
最后但并非最不重要的一点是,esolangs 可以迫使你从完全不同的角度看待问题(是的,我承认,这主要是一个尴尬的角度,但是,嘿,一些电影导演(例如希区柯克)将他们的整个职业生涯都归功于从尴尬的角度处理事情),它们像一个很好的谜题一样逗弄你的大脑。也就是说,例如,Brainfuck 存在的全部原因和名称。
就业保障!!!
现实世界的应用程序,嗯?
游戏《失落的王国》在 2004 年赢得了第一届年度经典 2k 文字冒险大赛,并由原作者在 Brainfuck 中(重新)编写和增强
Befunge或这个文本编辑器中的 IRC 机器人怎么样?而且我想如果你喜欢用深奥的语言写作,你可能会认为对 C 编译器的迷恋或对C编译器的愚蠢是非常有用的......
如果一种语言有实际用途,它就不会被称为esoteric。这两个术语是相互排斥的。
了解图灵机、可计算性,并对计算理论所暗示的内容有实际的认识。如果您使用诸如大脑**** 之类的深奥语言,则可以收集所有实际好处。
我敢肯定,还有其他人。
受这个问题及其答案的启发,我也发现了这种语言的实际用途:GolfScript,一种专为代码高尔夫设计的语言:
GolfScript 是一种面向堆栈的深奥编程语言,旨在以尽可能少的击键次数解决问题(漏洞)。它还旨在简单易写。
你有它,直接来自写它的人。尽管代码高尔夫是否是一个实际问题可能存在争议,但我个人认为,它与您和我可能实际编写和遇到的东西一样接近,更不用说它是一个有趣的编程练习和竞赛有很多粉丝。所以...如果游戏、足球和其他各种娱乐活动以某种方式...实用...我也可以随意加入代码高尔夫 :)
我看到的唯一实际好处是,如果你用一种深奥的语言编写代码,它会让你以新颖有趣的方式思考问题。即使您重新使用主流语言进行编程,学习解决问题的新方法也会受益。
去年我读了 Charles Petzold 的“Annotated Turing”。我当然没有打算对图灵机进行编程,至少正如他所描述的那样。但是考虑用他的“语言”解决问题让我心烦意乱。我是一个更好的 C# 程序员。
当然; Fungot,IRC 机器人:http: //zem.fi/~fis/fungot.b98.txt
深奥语言的发展就像创造曼陀罗一样。工作结束后,你可以忘记它,甚至毁掉它。
如果您仅通过Wikipedia 链接判断:
深奥的编程语言(有时缩写为 esolang)是一种编程语言,旨在测试计算机编程语言设计的边界、概念证明或笑话。通常不打算将这种语言用于实际编程。
那么,不,这种语言在实际问题上没有实际应用。
原因不是对语言的侮辱,他们专注于“实用”:
- 在实践中,如果你正在解决一个问题,你需要能够说服自己你已经解决了它。如果您使用的是专门设计为难以阅读的语言,则很难直观地检查您的解决方案并说“是的,这是正确的”。
- 实际上,您不是在真空中工作。在现实生活中,你总是和一群非零的人一起工作(即使只是未来的你)。其他人将不得不维护您的解决方案,在此处添加功能,在此处修复问题,或者更糟糕的是,尝试记录您所做的事情和原因。
- 如果 1 和 2 均不适用,那么您已经创建了一个解决方案,该解决方案 (a) 非常容易检查,并且 (b) 不需要维护,因为它从未在实践中使用过。因此,这是一个微不足道的/不实际的问题。
有一种语言叫做 Pilot。它是一种用 Dartmouth BASIC(一种交互语言)编写的解释性语言。它最初的用途是让非编程教师能够对他们的测试进行编程。该语言中的所有命令都是单个字母,使用的字母定义了可用的选项。它很古老,(我在 1976 年学会了它),据我所知,它不再有任何用处。
colorforth很强大,而且很实用。
290K 的 OKAD 和 GA4
代码混淆是一种非常常见的实际用途:-p
而且我不知道 APL/J/K 系列是否可以称为深奥,但它们已经在生产系统中使用了很长时间。
在其他用途中,更小的可用作算法搜索的(黑盒)/(沙盒算法语言),用于搜索用途,例如基于约束的编程和不断发展的解决方案。
这个答案解决了 3 种深奥的编程语言:
- 高尔夫语言
- 图灵沥青坑
- 游戏中的语言
当您需要一次性使用某些东西时,高尔夫语言很有用。与其编写一个 100 行的 Python 程序,也不必因为在高尔夫语言的内置程序上出错而进行调试,而只需连接几个内置程序并更快地完成工作。
图灵 tarpit 对创造力很有用。您必须跳出框框思考图灵 tarpit 所具有的几个命令。在 BF 中,您将如何将通过程序提供给您的整数(只是一堆 ASCII 值)转换为您可以处理的东西(例如单个单元格值)?你将如何检查平等?你将如何添加两个数字?
图灵 tarpits 对于练习代码组织也很有用。当一个简单的任务(例如添加两个数字)需要您编写伪代码并拥有整个程序的布局时,您必须组织您的程序。在 BF 中添加两个单元格值,您需要: 1. 减少第一个加数 2. 增加第二个加数 3. 循环直到第一个加数为空。
游戏中的语言对于增强该世界/关卡的玩家在世界/关卡中的体验非常有用。在 Roblox 中(虽然我不会称它为“深奥的”脚本语言),如果你只是在你的世界中加入一些部分和模型,会不会很有趣?不。如果您编写了这些模型的脚本来与您作战并为自己配备枪支?也许。在 Geometry Dash 中,您可以通过要求您在其“编程语言”中单击一定次数来提高关卡难度,或者使其在 Boss 战中使用伪随机攻击。游戏中的深奥编程语言可以极大地增强关卡/世界中的可能性范围。
埃菲尔、Erlang、Ocaml、Haskell。对于大多数程序员来说,这些都是“利基”语言,但它们在他们的领域内是实用的。您的问题根本没有意义,最好问“在流行的问题领域中我们不使用任何好的语言吗?”