你曾经使用过的最糟糕的编程语言是什么?

What is the worst programming language you ever worked with?

If you have an interesting story to
share, please post an answer, but
do not abuse this question for bashing
a language.

我们是程序员,我们的主要工具是我们使用的编程语言。

虽然有很多关于最好的那个的讨论,但我想听听你的故事你使用过最糟糕的编程语言,我想知道到底是什么让你生气。

我想收集这些故事的一部分是为了避免在设计一种语言(尤其是DSL)时出现常见的陷阱,另一部分是为了避免将来出现奇怪的语言。

这个问题不是主观的。如果一种语言只支持单个字符标识符(请参阅我自己的答案),那么这在一个没有争议的方面是不好的。

编辑

有些人担心这个问题会吸引巨魔。在你所有的回答中,有一件事很清楚。大多数答案都是适当的、有用的和写得好的。

更新2009-07-01 19:15 GMT

语言概述现已完成,涵盖102个答案中的103种不同语言。我决定对什么是编程语言松懈,包括任何合理的。感谢大卫对此事的评论。

以下是迄今为止所涉及的所有编程语言(按字母顺序,与答案链接,粗体新条目):

ABAP所有20世纪的语言,所有拖放语言,所有专有语言,有源滤波器,APL(1)AS400作者软件,自动热键,班卡斯塔,基本的,伯恩壳牌,他妈的,C++,Centura团队开发人员,COBOL(1)冷熔合,冷聚变,CRM114型,Crystal语法,CSS,Dataflex 2.3版,DB/C DX,数据库II,DCL德尔菲奥德,门DXL,DOS批处理(1)Excel宏语言,文件编制人,集中,第四,Fortran公司,Fortran 77,HTMLIllustra网刀片,Informix第四代语言,Informix通用服务器Web刀片,内部,Javajavascript(1)JCL(1)卡洛尔拉布拉克,标签视图,术语,Lisp标志,条形码,乐透脚本,M4魔法II,生成文件,基本地图,最大脚本,MEDITECH魔术,MELMIRC脚本,MS访问,流行性腮腺炎,奥伯伦,对象扩展到C,目标-C,OPS5盎司珀尔(1)PHP损益表,动力发电机,进度4gl,普罗瓦PS焦点,Python,正则表达式,RPG,RPG二期,方案,编剧,发送邮件.conf,小谈话,小谈话,史努博,速度脚本,Sybase PowerBuilder,Symbian C++系统RPL,TCL泰科可视化软件环境,小普拉特,Transcad公司,特罗夫乌巴西语,VB6(1)vbscript脚本(1)VDF4,维姆脚本,Visual Basic(1)Visual C++,Visual FoxPro,VSE网速,XSLT

涵盖80386汇编程序、VB6和VBScript的答案已被删除。


php(无特定顺序)

  • 函数名和参数顺序不一致
    • 因为有无数个函数,每个函数似乎都使用不同的命名约定和参数顺序。"让我们看看……是foo-bar还是foobar还是foobar…是针,草堆还是草堆,针?php字符串函数就是一个很好的例子。一半使用str oo foo,另一半使用strfoo。
  • 非标准日期格式字符
    • j为例
      • 在Unix中(顺便说一句,它是其他人用来作为日期字符串格式指南的工具),%j返回一年中以零开头的日期。
      • 在php的日期函数中,j返回不带前导零的月份日期。
  • 仍然不支持apache 2.0 mpm
    • 不建议这样做。
    • 为什么不支持这个?"当你没有完全独立的执行线程、完全独立的内存段和一个强大的沙盒来处理每个请求,从而使底层框架变得更加复杂时,PHP的系统中就引入了泥足。它不受支持,因为它会让事情变得更困难?因为只有简单的事情才值得做对吗?(公平地说,正如Emil H所指出的,这通常归因于第三方libs不安全,而php的核心是。)
  • 没有本机Unicode支持
    • 本机Unicode支持计划用于php6
    • 我很高兴我们没有生活在一个全球化的环境中,在过去的18年里,我们可能需要用其他语言与人交谈。哦,等等。(公平地说,在当今这个时代,所有东西都不使用Unicode,这一事实真的让我恼火。我的观点是我不应该做任何额外的工作来实现Unicode。这不仅仅是一个PHP问题。)

我还有其他语言方面的问题。这些只是一些。杰夫·阿特伍德有一篇关于为什么PHP很烂的老文章。他还说没关系。我不同意,但我们有。


XSLT。

  • 首先,XSLT令人费解。这个比喻完全不同于我所知道的任何东西。
  • 这件事是由一个委员会设计的,这个委员会的角度太深了,以至于它成为了一个奇怪的科学怪人。
  • 指定输出格式所需的奇怪的白炽灯。
  • 内置的、看不见的规则。
  • 奇怪的附加功能,比如脚本。
  • 对xpath的依赖。
  • 直到最近,对工具的支持还相当薄弱。早期调试XSLT是在完全黑暗中导航的练习。这些工具改变了这一点,但XSLT仍然是我的首选。

XSLT很奇怪,大多数人都忽略了它。如果你必须使用它,你需要一个XSLT萨满给你魔法咒语,使事情去。


DOS批处理文件。不确定这是否符合编程语言的条件。这不是说你不能解决你的问题,而是如果你习惯了bash

就我的两分钱。


不确定它是否是一种真正的语言,但我讨厌makefiles。

makefile在空格和制表符之间有意义的区别,因此即使两行显示相同,它们也不会运行相同的内容。

make还依赖于许多语言的一组复杂的隐式规则,这些规则很难学习,但常常被make文件覆盖。

makefile系统通常分布在多个目录中的多个文件上。在几乎没有范围或抽象的情况下,对几个目录之外的make文件进行更改可以阻止构建源文件。然而,错误消息始终是一个关联错误,而不是关于make或makefiles的有意义的错误。

我曾经工作过的任何成功使用makefiles的环境都有一个全职的make专家。所有这些都是为了节省几分钟的编辑时间??


