您最不喜欢自己的语言的五件事是什么?[关闭]


403

最近在Stack Overflow上出现了一堆Perl讨厌的东西,所以我想把我的“ 您最讨厌的五种语言讨厌 ”问题带给Stack Overflow。用您喜欢的语言,告诉我您讨厌的五件事。这些可能只是让您烦恼,承认设计缺陷,发现性能问题或任何其他类别的事情。您只需要讨厌它,它就必须是您最喜欢的语言。

不要将其与另一种语言进行比较,也不要谈论您已经讨厌的语言。不要以您喜欢的语言谈论您喜欢的事情。我只是想听听您讨厌但可以容忍的事情,以便您可以使用所有其他内容,并且我想听听您希望其他人使用的语言。

每当有人试图将自己喜欢的语言强加给我时,有时还是作为面试问题,我都会问这个问题。如果某人找不到最讨厌的五样东西,那么他对它的倡导或使用它的巨额资金将不甚了解。他没有在足够不同的情况下充分利用它。他主张将其作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,那我就错了。

我不太在乎您使用哪种语言。不想使用特定语言?那不要 您经过尽职调查才能做出明智的选择,但仍然不使用它?精细。有时候正确的答案是“您拥有一支强大的编程团队,拥有良好的实践和在Bar方面的大量经验。将其转换为Foo是愚蠢的。”


这也是代码审查的一个好问题。真正了解代码库的人会为此提出各种建议,而那些不太了解代码库的人会提出非特定的投诉。我问诸如“如果您可以重新开始这个项目,您会做些什么?”之类的问题。在这个幻想的世界中,用户和程序员会抱怨任何他们不喜欢的东西。“我想要一个更好的界面”,“我想从视图中分离模型”,“我将使用此模块而不是另一个模块”,“我将这套方法重命名”,或者他们真正不喜欢的任何方法不喜欢目前的情况。这就是我如何了解特定开发人员对代码库的了解程度。这也是关于程序员有多少

仇恨并不是弄清人们知道多少的唯一方式,但我发现这是一个相当不错的选择。他们讨厌的事情也为我提供了一个线索,他们对这个问题的思考程度如何。


11
这是对旧的“您喜欢的语言”问题的很好的回答。合理的理由。
汤姆·莱伊斯

14
我发现有趣的是,尽管SO拥有大量的.NET读者,但在撰写本文时,它有24个答案,其中只有一个(我的)与.NET或.NET语言有关。我不知道这对SO或.NET有什么意义,但这很有趣...
Jon Skeet

22
使用C / C ++进行编程的前15年,我讨厌(按字母顺序):1.指针2.指针3.指针4.指针5.指针
ileon 2010年

4
我不知道人们对讨厌自己的选择语言发表了多少评论,因为他们不了解如何使用自己的选择语言进行编程....
Kris.Mitchell 2010年

3
这是一个奇妙的问题。如果您想知道某种语言是什么样的,那么在此页面上阅读3种不同的回复将很容易成为您所能找到的最有用的时间信息。如果您已经了解该语言,那么这也是衡量程序员的经验(和谦虚程度)的一种好方法。
j_random_hacker 2010年

Answers:


182

我讨厌Java的五件事:

  • 没有一流的功能。
  • 没有类型推断。
  • 缺乏合理的默认值,例如图形。
  • NullPointerException不包含有关null的更多信息。
  • 毫无意义的“可配置”框架/服务提供者接口/工厂类/依赖注入系统的泛滥。几乎从未使用过可配置性,严重违反了DRY,代码大小增加了三倍,可读性减少了一半。

我知道,我应该检查Scala。


7
@both:NPE显示在堆栈tr的第一行。它包含(大多数情况下)类,java文件名和行号,例如:“ at your.faulty.code.Instance(Intance.java:1234)”然后,您只需打开该文件,转到该行,然后在其中是,没有分配任何变量的变量。
OscarRyz

35
@Oscar Reyes-嗯,我们知道这一点。但是那一行可能有多个变量,并且异常消息不会告诉我哪个为空。
Zarkonnen

10
Scala也有疣。但是,它比Java更好。
小麦味

10
+1的框架等的增殖
埃里希Kitzmueller

6
@Valentin,想像一下NullPointerException的有趣之处在于它每晚运行在一个巨大的日志文件中,您需要弄清楚发生了什么...调试不是一种选择。
托尔比约恩Ravn的安德森

216

哇,我很惊讶SQL还没有在这里完成。猜猜这意味着没有人喜欢它:)

  • 跨实现的语法不一致
  • 由于看似晦涩的原因,细微的代码差异可能会对性能产生巨大影响
  • 对文本操作的支持不佳
  • 入门费用低廉,但掌握语言的学习曲线却很艰难
  • 整个社区中针对最佳实践的最小标准化,其中包括语法样式。

...以及一些讨厌它的额外理由,无需额外付费

  • WHERE子句排在最后,可以很容易地过早执行UPDATE或DELETE,破坏整个表。相反,WHERE应该放在某处。
  • 关系划分很难实现。
  • 我可以将值设置为NULL,但是无法测试是否与NULL相等。我可以检查IS NULL,但这只会使代码复杂化-依我所愿,这是不必要的。
  • 为什么我们需要完全重新指定GROUPED列的公式,而不是在列上设置别名,然后在别名上设置GROUP BY(或与SORT一样的列索引)?

7
也许没有人会学会爱上它,直到他们停止将其视为一种语言。:)
艾伦·摩尔

4
+1。但是人们不知道为什么我会忍受ORM的麻烦...
James Schek

2
@Alan M ...这不是L代表的意思吗?:)
Kev

29
我不明白为什么INSERT的语法与UPDATE如此不同。MERGE是不可理解的。
LaJmOn

3
如果您认为NULL是在TRUE和FALSE之后的第三个可能结果,则应该明确IS NULL的必要性。因为它的意思是“未知”,所以您无法确定未知的事物是否也匹配另一未知的事物。另一个示例:如果NULL等于NULL,则意味着创建JOIN的整个概念将是不可能的,因为任何NULL值都可以与另一个NULL值匹配。如果您了解这一点(也称为三元逻辑),那么您可能会了解引入“ IS”运算符进行NULL测试的原因。
亚历克斯(Alex)2010年

159

