Lud*_*erl 44 programming-languages
如果你有一个有趣的故事要分享,请发一个答案,但不要滥用这个问题来抨击一种语言.
我们是程序员,我们的主要工具是我们使用的编程语言.
虽然有很多关于最佳编程的讨论,但我想听听你曾经使用过的最糟糕的编程语言的故事,我想知道你到底是什么烦恼.
我想收集这些故事,部分是为了避免在设计语言(特别是DSL)时遇到常见的陷阱,部分是为了避免未来的奇怪语言.
这个问题不是主观的.如果一种语言只支持单个字符标识符(请参阅我自己的答案),那么这是一个不容争议的方式.
编辑
有些人担心这个问题会吸引巨魔.趟过你所有的答案都有一点清楚.绝大多数答案都是恰当,有用且写得很好的.
更新2009-07-01 19:15 GMT
语言概述现已完成,涵盖102个答案中的103种不同语言.我决定对什么算作编程语言松懈,包括任何合理的东西.感谢大卫对此的评论.
以下是目前为止涵盖的所有编程语言(字母顺序,与答案相关联,新条目以粗体显示):
ABAP, 所有20世纪语言, 所有拖放语言, 所有专有语言, APF, APL (1), AS400, Authorware, Autohotkey, BancaStar, BASIC, Bourne Shell, Brainfuck, C++, Centura Team Developer, Cobol (1), Cold Fusion, Coldfusion, CRM114, Crystal语法, CSS, Dataflex 2.3, DB/c DX, dbase II, DCL, Delphi IDE, 门DXL, DOS批处理 (1), Excel宏语言, FileMaker, FOCUS, Forth, FORTRAN, FORTRAN 77, HTML, Illustra Web刀片, Informix第四代语言, Informix Universal Server Web刀片, INTERCAL, Java, JavaScript (1), JCL (1), karol, LabTalk, Labview, Lingo, LISP, Logo, LOLCODE, LotusScript, m4, Magic II, Makefiles, MapBasic, MaxScript, Meditech Magic, MEL, mIRC Script, MS Access, MUMPS, Oberon, C的对象扩展, Objective-C, OPS5, Oz, Perl (1), PHP, PL/SQL, PowerDynamo, PROGRESS 4GL, prova, PS-FOCUS, Python, 正则表达式, RPG, RPG II, Scheme, ScriptMaker, sendmail.conf, Sma lltalk, Smalltalk, SNOBOL, SpeedScript, Sybase PowerBuilder, Symbian C++, System RPL, TCL, TECO, Visual Software Environment, Tiny praat, TransCAD, troff, uBasic, VB6 (1), VBScript (1), VDF4, Vimscript, Visual Basic (1), Visual C++, Visual Foxpro, VSE, Webspeed, XSLT
覆盖80386汇编程序,VB6和VBScript的答案已被删除.
bau*_*ack 212
PHP(没有特别的顺序)
我还有其他语言的牛肉.这些只是一些.杰夫阿特伍德有一篇关于PHP糟透了的帖子.他还说没关系.我不同意,但我们有.
Che*_*eso 101
XSLT.
XSLT很奇怪,大多数人都忽略它.如果你必须使用它,你需要一个XSLT萨满来为你提供神奇的咒语.
bbu*_*ser 96
DOS批处理文件.不确定这是否有资格作为编程语言.并不是说你无法解决问题,但如果你习惯bash......
只是我的两分钱.
abe*_*nky 92
不确定它是否是真正的语言,但我讨厌Makefiles.
Makefile在空格和TAB之间有明显的差异,因此即使两条线看起来相同,它们也不会运行相同.
Make还依赖于许多语言的一组复杂的隐式规则,这些规则很难学习,但经常被make文件覆盖.
Makefile系统通常分布在许多目录中的许多文件中.几乎没有范围或抽象,将make文件更改为几个目录可能会阻止我的源代码构建.然而,错误消息总是一个compliation错误,而不是关于make或makefile的有意义的错误.
我工作过的任何使用makefile的环境都有一个全职的Make专家.而所有这些都可以节省几分钟的编译时间?
Rao*_*ter 79
我见过的更糟糕的语言来自工具praat,这是一个很好的音频分析工具.在您使用脚本语言之前,它做得非常好.感叹不好的回忆.
string = selected("Strings")
这里没什么特别的,你给变量字符串赋予所选函数的结果.不太可怕......但是.
Create Strings as file list... liste 'path$'/'type$'如您所见,函数名称从"Create"开始,以"..."结束.命令"将字符串创建为文件列表"是在praat上显示在按钮或菜单上的文本(我很害怕检查).此命令采用2个参数liste和一个表达式.我要深入研究表达方式'path$'/'type$'
嗯.是的.空间不足.如果引入了空格,那么它将是单独的参数.你可以想象,括号不起作用.在描述的这一点上,我想指出变量名的后缀.我不会在这一段中发展它,我只是在戏弄.
noliftt = Get number of stringswindowname$ = left$(line$,length(line$)-4)
那么,那里发生了什么?现在是时候看一下常规和表达类型了,所以我们得到了:
for i from 1 to 4
Select... time time
bandwidth'i'$ = Get bandwidth... i
forhertz'i'$ = Get formant... i
endfor
Run Code Online (Sandbox Code Playgroud)
我们得到了我这是一个数字,...(不,它不是一个函数),
bandwidth'i'$
它的作用是创建字符串变量:bandwidth1$,bandwidth2$,bandwidth3$,bandwidth4$并给他们的值.正如您所料,您无法以这种方式创建二维数组,您必须执行以下操作:
band2D__'i'__'j'$
outline$ = "'time'@F'i':'forhertznum'Hz,'bandnum'Hz, 'spec''newline$'"
outline$ >> 'outfile$'
字符串很奇怪(至少)用语言处理.''用于在全局""字符串中调用变量的值.这很奇怪.它违背了许多语言中构建的所有约定,从bash到PHP通过powershell.看,它甚至得到了重定向.不要被愚弄,它不像你心爱的外壳那样有效.不,您必须使用''获取变量值
我将通过与您讨论执行模型,对这个奇妙的演示进行最后的介绍.因此,在每个过程语言中,您都可以从上到下执行指令,这里有变量和praat GUI.那就是你在praat gui上编写所有代码,你调用菜单/按钮上的命令.
praat的主窗口包含一系列项目,可以是:
To Spectrogram... 0.005 5000 0.002 20 Gaussian
"就是这样,因为它遵循以下布局:
毋庸置疑,我的噩梦中充满了在我周围跳舞的praat剧本,并大喊"DEBUG MEEEE !!".
更多信息在praat网站上,名为"易编程脚本语言"的部分
ann*_*ata 74
好吧,因为这个问题拒绝死亡,因为OP确实刺激我回答......
我谦卑地提供您的考虑Authorware(AW)作为可能创建的最糟糕的语言.(我在这里回忆一下,自从我使用AW以来已经有6年了,这当然意味着有一些我甚至不记得的可怕事情)
恐怖,恐怖http://img.brothersoft.com/screenshots/softimage/a/adobe_authorware-67096-1.jpeg
让我们从这样一个事实开始,它是一个Macromedia产品(-10分),一种专有语言(-50多个),主要用于创建电子学习软件,而且软件可以由非程序员和程序员创建,作为一个标志性的实现语言和文本语言(-100).
现在,如果最后一个语句没有吓到你,那么你之前不必修复WYSIWYG生成的代码(你好Dreamweaver和Frontpage devs!),但重点是AW有一个大约12个元素的库,可能是拖入流中.像"页面"元素,动画,IFELSE和GOTO(-100).当然,从流中删除对象会产生任意数量的破坏的连接和工件,IDE具有不同程度的成功应对.自然地,内置向导(-10)是这些的主要来源.
幸运的是,你总是可以进入代码视图,最终你必须这样做,因为有一组有限的标志性元素,否则一些事情是不可能的.语言本身是基于TUTOR(-50) - 一个最差语言的候选者本身,只要它有野心和范围达到AW所追求的深度 - 关于哪个维基百科说:
... TUTOR语言不容易学习.实际上,甚至有人建议在程序员构建值得保留的程序之前需要几年的语言经验.
这是一个很好的基础,它建立在互联网兴起之前的几年里.绝对没有数组结构超出数组(-100),当然没有糖(真正的男人不使用switch语句?)( - 10),还有大量的句法醋(" - "是评论指标所以没有减量运算符给你!)( - 10).语言参考文档以纸质或zip文件格式(-100)提供,但至少您得到了开发人员运行usegroup的支持,并且可以快速建立问题的解决方案是使用AW的DLL或SWF导入功能来启用你用真实的语言进行实际的编码.
AW由一个流驱动(带有必要的PAUSE命令)因此具有线性而非基于事件的系统(-50)的所有伴随问题,尽管文档的直接营销谎言它不是面向对象的(-50)无论是.所有代码重用都是通过GOTO实现的.没有范围,很多全局变量(-50).
这不是语言的直接错误,但显然没有源控制集成是可能的,当然也没有TDD,文档生成或您可能喜欢的任何其他附加工具.
当然,Macromedia遇到了互联网领域的挑战,顽固拒绝参与多年,最终产生了错误,难以使用的安全噩梦,即Shockwave(-100)通过所需的插件实质上序列化软件的桌面版本(-10).随着HTML的上升,AW停滞不前,即使面对IEEE SCORM javascript标准,仍然坚持使用它的冲击波传输.
经过多年的乞讨和承诺,Macromedia最终宣布了一个全新的AW版本,以解决这些问题,并在几年后将开发外包,然后取消了该项目.虽然Macromedia当然还在卖它(EVIL BONUS -500).
如果还需要说什么,这是允许变量名称(-10000)的空格的语言.
如果您想要体验真正的痛苦,请尝试使用不区分大小写的语言阅读其他人的未注释的匈牙利语符号,并允许使用变量名称空间.
总Annakata任意分数(AAS): - 11300
根据个人经验调整:OutOfRangeException
(为长度道歉,但这是宣泄)
bus*_*ter 68
说真的:Perl.对于初学者甚至是每天与perl一起工作的半专业人士来说,编写代码只是一种痛苦.我可以经常看到我的同事们对语言进行斗争,构建最糟糕的脚本,比如2000行,而不考虑任何公认的编码标准.这是我在编程中见过的最糟糕的混乱.现在,你总是可以说,那些人在编码方面很糟糕(尽管他们中的一些人现在已经使用了perl很多年了,但是这种语言只是鼓励所有那些让我尖叫的怪物读一些其他人的剧本.
Joh*_*yre 43
MS Access Visual Basic for Applications(VBA)也非常糟糕.访问是完全糟糕的,因为它迫使你失去了一个弱的范式,并且看起来很容易上手,但是完成了一场噩梦.
Nos*_*dna 40
具有行号的Old-skool BASIC将是我的选择.如果行号之间没有空格来添加新行,则必须运行重新编号实用程序,这会导致您失去任何心理锚点.
结果,你最终在一行中挤压了太多的语句(用冒号分隔),或者你在其他地方做了goto或gosub来做你无法填补的工作.
Jor*_*ril 40
没有关于Cobol的答案呢?:o
dna*_*123 38
我在这里工作了几年,但从那以后我做了一个完整的脑转储.我真正记得的是没有文件(在我的位置)和神秘的命令.
那太差了.可怕!可怕!!!
Din*_*nah 37
只有两种语言:每个人都抱怨的语言和没人使用的语言.
Bjarne Stroustrup
Hel*_*len 34
我还没有使用过多种语言,主要处理脚本语言; 这些VBScript是我最不喜欢的.虽然它有一些方便的功能,但有些东西真让我烦恼:
使用Set关键字进行对象分配:
Set foo = Nothing
Run Code Online (Sandbox Code Playgroud)
省略Set是运行时错误的最常见原因之一.
没有结构化异常处理这样的事情.错误检查是这样的:
On Error Resume Next
' Do something
If Err.Number <> 0
' Handle error
Err.Clear
End If
' And so on
Run Code Online (Sandbox Code Playgroud)将过程调用参数括在括号中需要使用Call关键字:
Call Foo (a, b)
Run Code Online (Sandbox Code Playgroud)它的英语语法太冗长了.(我是花括号的粉丝.)
逻辑运算符是长期的.如果需要测试复合条件,后续条件依赖于前一条件的成功,则需要将条件放入单独的If语句中.
缺乏参数化类构造函数.
要将语句包装成多行,必须使用下划线:
str = "Hello, " & _
"world!"
Run Code Online (Sandbox Code Playgroud)缺乏多行评论.
编辑:发现这篇文章:讨厌VBScript的Flangy指南.作者总结了他的抱怨,因为"VBS不是Python":)
Joh*_*one 29
Objective-C的.
注释令人困惑,使用括号调用方法仍然无法在我的大脑中计算,更糟糕的是,C中的所有库函数都是使用C, - >和.中的标准运算符调用的,它看起来像是只有推动这种语言的公司才是Apple.
我承认我在为iPhone编程时使用了这种语言(并且正在研究OS X的编程),但感觉好像C++只是分叉,添加注释并强制实现并且头文件是分开的会产生很多更有意义.
Joe*_*ite 28
PROGRESS 4GL(显然现在被称为" OpenEdge高级商务语言 ").
PROGRESS既是语言又是数据库系统.整个语言旨在使编写蹩脚的绿屏数据输入屏幕变得容易.(首先想象一下这对Windows的转化程度如何.)任何比这更好的东西,无论是漂亮的屏幕,程序逻辑还是批量处理......都不是那么多.
我上次使用的是版本7,早在90年代后期,所以有些可能是其中一些已经过时,但我不打赌它.
Counter当前记录中的State字段,你只需说State.Counter = State.Counter + 1.哪个不是那么糟糕,除了......Index,你可以将其Index称为Ind或甚至为I.(错别字可以有非常有趣的结果.)如果你想访问数据库字段,你不仅可以缩写字段名称,而且甚至不必用表名来限定它; 他们也猜对了桌子.对于真正令人恐惧的结果,将其与:猜测是最糟糕的.在缩写和默认字段之间,如果你不小心,你可能会得到一些讨厌的东西.(忘记I在将它用作循环变量之前声明为局部变量?没问题,我们只需随机选择一个表,获取当前记录,并完全删除任意选择的字段,其名称以I!开头!)
然后添加一个事实,即一个意外的默认字段访问可能会改变它为你的表所猜测的范围,从而破坏了一些完全不相关的代码.好玩,是吗?
他们还有一个语言内置的报告系统,但我显然压抑了它的所有记忆.
当我从事Netscape LiveWire(服务器端JavaScript命运多变的尝试)和经典ASP(VBScript)的另一份工作时,我就在天堂.
R U*_*ben 28
最糟糕的语言?BancStar,放下手.
3,000个预定义变量,全部编号,全局.没有变量声明,没有初始化.其中一半分散在范围内,保留供系统使用,但您可以自担风险使用它们.由于各种操作,会自动填写一百个左右,而不会列出哪些操作.它们都适合38k字节,并且没有任何保护缓冲区溢出.如果您错误地声明了输入字段的长度,系统会高兴地让用户在10字节字段中放入20个字节.至少可以说,这种影响是不可预测的.
这是一种语言,可以让你声明一个计算出来的gosub或goto; 由于其局限性,这通常是必要的.条件可以向前或向后声明.想象一下"If"语句在开始之前终止20行.
返回堆栈非常浅,(20个Gosubs左右),并且由于用户按下任何功能键可以启动不同的子程序,因此可以轻松地超出堆栈.设计师仔细地包括一个"清楚Gosubs"命令来完全核对堆栈,以解决这个问题,并确保你永远不知道该程序接下来会做什么.
还有更多.成千上万的这个Lovecraftian恐怖线.
Gab*_*ona 23
DOS/Windows上的.bat文件脚本语言.上帝只知道这个是多么强大,特别是如果你将它与Unix shell语言(它们也不是那么强大,但仍然更好)进行比较.
只是尝试连接两个字符串或进行for循环.罗.
Gre*_*g D 23
这是我的一位教授(Henry Ledgard博士)试图在本科/研究生学校推销我们的语言.(我觉得给他的名字并不坏,因为据我所知,他仍然是一个很大的支持者,并且欢迎有机会说服一些人,这是自切片面包以来最好的事情).当描述到的人,我的最好的比喻是,它是那种FORTRAN和COBOL的私生子的,向其中投入了一些额外的糟糕.从只有真正访问的文件夹,我用这种材料发现(有一个在那里,我其它更多这里不打算特别链接:
VSE围绕他们所谓的"分离原则"而建立.这个想法是数据和行为必须完全隔离.想象一下C要求所有变量/数据必须在函数的开头声明,除非现在将该声明移动到其他函数也可以使用的单独文件中.当其他函数使用它时,它们使用相同的数据,而不是具有相同布局的本地数据副本.
为什么这样做?我们从软件幸存者那里了解到可变范围规则很难. 我会包括一个引用但是,像大多数傻瓜一样,这些家伙永远都要说些什么.搜索PDF为"范围的泥潭",你会发现一些真正的启示.
他们继续声称这在某种程度上使它更适合多进程环境,因为它更接近地模拟底层硬件实现.Riiiight.
经常出现的另一个选择主题:
Run Code Online (Sandbox Code Playgroud)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虽然不是惊天动地,但算术的风格反映了普通用法,即任何人都可以阅读和理解它 - 而不需要了解编程语言.事实上,VisiSoft算法几乎与FORTRAN相同,包括嵌入式复杂算术. 这使程序员关心他们的专业状态和相应的工作安全感到不安.
嗯,真的没那么关心.其中,比尔洞用来尝试出售VSE的关键卖点是规划的民主化,使业务人员不需要自己契约到谁使用疯狂,神秘的工具,工作保障的唯一目的的程序员.他利用这种非理性的恐惧来销售他的工具.(而且它有效 - 联邦政府是他最大的客户).我在文件中统计了17个"工作保障"一词的用法.例子:
- ......只适合那些渴望人工安全的人.
- 更多虚假的工作保障?
- 工作保障是否依赖于确保其他人无法弄清楚做了什么?
- 工作安全是否依赖于复杂的代码......?
- 影响接受新技术的最强大力量之一是对一个人的工作保障的看法.
他利用这种偏执来驱动持有钱包的管理人员和技术人员之间的楔子,他们具备识别VSE的知识.这就是他把它挤进公司的方式 - "你的技术人员只是说它很糟糕,因为他们害怕会让它们过时!"
这种方法的另一个结果是数据在"所见即所得"的基础上被映射到内存中,并在整个过程中得到维护.这允许用户将完整结构作为字符串移动到描述每个单独字段的模板中.可以为给定的存储区域重新定义多个模板.与C和其他语言不同, 子结构可以移动而没有由于字边界对齐标准导致的未对准问题.
现在,我不知道你,但我知道,一个所见即所得的方式来存储布局在顶我的优先级列表,当谈到语言的选择!基本上,他们忽略了对齐问题,因为只有在60年代和70年代设计的旧语言关注字对齐.或类似的东西.推理是虚假的.对我来说这没什么意义,我几乎立刻忘了它.
VSE中没有用户定义的类型. 这是一个影响深远的决定,大大简化了语言.从实际角度来看,收益也很大.VSE允许设计人员和程序员按照与建模的物理系统相同的方式组织程序.VSE允许在易于阅读的逻辑属性层次结构中构建结构.
真棒!用户定义的类型是蹩脚的.为什么我需要像InputMessage对象一样的东西:
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
Run Code Online (Sandbox Code Playgroud)
你可能会看到这一点并想一想,"哦,如果有点老派,那格式很好." 老派是对的.空白是重要的 - 非常重要.多余的!该1"s必须是在第3栏的1显示,它在层次结构的第一层.符号名称必须位于第5列.您的层次结构的深度限制为9.
嗯,好的,但是那太可怕了吗?等一下:
众所周知,对于阅读文本,使用传统的大/小写更具可读性.VSE使用全部大写(注释除外).为什么?心理学文献以散文为基础.简单来说,节目不是散文.程序更像是数学,会计,表格.程序字体(通常是Courier)几乎是普遍固定的音调,并且有充分理由 - 相关代码行之间的垂直对齐.大写的程序具有良好的可读性,经过一段时间后,我们认为更好
没有什么比在语言层面强制执行您的意见了!没错,你不能在VSE中使用任何小写,除非它在评论中.只要保持你的CAPSLOCK,它就会被卡在那里一段时间.
VSE子过程称为过程.此代码示例包含三个进程:
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
Run Code Online (Sandbox Code Playgroud)
所有上限均符合预期.毕竟,这更容易阅读.注意空格.它再次显着.所有进程名称必须从第0列开始.指令的初始级别必须从第4列开始.更深的级别必须缩进3个空格.但这并不是什么大问题,因为你不允许做像巢条件这样的事情.你想要一个嵌套的条件?好吧,只需进行另一个过程并调用它.并注意美味的 COBOL-esque语法!
你想要循环吗?简单:
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
Run Code Online (Sandbox Code Playgroud)
啊.
Lud*_*erl 22
以下是对我自己的问题的贡献:
Origin LabTalk
我在这方面的最爱是Origin LabTalk.在LabTalk中,字符串变量标识符的最大长度是一个字符.也就是说,根本只有26个字符串变量.更糟糕的是,其中一些被Origin本身使用,目前尚不清楚哪些.
从手册:
LabTalk使用%表示法来定义字符串变量.合法字符串变量名称必须是%字符后跟单个字母字符(从A到Z的字母).字符串变量名称不区分大小写.在所有存在的26个字符串变量中,Origin本身使用14.
门DXL
对我而言,我认为第二差的是Doors DXL.编程语言可以分为两组:具有手动内存管理(例如删除,免费)和具有垃圾收集器的语言.有些语言提供了这两种语言,但DXL可能是世界上唯一不支持的语言.好吧,说实话,这只适用于字符串,但是,嘿,字符串并不是需求工程软件中最少使用的数据类型.
结果是字符串使用的内存永远无法回收,而DOORS DXL就像筛子一样泄漏.
DXL中还有无数其他怪癖,仅举几例:
Ken*_*rdt 21
冷融合
我想这对设计师来说很好,但作为程序员,我总觉得一只手被绑在背后.
Pan*_*rit 20
与我合作过的最糟糕的两种语言是APL,它与其年龄的语言相比众所周知,而TECO是原始Emacs编写的语言.两者都以其简洁,难以理解的语法而着称.
APL是一种数组处理语言; 它非常强大,但几乎不可能阅读,因为每个角色都是一个操作员,很多都不会出现在标准键盘上.
TECO有类似的外观,并且出于类似的原因.大多数字符都是运算符,这种特殊目的语言专门用于编辑文本文件.它好一点,因为它使用了标准字符集.它确实具有定义函数的能力,这就是为emacs赋予生命的东西 - 人们写了宏,并且只在一段时间后才调用它们.但弄清楚一个程序做了什么或写了一个新程序是一个相当大的挑战.
Tob*_*ias 19
HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE
说真的,最糟糕的编程语言是Makefiles.完全不可理解的选项卡具有语法含义,甚至不是调试器来查找正在发生的事情.
Tho*_*rin 19
我不确定你是否打算包含脚本语言,但我看过TCL(这也很烦人),但是...... mIRC脚本语言让我感到厌烦.
由于解析中的一些疏忽,当它不应该是空白时它是空白的.条件语句有时会因为这个而被跳过.打开块语句不能在单独的行等上完成.
除此之外,它只是充满了混乱,不一致的语法,可能是为了使基本的东西变得容易,但同时使任何更复杂的东西几乎不可读.
我丢失了大部分的mIRC脚本,或者我可能已经找到了一些很好的例子来说明它会强迫你创造一个可怕的混乱:(
oɔɯ*_*ɯǝɹ 18
常用表达
它是一种只写语言,很难验证它是否适用于正确的输入.
Arn*_*psa 17
Visual Foxpro
Fai*_*ali 17
我发现自己避免使用VBScript/Visual Basic 6.
我主要使用C++,javascript,Java来处理大多数任务,并在需要时使用ruby,scala,erlang,python,汇编程序,perl.
我和大多数其他有理智的polyglots /程序员一样,强烈认为你必须使用正确的工具来完成工作 - 这需要你了解你的领域并理解你的工具.
我使用VBscript和VB6的问题是当我使用它们编写脚本窗口或办公应用程序(适合它们的域)时 - 我发现自己在使用该语言时遇到困难(他们没有成为正确的工具).
VBScript缺乏易于使用的本机数据结构(例如关联容器/映射)和其他怪癖(例如用于分配给对象的设置)是一种不必要且令人沮丧的烦恼,特别是对于脚本语言.将它与Javascript(我现在用于编写wscript/cscript窗口并执行activex自动化脚本)进行对比,这更具表现力.虽然有一些事情可以更好地与vbscript一起工作(例如从COM对象来回传递数组稍微容易一些,虽然使用jscript将事件处理程序传递到COM组件更容易),但我仍然对编码器的数量感到惊讶仍然使用vbscript来编写脚本窗口 - 我敢打赌,如果他们用两种语言编写相同的程序,他们会发现jscript比vbscript更多地使用你,因为jscript的本机哈希数据类型和闭包.
Vb6/VBA虽然比一般的vbscript好一点,但仍有许多类似的问题(对于他们的域),他们需要更多的锅炉板来完成比我想要和在其他脚本语言中看到的简单任务.
dmc*_*kee 17
两次我不得不在'语言'中工作,在那里你将模块拖放到页面上并用线条将它们链接在一起以显示数据流.(一个声称是RDBM,另一个是通用数据采集和数字运算语言.)
只是想到它会让我扼杀某人.或者呕吐.或两者.
更糟糕的是,既没有暴露出你可以直接破解的文本语言.
Jor*_*oba 17
我无法相信没有人说过这一个:
的LotusScript
我认为至少比php差得多.
是不是语言本身遵循类似于Visual Basic的语法,事实上它似乎有很多功能用于极其无用的东西,你永远不会(或百万次)使用,但缺乏对事物的支持你会每天使用.
我不记得任何具体的例子,但他们就像:
"好的,我有一个事件来检查鼠标指针是否在表单的上角,我没有表单的双击事件!! ?? WTF ??"
dic*_*oce 16
TCL.它只是在执行代码之前编译代码,所以如果你的代码在测试时从未进入分支A,有可能在某一天,它在字段A下降到分支A,它可能有一个SYNTAX ERROR!
17 *_* 26 16
在25年多的计算机编程中,到目前为止,我遇到的最糟糕的事情是MUMPS的衍生物,称为Meditech Magic.它比PHP希望的更加邪恶.
它甚至不使用'='来进行分配!100 ^ b为b赋值100,读作"100转到b".基本上,这种语言从上到下发明了自己的语法.所以无论你知道多少种编程语言,Magic对你来说都是一个完全的谜.
这是用这种语言可憎写的墙上的100瓶啤酒:
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;
Run Code Online (Sandbox Code Playgroud)
xcr*_*mps 14
的troff
告诉你我多大了.你可以在里面做一些非常甜蜜的事情,但它很粗糙.那些认为Perl不可读的人应该检查一下.
我的意思是:
.nr *pop-count 0
.while !'\\n(.z'' \{\
. \"@warning automatically terminating diversion \\n(.z
. ie d @div-end!\\n(.z .@div-end!\\n(.z
. el .*div-end-default
. nr *pop-count +1
. \" ensure that we don't loop forever
. if \\n[*pop-count]>20 .@fatal recovery failed
.\}
.while !'\\n[.ev]'0' .ev
.par@reset-env
.par@reset
Run Code Online (Sandbox Code Playgroud)
信不信由你,多年来不得不这样做,我一直在编程.
Ric*_*ton 13
我真的不喜欢Visual Basic,甚至是.NET版本.坦率地说,我发现语言的核心方式是冗长的.
例如:
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
Run Code Online (Sandbox Code Playgroud)
但是在C#中:
if (condition1 == condition2) {
...
}
else if (condition1 == condition2) {
...
}
public string SomeFunction(string arg1, int arg2) {
...
}
Run Code Online (Sandbox Code Playgroud)
显然许多其他语言如F#,Python等都不那么冗长.老实说,由于这个原因,我使用VB的时间比其他语言长两倍.
我知道这是一个非常浅薄的答案,部分原因是它没有解决一些语言问题(比如PHP过度使用全局函数).但是从人文主义的"体验导向"的角度来看,VB只会让我变得脾气暴躁.
Len*_*bro 12
我曾经为电信公司运行发票系统.这意味着手动运行一系列命令,每个命令都可以收集,准备,计算,格式化并最终打印发票.这通常是以批量形式完成的,因此我被告知要为哪些客户编号开具发票,我会批量生产.
这很无聊.所以我开始自动化它.不幸的是,服务器上允许的唯一语言是......没有.完全没有.所以我必须在shell脚本中编写所有内容.这是一种真正荒谬而奇异的语言.没有什么比这更有意义了.这是不一致和过度稀疏,所以两个相似的事情可能做完全不同的事情,因为一个?来自一个稍微不同的地方.使用反引号作为语言的一部分只是纯粹的邪恶.它们甚至与某些字体中的单引号不同!
我有更糟糕的编程经验.更糟糕的是.但那些一直涉及维护其他人的奇怪代码.但这必须是我用过的最糟糕的语言.比DOS批处理文件差?哦,是的.DOS批处理文件的主要问题是它们是原始的.你必须找到聪明的方法让它真正做一些有用的事情.但语法本身并没有那么糟糕.它只是没有足够的内置功能.比Visual Basic更糟糕?哦,是的,毫无疑问,虽然我承认我在MS Access中为这个Bourne Shell系统编写了一个UI,这几乎是可怕的,但差不多.他们通过Sybase进行了沟通,因此我需要学习Sybase SQL,这也非常可怕.但仍然不像sh-scripting那么可怕.
所以Bourne Shell赢得了我的巨额价格.只是,VB紧跟着它,但它仍然获胜.
Ale*_*exC 10
对我来说,最糟糕的体验是我对语言的看法是Perl.有人要求我支持一些perl脚本,这些脚本已被其他人"支持",这些人在被要求支持后几个月就立即离开了公司.虽然语言可能没问题,但它允许代码变得不可读并且几乎不能很快地支持(除非只有1个人接触过它们).这是一堆乱七八糟的正则表达式,伪对象,单字母变量和函数名称.它很快让我完全用python和scrap perl重写它(就是那个或我退出).python版本更加实用和可支持,10年后它仍在使用中,从我听到的情况来看,没有人可以再次在该公司使用Perl.
Pet*_*ate 10
FORTRAN 77
公平地说,也许在1977年它是一种非常好的语言,但到1999年时,我不得不维持一个FORTRAN 77程序,这个程序最初是由我的顾问在1970年代的某个时候开始的研究生时开始的(打卡,orignally).该程序被"增强"黑客攻击,被各种能力的人堵塞了二十多年.最古老的代码是ALLCAPS,充满了GOTO语句,全局变量以及参数多于我手指的函数.最初Fortran中的变量名称限制为6个字符,但为了节省字节,大多数变量都被赋予了诸如"A","B","AA","II"等的描述性名称.
当然,我的大部分经验都与编写程序的方式有关,但语言并没有真正鼓励良好的编程风格:
值得庆幸的是,自从我看过FORTRAN已经10年了,我忘记了更多我记忆中的烦恼.
cbp*_*cbp 10
CSS
对于基本造型来说,OK和选择器非常酷,但是对于盒子模型,浮动和清理有一点点虐待狂.
攻击语言以使其完成基本的操作,例如将一个框移到另一个框下面,这些都是在一天之内完成的.
在这里,我们生活在未来,只是让基本的设计元素工作,如圆角或阴影,是徒劳的.
"可重用性"的概念几乎以Ctrl-C Ctrl-V结束.即使是经验丰富的CSS编写者也很少会碰到其他人的样式表 - 这意味着基本的布局在世界各地都会被一次又一次地重写.
当然它不应该采取一切措施 - 任何希望它为世界提供真正有用的东西都是通过语言的事实上的"平台" - 在Internet Explorer上残酷地冲破了岩石.
对我来说,它必须是FileMaker.
ScriptMaker
此屏幕截图显示了最近命名的"ScriptMaker",它在FileMaker 9中有许多改进,例如用于复制和粘贴的Ctrl + C Ctrl + V快捷方式,以及非模态对话框,因此您可以一次编辑多个脚本.
http://images.macnn.com/macnn/reviews/filemaker/9proadvanced-ice_feature1_main.png
您可以使用此对话框编辑单个脚本.脚本"步骤"(如左图所示)被添加到左侧列表中(通过双击),并上下移动(使用"设置Web查看器"左侧的小blob).一次只能移动一行,并且仅在FileMaker Pro的高级版本中提供用于临时禁用脚本步骤的注释.
构建脚本有效地破坏了你的手腕,因为你在键盘和鼠标之间每小时交换数千次键入小配置框并重新安排你的代码行.
脚本在技术上是一个过程,可以传递一个参数.是的,只有一个.如果您需要多个分隔符,则必须使用某些分隔符有效地组合您的参数,将其传递给脚本,然后将参数拆分出来.在脚本完全具有参数之前(在FM7 IIRC之前),使用全局变量来传递数据是正常的.
这家伙将他的大部分仇恨都包含在骗局FileMaker 11中.
我要投票给ColdFusion.它试图成为一种很酷的脚本语言,但是用类似html的标签来完成让我疯了 - 因为我不得不处理它已经有一段时间了,但是我记得变量声明可能是一只熊,它是在两个不同的环境中容易有略微不同版本的服务器,这两个环境的代码在两者上的工作方式都不同.
如果你想用它做任何令人印象深刻的事情,它主要涉及用Java创建一个对象并找出如何将它与coldfusion的服务器连接起来,这样你就可以将它作为标记调用.我正在使用PHP,尽管PHP存在问题,但ColdFusion肯定更糟.
JCL - IBM大型机的作业控制语言......不是一种编程语言,更像是批处理文件.
这是基于通常在作业开始时放置的穿孔卡,即相同的语法,不同的介质.71列限制以及这些卡花钱的事实意味着冗长是COBOL来源最好的罪.这种态度延续到了非纸质对手JCL.
我只想弄清楚在使用它的过程中如何更改主卡中的作业队列和参数.维基百科提供了以下精美示例:
//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
Run Code Online (Sandbox Code Playgroud)
正是.
值得一提的是Cincom Mantis,一个"应用程序生成器"(读作:基于文本的表单设计器),由类似COBOL的4GL"驱动".Mantis是帮助我决定获得学位的语言 - 屁股中的最后几个CICS ......
编辑在其他地方提及DCL等...... Datatrieve我也记得.这些确实很糟糕,但仍然更喜欢VMS的东西到任何大型机.
IT有时会让我感到困惑,为什么软件公司会开发自己的脚本语言来与他们的软件进行交互,而不是构建一个可以与您选择的脚本语言交互的强大API.我的投票是TransCAD的脚本语言.
我鄙视像C#和AppleScript这样的专有语言,其唯一的原因是将开发人员与商业平台或产品联系起来.这不是一个技术问题,但是当这些语言在学校教授时,这是一个社会问题.我有一个只安装了Linux的朋友,他在第一年的CompSci中被教授C#.是的,有单声道,但自然它总是在追赶功能和稳定性.
METLIFE ENGLISH LANGUAGE(MEL)!
我曾在一家公司工作,该公司编写了自动查找和修复Cobol和PL/I中Y2K问题的工具.MetLife用他们用MEL编写的200万行代码向我们询问,MEL是他们在50年代末或60年代初期开发的一种语言.MEL是一种帮助激发Cobol的语言,其程序代码看起来对任何现代Cobol程序员来说都相当熟悉.
我们有一个强大的开发人员在写一个翻译器来破解MEL程序并纠正确定的日期.他实际上在几周内就进行了一次演示,他认为只需要3-4周的工作就能完成它的制作.很好,我们想,并决定承担这项工作.
不幸的是,他并没有真正研究过MEL的非常原始的Cobol DATA DIVISION(声明在哪里).事实证明,每个MEL程序都提供了自己对每个输入或输出文件的视图,并且它只声明了它感兴趣的那些字段.对于具有变体记录的输入文件,可能有30或40个不同的视图.谈论盲人和大象!
然后,一个异常聪明且被驱动的人接管了并确定了识别哪个记录定义描述了哪个文件的语义,这个过程因许多文件中的变体记录的存在而变得更加困难.然后,他编写了算法,将每组备用记录定义统一到一个公共记录定义中,然后将旧仿真霍尼韦尔数据类型的所有内容映射到新的IBM大型机类型.花了两年时间才完成所有工作.
我在其他地方给出了相同的答案,但我认为它应该在这里得到它的位置:
在90年代末,我不得不在Informix Universal Server Web刀片(又名Illustra web刀片)中编写几个网站
对于那些对这个可恶环境一无所知的人,它迫使你使用我遇到过的最离奇的语言.正如Joel Spolsky所描述的那样
当它确实运行时,它被证明具有我见过的唯一编程语言,如果你可以想象的话,它不是图灵等价的.
更多信息,请访问http://philip.greenspun.com/wtr/illustra-tips.html
以及"简单"if条件的示例:
cond=$(OR,$(NXST,$email),$(NXST,$name),$(NXST,$subject))
Run Code Online (Sandbox Code Playgroud)
我希望我能找到完整的api文件,因为事后回想一下,这将是热闹/难以置信/悲惨的.
它的可怕性质的一个例子是它没有循环的事实.任何形式的.可以通过创建查询并遍历其行来破解循环功能,但这是错误的,这让我感到恶心.
编辑:我已经设法找到一个完整的代码示例.看吧:
<HTML>
<HEAD><TITLE>WINSTART bug</TITLE></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>
<BR>
<?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>
Run Code Online (Sandbox Code Playgroud)
Prettify不知道如何着色,quelle惊喜
有人提到过Autohotkey中使用的脚本语言吗?
我用过的最糟糕的语言.
CRM114.一种专门用于与强大的贝叶斯过滤器连接的语言,可用于垃圾邮件过滤和类似任务.
去年我被客户要求使用它,在查看之后,使用了Codeproject.com上的一些简单的贝叶斯代码.后来,我在CRM114原作者的某个论坛上发布了一条消息,为此道歉.
主要问题是拉丁语派生的语法.作者承认他当时正在学习拉丁语,因此将其整合到他的项目中.因此,它获得了奇怪的运算符顺序和参数约定.这也导致使用'alius'这个词(拉丁语为'otherwise'或'else),你可以在其他任何语言中使用'else'.
很难让它做任何事情.
在90年代中期,我在一家小型管理咨询公司工作,使用名为MapInfo的GIS产品,该产品具有一种名为MapBasic的弱脚本语言.
我不记得具体细节,但基本上当时有对象*只能在硬编码时实例化(而不是用变量实例化).这是一个彻头彻尾的痛苦,它似乎做了你需要做的一切,直到你真正尝试实施.实施要么不可能,要么非常重要.
那时我是一个新手并且遇到了很多困难a)预测可能做什么和不能做什么,以及b)向我的非编程经理解释原因.这令人沮丧.
有很多语言和工具在某些方面很弱,但在处理Map Basic之后,甚至Visual Basic 3.0都感到自由了!
* - 我不记得它是所有对象还是只有某些对象.
首先,一些注意事项:我倾向于传授能够很好地满足其预期目的的语言,但是被企业界所挫败为比他们的设计师所做的更多.出于这个原因,我给VB和它的VB-office变体传递了一个.对于快速原型设计,VB很难被击败.当人们试图将它用于企业级工作时,它失败了.同为Perl,这是一个伟大的脚本工具,它以某种方式得到了晋升为CGI语言大谈特谈在当天返回.
但是,即使按照自己的条件,这种语言也无法满足期望?对我来说,这不是竞赛:JavaScript,原因有三个:
如果我被允许选择一个框架,它同样是一个简单的选择:JSF和IceFaces.
如果我们问自己这个问题X年下来(X = 10或20或?),我们都会在合唱中说"20世纪的所有语言都吸"了.这将是我们以一种截然不同的方式做事的范式转变......虽然我无法想象如何!
| 归档时间: |
|
| 查看次数: |
139462 次 |
| 最近记录: |