我见过最糟糕的语言来自工具praat,它是一个很好的音频分析工具。在使用脚本语言之前,它做得很好。感叹不好的回忆。好的。针对初学者的小型praat脚本教程

  • 函数调用我们至少列出了3种不同的函数调用语法:
    • 普通的那个string = selected("Strings")

      这里没有什么特别的,您可以将所选函数的结果赋给变量字符串。不太可怕…然而。好的。

    • "我正在用参数调用一些GUI命令"Create Strings as file list... liste 'path$'/'type$'

      如您所见,函数名从"create"开始,以"…"结束。命令"创建字符串作为文件列表"是在praat的按钮或菜单上显示的文本(我不敢检查)。此命令接受2个参数列表和一个表达式。我会更深入地研究'path$'/'type$'的表达。好的。

      嗯,是的。没有空格。如果引入空格,它将是单独的参数。你可以想象,括号不起作用。在描述的这一点上,我想指出变量名的后缀。我不会在这一段中发展它,我只是在开玩笑。好的。

    • "哦,但是我想在我的变量中得到gui命令的结果"noliftt = Get number of strings
      是的,我们可以在这里看到一个模式,长而奇怪的函数名,它必须是一个GUI调用。但是没有"…"所以没有参数。我不想看到解析器是什么样子的。
  • 令人难以置信的类型系统(又名haskell和ocaml,praat正朝你走来)
    • 简单的本地类型江户十一〔四〕号

      那么,那里发生了什么?现在是时候看一下惯例和表达式类型了,所以我们得到:

      • 左$::(string,int)->string
      • 长度::(字符串)->int
      • WindowName$::字符串
      • 行$::字符串

      如您所见,变量名和函数名的后缀是它们的类型或返回类型。如果后缀是"$",则返回字符串或是字符串。如果什么都没有,那就是一个数字。我可以看到将类型前缀为变量以便于实现的点,但是后缀,不抱歉,我不能好的。

    • 数组类型要显示数组类型,让我介绍一个"微小"循环:
      1
      2
      3
      4
      5
          for i from 1 to 4
              Select... time time
              bandwidth'i'$ = Get bandwidth... i
              forhertz'i'$ = Get formant... i
          endfor

      我是一个数字,而且…(不,它不是函数)
      bandwidth'i'$
      它的作用是创建字符串变量:bandwidth1$bandwidth2$bandwidth3$bandwidth4$,并给出它们的值。正如您所期望的,您不能这样创建二维数组,您必须这样做:埃多克斯1〔10〕好的。img214.imageshack.us http:/ / / / / scaredkittylolqa2.jpg img214 3008

    • 特别invocation字符串
      outline$ ="'time'@F'i':'forhertznum'Hz,'bandnum'Hz, 'spec''newline$'"
      outline$ >> 'outfile$'

      字符串是weirdly(至少)在语言处理。"价值"是呼叫一变量在全球"的字符串。这是奇怪的。它是对所有的内置多语言会议从传递到PHP的PowerShell的bash。和外观,甚至把它重定向。Don’t】的工作,它不在你的亲爱的壳状。你有没有得到的变量值的酒店"

    • 因为wonderderderfulful执行模型

      我要把最后的触摸到这个wonderderderfulful表示由在你的执行模型。如你要在每一个指令执行的程序语言从顶至底,那里的变量和Praat的GUI。这是你的代码和GUI在Praat,你写在命令菜单/ Invoke按钮。

      主窗口包含列表项(Praat可以:

      • 文件
      • 清单文件(创建一个函数,一个wonderderfulful长名称)
      • spectrogramm
      • 字符串(不要问)

      所以,如果你想将一个给定的运行文件,你必须选择在文件列表programmatically推不同的按钮,然后采取一些行动。如果你想通过一个GUI动作参数,你必须跟随你的GUI布局参数的形式,例如"To Spectrogram... 0.005 5000 0.002 20 Gaussian
      "是这样,因为它是本布局:

      img7.imageshack.us http:/ / / / / tospectrogramm.png img7 5534

    needless说,我是一个nightmares钢管舞praat脚本调试和meeee高喊着"我周围!!"。

    <副>更多的信息在我们的网站,在Praat,命名第"容易可编程脚本语言"子></

    好的。


    好吧,既然这个问题不肯死掉,既然手术促使我回答……

    我谦恭地向您介绍Authorware(AW)是最糟糕的语言。(注意,我不记得了,自从我使用aw以来已经有6年了,这当然意味着有很多可怕的事情我都记不起来了。)

    恐怖,恐怖http://img.broorsoft.com/screenshots/softimage/a/adobe_authorware-67096-1.jpeg

    让我们从一个事实开始,它是一个Macromedia产品(10分),一种专用语言(50分以上),主要用于创建e-learning软件,以及由非程序员和程序员创建的软件,这些软件都可以实现为一种标志性语言和一种文本语言(100分)。

    如果最后一句话没有吓到你,那么你以前就不必修复WYSIWYG生成的代码了(Hello Dreamweaver和FrontPage devs!)但最突出的一点是,aw有一个大约12个元素的库,这些元素可以被拖入流中。像"页面"元素、动画、ifelse和goto(-100)。当然,从流中删除对象会创建任意数量的断开的连接和工件,而IDE可以成功地处理这些断开的连接和工件。当然,内置向导(-10)是其中的主要来源。

    幸运的是,您可以一直进入代码视图,最终不得不这样做,因为只有有限的一组标志性元素,否则有些事情是不可能实现的。这门语言本身是以导师(50人)为基础的,他是最差语言本身的候选人,只要他有雄心壮志,有足够的空间达到我们所追求的深度,维基百科就说:

    ...the TUTOR language was not easy to
    learn. In fact, it was even suggested
    that several years of experience with
    the language would be required before
    programmers could build programs worth
    keeping.

    那是一个很好的基础,它建立在互联网崛起之前的几年里。绝对没有任何形式的数据结构超过数组(-100),当然没有糖(真正的男人不使用switch语句?)(-10),大量的句法陈词滥调("--"是注释指示符,所以没有减量运算符!)(-10)。语言参考文档是以纸质或zip文件格式提供的(-100),但至少您得到了开发人员run usegroup的支持,并且可以快速建立解决您问题的解决方案,即使用dll或swf导入aw的功能,使您能够用真正的语言进行实际的编码。

    aw是由一个流(带有必要的暂停命令)驱动的,因此具有线性系统而不是基于事件的系统的所有相关问题(-50),尽管文档中存在直接的营销谎言,但它也不是面向对象的(-50)。所有代码重用都是通过goto实现的。没有范围,很多全球性的(50)。

    这不是语言的直接错误,但显然不可能实现源代码管理集成,当然也不可能实现TDD、文档生成或任何其他您可能喜欢的附加工具。

    当然,Macromedia在面对互联网的挑战时,多年来一直顽固地拒绝参与其中,最终产生了一个不好用的安全梦魇,这是一个冲击波(-100),它通过一个必需的插件(10)将软件的桌面版本串联起来。随着HTML的增长,aw也停滞不前了,即使面对ieee scorm javascript标准,仍然坚持它的冲击波交付。

    经过多年的讨价还价和承诺,Macromedia最终宣布了一个全新的AW开发版本来解决这些问题,几年后将开发工作外包,然后取消了该项目。当然,Macromedia仍在出售它(邪恶奖金-500)。

    如果还有什么需要说的话,这就是允许变量名中有空格的语言(-10000)。

    如果你想体验真正的痛苦,试着用一种不区分大小写并且允许使用变量名空间的语言来阅读别人的非注释匈牙利符号。

    安纳卡塔任意总分(aas):-11300
    根据个人经验调整:超出范围例外

    (抱歉太久了,但这是发泄)


    说真的:珀尔。对于初学者甚至是那些每天都与Perl一起工作的半专业人员来说,编写代码简直是一件麻烦事。我可以经常看到我的同事们在语言方面的斗争,构建最糟糕的脚本,比如2000行,而不考虑任何公认的编码标准。这是我在编程中见过的最糟糕的一团糟。现在,你总是可以说,那些人在编码方面很糟糕(尽管他们中的一些人已经使用Perl很多年了,现在),但是语言只是鼓励了所有那些让我在读别人的脚本时尖叫的可怕的东西。


    MS Access Visual Basic for Applications(VBA)也相当糟糕。访问完全是不好的,因为它迫使您放弃了一个薄弱的范例,而且开始起来似乎很简单,但完成起来却是一场噩梦。


    关于COBOL还没有答案?o


    我可以选择使用带有行号的旧skool基础。当您在行号之间没有空格来添加新行时,您必须运行重新编号实用程序,这会导致您丢失任何您必须的精神锚定到的位置。

    结果,你在一行中(用冒号分隔)挤进了太多的语句,或者你在别的地方做了一个goto或gosub来完成你不能塞进的工作。


    流行性腮腺炎

    我在这工作了几年,但从那以后我就完全放弃了。我真正能记住的是(在我的位置)没有文档和神秘的命令。

    太可怕了。好可怕!好可怕!!!!


    There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.

    本贾尼·斯特劳斯特卢普


    我还没有使用过很多语言,主要是处理脚本语言;在这些vbscript中,我最不喜欢的就是它。虽然它有一些方便的功能,但有些东西确实让我恼火:

    • 使用Set关键字进行对象分配:

      1
      Set foo = Nothing

      省略Set是导致运行时错误的最常见原因之一。

    • 没有结构化异常处理这样的事情。错误检查如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      On Error Resume Next

      ' Do something

      If Err.Number <> 0
        ' Handle error
        Err.Clear
      End If

      ' And so on

    • 将过程调用参数括在括号中需要使用Call关键字:

      1
      Call Foo (a, b)
    • 它类似英语的语法太冗长了。(我喜欢大括号。)

    • 逻辑运算符是长电路。如果需要测试一个复合条件,其中后续条件依赖于前一个条件的成功,则需要将条件放入单独的If语句中。

    • 缺少参数化类构造函数。

    • 要将语句换行,必须使用下划线:

      1
      2
      str ="Hello," & _
           "world!"

    • 缺少多行注释。

    编辑:找到了这篇文章:讨厌vbscript的法兰西指南。作者将他的抱怨总结为"vbs不是python":)


    目标-C.

    注释令人困惑,使用括号调用方法在我的大脑中仍然无法计算,更糟糕的是,C中的所有库函数都是使用C、->和…中的标准运算符调用的,而且似乎只有苹果公司在驱动这种语言。

    我承认我在iPhone编程时只使用了语言(并且查看了OS X的编程),但感觉好像C++只是分叉的,在注释中加上,强制实现和头文件分开是更有意义的。


    Progress 4GL(显然现在被称为"Openedge高级商务语言")。

    进步既是一种语言,也是一种数据库系统。整个语言的设计是为了让编写糟糕的绿色屏幕数据输入屏幕变得容易。(所以,首先想象一下这对Windows有多好。)任何比这更好的东西,不管是漂亮的屏幕、程序逻辑还是批处理…没那么多。

    我上一次使用第7版是在90年代后期,所以有可能有些版本已经过时了,但我不敢打赌。

    • 它最初是为文本模式数据输入屏幕而设计的,因此在Windows中,所有屏幕坐标都是以"字符"单位表示的,这是一些奇怪的像素宽度和不同的像素高度。但当然,它们默认为比例字体,因此"字符单位"的数量与在给定空间中容纳的实际字符数不对应。
    • 没有类或对象。
    • 没有对数组或动态内存分配的语言支持。如果您想要类似于数组的东西,可以创建一个临时内存中的数据库表,定义它的模式,然后在上面得到一个光标。(我看到了一小段来自更高版本的代码,它们实际上在内存表的基础上构建并交付了一个基本的面向对象系统。太可怕了。)
    • 内置了ISAM数据库访问。(但不是SQL。谁需要它?)如果要在State表的当前记录中增加Counter字段,只需说State.Counter = State.Counter + 1即可。这还不错,除了……
    • 当您直接在代码中使用一个表,然后在幕后使用时,它们会创建类似于一个不可见的、神奇的局部变量的东西,以保持该表中的当前光标位置。他们猜测这个光标将被限定在哪个包含块的范围内。如果您不小心,当您退出一个块时,您的光标将消失,稍后会自动重置,而不会出现任何警告。或者,您将开始处理一个表,并发现您不是从第一个记录开始的,因为您正在从其他块(甚至是您自己的块)重用光标,因为您的范围是在您不期望的时候扩展的。
    • 事务在这些猜测范围上运行。我们玩得开心吗?
    • 一切都可以缩写。对于一些具有攻击性的长关键词,这一点一开始可能并不那么糟糕。但是如果你有一个名为Index的变量,你可以把它称为IndexInd甚至I。(输入错误可能会产生非常有趣的结果。)如果您想访问数据库字段,不仅可以缩写字段名,而且您甚至不必用表名限定它;它们也会猜测表。要获得真正可怕的结果,请将其与以下内容结合起来:
    • 除非另有规定,否则它们假定所有内容都是数据库访问。如果您访问一个还没有声明的变量(或者,更可能的是,如果您输入了错误的变量名),就不会有编译器错误:相反,它会查找一个具有该名称的数据库字段…或者缩写为该名称的字段。

    猜测是最坏的。默认情况下,在缩写和字段之间,如果不小心,可能会得到一些讨厌的东西。(在将I用作循环变量之前,忘记将其声明为局部变量了吗?没问题,我们只需要随机选择一个表,获取当前记录,然后完全废弃一个名称以I开头的任意选择的字段。)

    然后再加上一个事实,默认情况下,一个意外的字段访问可能会改变它为您的表所猜测的范围,从而破坏一些完全不相关的代码。有趣,是吗?

    他们也在语言中内置了一个报告系统,但我显然抑制了对它的所有记忆。

    当我在Netscape LiveWire(一个服务器端javascript的不幸尝试)和经典的ASP(vbscript)上找到另一份工作时,我简直是在天堂。


    最糟糕的语言?Bancstar,把手放下。

    3000个预定义变量,全部编号,全部全局。没有变量声明,没有初始化。其中一半分散在范围内,保留供系统使用,但您可以在危险的情况下使用它们。由于各种操作,大约有一百个会自动填写,而没有这些操作的列表。它们都可以容纳38K字节,并且对于缓冲区溢出没有任何保护。如果您错误地声明了输入字段的长度,系统会很高兴地让用户在10字节字段中输入20字节。至少可以说,影响是不可预测的。

    这是一种允许您声明计算gosub或goto的语言;由于其局限性,这通常是必需的。条件可以声明为正向或反向。想象一个"if"语句在开始前终止20行。

    返回堆栈非常浅(大约20个gosubs),而且由于用户按下任何函数键都会启动不同的子例程,因此可以轻松地溢出堆栈。设计人员深思熟虑地包含了一个"clear gossubs"命令,可以完全对堆栈进行核处理,以解决该问题,并确保您永远不会确切知道该程序接下来会做什么。

    还有很多。成千上万行这样的爱情魔术师恐怖。


    .bat文件在DOS/Windows上的脚本语言。上帝只知道这一种语言有多不强大,特别是当你把它与unix shell语言进行比较时(它们也没有那么强大,但是仍然要好得多)。

    只需尝试连接两个字符串或生成for循环。不.


    视觉软件环境。

    这是我的一位教授(亨利·莱德加德博士)在本科生/研究生学校试图向我们推销的一种语言。(我对说出他的名字并不感到难过,因为据我所知,他仍然是一个伟大的支持者,并欢迎有机会说服一些人,这是自切片面包以来最好的事情)。当我把它描述给人们时,我最好的比喻是,它有点像Fortran和Cobol的私生子,有点特别糟糕。从我找到的唯一真正可访问的文件夹中(其中有很多我不想在这里具体链接的内容):好的。

    • VSE概述(PDF)
    • 第3章:VSE语言(PDF)(根本不是语言概述)
    • 附录:关于字符串和字符(pdf)
    • 软件幸存者(PDF)(狂热的漫无目的地试图证明这一图尔德)

    VSE是建立在他们称之为"分离原理"的基础上的。其理念是数据和行为必须完全隔离。假设C要求所有变量/数据必须在函数开头声明,除非现在将该声明移动到其他函数也可以使用的单独文件中。当其他函数使用它时,它们使用的是相同的数据,而不是具有相同布局的数据的本地副本。好的。

    为什么要这样做?我们从软件幸存者那里了解到,可变范围规则很难实现。我想引用一句话,但是,像大多数傻瓜一样,这些人需要永远说什么。在那个pdf中搜索"范围的泥潭",你会发现一些真正的启示。好的。

    他们继续声称,这在某种程度上使它更适合于多进程环境,因为它更接近于底层硬件实现的模型。好的。好的。

    另一个经常出现的选择主题:好的。

    1
    2
    3
    4
    5
    INCREMENT DAY COUNT BY 7 (or DAY COUNT = DAY COUNT + 7)
    DECREMENT TOTAL LOSS BY GROUND_LOSS
    ADD 100.3 TO TOTAL LOSS(LINK_POINTER)
    SET AIRCRAFT STATE TO ON_THE_GROUND
    PERCENT BUSY = (TOTAL BUSY CALLS * 100)/TOTAL CALLS

    Although not earthshaking, the style
    of arithmetic reflects ordinary usage,
    i.e., anyone can read and understand
    it - without knowing a programming
    language. In fact, VisiSoft arithmetic
    is virtually identical to FORTRAN,
    including embedded complex arithmetic.
    This puts programmers concerned with
    their professional status and
    corresponding job security ill at
    ease.

    Ok.

    嗯,真的没那么担心。Bill Cave尝试销售VSE的一个关键卖点是编程的民主化,这样商业人士就不需要为了工作安全而使用疯狂的、神秘的工具的程序员签订契约。他利用这种非理性的恐惧来出售他的工具。(它起作用了——联邦政府是他最大的客户)。我统计了文件中"工作安全"一词的17种用法。示例:好的。

    • ... and fit only for those desiring artificial job security.
    • More false job security?
    • Is job security dependent upon ensuring the other guy can't figure out what was done?
    • Is job security dependent upon complex code...?
    • One of the strongest forces affecting the acceptance of new technology is the perception of one's job security.

    他利用这种妄想症来挑拨那些手握钱袋的经理们和那些有知识认识VSE的技术人员之间的隔阂。他就是这样把它挤进公司的——"你的技术人员只是说它很烂,因为他们害怕它会让他们过时!"好的。概述文档中的一些附加选项:

    Another consequence of this approach
    is that data is mapped into memory
    on a"What You See Is What You Get"
    basis, and maintained throughout.
    This allows users to move a complete
    structure as a string of characters
    into a template that descrives each
    individual field. Multiple templates
    can be redefined for a given storage
    area. Unlike C and other languages,
    substructures can be moved without the problems of misalignment due to
    word boundary alignment standards.

    Ok.

    现在,我不知道你的情况,但我知道,当涉及到语言选择时,内存布局的WYSIWYG方法是我优先考虑的问题!基本上,他们忽略了对齐问题,因为只有在60年代和70年代设计的旧语言才关心单词对齐。或者类似的。推理是假的。这对我来说毫无意义,我几乎立刻就忘记了。好的。

    There are no user-defined types in VSE. This is a far-reaching
    decision that greatly simplifies the
    language. The gain from a practical
    point of view is also great. VSE
    allows the designer and programmer to
    organize a program along the same
    lines as a physical system being
    modeled. VSE allows structures to be
    built in an easy-to-read, logical
    attribute hierarchy.

    Ok.

    令人惊叹的!用户定义的类型是lame。如果我可以的话,为什么我想要一个像InputMessage的东西?好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    LINKS_IN_USE INTEGER
    INPUT_MESSAGE
       1 ORIGIN             INTEGER
       1 DESTINATION        INTEGER
       1 MESSAGE
          2 MESSAGE_HEADER  CHAR 10
          2 MESSAGE_BODY    CHAR 24
          2 MESSAGE_TRAILER CHAR 10
       1 ARRIVAL_TIME       INTEGER
       1 DURATION           INTEGER
       1 TYPE               CHAR 5

    OUTPUT_MESSAGE CHARACTER 50

    你可能会这样想,"哦,这是相当好的格式,如果有点老派。"老派是对的。空白很重要——非常重要。而且是多余的!1必须在第3列中。1表示它处于层次结构的第一级。符号名称必须在第5列中。您的层次结构的深度限制为9。好的。

    好吧,好吧,但那太可怕了吗?等一下:好的。

    众所周知,阅读文本,使用传统的上/下箱子更易读。VSE使用所有大写(注释除外)。为什么?心理学文献是以关于散文。简单地说,程序不是散文。程序更像数学,会计,表格。程序字体(通常是快递员)几乎通用固定螺距原因-垂直对齐相关代码行。中的程序大写字母可读性很好,一段时间后,我们的意见好的。

    没有什么比在语言层面上强化你的观点更重要的了!没错,除非在注释中,否则不能在VSE中使用任何小写。把你的锁打开,它会在那里卡住一段时间。好的。

    VSE子进程称为进程。此代码示例包含三个进程:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    PROCESS_MUSIC
        EXECUTE INITIALIZE_THE_SCENE
        EXECUTE PROCESS_PANEL_WIDGET

    INITIALIZE_THE_SCENE
        SET TEST_BUTTON PANEL_BUTTON_STATUS TO ON
        MOVE ' ' TO TEST_INPUT PANEL_INPUT_TEXT
        DISPLAY PANEL PANEL_MUSIC

    PROCESS_PANEL_WIDGET
        ACCEPT PANEL PANEL_MUSIC

    *** CHECK FOR BUTTON CLICK
        IF RTG_PANEL_WIDGET_NAME IS EQUAL TO 'TEST_BUTTON'
           MOVE 'I LIKE THE BEATLES!' TO TEST_INPUT PANEL_INPUT_TEXT.
        DISPLAY PANEL PANEL_MUSIC

    按预期全部大写。毕竟,这很容易理解。注意空格。这又有意义了。所有进程名称都必须从列0开始。指令的初始级别必须从第4列开始。更深的级别必须缩进3个空格。不过,这没什么大不了的,因为不允许你做嵌套条件之类的事情。要嵌套条件吗?好吧,做另一个过程,然后调用它。注意可口的COBOL风格语法!好的。

    你想要套环吗?容易的:好的。

    1
    2
    3
    4
    5
    6
    7
    EXECUTE NEXT_CALL
    EXECUTE NEXT_CALL 5 TIMES
    EXECUTE NEXT_CALL TOTAL CALL TIMES

    EXECUTE NEXT_CALL    UNTIL NO LINES ARE AVAILABLE
    EXECUTE NEXT_CALL    UNTIL CALLS_ANSWERED ARE EQUAL TO CALLS_WAITING
    EXECUTE READ_MESSAGE UNTIL LEAD_CHARACTER IS A DELIMITER

    呃。好的。好啊。


    以下是对我自己问题的贡献:

    源Labtalk

    在这方面我一直最喜欢的是Origin Labtalk。在labtalk中,字符串变量标识符的最大长度是一个字符。也就是说,总共只有26个字符串变量。更糟糕的是,其中一些是源代码本身使用的,不清楚是哪个。

    从手册中:

    LabTalk uses the % notation to define
    a string variable. A legal string
    variable name must be a % character
    followed by a single alphabetic
    character (a letter from A to Z).
    String variable names are
    caseinsensitive. Of all the 26 string
    variables that exist, Origin itself
    uses 14.

    门DXL

    在我看来,第二个最糟糕的是DOORS DXL。编程语言可分为两组:那些具有手动内存管理(例如,删除、空闲)和垃圾收集器的。有些语言同时提供这两种语言,但dxl可能是世界上唯一两者都不支持。好吧,老实说,这只适用于弦乐,但是,弦乐并不是需求工程软件中最常用的数据类型。

    结果是字符串使用的内存永远无法回收,并且门像筛子一样漏。

    在DXL中还有无数其他的怪癖,仅举几个例子:

    • dxl函数语法
    • DXL阵列


    冷熔合

    我想这对设计师有好处,但作为一个程序员,我总是觉得有一只手绑在我的背后。


    我使用过的最糟糕的两种语言是APL,它以其所处的时代的语言而闻名,而Teco,它是最初编写Emacs的语言。两者都以简洁、难懂的语法而闻名。

    APL是一种数组处理语言;它非常强大,但几乎不可能读取,因为每个字符都是一个运算符,许多字符没有出现在标准键盘上。

    Teco有着相似的外表,原因也相似。大多数字符都是运算符,这种专用语言专门用于编辑文本文件。因为它使用了标准的字符集,所以有点好。它确实有能力定义函数,这就是赋予emacs生命的东西——人们编写宏,并在一段时间后才调用它们。但是弄清楚一个程序做了什么或者写一个新的程序是一个很大的挑战。


    • L代码:
    1
    2
    3
    4
    HAI
    CAN HAS STDIO?
    VISIBLE"HAI WORLD!"
    KTHXBYE

    说真的,最糟糕的编程语言是makefiles。完全不可理解,标签有句法意义,甚至没有一个调试器来找出发生了什么。


    我不确定您是否打算包括脚本语言,但我见过tcl(这也很烦人),但是…MIRC脚本语言让我非常恼火。

    由于解析过程中的一些疏忽,在不应该出现空白的情况下,它是非常重要的。条件语句有时会在应该跳过时执行。不能在单独的行等上打开block语句。

    除此之外,它还充满了混乱、不一致的语法,这种语法可能是为了使非常基础的东西变得容易而设计的,但同时也使任何东西变得更加复杂,几乎不可读。

    我丢失了大部分MIRC脚本,或者我可能找到了一些很好的例子,说明它迫使你造成了多么可怕的混乱:(


    正则表达式

    它是一种只写的语言,很难验证它对于正确的输入是否正确工作。


    管理系统中信息技术的应用


    我发现自己最不必使用vbscript/VisualBasic6。

    对于大多数任务,我主要使用C++、JavaScript、Java,并在需要时涉入Ruby、Scala、Erlang、Python、汇编器、Perl。

    我,像大多数其他思想合理的多语者/程序员一样,强烈地感觉到你必须为工作使用正确的工具——这需要你理解你的领域并理解你的工具。

    我对vbscript和vb6的问题是,当我使用它们编写Windows或Office应用程序(它们的正确域)脚本时——我发现自己在语言方面遇到了困难(它们没有成为正确的工具)。

    vbscript缺乏易于使用的本地数据结构(如关联容器/映射)和其他特性(如为对象分配设置的特性),这是一个不必要和令人沮丧的麻烦,尤其是对于脚本语言而言。与JavaScript(我现在用它来编程wscript/cscript窗口和执行ActiveX自动化脚本)相比,它更具表现力。虽然有一些对vbscript更有效的东西(例如,从COM对象来回传递数组稍微容易一些,尽管用jscript将事件处理程序传递到COM组件更容易),但是仍然有大量的编码器使用vbscript编写窗口脚本,我仍然感到惊讶-我敢打赌,如果他们用bo编写相同的程序他们会发现,由于JScript的本地散列数据类型和闭包,JScript比VBScript更适合您使用。

    vb6/vba虽然总的来说比vbscript好一点,但仍然有许多类似的问题,在这些问题上(在他们的领域),他们需要更多的锅炉板来完成简单的任务,而不是我希望和看到的其他脚本语言。


    我不敢相信没有人说过这句话:

    奖章

    我认为至少比PHP差得多。

    与遵循类似于Visual Basic的语法的语言本身无关的是,它似乎具有许多功能,用于极其无用的东西,而这些东西您永远不会(或百万分之一)使用,但缺乏对您每天使用的东西的支持。

    我不记得有什么具体的例子,但它们是这样的:

    "好的,我有一个事件要检查鼠标指针是否在窗体的上角,并且窗体没有双击事件!???WTF?"


    我曾经两次用"语言"工作,你把n-dropped模块拖到页面上,然后用线将它们链接在一起以显示数据流。(一种是RDBMS,另一种是通用数据采集和数字处理语言。)

    一想到它,我就知道该怎么阻止别人。或者呕吐。或者两者都有。

    更糟糕的是,这两种语言都没有暴露出可以直接破解的文本语言。


    在25年多的计算机编程生涯中,我所经历的最糟糕的事情是腮腺炎的一个衍生产品,叫做"MEDITECH MAGIC"。这比PHP所希望的邪恶得多。

    它甚至不使用"="进行分配!100^b将100的值赋给b,并读作"100到b"。基本上,这种语言自上而下发明了自己的语法。所以不管你知道多少编程语言,魔法对你来说都是一个完全的谜。

    墙上有一百瓶啤酒,是用这种可憎的语言写的:

    1
    2
    3
    4
    5
    6
    BEERv1.1,
    100^b,T("")^#,DO{b'<1 NN(b,"bottle"_IF{b=1"";"s"}_"of beer on the wall")^#,
                              N(b,"bottle"_IF{b=1"";"s"}_"of beer!")^#,
                              N("You take one down, pass it around,")^#,b-1^b,
                              N(b,"bottle"_IF{b=1"";"s"}_"of beer on the wall!")^#},
    END;


    TCL。它只在代码执行之前编译代码,因此,如果您的代码在测试期间从未下过分支,并且有一天,在它下过分支A的字段中,它可能有语法错误!


    特劳夫

    告诉你我多大了。你可以在里面做些可爱的事,但很粗糙。你们认为Perl不可读的人应该去看看。

    我是说:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    .nr *pop-count 0
    .while !'\
    (.z'' \{\
    .   "@warning automatically terminating diversion \
    (.z
    .   ie d @div-end!\
    (.z .@div-end!\
    (.z
    .   el .*div-end-default
    .   nr *pop-count +1
    .   " ensure that we don't loop forever
    .   if \
    [*pop-count]>20 .@fatal recovery failed
    .\}
    .while !'\
    [.ev]'0' .ev
    .par@reset-env
    .par@reset

    不管你信不信由你,在不得不这么做多年之后,我一直在编程。


    标志……那只该死的乌龟永远不会到我想去的地方。


    我真的不喜欢Visual Basic,甚至.NET版本。坦率地说,我发现语言的核心方式是冗长的。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    If condition1 = condition2 Then
      ...
    Else If condition1 > condition2 Then
      ...
    End If

    Public Function SomeFunction(ByVal arg1 As String, ByVal arg2 As Integer) As String
      ...
    End Function

    但是在C:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (condition1 == condition2) {
      ...
    }
    else if (condition1 == condition2) {
      ...
    }

    public string SomeFunction(string arg1, int arg2) {
      ...
    }

    显然,许多其他语言,如f_、python等,都没有那么冗长。老实说,我觉得使用VB的时间是其他语言的两倍。

    我知道这是一个很肤浅的答案,部分原因是它没有解决某些语言问题(比如PHP对全局函数的过度使用)。但从人性化的"经验导向"的角度来看,VB只是让我脾气暴躁。


    伯恩贝壳

    我曾经为一家电信公司开过发票。这意味着手动运行一系列命令,这些命令将分别用于订单收集、准备、计算、格式化和最终打印发票。这通常是以批处理的形式进行的,这样我就被告知要为哪些客户编号开具发票,并且我会批量处理这些客户编号。

    这很无聊。所以我开始把它自动化。不幸的是,服务器上唯一允许使用的语言是…嗯,没有。完全。所以我必须用shell脚本编写所有内容。这真是一种荒诞离奇的语言。没有什么真正有意义的。它是不一致和过于稀疏的,所以两个相似的事情可能做完全不同的事情,因为一个?在一个稍微不同的地方。使用反引号作为语言的一部分是纯粹的邪恶。在某些字体中,它们甚至看起来与单引号没有区别!

    我有过更糟糕的编程经验。更糟。但这些总是涉及到维护其他人的奇怪代码。但这肯定是我用过的最糟糕的语言了。比DOS批处理文件更差?哦,是的。DOS批处理文件的主要问题是它们是原始文件。你必须找到聪明的方法让它真正发挥作用。但语法本身并没有那么糟糕。它只是没有足够的内置功能。比Visual Basic差?哦,是的,毫无疑问,尽管我在MS Access中为这个BourneShell系统编写了一个UI,但这几乎是可怕的,但几乎是。他们通过Sybase进行交流,所以我需要学习Sybase SQL,这也很可怕。但仍然没有Sh脚本那么可怕。

    所以伯恩壳牌公司为我赢得了巨额的价格。只有当vb紧跟其后时,它才会赢。


    在Unix中,m4脚本和sendmail.conf脚本。


    Fortran 77型

    公平地说,也许1977年它是一门很好的语言,但到1999年我不得不维持一个Fortran 77程序,这个程序最初是由我的顾问在20世纪70年代的某个时候作为研究生开始的(最初是用打孔卡)。该程序被"增强"黑客攻击,被各种能力的人中断了二十多年。最古老的代码是allcaps,塞满了goto语句、全局变量和参数多于我手指的函数。FORTRAN中最初的变量名仅限于6个字符,但为了保存字节,大多数变量都被赋予了诸如"a"、"b"、"aa"、"ii"等描述性名称。

    当然,我的很多经验都与程序的编写方式有关,但语言并不能真正鼓励良好的编程风格:

    • 取决于变量名的第一个字母的隐式键入(例如,以"i"到"n"开头的名称是整数,否则默认为实数)
    • 固定语句布局(打孔卡的保留:第0列表示注释行,如果它有"c",第1-5列中的标签,第6列中的延续字符,第7-72列中的语句)
    • 语句标签(此处为数字标签)
    • 关键词都是大写

    谢天谢地,我已经10年没看过Fortran了,我已经忘记了我记得的更多烦恼。


    CSS

    对于基本的样式来说,它是可以的,选择器是相当酷的,但是有一些关于盒子模型,漂浮和清除的虐待狂。

    黑客语言使得它做一些基本的事情,比如把一个盒子放在另一个盒子下面,这一切都是在一天的工作中完成的。

    在这里,我们生活在未来,只是让基本的设计元素发挥作用,如圆角或阴影,是徒劳的练习。

    "可重用性"的概念基本上以ctrl-c ctrl-v结尾。即使是一个经验丰富的CSS编写者也很少接触到其他人的样式表,这意味着在世界各地,基本布局都会被反复重写。

    当然,它不应该全力以赴——它所提供的对世界真正有用的东西的任何希望都被事实上的语言"平台"——Internet Explorer无情地抛在石头上。


    对我来说,破坏我对语言观点的最糟糕的经历是Perl。我被要求支持一组Perl脚本,这些脚本已经得到了其他人的"支持",他们在被要求支持它几个月后立即离开了公司。虽然语言可能是正常的,但它允许代码很快变得不可读和几乎不可支持(除非只有一个人接触过它们)。它是一堆regexp、伪对象、单字母变量和函数名。它很快让我用python重写了它,并彻底废弃了perl(或者我退出了)。python版本的可用性和可支持性大大提高,10年后它仍在使用中,据我所知,该公司不允许任何人再次使用perl。


    对我来说,它必须是文件编制者。

    编剧

    此屏幕截图显示了直到最近才被命名为"scriptmaker"的文件生成器9,它在文件生成器9中有许多改进,例如用于复制和粘贴的ctrl+c ctrl+v快捷方式,以及一个非模态对话框,以便您可以一次编辑多个脚本。

    http://images.macnn.com/macnn/reviews/filemaker/9proadvanced-ice_feature1_main.png

    使用此对话框编辑单个脚本。脚本"steps"(如左图所示)将添加到左侧的列表中(双击),并向上和向下移动(使用"set web viewer"左侧的小blob)。一次只能移动一行,临时禁用脚本步骤的注释仅在高级版本的FileMaker Pro中可用。

    构建一个脚本实际上会破坏你的手腕,因为你一小时要在键盘和鼠标之间进行数千次的交换,在小配置框中输入内容,然后重新安排代码行。

    脚本在技术上是一个过程,可以传递一个参数。是的,只有一个。如果需要多个参数,则必须使用一些分隔符有效地组合参数,将其传递给脚本,然后将参数拆分。在脚本完全可以拥有参数之前(在fm7 iirc之前),使用globals传递数据是正常的。

    这家伙把他的大部分仇恨都藏在了一个骗局文件制作11的预告片里。


    我要投票支持ColdFusion。它试图成为一种很酷的脚本语言,但是用HTML格式的标记来完成却让我抓狂——我已经有一段时间没有处理它了,但是我记得变量声明可能是一个负担,而且很容易在两个不同的环境中有稍微不同的服务器版本,这两个环境中的代码工作方式也会有所不同。两个都是。

    如果你想用它做任何令人印象深刻的事情,它基本上涉及在Java中创建一个对象,并找出如何将它与CaldFixon的服务器链接,这样你就可以调用它作为标签。我在用PHP,尽管PHP有问题,但ColdFusion确实更糟。


    JCL-IBM大型机的作业控制语言…不完全是编程语言,更多的是批处理文件。

    这是基于通常放在作业开始时的穿孔卡片,即相同的语法、不同的介质。71列的限制和卡的成本意味着冗长的内容是留给COBOL资源的一个最坏的选择。这种态度延续到了JCL,即非纸面上的对应者。

    我只是想知道如何在我的工作时间内更改工作队列和潜在客户卡中的参数。维基百科提供了以下很好的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X
    //COPY01   EXEC PGM=IEBGENER
    //SYSPRINT DD SYSOUT=*
    //SYSUT1   DD DSN=OLDFILE,DISP=SHR
    //SYSUT2   DD DSN=NEWFILE,
    //            DISP=(NEW,CATLG,DELETE),
    //            SPACE=(CYL,(40,5),RLSE),
    //            DCB=(LRECL=115,BLKSIZE=1150)
    //SYSIN    DD DUMMY

    没错。

    值得一提的是,CincomMantis是一个"应用程序生成器"(读作:基于文本的表单设计器),由类似于COBOL的4GL驱动。螳螂是帮助我决定去攻读学位的语言——是屁股上几个CIC中的最后一个。

    编辑提到的DCL等其他地方…数据检索我也记得。这些确实很糟糕,但仍然比任何大型机都更喜欢虚拟机。


    有时我很困惑为什么软件公司会开发自己的脚本语言来与他们的软件交互,而不是构建一个强大的API来与您选择的脚本语言交互。我的选票投给了Transcad的脚本语言。


    我"使用"的最糟糕的语言是"机器人卡罗尔",这是一种德语编程语言。只能在xd屏幕上移动机器人


    我鄙视专有语言,如C和AppleScript,它们存在的唯一原因是将开发人员与商业平台或产品联系在一起。这不是一个技术问题,但当这些语言在学校里教授时,它是一个社会问题。我有一个朋友只安装了Linux,他在第一年的康普西语课上被教授C。是的,有单声道,但自然它总是在功能和稳定性上追赶。


    大都会英语(梅尔)!

    我在一家公司工作,该公司编写工具来自动查找和修复COBOL和PL/I中的Y2K问题。Metlife向我们提供了他们用Mel编写的200万行代码,这是他们在50年代末或60年代初开发的一种语言。Mel是一种有助于激发COBOL的语言,其过程代码对于任何现代COBOL来说都相当熟悉。程序员。

    我们让一个强大的开发人员尝试着写一个翻译器来翻阅MEL程序并更正确定的日期。事实上,他在几周内就完成了一个演示,他认为只有另外3-4周的工作才能使它成型用于制作。太好了,我们想,决定开始工作。

    不幸的是,他并没有真正研究mel非常原始的相当于COBOL数据划分(声明在哪里)。结果,每个MEL程序都提供了自己的每个输入或输出文件的视图,并且只声明了感兴趣的字段。可能有30或40种不同的方式来处理带有变量记录的输入文件。说说盲人和大象!

    然后,一个非常聪明和有驱动力的人接管了这项工作,并研究出了识别哪些记录定义描述了什么文件的语义,这一过程由于在许多文件中存在不同的记录而变得更加困难。然后,他编写了算法,将每一组备用记录定义统一为一个通用记录定义,然后将所有内容从旧的模拟霍尼韦尔数据类型映射到新的IBM大型机类型。花了两年的时间才使它全部工作起来。


    Symbian C++嗯,它不是C++。它正在学习一门全新的语言,但效果不太好。


    我在其他地方也给出了同样的答案,但我认为它应该在这里占有一席之地:

    在90年代后期,我不得不用InformixUniversalServerWebBlade(又名IllustraWebBlade)编写几个网站。

    对于任何一个不了解这种令人讨厌的环境的人来说,它迫使你使用我所见过的最奇怪的语言。乔尔·斯波斯基描述的那样

    When it did run, it proved to have the only programming language I've ever seen that wasn't Turing-equivalent, if you can imagine that.

    更多信息请访问http://philip.greenspun.com/wtr/illustra-tips.html。

    以及"简单"if条件的示例:

    1
    cond=$(OR,$(NXST,$email),$(NXST,$name),$(NXST,$subject))

    我希望我能找到完整的API文档,因为回头看,这将是一个滑稽/难以置信/悲剧。

    它可怕的一个例子是它没有回路。任何种类的。可以通过创建一个查询并遍历其行来破坏循环功能,但这是错误的,这让我感到恶心。

    编辑:我已经找到了一个完整的代码示例。看到:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <HTML>
    <HEAD>WINSTART bug</HEAD>
    <BODY>
    <!--- Initialization --->
    <?MIVAR NAME=WINSIZE DEFAULT=4>$WINSIZE<?/MIVAR>
    <?MIVAR NAME=BEGIN DEFAULT=1>$START<?/MIVAR>

    <!--- Definition of Ranges ---->
    <?MIVAR NAME=BEGIN>$(IF,$(<,$BEGIN,1),1,$BEGIN)<?/MIVAR>
    <?MIVAR NAME=END>$(+,$BEGIN,$WINSIZE)<?/MIVAR>
    <!--- Execution --->
    <TABLE BORDER>
    <?MISQL WINSTART=$BEGIN WINSIZE=$WINSIZE
        SQL="select tabname from systables where tabname like 'web%'
            order by tabname;">
        <TR><TD>$1</TD></TR>
    <?/MISQL>
    </TABLE>

    <?MIBLOCK COND="$(>,$BEGIN,1)">
        <?MIVAR>
        <A HREF=$WEB_HOME?MIval=WINWALK&START=$(-,$BEGIN,$WINSIZE)&WINSIZE=$WINSIZE>
        Previous $WINSIZE Rows </A> $(IF,$(<,$MI_ROWCOUNT,$WINSIZE), No More Rows,  )
        <?/MIVAR>
    <?/MIBLOCK>
    <?MIBLOCK COND="$(AND,$(>,$END,$WINSIZE),$(>=,$MI_ROWCOUNT,$WINSIZE))">
        <?MIVAR>
        <A HREF=$WEB_HOME?MIval=WINWALK&START=$END&WINSIZE=$WINSIZE>
        Next $WINSIZE Rows  </A>
        <?/MIVAR>
    <?/MIBLOCK>
    </BODY>

    美丽不知道如何给它上色,平息惊喜。


    我很惊讶没有人提到Sybase PowerBuilder

    • 混淆语法
    • 混淆对象模型
    • 缺少本地正则表达式支持
    • 很难使用IDE(特别是工具选项板)


    我认为,3dstudiomax附带的脚本语言maxscript,我从来没有见过它的语法逻辑。


    RPG II?有人吗?

    这是最糟糕的一个检查这个wiki描述的一个简短的介绍一种语言,生活在它的过期日期很长。

    从好的方面来说,你可以喝醉或清醒地写程序,但这并没有什么不同。


    有人提到autohotkey中使用的脚本语言吗?我用过最糟糕的语言。


    CRM114。一种专门设计用于与非常强大的贝叶斯过滤器接口的语言,可用于垃圾邮件过滤和类似任务。

    去年一个客户要求我使用它,在研究之后,我使用了codeproject.com上的一些简单的贝叶斯代码。后来,我在论坛上发现了一条来自CRM114原始作者的信息,为此道歉。

    主要问题是拉丁语衍生语法。作者承认当时他一直在学习拉丁语,因此把它融入到了他的项目中。因此,它得到了奇怪的操作符顺序和参数约定。这也导致了使用"alius"(拉丁语表示"否则"或"其他")这个词,在其他语言中使用"else"。

    很难让它做任何事情。


    90年代中期,我在一家小型管理咨询公司工作,使用一种叫做mapinfo的地理信息系统产品,该产品的脚本语言很弱,叫做mapbasic。

    我不记得具体细节,但基本上当时有对象*只能在硬编码时实例化(而不是用变量实例化)。这是一个彻底的痛苦,因为它似乎做了你需要做的一切,直到你真正尝试实现。实施不是不可能的,就是非常笨重。

    那时我还是个新手,有很多困难a)预测什么可以做,什么不能做;b)向我的非编程经理解释为什么。这也同样令人沮丧。

    在某些领域,有很多语言和工具都很薄弱,但在处理完map-basic之后,即使是Visual Basic 3.0也感觉到了解放!

    *-我不记得是所有的物体还是只有某些物体。


    首先,需要注意的是:我倾向于将语言传递给那些能够很好地满足其预期目的的语言,但是让企业界去做比他们的设计师预期的更多的事情。出于这个原因,我将传递给vb及其vb office变体。对于快速原型设计,VB是很难击败的。当人们试图将它用于企业级工作时,它失败了很多。Perl也是如此,它是一个伟大的脚本工具,在某种程度上被提升为CGI语言。

    但是一种语言,即使用它自己的术语也不能达到预期?对我来说,这不是一场竞赛:javascript,原因有三个:

  • 缺乏良好的调试能力(Firebug有帮助,但还不够)。
  • 它只是在出现错误时停止的方式,强制程序员添加警报("in functionx"),以确保您将其设置为functionx,以及
  • 它令人恼火的模糊错误信息。
  • 如果允许我选择一个框架,这也是一个简单的选择:JSF和ICEFEAS。


    如果我们问自己这个问题X年下来(X=10或20或?)我们都会齐声说"20世纪所有的语言都很糟糕"。这将是一种范式转换,即我们将以一种截然不同的方式做事……虽然我无法想象怎么办!


    ABAP

    它用于为SAP编程应用程序。这很糟糕。


    还没人提到Vimscript?

    我的维姆之旅就像科拉琳进入门的另一边的旅程。起初很酷,我的手指也很高兴,但后来我不想用维姆脚本来代替我的眼睛。


    旧的Excel宏语言在Excel工作表中存储变量真是令人沮丧。VBA也很差。


    我打算对JAVA进行抱怨和呻吟,但显然它并没有那么糟糕,那就相当于拖曳,此外,我还记得更糟糕的事情:

    魔法II。

    它几乎不适合作为一种语言。实际上,它可以更准确地描述为具有数据驱动编程模型的SQL前数据库系统。它基于敏锐的观察,几乎你对数据库表所做的每件事都涉及到在开始迭代数据之前做一些事情,然后迭代数据,然后在完成之后做一些事情。

    "编程"的魔力在于在表格中填入描述程序生命中这三个阶段的字段。它也有一个文本模式的屏幕设计师,与整个混乱联系在一起。训练有素的魔术师用户可以以相当快的速度删除报告和数据输入屏幕,这让管理层感到高兴。

    对我来说,问题是语言的抽象设施非常少。您可以定义可以从其他例程调用的例程。就这样。除了数据库表,没有其他数据结构,也没有内存中的数组(不过,您可以定义新表!)

    没有哈希表,没有任何有意义的方式来组织变量(语言确实支持)。没有列表。没有什么。当然,没有类或者类似对象模型的东西,但是老实说,没有它我也能活下去。我做到了。

    更糟的是,"程序"的一些片段被隐藏在你必须放大才能看到的字段中——某些表达式等等,所以你永远不能仅仅阅读一个代码屏幕并知道它做了什么。

    这件事把数据驱动的编程带到了它的终极,悲伤的顶点。这是一种困扰,体现在编程工具中。我很高兴把那可怜的垃圾放在我身后。

    最近,我遇到了一位前同事,他在我使用魔法的时候和我一起工作。我已经做了近20年了,但她很高兴地告诉我她是如何承担维护我的一个项目的任务的,当她在某个地方发现一个递归过程时,她宣布失败。她从未见过有人用魔法实现递归。从来没有人有过。这是一个未知的领域。我认为没有人意识到这个工具能够递归。

    在这个项目导致某人的大脑爆炸之前,必须匆忙重写它。


    LabVIEW(这是否被认为是一种语言?)

    太可怕了。如果你想扩展这个术语,HTML也很糟糕,XML也是。


    系统RPL,由HP 48、49和50图形科学计算器使用。在我看来,有时编译器实际上已经为处理器生成了一种更高级的语言来执行。


    半烘焙的面向对象扩展到C。在嵌入式系统中,仍然有许多只包含C的项目。所以时不时有人认为他的面向对象的解决方案就是把这个项目塑造成一个完整的形状所需要的…在线下的某个地方留下了大量的维护混乱。

    通常情况下,这个人开始时的目标是谦逊和高尚的,但每次都会远离他。他交给另一个认为这很好的程序员。噢,在C中,多么整洁,然后屠杀了他不理解的已经悲惨的代码。很快就无法修复了。最糟糕的是,我看到没有一个驱动程序能够在不包含将要使用它的对象的所有头文件以及该组件用户的头文件的情况下编译到最高级别。

    任何编程语言如果没有按预期使用,都会变成怪物。


    天哪,你是说没人用过PL/SQL?甲骨文是从地狱衍生出来的,它被解释为甲骨文,并生活在甲骨文服务器的上下文中。所有输出都被假脱机,直到程序完成。它可以显示的输出量有一个绝对限制。调试几乎是不可能的。总…我觉得我会考虑的。


    行话,用于冲击波闪光(或其他)。相当可怕,基本的东西有点太动态类型系统。编辑很差劲,调试程序也很差劲。啊!

    我不得不承担的应用程序是由ScriptKiddies编写的,它使用变量类型来控制流,这可能没有帮助。(如果是一个字符串,我们是在模式A中,所以它的意思是x,如果是int,我们是在模式B中,所以它的意思是y)。美元,英镑,英镑,英镑!

    我喜欢python,我想在那里也可以做一些同样可怕的事情,但是社区和工具更加友好和严格。


    Focus,被吹捧为"4GL"(第四代语言)。一些系统可以使用焦点,如SQL,执行数据库查询,结果用基本的或其他程序语言包装,但我在80年代在波音公司工作的系统没有这样的功能。有点像一个经营企业的非常差劲的Excel。那是我唯一讨厌的编程工作。


    PC焦点

    我在一个仓库库存+管理系统工作,其中后台子系统在PC-Focus中实现。

    关于这种语言,需要说的是,编程手册中有一个100多页的章节,标题是"解决方法"。


    网络速度和速度脚本..太可怕了,没有解释:)


    对于我的高级设计,我们设计了一个佳能相机,用CHDK生成深度图。大多数代码都是用C语言编写的,但是您必须使用这种称为ubasic的荒谬语言与它进行交互。基本上,它不是用一个合适的解析器实现的,所以变量只能是1个字母,速度非常慢,如果你出错了,相机就会关闭。


    它的vb6 nooooooooooooooooooo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!你最终就像1984年底的温斯顿·史密斯……


    奥伯伦。

    在我们上大学的第一年,每个人都必须在奥伯伦学习。我想办法是确保没有人先发制人。语言与Oberon OS/GUI绑定在一起,这太可怕了!我不确定是否有什么变化,但这绝对是我有史以来最糟糕的编程经验。


    在存在firebug之前的javascript,并使用记事本对其进行编码。

    这是我生命中最可怕的代码,JS区分大小写,我很头疼。IE以一种奇怪的方式检测错误…


    snobol有一些简洁的特性,字符串处理能力比Perl更广泛。它还有一种类型的语句: = :S(,其中大部分组件可以省略。根据是否在基字符串中找到匹配字符串,通过跳到一个或另一个标签(如果存在)来完成控制结构。字符串可以包括各种函数和子字符串,因此合理的snobol字符串可以包括您最喜欢的编程语言标准后面提到的所有语法树。

    在其中编写一个解析器是很简单的(尽管它不一定是有效的),但是像算术或循环之类的东西都是很麻烦的。


    毫无疑问,这是一场小小的谈话。但仅仅是在技术层面上:实际的语言很好,但是我们在课堂上使用的IDE是可视化作品,这是我所经历过的最糟糕的一个。以下是一些恐怖事件的例子:

    -除非每一位代码在语法和语义上都完全正确,否则无法保存图像(整个项目包装成一个文件)。-它经常崩溃,而且UI的设计非常糟糕。按钮会从窗户上脱落等等。-有一次,当我做了大约2-3个小时的新鲜工作后,视觉作品冻结在我身上,不幸的是没有保存。幸运的是(我想),保存按钮仍然有效。所以,我松了一口气,挽救了我的计划。但是,由于VisualWorks将项目保存为图像的方法,当我重新打开文件时,它将我的项目保存为冻结状态。最后我不得不回到我的代码的早期版本,并损失了几个小时的工作。

    可怕的IDE设计的一个最糟糕的症状是:-只有一步撤消。不仅如此。听听这个。如果删除一行代码,请将光标移到其他位置,然后单击"撤消",将代码行粘贴到光标当前所在的位置,而不是该行最初所在的位置。那是世贸组织吗??我认为Freakin的Lotus1-2-3具有比这更好的撤销功能!

    另外,我知道我不是在谈论语言,但因为这代表了我使用语言的经验,所以我觉得我仍然可以在这个问题上给出我的答案。:)


    在我遇到的语言方面,我将投票支持COBOL和Scheme。

    COBOL是商业专业学生永远不应该编写编程语言的确凿证据(这是来自商业专业毕业生——CIS)。你不应该写半连贯的小说,把它编成某种东西。我知道40年前它就已经被使用过了,但有人把它移植到了cobol.net上,因为它大声的叫喊。

    其次是Scheme,它只有一个变量类型:链表。如果你是一个美国出生的火星人,试着学会如何思考就好像学北极熊一样。它对其他一切都是陌生的。

    就我所使用的专业语言而言,vbscript非常简单。就像vb更糟。我曾经尝试在vbscript中实现MD5算法。我要做的第一件事是执行异常的位移位操作。我没有重新设计轮子,而是出去寻找一个实现。我发现的那个,我不骗你,遵循以下算法:

  • 将数字转换为十六进制
  • 将十六进制转换为字符串,例如,0x08->"08"
  • 使用一个巨大的select case语句,将每个数字转换为1和0的字符串,例如"8"->"00001000"
  • 现在你有了一个1和0的大串,必要的时候把它们移过来。
  • 真是一团糟。这是我找到的最好的一个。

    (注意:这是我记忆中最好的算法。那是6年前的事了。:)


    有源滤波器。你很幸运从来没有听说过这个噩梦。它是IBM大型机层次结构数据库/事务监视器IMS系统的昂贵附加组件。从哪里开始。

    不支持数组。如果你有一个由十个项目组成的数组,那么你需要对项目1、项目2等进行编码,并编写十行代码来处理每个项目。

    您的代码存储在数据库中,并在运行时进行交互。对代码被分解并存储在多个记录中的内容的内部结构执行此操作。改写别人的代码是非常容易的。

    有些代码与事务关联(IMS代表服务),但有些代码与数据库记录关联——如果每次有人访问记录时,程序运行的位出错。

    没有调试程序,"编译器"只做了基本语法检查大多数错误在运行时震惊,它有四个错误消息之一。

    其中一条错误消息是"无效数据类型"——也就是说,没有变量名,没有行号,没有线索。

    简直太可怕了。


    Dataflex 2.3和VDF4。

    VDF 4是驱使我远离Dataflex的原因。

    他们做的最蠢的事情之一是用第三个鼠标按钮的Windows消息在IDE和编译器之间进行通信。除非你有一个三按钮的鼠标,否则它工作得很好。


    任何语言都可能是右手最差的。不恰当的团队合作会使情况更糟。我的意思是,如果用自己的脚射击还不够有趣,你可以试着射一些同事的脚。到目前为止,我所看到的最好的语言是C++。你真的可以用它伤害同事的大脑。


    角色扮演游戏

    别在这里说角色扮演游戏,伙计们。我大学时学过COBOL,还有RPG IV。如果有什么语言让我想用叉子挖眼球,那就是RPG。它几乎是基于"列"的代码,因为您不只是从左到右编写代码,还必须确保您在正确的列中。其背后的原因是,语言最初是为穿孔卡开发而创建的。

    I can't write to a file! What the heck!

    Well duh,
    dummy, you forgot a capital F in
    column 68.


    我使用过的最糟糕的语言肯定是oz,这是一种创建多半径编程语言的失败尝试。正如您可以想象的那样,它最终变得非常模糊,语法极其复杂。您有不同的分隔符来标记您正在以功能性方式或命令性方式工作。我总是发现一些有点奇怪的定义类,其中包含函数性的非副作用方法部分。


    工作控制语言必须是我接触过的最糟糕的东西。


    哦,来吧。在3页中,没有提到forth?真的吗?

    当然,和APL一样,它很强大,也有它的位置。但和APL一样,它也在只写语言领域竞争第一名。我仍然诅咒物理教授,他在80年代末强迫我这样做,因为他确信它将接管软件世界。

    我对宇宙中5个人用反波兰符号处理现实感到遗憾。或者我应该说"道歉+"之类的话吗?


    OPS5即使现在想起来也会让我大哭。


    最差的编程语言?-脑筋操

    我自己也没用过,但我会称之为最差的。不过,它通常被用作一种挑战,而不是用于制作(更像是:这个周末我很无聊,让我们看看我是否可以在其中重新编写tic-tac-toe)。看看wiki上的Hello World程序。


    对我来说,答案是Crystal语法,Crystal Reports使用的基本语言。试图完成除简单比较以外的任何事情,充其量是困难的,充其量是不可能的。当然,他们的阵列做得相当好:

    1
    {some_database_field} IN ["firstValue","secondValue","thirdValue"]

    但以下内容根本不起作用:

    1
    {some_database_field} NOT IN ["firstValue","secondValue","thirdValue"]

    即使语言没有非运算符。


    也许Fortran……我还是有点不知所措。


    闲聊。

    我必须在大学里学。讨厌语言的方方面面。也许我们的教授在语言实现上做了一个愚蠢的选择,但基本上是这样的:

    • 没有可以浏览的源代码。只有一个类树,您可以在其中创建和编辑方法实现。除了将代码剪切粘贴到记事本之外,没有其他方法可以保存代码。您可以保存会话,但这些是二进制转储。

    • 整个环境都是用smalltalk写的,孩子——速度慢吗?每次你按下一个键,你都能看到整个屏幕的重画。编辑器(由于缺少加载/保存源代码而必须使用)缺少基本的编辑功能,如插入/重写模式。

    • 这种语言是纯粹的,在某种程度上不可能提前终止循环。语言中禁止所有使编程变得简单和高效的东西。

    • 一切都是一个物体。重写布尔值和整个系统崩溃的比较运算符。


    DBASEII(那是2,而不是3):幸运的是,我没有经常使用它,而且已经超过20年了,所以除了疼痛之外,我记不太多了!IIRC,在变量名(和其他地方)中自由使用特殊字符。使得它几乎不可能被读取,而且它缺乏流量控制。3似乎得到了更多的使用(当我使用2的时候已经这样做了,但是我的雇主太便宜了,无法升级),但我不知道它是否更好。


    动力发电机

    这是一个来自Sybase的产品,它将webapp代码和您的数据一起存储在数据库中。没有变量范围,strlen()函数本质上是一个随机数生成器。


    我的投票是基于数据总线的DB/C DX。我相信你们中的大多数人从来没有听说过这件事,还有那些……我很抱歉。。。。。


    代码齿轮Delphi

    这不是我不喜欢的语言,而是ide:codegear rad studio for delphi。这很容易是我用过的最糟糕、最轻便、最开心的IDE。我和其他Delphi程序员通常会每天损失几个小时的开发时间,因为IDE会崩溃或冻结。

    在安装了coderush之后,应用程序实际上变得不可用。它以5-15分钟的间隔崩溃,即使没有用户输入。更糟糕的是,基本调试触发了一些神秘的错误,比如命中一个断点(通常,调试器会命中一个断点,然后简单地在一个小行上冻结跟踪,比如变量分配。你做不到任何事都不会让它继续下去。如果您让程序单独运行,它将稳定运行长达半小时,然后抛出某种内存异常。

    所以,在我们花了数千美元购买codegear rad studio许可证之后,没有人想使用它。当我离开公司时,我们所有的Delphi项目都是用VIM编码的。


    "Visual C++"…如此多的遗留代码交织在一起……到处都是。

    让我爱上了obj-c。


    我也忘了提普罗瓦,是的,它是一种混合语言。它是一个构建在Java之上的Prolog实现,这意味着它是非常缓慢的。他们通过调用Java函数的能力来销售它,可悲的是,当你做Java函数时,你会丢失回溯。所以,总的来说,你失去了两种语言的优势。我仍然不明白为什么作者没有在Java中只选择Prolog的实现,所以你可以用Java调用Prolog代码,而不是构建自己的解释器。


    我很惊讶没有人提到intercal:没有可发音首字母缩写的编译器语言。它没有goto语句。它有一个来自声明!

    好吧,不过说真的,我的两个候选者是vb,我必须使用html、php和javascript的组合。

    因为它有5个不同的循环结构。因为,在做的时候,在我理解的时候做。但你真的还需要直到做,直到做????真的?

    HTML/PHP/javascript不是因为任何语言的任何特定特性,而是因为您可以以非常令人困惑的方式散布它们。打开一个HTML标记,在其中有一些javascript,在中间启动一个php if,关闭javascript和html标记,然后关闭php,再关闭另一个html和js……最后看起来像(([)]])

    似乎这只是一个糟糕的代码,但我还没有找到另一种方法来做我们正在做的事情。


    没人说AS400?????

    我在大学时就有过,那绝对是最糟糕的…


    没有人提到过DCL????


    I4GL(Informix第四代语言)。

    谢天谢地,它差不多死了。这种语言不难看,也不难写,但是实现缺陷使它几乎毫无用处。

    首先,它实际上是两种语言——解释的(更灵活、更慢)和编译的(几乎没用,实际上是在您的一生中完成运行的语言)。当然是专有的。

    早期版本缺少一些算术运算符,因此必须将临时数据推送到数据库中,并使用SQL进行数学运算。

    它本来应该具有多用户功能,但由于后端(InformixTurbo,还记得吗?)缺少适当的锁定,而不是在锁定的行上等待90秒,然后返回有用的错误,您将得到一个带有不可用的非错误返回值的即时返回。由于没有后端I4GL是无用的,所以我认为这是语言运行时中的一个缺陷。

    我曾经有一份工作,把以前所有的程序员的联合都黑客化为I4GL循环中的一系列较小的选择。原因是,工会不会在你的有生之年完成。当然,项目经理已经删除了索引唯一约束,因为它们使插入崩溃了很多。


    当然,我对不同的语言没有太多的经验,但我得说python。即使它本身的语言是好的,我只是恨""!=" "等缩进。尽管"自动"范围结束的想法是好的,但这只会导致太多的错误/花费200次按空格键来使用其他人的代码:(


    我的回答是相当接近的,但我认为这值得记录下来:

    HTML

    不管怎样,这不是一种特别强大的语言,但考虑到对它的熟悉程度超过了过去的人数,我认为它应该被归类为程序员。

    很多针对诸如PHP之类的语言的焦虑(甚至在这个线程中)根源于HTML的限制。考虑一下它的一些缺点:它鼓励内容和表示的混合,它是冗长的和有代表性的,规范仍然有一些模糊的地方,而且,很明显,实现传统上受到了规范不一致性的影响。客户端和服务器端语言的大生态系统很大程度上归功于这样一个事实:直接HTML是一种痛苦。

    是的,有一些不好的离奇语言,但是在我的书中,把一种共同语言推向其极限是一个更大的罪恶。


    Visual Basic。我只是不理解它的神秘语法,因为它不遵循任何编程约定。作为一个习惯于C/C++的人,我可能是部分的。但这并没有破坏我使用过的最糟糕的语言是VB的事实。


    Lisp

    也许这门语言没什么问题,但我无法理解。