JavaScript

  1. 所有最酷的事情都极其复杂,但是,所有这些酷事也被包裹在如此少量的代码中,以致于您难以遵循它而感到愚蠢

  2. “ +”是用于弱类型语言的串联运算符的荒谬选择。是他们试图吓跑的菜鸟?

  3. 这是一个跨浏览器兼容性的雷区(不管它是否打开都不要紧)

  4. 通常这是不受信任的-与卑鄙的人相关,例如阻止后退按钮,永不消失的弹出窗口等。

  5. 几乎不可能进行调试,因为只有几个不同的错误消息和几个不同的类型(数字,字符串,对象等)。

如果不是jQuery,我可能还是会像以前那样讨厌它:)


15
我同意马什。ECMAscript本身就是一门美丽而强大的语言。讨厌的浏览器(:cough:IE)弄乱了它的名字。
TJ L 2009年

32
@Mausch:哪里呢JavaScript进行实时的广阔大多数情况下?您是在说“汽车不会助长全球变暖,而是汽车在驱动全球变暖”,这是对的。
jTresidder

20
@Chris:是的,“ +”是使用强类型语言(例如Python)进行连接的很好的运算符。在弱类型语言(如Javascript或C)中,这很糟糕;它(无声地)决定'sum:'+ 2 + 3不是'sum:5'而是'sum:23'。有更多Javascript经验的人可以提供更好的示例。
ShreevatsaR

5
是的,与Python相比,C是弱类型的(例如,您可以为chars 分配整数,通过void *指针将任何内容强制转换为任何东西,等等。)它是静态类型而不是动态类型,并且还需要显式类型而不是动态类型类型推断,但与强v / s弱类型无关。[随机示例:Python具有隐式动态强类型,Haskell具有(可选显式)静态强类型,Java具有显式(大部分静态)强类型,C具有显式静态(相对弱)类型。]“强类型”和“弱类型” ”实际上并没有明确定义。
ShreevatsaR

5
@ShreevatsaR的典型示例是:'3'+'2'='32''3'-'2'=1
Thomas Ahle 2010年

148

PHP:

1)强迫我进行不必要的变量:

$parts = explode('|', $string);
$first = $parts[0];

2)lambdas的实现如此la脚,它大致等同于使用eval(),因此我从未使用过它,这是可怕的错误(请参阅http://www.php.net/create_function)。

3)尝试/捕获系统只能捕获大约80%的可能发生的错误。

4)Regex支持与lambda支持一样la脚,因为它必须在常规字符串中编写,这使最难学的编程工具之一的难度提高了大约三倍。PHP应该是一种“简单”的语言?!?!?

5)无法安全地从$ _POST中取出内容,而无需编写两次或构建自己的函数或使用'@'运算符:

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6)奖励答案:“ @”。如果您不必为正确编写代码而烦恼,只需添加“ @”,对于以后不得不调试您的代码的人来说就太糟糕了。


44
那么list($ first)= explode('|',$ string); ?
mlarsen

44
理想情况下,我想使用some_function(explode('|',$ string)[0]);
太多的PHP

8
什么奇怪的变量作用域?将所有内容都放在本地并强迫您在要使用全局变量时声明是一个好主意,它可以防止菜鸟创建仅使用全局变量的函数,而不是像使用参数那样返回参数和返回值。
scragar's

24
您忘记了参数顺序随机更改的函数
dusoft

39
您忘记了动词名词,动词名词,名词动词,名词动词,动词名词,名词动词等> _>
Warty,2010年

135

C ++

  • 随机破坏内存并创建几乎无法发现的错误太容易了(尽管Valgrind在解决此问题上还有很长的路要走)。
  • 模板错误消息。
  • 使用模板时,很容易最终不得不将所有内容都包含在一个文件中,然后获得愚蠢的编译时间。
  • 标准库在现代是个玩笑(默认情况下仍然没有线程或网络吗?)
  • C令人讨厌的点点滴滴(特别是在short / int / unsigned /等之间的所有转换)。

13
我同意STL,但是我要说的其中的好处。
伯纳德

22
unicode。我确实尊重ascii的简单性,但出于善意,我们已经进入21世纪。
威廉姆特尔2009年

29
@Kieveli const正确性实际上是我用其他语言编程时最想念的事情之一。特别是动态类型的 raii是我经常想念的一个重要功能。
威廉姆特尔2009年

6
大多数C ++问题来自成为ISO标准并已锁定10年。
graham.reeds,2010年

7
+1“模板错误消息。”
若昂里斯本

129

C#/。NET:

  • 默认情况下应密封类
  • 应该没有lock语句-相反,您应该有特定的锁定对象,并且应该有诸如Acquire返回一次性锁定令牌的方法之类的方法。结论:不应该为每个对象都配备一个监视器。
  • GetHashCode()并且Equals()不应该加入System.Object-并非所有内容都适合哈希。取而代之的是,有一个IdentityComparer它做同样的事情,并保持IComparer<T>IComparable<T>IEqualityComparer<T>以及IEquatable<T>界面自定义比较。
  • 对不变性的支持不佳
  • 发现扩展方法的方式很差-与我使用名称空间这一事实相比,这应该是一个更加自觉的决定。

那些不在我的脑海中-明天问我,我会提出另一个5 :)


22
默认情况下是密封的:继承应设计为一个类(这会花费时间并限制将来的选项)或被禁止。hashCode / equals:Java也很烂。有一天,我会写一篇很长的博客文章。阅读有效的Java,了解为什么在继承链中难于平等。
乔恩·斯基特

88
默认情况下,密封意味着您已经想到了某人可能想从您的类继承的所有可能原因,并且您认为其中任何一个都没有道理。抱歉,但我们都不是那么聪明。
Ed S.

69
在那种情况下,我不够聪明,无法让您从我的代码中派生出来:因为我无法预测将来可能会发生哪些更改,这些更改可能会破坏您的代码。IMO,这是一个非常重要的问题。密封代码更具限制性,但会带来更多的实现自由和健壮性。
乔恩·斯基特

11
我不敢相信没有人提到“ goto case”语法,我讨厌那个!
Aistina

20
乔恩·斯凯特(Jon Skeet)没有设计C#是一件好事,否则我的清单将像是“ 1.默认情况下密封类; 2。锁定太复杂; 3。大多数对象不可散列”!
加布

113

C

  • 字符串操作。

必须手动处理字符串缓冲区是容易出错的痛苦。由于大量的计算实际上是在移动和修改字符串(计算机用于大量数字运算的东西并没有像人们认为的那样使用那么多),因此能够使用托管语言或C ++的字符串真的很好对象来处理这些。当我必须在直线C中进行操作时,感觉就像在流沙中游泳一样。


