Intercal,YAML和其他可怕的编程语言

2021-02-26 14:53:23

1972年,两名学习FO​​RTRAN的学生提出了一种奇妙的新编程语言,称为INTERCAL。 INTERCAL有点不寻常。例如,单引号称为火花,双引号称为兔耳,小于(<)是一个角度,而破折号(-)是蠕虫。这使手册的阅读就像单词拼图一样,加上扩展的玩笑:

关于火花和兔耳的最后评论;如果程序中的下一个字符是一个点(通常会发生此情况,因为onespot变量是操作数的常见选择),则可以将火花和后面的点组合为哇(!)。 -INTERCAL手册。

编译器错误是作者真正具有创造力的地方。错误包括:在WEST HYPERSPACE中可能无法存储变量以用于错误地访问阵列,在BEACEND SPACE中存在IT CAME导致无效的控制流,由于线程问题导致的精神健康原因而拒绝了该程序,我没有文件并且必须为未找到的文件进行cree还有很多。

是的,这是一种模仿语言,阅读本手册后,您会感觉到没有人像里昂和伍兹那样写过如此有趣的技术文档。

请注意,这是内部请,1<-#5 DO,1 SUB#1<-#54 DO,1 SUB#2<-#192 DO,1 SUB#3<-#136请,1 SUB# 4<-#208 DO,1 SUB#5<-#98 DO from(1)做读出,1(2)DO,1 SUB#1<-#134(1)请从(2)开始)

INTERCAL令人兴奋的创新之一是COMEFROM指令,在此处以BASIC的形式出现。

10 COMEFROM 4020输入"您叫什么名字? &#34 ;; 30澳元的PRINT" HELLO,&#34 ;; 40澳元起

程序中任何位置的COMEFROM都可以从您正在读取的行中获取控制流。并且在某些实现中,如果许多COMEFROM引用同一行,则执行会在每个方向上分开。

COMEFROM是抛出多线程的GOTO语句的逆函数。它打破了命令执行的思维模式,在该模型中,每行的评估均指向下一行。您可以逐行模拟其执行的想法是命令式编程的基础,COMEFROM试图破坏该模型。

在Twitter上,他们有一个巨大的Monorepo,其中包含许多服务。 Twitter的某人想知道哪种语言最流行。 Twitter使用最多的是哪种语言?

Java排在第三,Scala排在第二。但是第一是一个惊喜。 Twitter上排名第一的编程语言是YAML [1]。

对于我来说,YAML通常感觉不像是一种编程语言。我当前正在写入的文件位于markdown中,顶部带有一些YAML,用于设置标题和相关字段:

什么都不会执行此YAML。它仅向博客平台提供一些信息。但是我不认为这是构成Twitter上大量配置的YAML类型。

我怀疑其中很多是YAML形式的构建和部署脚本。正是这种配置的类型对某些外部系统的控制流进行了编码。像这样的YAML处于声明式配置和成熟的编程语言之间的灰色地带。

我会告诉你我的意思。 让我们看一下来自shellcheck的构建脚本的示例: 上面的create似乎开始看起来更像执行了。 让我们继续。 脚本:-ls -la $ {CASHER_DIR} / || 正确-tar -xvf $ {CASHER_DIR} /ws-osx-fetch.tgz --strip-components = 5-ls -la deploy-./.github_deploy 现在,YAML只是专注于指定如何执行命令抓包。 我们还没有看到控制流,但是它来了。 那是针对TravisCI的,但这不是TravisCI或CI特定的。 这是Ansible的一个简单示例: -主机:所有任务:-包括:foo.yml何时:事物==" foo" -包括:bar.yml何时:某事==" bar" 步骤:-名称:步骤7,如果:$ {{github.event_name ==' pull_request' && github.event.action ==' unassigned' }}运行:echo此事件是已删除受让人的请求请求。