50
同意 字符串操作是第1项通过的事情我5讨厌C.
BoltBait

1
只需使用DJB的安全字符串库之类的东西即可。在大多数语言中,XML操作都很困难,并且许多程序都在进行XML操作,但是您看不到很多帖子说“ Perl完全坏了,因为它不支持DOM节点作为原始数据类型”。他们使用图书馆。
史蒂夫·杰索普

5
C字符串操作确实很烂,但是就语言问题而言,这并不是最坏的情况。
克里斯·卢茨

3
要连接的strcat,但是要等...目标是否有足够的空间...好,必须插入if语句进行检查...但是要等一下,如果我的字符串在堆上怎么办?好吧,必须保留一个变量来跟踪大小...而且这种情况可以持续下去……
blwy10 2009年

4
我们需要一个线程来处理我们讨厌的五件事...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2010年

94

我讨厌“我讨厌某种语言的事情”列表中的五件事?:D

5-画一个橘红色并不意味着它是一个苹果。

设计语言时,设计师通常会记住它的用途。将它用于完全不同的东西可以起作用,但是抱怨它不只是愚蠢的。以Python为例。我确定有人或某天某人会创建实用程序来从Python代码创建exe。为什么上帝的地球,你会这样做?这会很整洁-不要误会我的意思-但这没有用。因此,不要再抱怨了!

一个设计良好的项目可能包含多种语言的代码。这并不是说您不能只用一种语言来完成一个项目。无论您使用哪种语言,某些项目都可能在能力范围之内。

4-你站在木腿上吗?

该平台可能会对语言的功能产生很大影响。如今,垃圾收集器甚至是帕斯卡早日尝试进行“垃圾收集”,都可以帮助减少内存(可能会分配更多的内存?)。计算机速度更快,因此,当然,我们期望更多的语言支持。坦率地说,我们可能应该这样做。但是,为使编译器创建哈希表或字符串或其他各种概念的便利性,需要付出巨大的代价。这些东西可能不会继承到使用它们的平台。要说它们很容易包含在语言中,只是告诉我您可能没有立场。

3-真的是谁的错?

虫子。你懂。我喜欢虫子。为什么我喜欢虫子。因为这意味着我可以继续工作。没有错误,将有许多封闭的比萨店。但是,用户讨厌错误。但是这里有点冷水飞溅。每个错误都是程序员的错。不是语言的。具有如此严格的语法的语言将大大减少可能产生的错误数量,这将是一种完全无用的语言。一方面可以算出它的能力。您想要灵活性还是力量?您有错误。为什么?因为你不完美,并且会犯错误。在C中举一个非常明显的例子:

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

我们都知道会发生什么。但是,也许我们中的一些人没有意识到的是……该功能可能非常有益。取决于您在做什么。缓冲区溢出是该功能的成本。上面的代码。如果我真的公开发布了。再说一次..和我一起说..“我的错”。不是C允许我这样做。

2-我们不应该将其放入回收站吗?

用我们不了解的语言来指出功能很容易,因为我们不经常使用它并称其为愚蠢的。抱怨它在那里等等。后藤总是招待我。人们总是抱怨goto是一种语言。但是我敢打赌,您的上一个程序包含了goto类型。如果您曾经使用过休息或继续,则使用过goto。就是这样 当然,这是一个“安全的” goto,但事实就是如此。后藤有其用途。是使用诸如“ continue”还是“ break”之类的“隐式” goto还是显式gotos(对于任何语言都使用实际的关键字“ goto”)。并不是说语言开发人员是完美无缺的,而是通常……如果自从该时间的黎明起就存在功能。这方面可能是该语言的定义质量。意思是.. 被使用,并且可能由于向后兼容性而没有使用。今天正在使用。如5分钟前。并正确使用。好吧..可以说有人也在不正确地使用它,但这与我列表中的#3有关。

1.-一切都是对象。

好的,这真的是#2的子集。但这是迄今为止我在仇恨清单中看到的最烦人的投诉。并非所有事物都是对象。有很多不属于或需要成为对象的概念。把东西放到不属于他们的地方是很丑陋的,并且会降低程序的效率。当然。取决于语言的可能不多。这也与#5有关。这意味着...是的。全球都可以。附加到静态方法的函数是可以的。将OO编程与全局功能结合在一起是可以的。现在..这并不意味着我们也应该全力以赴,并从对象模型中“释放”我们的代码。设计一段代码或整个项目时,幕后发生的事情应该放在一起时考虑。不仅是该概念存在的地方,还有许多其他因素。如果无用,为什么要在类或命名空间概念中包装全局函数呢?取静态成员变量。这让我感到非常有趣,因为..当然,取决于语言和实现,但总的来说,您只是声明了一个全局变量。是的,出于某些原因将这些非OO概念包装在OO包装器中。当然之一就是自我记录代码。那很有意义。所以..就像我说的。不要出去“释放”您的代码。但是,任何好的现代语言都将在OO建模之外具有全局概念。是的,我要特别指出的是,没有全局概念的OO编程语言很可能存在严重的设计缺陷。再一次.. 取决于语言的意图和设计,因此我没有尝试选择任何特定的语言,并且这里有太多的内容需要分析。任何人,请考虑代码应该存放在哪儿并且是最有效的。在不增加功能或支持的情况下增加闪光点只会使键盘磨损更快。它对任何人都没有好处。好吧..除非您喜欢那个可能错误地教您所有事物都是对象的人的布朗尼蛋糕。

简而言之,编程不仅是无意间敲击键盘。任何项目都有很多设计注意事项。我知道这是陈词滥调,但您必须从各个角度审视它。即使使用当今的类型安全语言。您不仅会删除代码并期望它能正常工作。当然可以,但是可能不是正确的方法。总体而言,选择最适合特定工作和环境的语言和格式。但是没有一种语言能够消除其背后的思想。如果您不考虑..,则只需输入。


19
语言不是完美的,如果列出您讨厌某种语言的事情,您可能会得到一些有趣的评论和想法。首先,它允许其他人为您提供您不知道的解决方案(浏览帖子,您会看到一些东西)。其次,它构成了语言开发人员的用户反馈(如果您的用户提出了他们最讨厌的5件关于您的软件的清单,您是否会感兴趣?),第三,思考这些缺陷会很有趣您的工具。
Sylverdrag

4
如果您在该级别上查看它,不仅要中断并继续执行命令,而且还要执行循环(如果满足条件,则跳转到循环的开始),如果响应是goto(如果不满足条件,则跳转到该块),函数调用是goto(跳至函数的开头,然后再跳回),...
氦气2010年

17
从源代码创建可执行文件“没有用”?什么?
2010年

4
从80年代末开始,Perl可以从Perl文件创建可执行文件。分发一件事很有用。不需要a)安装Perl,b)安装程序的组件,c)也许编写脚本来设置路径并执行所有操作……是的,真的没用。
xcramps 2010年

1
但是,如果无法从源代码创建.exe文件,则Windows用户将无法运行它。;)
Evan Plaice 2010年

88

我讨厌Java的五件事(目前是我最喜欢的语言)没有特别的顺序。

  1. 尽管我是Java Generics的爱好者,但它的设计方式还是有很多奇怪之处。因此,泛型存在无数烦人的限制(其中一些是类型擦除的结果)。
  2. Object.clone()和Cloneable接口的工作方式已完全中断。
  3. Sun没有走上高路,而是把所有东西都变成对象(例如SmallTalk),而是扑朔迷离地创建了两种不同的数据类型类别:对象和基元。结果,对于基本数据类型和奇怪的问题,现在有两种表示形式,例如装箱/拆箱以及不能将基元放入集合中。
  4. 摇摆太复杂。不要误会我的意思:Swing可以做很多很酷的事情,但这是过度设计的一个很好的例子。
  5. 最后的抱怨同样是Sun和为Java编写XML库的人的错。Java XML库太复杂了。为了简单地读取XML文件,我经常不得不担心我使用的是哪种解析器:DOM还是SAX?每个API都令人困惑。语言的本机支持可轻松解析/编写XML,将非常好。
  6. java.util.Date很烂。它不仅不必要地变得复杂,而且所有有用的方法都已被弃用(并被增加复杂性的其他方法所取代)。

32
您忘记了java.util.Date!
TM。

3
另外:“ Cloneable”接口没有“ clone()”方法。这使“可克隆”界面成为Oxymoron。而且由于clone()返回一个Object,所以类型安全性不在窗外(即使在J2SE 5.0中引入了泛型之后,也没有进行任何纠正的尝试)。
Ryan Delucchi 09年

2
只要我们抨击可克隆,还可能包括所谓的“可序列化”“接口”。每当使用它时,我总是想刺伤自己。
wds

12
很难做一些简单的事情,例如打开文件并从中读取文件。
埃里克·约翰逊

3
@Ryan clone()不一定需要返回“ Object”。在J2SE 5.0中,Java引入了协变返回类型,这意味着您可以返回基类的任何子类型。因此,公共MyType clone()是可能的!
helpermethod 2010年

73

Ruby有很多与其速度相关的缺陷,但我并不讨厌这些缺陷。社区传福音的泛滥也存在缺陷,但这并没有真正困扰我。我讨厌这些:

  • 闭包(块)具有4种不同的创建语法,并且都不是最佳的。优雅的语法不完整且带有哈希值,而完整的语法很难看。
  • 社区倾向于反对真实的文档,而倾向于“阅读代码”。我觉得这个孩子气和懒惰。
  • 元编程滥用(尤其是在库中)使错误成为跟踪错误的噩梦。
  • 值得一提的是,普遍的元编程使全面的IDE难以甚至不可能实现。
  • 块传递给函数的方式很愚蠢。没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(产量)。我认为应该为块提供一种不太模糊的语法(或者哈希可以使用不同的定界符;也许使用<>而不是{}),并且作为参数传递给方法应该像所有其他参数一样传递。

    object.method(1, {|a| a.bar}, "blah")
    

    这些奇怪的地方,例如块必须是传递的最后一个参数,而传递更长的语法会传递一个以上的块,这确实让我很烦。


2
次优m17n和unicode支持,尽管它变得越来越好。1.9仍然很复杂...
Keltia

37
我认为元编程滥用被称为“惯用红宝石” :)
Slartibartfast

2
akway:其他两种语法是lambdaProc.new
Myrddin Emrys

2
关于文档,我曾经听过一个在Pragmatic Programmers出版社工作的人的演讲,他说公司成立时,他们想要一本Ruby书,因为唯一的书是日语。因此,他们本可以由公司翻译和出版该书。但是他们做了什么却代替了阅读源代码的内容:-) Ruby书显然是启动Pragmatic Programmers的书之一。
亚瑟·鲁特瑙尔

13
我发现有趣的是,其中三个与人有关,而不与语言本身有关。Ruby仍然是我最不喜欢的语言。
Toby Hede,2009年

72

佩尔

  • 信息的混合使用

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • 例如没有这些是一样的:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    Perl6上面写着

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • 缺乏真正的面向对象

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    Perl6里面写着

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • 设计不当的正则表达式功能

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    Perl6它被写入

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • 缺乏多次派遣

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    Perl6上面写着

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • 运算符重载不佳

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    Perl6上面写着

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
我不认为缺乏真正的OO就像您做到的那样糟糕。有时,这是一个救星,尤其是当您使用的CPAN模块没有考虑公开您的需求时。而且缺少多次调度可能会变得更糟:可能已经对perl进行了强力输入;-)
Tanktalus

3
我喜欢Perl并不是强类型的,但是添加一些类型信息会很有用。
布拉德·吉尔伯特

13
似乎您选择了批评一种不喜欢的语言(您应该批评perl6)
Frew Schmidt

5
与perl 6相比有什么意义?您是在建议Perl 6解决您的问题,还是继续解决这些问题?
罗伯特·P

2
我怀疑我需要说的不止于此
mark

57

我会去做的 有时 PHP,而Python会做得太多。

  • 没有名称空间;一切都在一个非常大的命名空间中,这在更大的环境中是地狱

  • 函数方面缺乏标准:数组函数将“ needle”作为第一个参数,将“ haystack”作为第二个参数(请参阅array_search)。字符串函数通常首先将大海捞针,其次才是针(请参阅 strpos)。其他功能只是使用不同的命名方案: bin2hexstrtolower cal_to_jd

    有些函数的返回值很奇怪,这与正常情况不同:这迫使您无处声明第三个变量,而PHP可以通过其类型处理有效地将空数组解释为false。几乎没有其他功能可以做到这一点。

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • 该语言(直到PHP6)已尽最大努力尊重向后延迟的向后兼容性,从而使其在不需要时带有不良实践和功能(请参阅 mysql_escape_stringmysql_real_escape_string)。

  • 该语言已从模板语言演变为全后端语言。这意味着任何人都可以在需要时输出任何东西,并且滥用它。您最终获得了用于模板语言的模板引擎。

  • 导入文件很烂。您有4种不同的方法(包括,include_once,require,require_once),它们都很慢,非常慢。实际上,整个语言都很慢。至少,从我收集的数据来看,它比python(甚至具有框架)和RoR慢得多。