{{if(或(未启用.Values.persistence.type)(eq .Values.persistence.type" pvc"))}} apiVersion:apps / v1kind:Deploymentmetadata:名称:{{template&#34 ; grafana.fullname" 。 }}命名空间:{{template" grafana.namespace" 。 }}标签:{{-包括" grafana.labels" 。 | nindent 4}} {{-如果是.Values.labels}} {{toYaml .Values.labels |缩进4}} {{-end}} {{-和.Values.annotations}}注释:{{toYaml。 |缩进4}} {{-end}}

我认为这是一个问题。在配置文件中写入控制流就像敲击螺丝一样。这是用于错误工作的有用工具[2]。

我们是如何进入YAML中嵌入少量编程语言的世界的?调用某种配置是否会减少恐惧感?如果是这样,您只是给gcc配置了一个c ++程序吗?

< xsl:stylesheet version =" 1.0" xmlns:xsl =" http://www.w3.org/1999/XSL/Transform"> < xsl:output method =" text" omit-xml-declaration ="是" /> < xsl:template match =" /"> < xsl:call-template name =" FizzBu​​zz"> < xsl:with-param name =" i"选择=" 1" /> < / xsl:call-template> < / xsl:template> < xsl:template name =" FizzBu​​zz"> < xsl:param name =" i" /> < xsl:choose> < xsl:when test ="($ i mod 3)= 0和($ i mod 5)= 0"> FizzBu​​zz
< / xsl:when> < xsl:when test =" $ i mod 3 = 0"> Fizz
< / xsl:when> < xsl:when test =" $ i mod 5 = 0"> Buzz
< / xsl:when> < xsl:否则>< xsl:value-of select =" $ i" />< xsl:text>& #xa;< / xsl:text>< / xsl:otherwise> < / xsl:choose> < xsl:if test =" $ i& lt; 100" < xsl:call-template name =" FizzBu​​zz"> < xsl:with-param name =" i" select =" $ i + 1" /> < / xsl:call-template> < / xsl:if> < / xsl:template>< / xsl:stylesheet>

那就是XSLT中的FizzBu​​zz。我认为它是用笑话编写的,但是在许多方面,XML和XSLT优于基于YAML的特定脚本语言。 XSLT是经过记录和标准化的东西,而不仅仅是用于指定执行的临时格式。

看着它真让我大吃一惊,但是至少XSLT打算用作编程语言。关于YAML或INTERCAL,这是我们不能说的。

这些语言嵌入到YAML中的问题在于它们都是一次性实现。 TravisCI条件条件具有特定于TravisCI的语法,用法和功能。您不能在YAML配置中将Travis的concat函数或条件正则表达式用于您的ansible剧本。

在某种程度上,这个YAML问题就像COMEFROM问题。如果您知道yaml,则只能打开.yml文件并开始逐行读取文件。您需要了解配置如何控制特定系统的执行。这很难。

配置和编程语言之间的界线并不是一条明确的界线。很容易慢慢地将编程语言构造添加到配置文件中。在不知不觉中,您已经在配置文件的解释中嵌入了完整的未指定编程语言。

那是两全其美的最糟糕的情况,太多的YAML似乎正在进入这一领域。

我更喜欢YAML,而不是XML,但是对于控制流,您知道什么比YAML更好吗?还要别的吗!也许甚至是INTERCAL?我的意思是,一个玩笑的编程语言有多糟糕?

(100)请注意,这是模糊功能,请注意:输入是否被#15整除? DO .1≤-.100 DO .2≤-#15 DO(2030)接下来请注意:.4(余数)== 0吗? DO .4<-'?"' .4〜.4'〜#1" $#1'〜#3 DO(130)下一个请注意编号在#15之前不可分割=>请检查是否可以按#3 DO .2≤-#3 DO(2030)进行下一步检查,请注意:.4(余数)是否等于0? DO .4<-'?" .4〜.4'〜#1" $#1'〜#3 DO(110)下一个请注意编号无法通过#3 =>划分请检查是否被#5 DO除以.2≤-#5 DO(2030)请注意:.4(余数)是否等于0? DO .4<-'?" .4〜.4'〜#1" $#1'〜#3 DO(120)下一个请注意编号是常规=>返回输入DO .101<-。100 DO(199)下一个(110)DO(111)下一个DO忘记#1,请注意编号可以除以#3 =>返回模糊DO .101<-#61440 DO(199)下一个(120)DO(111)下一个DO忘记#1,请注意编号可除以#5 => RETURN BUZZ DO .101<-#45056 DO(199)NEXT(130)DO(111)NEXT DO忘记#1,请注意编号被#15除尽=> RETURN FIZZ-BUZZ DO .101<-#64256 DO(199)NEXT(111)DO RESUME .4(199)DO FORGET#1 DO RESUME#1

Ansible和Helm使用建立在YAML之上的模板语言,这比嵌入式控制流更好,但我认为这一点仍然成立。 ↩︎

实际上,您可能必须使用将DSL编码为配置的工具,但是您可以在认识到我们可以做得更好的同时使用它们。我认为像Dhall这样的复杂配置以及像pulumi这样的复杂配置作为代码应该是我们作为行业的目标。 ↩︎