我仍然喜欢PHP。这是Web开发的电锯:您想要一个真正快速完成的中小型网站,并确保任何人都可以托管它(尽管配置可能有所不同)?PHP就在那里,它无处不在,只需5分钟即可安装完整的LAMP或WAMP堆栈。好吧,我现在要重新使用Python。


4
我想在5.3中实现了点1 :)尽管参数排序越来越好,命名仍然很差。我同意向后兼容性。
罗斯,2009年

4
要爱#4。这也是一直困扰我最多的事情之一。
Franz

1
我认为,速度争论是相当主观的。速度更多地取决于代码的效率,而不是语言本身。较差的PHP代码可能比高质量的python代码慢,但良好的PHP可能比较差的Python性能更好。
selfawaresoup,2010年

17
no_really_now_mysql_escape_the_string_im_serious()
Salaryman'5

2
命名空间schmamespaces。PHP是万维网上,所以一切应该是全球性的
埃文鲽

50

这是我不喜欢Java的一些东西(这不是我最喜欢的语言):

  • 泛型类型擦除(即没有泛型泛型)
  • 无法在单个catch块中捕获多个(不同类型的)异常
  • 缺乏析构函数(finalize()是非常差的替代品)
  • 不支持闭包或将函数视为数据(匿名内部类是非常冗长的替代品)
  • 一般检查的异常,或更具体地说,是检查不可恢复的异常(例如SQLException)
  • 对文字集合不提供语言级别的支持
  • 调用泛型类的构造函数时,没有类型推断,即类型参数必须在'='的两侧重复

1
@Svish-我想指出的是,仅在不关心要处理的异常类型时才使用此构造。换句话说,当你要处理他们所有具有相同
多纳尔

3
当语言具有GC,并且每次发布的GC都越来越好时,我不会把缺少析构函数称为缺陷。在Java 1.1.8中没有使用析构函数,但在Java 6中没有使用析构函数,因为gc得到了极大的改进。
Mike Reedell,2009年

7
C#修复了所有这些问题,除了捕获多个异常。泛型被泛化,析构函数被using / IDisposable替换,闭包通过anon方法和lambda实现,未检查异常,有集合文字,并且存在“ var”以避免两次指定构造的类型。
丹尼尔·艾威克

1
Java肯定有闭包。匿名内部类在其范围内关闭局部最终变量。我同意匿名内部类不能适当替代匿名函数,但它们闭包。
亚当·贾斯基维奇

2
Anon内部类不是闭包的:尝试创建一个访问者回调,其中包含“ sum + = current.amount()”之类的内容,其中“ sum”是封闭范围内的非最终变量。关闭,但没有雪茄。
Roboprog

40

C ++

  1. 模板语法
  2. 钻石继承问题
  3. 现代语言所拥有的标准库过多/不足(尽管提升很快)。
  4. IOStreams
  5. IOStreams周围使用的语法

蟒蛇

  1. 空间有意义(有时)
  2. 强调关键字
  3. 线程支持有限(至少当前如此)
  4. “自我”而不是“这个”
  5. 空间有意义(有时)

80
您可以将“自我”称为“此”,这是您真正想要的(尽管其他人可能很难理解)。“ Self”不是关键字,您可以根据需要命名该变量。
mipadi

36
到那里,我实际上将Python中的空格(尤其是缩进)的意义列为其最大优点之一; ...)
Oliver Giesen

22
“空间有意义”是python的最佳功能之一!ps尝试在解释器中“从将来的导入括号中” 运行此
脚本

4
除了线程支持外,我几乎不同意您的整个python列表。空格是没有意义的,缩进是有意义的;有很大的不同。
克里斯蒂安·奥达德

3
哇。就像没有人发明一种文本编辑器一样,它以特殊字符突出显示/显示空格/标签(什么,您在记事本中编码?)。另外,如果将标签页扩展到空格,请放火烧死。
假名称

37

目标C

1)没有名称空间,只有手动命名约定-我不介意类分离,但是我确实想念能够在一行中导入名称空间中的所有类定义(例如import com.me.somelibrary)。 *)。

2)图书馆在诸如RegEx支持之类的重要领域仍然存在一些漏洞。

3)属性语法有点笨拙,需要三行(在两个单独的文件中)来声明属性。

4)我喜欢保留/发布模型,但是它比发布参考然后在以后意外使用它要容易得多。

5)尽管Xcode并不是真正的语言功能,但它与Objective-C的使用紧密相连,我不禁要考虑这一方面...基本上,自动完成功能非常棘手。它更像是一个奖励您发现存在的事物的系统,然后将其呈现为选择。但是后来我想我从不喜欢自动完成引擎。


2
同意名称空间,以字母代码作为前缀的类是愚蠢的。而且我会添加对真实类变量的缺少支持,我不喜欢伪造文件静态变量。
zoul

2
Objective-C属性。真的,它们令人震惊,我无法理解宣传,尤其是看到C#的表现如何。
Justicle

6
实际上,我真的很喜欢Lisp和ObjC的方面-您只需要一个具有良好括号匹配的编辑器,例如Emacs或XCode。我通常在输入括号之前先成对键入,因此我不会真正遇到匹配问题...而且XCode也可以通过双击包含括号的区域来突出显示括号包围的区域。
Kendall Helmstetter Gelner 09年

1
@Chris S:您是说YES/NO布尔值是一件坏事吗?更重要的是,您是说命名参数是一件坏事吗?我可以理解布尔值,但命名参数可能是ObjC的最佳功能之一(就可读性而言)。
jbrennan

3
也许我是受虐狂,但我喜欢带前缀的类名。它使google和文档搜索变得清晰明了,如果该类称为NSString,则对使用哪种字符串永远不会感到困惑。
kubi 2010年

36

C ++

  • 字符串。
    它们不能与平台字符串互操作,因此您最终有一半时间会使用std :: vector。未定义复制策略(写时复制或深层复制),因此无法为简单的语法提供性能保证。有时,他们依赖于使用起来不太直观的STL算法。太多的图书馆会自己推出图书,但不幸的是,它们使用起来舒适得多。除非您必须将它们结合在一起。

  • 各种各样的字符串表示形式
    现在,这是一个平台问题,但是我仍然希望,如果早些时候可以使用不太顽固的标准字符串类,那就更好了。我经常使用以下字符串表示形式:

    • 通用LPCTSTR,
    • 由CoTaskMemAlloc分配的LPC(W)STR,
    • BSTR,_bstr _t
    • (w)字符串,
    • CString,
    • std :: vector
    • 一类我自己的类(sigh),它将范围检查和基本操作添加到已知长度的(w)char *缓冲区
  • 建立模型。
    我讨厌把所有时间都花在谁身上,包括什么,前向声明,优化预编译的头文件,并至少包括可忍受的增量构建时间,等等。打包一段代码有很多障碍,因此可以重复使用,甚至妈妈的狗也无聊听我的话。

  • 难以解析
    这使得外部工具尤其难以编写且正确无误。如今,我们的C ++专家在工具链中大多缺乏。我喜欢我的C#反思和代表,但我可以没有他们。没有出色的重构,我无法。

  • 线程太难
    了(到目前为止),语言甚至还不能识别它,而编译器的自由度虽然很棒,但却非常痛苦。

  • 静态和按需初始化 技术上,我在这里作弊:这是“包装代码以供重用”中的另一个难题:只在需要时才初始化某些东西是一场噩梦。解决所有其他redist问题的最佳解决方案是将所有内容都放入标头中,该问题为“ neener-you not”。


诚然,其中很多超出了严格的语言范围,但是IMO整个工具链都需要进行判断并需要发展。


查看STL上的文档就像寻找有关如何从头开始构建图形卡的手册一样。
aviraldg

坦白说,这些要点中的大多数听起来都像是您从不费心去适当地学习C ++。在#3中,这很明显,因为包容性保护是每个 C ++程序员都应该知道的。我也不确定如何理解第一点,您对此感到困惑std::string吗?也许阅读有关std::vector(以及为什么不应该std::string在从未设计过的地方使用它的)好的文档和/或教程可以为您解决这些问题。

@nebukadnezzar:我发现Meyers阐明了STL,但是它不能解决基本问题。坦白地说,这听起来像您不必维护大型项目,也无需在数十个深的包含层次结构中寻找循环依赖。我知道有守卫,但是为什么我们要打扰他们呢?顺便说一句。他们并不能解决所有问题。std::string如果我有一半时间不能使用它,那么“标准”是多少?(C ++ 0x至少可以解决该问题,但我仍然对数十个使用不同字符串表示形式的库感到困惑)。
peterchen 2011年

but why do we have to bother with them (inclusion guards)-因为C ++没有模块。How "standard" is a std::string if I can't use it half of the time?-我认为这取决于您的使用方式std::string。字符串类使您可以const char*通过来访问字符串数据std::string::c_str,这已经std::string与每个也带有const char*参数的类/函数完全兼容。

因为C ++没有模块 -正是我的抱怨:构建模型是过时的(我也只接受模块以外的任何其他解决方案)。----- 完全兼容 -但与许多其他情况完全不兼容(我认为C ++ 0x修复了这个问题,我在这里确实有一点要说。)如果std :: string足够普及,我很高兴已在10年前被采纳为THE字符串类,但事实并非如此-另一个抱怨。
peterchen 2011年

35

JavaScript

  • Object原型可被修改。程序中的每个对象都有新的属性,某些东西可能会损坏。

  • 所有对象都是哈希图,但是很难安全地使用它们。特别是,如果您的关键之一恰好是__proto__,那么您就很麻烦。

  • 在函数引用时没有对象关闭。实际上,根本没有对象关闭-而是this在使用对象符号或new运算符调用函数时设置。导致很多混乱,尤其是在创建事件回调时,因为this未设置为程序员期望的值。

    • 必然结果:调用没有对象表示法的函数或new运算符将导致this设置为等于全局对象,从而导致大量破坏。
  • 尽管这两个操作根本不同,但重载加法运算符也可以执行字符串连接。当您期望为数字的值实际上是字符串时,会导致痛苦。

  • ==然后!=操作员执行类型强制。不同类型之间的比较涉及一系列规则,凡人都无法完全记住。===!==运算符的存在减轻了这种情况。

  • 两者nullundefined存在,具有微妙的不同而又多余的含义。为什么?

  • 建立原型链的怪异语法。

  • parseInt(s)期望使用C样式的数字,因此将前导零的值视为八进制等。您至少可以这样做,parseInt(s, 10)但是默认行为令人困惑。

  • 无块范围。

  • 可以多次声明同一变量。

  • 可以使用变量而无需声明它,在这种情况下,它是全局变量,可能会破坏您的程序。

  • with { }

  • 真的很难用一样的工具JavaDoc的记录。


3
对于nullundefined:有时您真的想知道是否为变量分配了值。由于null是一个值,因此undefined是唯一的判断方法。当然,我发现这唯一有用的是创建getter / setter函数。
扎克

1
“如果您的钥匙之一恰好是原型 ”-好吧,这是一个保留字,具有特殊含义。就像在抱怨不能将其for用作变量名一样。
尼克

5
@nickf:哈希的关键是一个字符串。字符串可以具有任何值,包括保留字。该值尤其"for"可以作为哈希键有效。__proto__不是保留字。特殊字符串值在用作哈希键时不能按预期工作,这违反了有关关联数组如何以任何语言工作的合理预期。它们还违反了EcmaScript规范。
丹尼尔·卡西迪

2
托马斯:换行并不总是结束声明。因此,明智的编码人员以分号结束每个语句,以使代码更清晰。
丹尼尔·卡西迪

2
newline may or may not end a statement depending on context是我的前5名名单之一
reinierpost 2010年

34

蟒蛇:

  • 缺乏静态打字
  • 默认参数处理(特别是您可以更改默认参数的事实为以后的调用者!)
  • 下划线过多(必须调用构造函数 __init__
  • 缺乏适当的私有成员和职能(常规只是说,下划线开头的大多数东西都是私有的,除了诸如 __getattr__
  • 用于print读取文件的有趣语法(但是他们正在Python 3中对其进行修复)

10
我想要的是使用静态类型的选项
Greg Hewgill

4
顺便说一句:init并不是真正的构造函数,当您在其中输入对象时,已经创建了对象(猜测self是...)。构造函数是全新的,您可以在其中访问要实例化的类。
安德烈·

90
如果您喜欢静态类型,为什么Python是您最喜欢的语言?
finnw

9
finnw:静态类型对某些程序很有用,而其他类型则不需要。我通常不介意缺少静态类型,但是当您需要它时,至少可以选择使用它真的很不错。
Greg Hewgill

8
我会说缺少静态类型是一种功能,而不会缺少功能...
arnorhs 2010年

32

C#

  • 我希望我可以switch()使用任何类型,并且case可以是任何表达式。

  • 不能将对象初始化器语法与“只读”字段/自动private setprops一起使用。通常,我需要语言帮助来制作不可变的类型。

  • 使用{}for 命名空间以及方法属性/索引器块以及多语句块数组初始化器。当他们相距遥远或不匹配时,很难弄清楚你在哪里。

  • 我讨厌写作(from x in y ... select).Z()。我不想回到方法调用语法,因为查询语法缺少某些内容。

  • 我想要do查询语法的子句,就像foreach。但这并不是真正的查询。

我真的到了这里。我认为C#太棒了,很难发现很多坏处。


14
+1可开启任何类型
o

+1是切换问题,还有{}是我到目前为止才真正想到的问题
Maslow,2009年

我恨 {}。它们看起来太像()。对我而言,错配从来都不是什么大问题,因为除非它们基本上是单线的,否则我总是将它们置于同一水平。
罗伦·佩希特尔

2
+1为linq查询。特别是当您只希望返回一个对象时。而不是(从y中的x选择).first(),为什么不选择(从y中的x选择顶部1)或更接近实际sql语法的内容。
AdmSteck,2010年

如果您希望可以在任何类型上切换(),并且该情况可以是任何表达式,请查看F#模式匹配。c-sharpcorner.com/UploadFile/mgold/...
gradbot

26

的PHP

  1. 如果您不控制服务器,则没有调试功能,即使这样它们也很烂
  2. 大量的错误PHP代码四处飘浮,给所有PHP程序员一个坏名声
  3. 函数命名不一致
  4. 如果我想要一个静态类型变量,则无法使用它(我非常喜欢90%的动态类型变量)
  5. REGISTER_GLOBALS是魔鬼

25
REGISTER_GLOBALS一次吃了我的狗:(
Pim Jager

2
1:我建议使用xdebug和一个GUI客户端,例如MacGDBp。这确实减轻了一些痛苦……我同意其他几点。
Jonas Due Vesterheden

5
#2:噢,天哪,别让我开始。作为一个PHP开发人员,我总是要捍卫自己,以免受那些只看到许多人使用PHP造成混乱的人的攻击。
selfawaresoup 2010年

1
为#2 +1我花了太多时间为自己作为PHP开发人员辩护。
UnkwnTech'5

+1为#2 –也会导致不好的薪水:(
Shiki 2010年

25

C(好的,这不是我的最爱,但尚未完成。)

  • 套接字库语法。
  • 没有函数重载。
  • C风格的字符串。
  • 缓冲区溢出。
  • 密码语法。我不知道我已经看过几次像atoi的东西,拍了拍额头,然后大喊“当然!”

编辑:如果我诉诸更多的库代码,我可能会想出更多的东西(就像我对套接字所做的那样,但是这些特别糟糕),但是我已经觉得自己在欺骗C语言。 C的好部分,而取代坏的部分,就像击败一匹死马一样。


22
什么套接字语法?C没有套接字的概念。
Ferruccio's

3
哦,拜托!您可以拿出五个。指针算术不是很烂吗?:)
brian d foy

8
+1我嘲笑了“ C风格的弦”。@brain_d_foy:指针算术只有在您不理解的情况下才很烂。
克里斯·卢兹

1
@Chris Luts:甚至在我学习普通C时(在我知道C ++或任何其他OO语言之前),我只是知道char数组有问题。:)
比尔蜥蜴,

2
指针运算是电锯-非常有效的,但你可能把你整条腿
托尔比约恩Ravn的安徒生

24

普通Lisp:

  1. 关键字通常过于罗word。
  2. 图书馆的支持很少。
  3. 在想要更严格地处理内存的操作系统中效果不佳。
  4. 没有与操作系统进行交互的良好工具。
  5. “循环”功能的定义不明确,因此看起来似乎不太漂亮。

2
“循环”可能并不轻松,但是对它的定义有什么不好呢?
丹尼尔·卡西迪

2
我自己还没看过标准,我主要是在Paul Graham的“ On Lisp”上学习。他说,该标准主要是示例,并没有很好地定义极端情况。
David Thornley 2009年

3
您不是说关键字太罗?了吗?
GClaramunt 2010年

我同意这不是“轻率”,但CLtLv2花费了大量时间。我只是认为它设计得太多了。 sunsite.univie.ac.at/textbooks/cltl/clm/…–
汉斯·凡·斯卢滕

除了“循环”之外,“格式”也不太像Lisplike。即使Lisp是我最喜欢的语言,我也讨厌“格式”和“循环”。
Paul Reiners 2010年

24

脑** ck

  • 您的亮点是您图灵完成了吗?我可以在Perl正则表达式中做更多的事情!

  • 缺少物体。来吧,人!就像,你好 ...

  • 没有网络库。我只想抓取一个网页,GOSH。

  • 没有一流的功能。祝贺您-您将与Java朋友感到同情。

  • 无限的磁带用于存储,别无其他。这太自命不凡,以至于我们不妨编写Lisp。


6
没有名称空间或动态模块支持。没有这些基础知识,我们怎么期望写化工厂控制系统?
Donal Fellows 2010年

没有语法糖,例如> 10(移动10次),0(插入零),+ 5(加5)。
Squall

23

的JavaScript

  1. 数字作为字符串-当数字解释为字符串时,数学可能会令人沮丧。5 + 2 = 52?rr ...
  2. 权限-所有最好的东西都需要用户的权限!
  3. 屏幕更新-浏览器必须处于稳定状态才能更新屏幕。似乎没有办法强制屏幕在脚本中间进行更新。
  4. 慢-尽管Google的Chrome浏览器不错...
  5. 浏览器的差异使使用该语言成为[已审查]。

4
作为字符串的数字很容易固定。如果您有字符串,则需要parseInt(x,10)。最大的失败是,您忽略了“ 10”,它将'017'解释为OCTAL
Orion

3
false == 0 == [] ==“”,但null和NaN不是。NaN!= NaN。空==空。
吉米

7
typeof“字符串” ==“字符串”。typeof new String(“另一个字符串”)==“对象。new String('a')。constructor ==” a“ .constructor。typeof new Array()=='object'–
Jimmy

1
for(x in object)返回函数
Jimmy

14
-1,此列表主要是关于浏览器的问题,而不是语言本身。
Mauricio Scheffer,2009年

20

PHP:

  • 永远无法确定某些几乎通用的扩展在所有Web服务器上都可用。
  • 尝试成为将来的一切(goto,closures ...)
  • 经验不足的用户面临许多安全风险
  • 更多运算符重载会很好
  • 所有可怜的程序员,他们没有学习如何使其正常工作并给它起一个不好的名字

不过是PHP (脚本)语言。;-)


好,再去一件!
brian d foy

4
完全同意第5点-也会在Javascript列表中。
史蒂夫·克拉里奇

我不同意“所有不学习如何使其正常运行并给它起坏名字的可怜的程序员”。我将其替换为“大量添加运行时语言配置选项”。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. 仅Windows。
  2. 不再受支持。
  3. 数组可以以任意数字开头,而不是全部标准化为0。
  4. 编译的应用程序依赖于许多dll才能正常运行。
  5. 当您运行未编译的代码时,许多复杂的控件(如浏览器控件或复杂的代码段)往往会破坏IDE,但在编译时效果很好。

13
VB是某人最喜欢的语言?哦 为什么这里没有“完全不同且与其他语言不兼容的syntaz”和“在使用其他语言方面却养成不良习惯”?
永塔

3
我实际上发现#3是一个非常强大的功能,而不是错误-我真的很喜欢VB.NET拥有的功能。从某种意义上说,AWK拥有它,但是在AWK中,数组实际上是变相的哈希:(
Joe Pineda

3
在1和4上,.NET C#不需要完整的框架和操作系统???(嘿,我听说您单调偏执...对于您来说,它仍然是一个“完整的框架”,我怀疑Debian发行人是否会吃掉它)。关于5,没有任何有主见的VB6程序员(在白天)保持默认的“按需编译”选项
处于

2
偶尔还是要支持vb6。宠儿:不能在声明时初始化变量,不能进行参数化构造,每个文件一个类,等等。如果它们可以解决这些问题,那么该语言可以再继续使用十年。
AngryHacker

14
那“ On Error Resume Next”又如何呢……这就像说“此代码为F ** KED,但无论如何
都要让它

18

Ruby是我最喜欢的语言,这是我不喜欢的语言:

  • 绿色线程+阻塞C库=巨大失败
  • 如此缓慢
  • 标准库本身与bang的用法不一致!方法
  • 模块包含+扩展是凌乱的。
  • 不能限制“开放类”的范围-我想添加一个String#dostuff,但我不希望它泄漏到所有第三方库中
  • 没有二进制部署打包解决方案。

3
您是否尝试过Ruby 1.9.1?与Ruby 1.8.6相比,它提供了极大的提速
Christian Stade-Schuldt'Feb

试试jrubyc。JVM JIT FTW!
KitsuneYMG 2010年

+1包含合理的问题,而不是最讨厌的Ruby回答中的“讨厌”。
Phrogz

17

德尔福:

  • IDE有点不稳定。
  • 代码见解有时会感到困惑。
  • 调试有时会出错。
  • 更新多个项目文件可能很麻烦。
  • 如果在一个或多个软件包不可用时启动,则错误消息会弹出几次。

5
所有这些似乎是德尔福的IDE,而不是德尔福投诉的语言(AKA在Object Pascal)
多纳尔

11
大概是因为对象Pascal很完美;-)
Mark Bessey

3
我参加聚会有点晚了,但是无论如何,这里都去了:-必须写下两次方法签名(接口+实现)-单元名称必须与文件名相同。WTF?!?
马丁于2009年

1
我发现begin..ends更好-它们比{}更清晰。与编写代码相比,您花费更多的时间阅读代码。不过,对于抱怨来说,即使在案例中声明范围是完全合法的,也不能在案例中使用枚举类型的已定义子范围。同样,跨部门也没有前向参考。
罗兰·佩希特尔

1
@AlexanderN:不,它从来没有像现在这样活着,流行或很棒。
Andreas Rejbrand

16

的JavaScript

  • 每个脚本都在单个全局“命名空间”中执行...使用不同来源的脚本时必须注意的事情

  • 如果使用了变量但尚未事先定义,则将其视为全局变量

  • 浏览器供应商会按自己的意愿来制定标准,这使得使用如此精美的语言为我们开发人员编码的难度超过了应有的难度

  • 区分大小写-考虑到没有像样的IDE可以通过编译时检查来开发js

  • 解决方法(例如使用hasOwnProperty方法)执行一些其他简单的操作。


AFAIK,浏览器供应商对JS 语言(不是DOM)的所有扩展至少已被推为标准采用-即使标准流程未能实现这一目标。hasOwnProperty /解决方法:双刃剑。为了强制“简单”,我们失去了很多功能和灵活性。那个抱怨总是让我生气。正确编写循环(也正确检查对象成员)!
眼睑滑落

15

Haskell:

  1. 懒惰评估导致空间泄漏。
  2. 不是根据数学抽象构造的数字层次结构。
  3. 严格的monadic IO使其更难调试。
  4. 大型实现以似乎与标准不太兼容的方式处理I / O。(特别是,输出字符仅输出低8位-然后构建使用此假设执行二进制I / O的代码。)
  5. ($)可以更改运算符的关联性以使某些表达式更美观。

其中大多数都没有达到仇恨的程度,并且有人试图为每种方法解决或构建可靠的解决方法。

编辑:关于第5点,有些困惑。特别是某些人似乎认为我指的是论据的顺序,我不是。除了要解释我的意思外,我只会将人们指向以下链接,该链接很好地表达了这一点:http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity


3
您为什么要更改($)的关联性?'fghx'括号为'(((fg)h)x'和'f $ g $ h $ x'括号为'f(g(hx))'...
Erik Hesselink

1
我<3哈斯克尔。标准库需要包含大量数学抽象,包括向量空间等。序言还需要一个运算符,该运算符的链接方式与($)相似,但从左到右{
yfeldblum

10
您错过了真正糟糕的一个:Haskell程序员倾向于使用一个字母变量名。
Benjamin Confino

1
左关联($)运算符只是函数应用程序,在Haskell中用空格字符表示。@正义:尝试翻转功能。(|>)=翻转($)
Apocalisp

1
有人可以解释#5的观点吗?我认为正确的关联性是($)的重点。
蒂姆·马修斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.