你讨厌自己喜欢的语言有五件事情是什么?

bri*_*foy 403 language-agnostic programming-languages

最近Stack Overflow上出现了一群Perl-hate,所以我想我会把" 你讨厌你最喜欢的语言的五件事 "问题带到Stack Overflow.拿你最喜欢的语言告诉我你讨厌的五件事.那些可能是让你烦恼,承认设计缺陷,公认的性能问题或任何其他类别的东西.你只需要讨厌它,它必须是你最喜欢的语言.

不要将它与其他语言进行比较,也不要谈论你已经讨厌过的语言.不要用你最喜欢的语言谈论你喜欢的事情.我只想听听你讨厌但容忍的事情,这样你就可以使用所有其他的东西了,我想听听你希望别人会用的语言.

每当有人试图将他们最喜欢的语言推到我身上时,我就会问这个问题,有时也会作为面试问题.如果有人找不到讨厌他最喜欢的工具的五件事情,他就不会很清楚这一点,无论是提倡它还是使用它来获取大笔资金.他没有在足够多的情况下使用它来充分探索它.他主张将其作为一种文化或宗教,这意味着如果我不选择他喜欢的技术,我就错了.

我不在乎你使用哪种语言.不想使用特定的语言?然后不要.您是否经过尽职调查以做出明智的选择但仍然不使用它?精细.有时候正确的答案是"你有一个强大的编程团队,有很好的实践和很多Bar经验.改变Foo会是愚蠢的."


这也是代码审查的一个很好的问题.真正了解代码库的人会对它有各种各样的建议,那些不太了解代码库的人会有非特定的投诉.我问的问题是"如果你能重新开始这个项目,你会做些什么不同的事情?" 在这个幻想的土地上,用户和程序员会抱怨任何他们不喜欢的东西."我想要一个更好的界面","我想将模型与视图分开","我会使用这个模块而不是另一个","我会重命名这套方法",或者他们真的不喜欢不喜欢目前的情况.这就是我如何处理特定开发人员对代码库的了解程度.这也是关于程序员多少的线索

仇恨并不是弄清楚人们知道多少的唯一方面,但我发现它是一个非常好的维度.他们讨厌的事情也让我知道他们对这个主题的思考程度.

Jer*_*hka 216

哇,我很惊讶SQL还没有在这里搞定.猜猜这意味着没有人喜欢它:)

  • 跨实现的语法不一致
  • 由于看似模糊的原因,微妙的代码差异可能会产生巨大的性能影响
  • 对文本操作的支持不足
  • 入门成本高,但掌握语言的学习曲线陡峭
  • 社区中针对最佳实践的最小标准化,包括语法风格.

......还有一些奖励它的奖励理由,不收取额外费用

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

  • 我无法理解为什么INSERT的语法与UPDATE如此不同.MERGE是不可理解的. (29认同)
  • 也许没有人能够学会爱它,直到他们不再把它当成一种语言.:) (7认同)
  • 一切都+1.然而人们想知道为什么我会忍受ORM的头痛...... (4认同)
  • 如果你认为NULL是第三种可能的结果,就在TRUE和FALSE之后,IS NULL的必要性应该是明确的.由于它的含义是"未知的",你无法分辨出未知的东西是否与另一个未知的东西相匹配.另一个例子:如果NULL等于NULL,这意味着制作JOIN的整个概念将是不可能的,因为任何NULL值都可以与另一个NULL值匹配.如果您理解这一点(也称为三元逻辑),那么您可能会理解引入"IS"运算符以对NULL进行测试的原因. (3认同)
  • @Alan M ...不是L代表什么?:) (2认同)

Zar*_*nen 182

我讨厌Java的五件事:

  • 没有一流的功能.
  • 没有类型推断.
  • 缺乏理智的默认设置,例如图形.
  • NullPointerException不包含有关null的更多信息.
  • 无意义的"可配置"框架/服务提供者接口/工厂类/依赖注入系统的激增.几乎从不使用可配置性,严重违反DRY,并且代码大小翻了四倍,易读性减半.

我知道,我应该查看Scala.

  • @Oscar Reyes - 呃,我们知道.但是该行上可能有多个变量,并且异常消息不会告诉我哪一个是null. (35认同)
  • 斯卡拉也有疣.但是,它比Java好得多. (10认同)
  • 为框架等的扩散+1 (10认同)
  • @both:NPE显示在堆栈恍惚的第一行.它包含(大多数时候)类,java文件名和行号,如:"at your.faulty.code.Instance(Intance.java:1234)"然后你只需打开那个文件,转到那一行就可以了是一个没有分配给它的变量. (7认同)
  • @Valentin,只是想象中的NullPointerException从夜间运行一个庞大的日志文件是的乐趣,你需要弄清楚发生了什么...调试不是一个选项. (6认同)
  • @Bishiboosh是的,如果你可以复制问题,并且它在你自己的机器上,所以你可以附加一个调试器,它不在一个大约10000次循环... (2认同)

jTr*_*der 159

JavaScript:

  1. 所有最酷的东西都是非常复杂的,但是,所有的冷静也包含在如此少量的代码中,你觉得愚蠢的努力追随它

  2. 对于弱类型语言的连接,'+'是一个荒谬的运算符选择.他们试图吓跑新手吗?

  3. 这是一个跨浏览器兼容性的雷区(更别说它是否打开了)

  4. 它通常是不受信任的 - 与诸如阻止后退按钮,永不死亡的弹出窗口等的捣乱有关.

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

如果它不适合jQuery,我可能仍然讨厌它,就像我以前一样:)

  • @Mausch:在大多数情况下,javascript在哪里?你说的相当于"汽车不会导致全球变暖,它正在推动汽车行驶" - 当然,这是真的,但忽略了这一点 - 你还用汽车做了什么? (32认同)
  • @Chris:是的,"+"是强类型语言(如Python)连接的良好运算符.在弱类型语言(如Javascript或C)中,它很糟糕; 它决定(默默地!)'sum:'+ 2 + 3不是'sum:5'而是'sum:23'.拥有更多Javascript经验的人可以提供更好的示例. (20认同)
  • 我同意mausch.ECMAscript本身就是一种美丽而强大的语言.令人讨厌的浏览器(:咳嗽:IE)混淆了它的名字. (15认同)
  • 是的,与Python相比,C是弱类型的(例如,您可以将整数分配给`char`s,通过void*指针将任何内容转换为任何内容等).它是*静态*类型而不是*动态*类型,并且还需要*显式*键入而不是类型推断,但这些与强v/s弱类型无关.[随机示例:Python具有隐式动态强类型,Haskell具有(可选显式)静态强类型,Java具有显式(主要是静态)强类型,C具有显式静态(相对弱)键入.]"强类型"和"弱类型" "实际上没有明确的定义. (5认同)
  • @ShreevatsaR这个典型的例子是:''3'+'2'='32'`,`'3' - '2'= 1`. (5认同)
  • 未声明的标识符是全局变量.Eeek! (4认同)
  • @Viet:你能说出强类型的定义吗?(正如我已经说过的那样,"强类型"没有明确定义.请参阅http://www.c2.com/cgi/wiki?StronglyTyped - 大多数定义中,C的输入强度不如Python或Ocaml.我对强类型的定义,我已经从上下文中已经清楚地表明,强制转换是不会默默执行的.无论如何,这是与JavaScript和这个问题相关的意义. (4认同)
  • javascript的美妙之处在于它让我受雇 (3认同)
  • javascript没有"正确"的关联数组:你不能使用任意对象作为键.我发现这令人难以置信. (3认同)
  • 如果它很难看你做错了. (3认同)
  • @ShreevatsaR:C是弱类型的? (2认同)
  • @shreevatsaR:从什么时候C是弱类型的语言?OO (2认同)
  • *JQuery*很难看.JQuery代码看起来像是一个喜欢吃很多括号生病的人. (2认同)
  • @ShreevatsaR:C强烈且静态地输入.也许你需要一个初学者的教科书. (2认同)

too*_*php 148

PHP:

1)强迫我做出不必要的变量:

$parts = explode('|', $string);
$first = $parts[0];
Run Code Online (Sandbox Code Playgroud)

2)lambdas的实现如此蹩脚它大致等同于使用eval(),所以我从未使用过这种可怕的错误(参见http://www.php.net/create_function).

3)一个try/catch系统,它只能捕获可能发生的大约80%的错误.

4)正则表达式支持就像lambda支持一样蹩脚,因为它必须写在常规字符串中,这是最难学习的编程工具之一,难度是其三倍.PHP应该是一种"简单"的语言?!?!?

5)无法在不写入两次或构建自己的函数或使用"@"运算符的情况下安全地从$ _POST中提取东西:

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;
Run Code Online (Sandbox Code Playgroud)

6)奖金回答:'@'.如果您无法正确编写代码,只需添加"@",对于以后必须调试代码的任何人来说都太糟糕了.

  • 怎么样的列表($ first)= explode('|',$ string); ? (44认同)
  • 理想情况下,我想使用some_function(explode('|',$ string)[0]); (44认同)
  • 你忘记了verbNoun,verb_noun,noun_verb,nounverb,verbnoun,nounVerb等> _> (39认同)
  • 你忘记了参数顺序随机变化的函数 (24认同)
  • 什么奇怪的变量范围?让一切都在本地并迫使你在你想要使用全局时声明是一个好主意,它可以阻止noobs创建只使用全局变量的函数,而不是像他们应该那样使用参数和返回值. (8认同)
  • PHP不是一种_hack_语言. (7认同)
  • $ parts = current(explode('|',$ string)); (6认同)
  • @Franz:我认为他的意思是正则表达式是一种硬语言 - 我同意.在没有添加字符串转义的情况下,跟踪正则表达式的转义是很困难的. (4认同)
  • 或$ first = explode('|',$ string); $ first = $ first [0]; (3认同)
  • #1的最佳解决方案是使用strtok.这只有在你获得第一个元素时才有效 - 否则列表是我能想到的唯一其他方法(除了使用一些可怕的正则表达式...).我也喜欢将[0]添加到函数的末尾.它非常整洁和直观. (2认同)
  • 看起来很有趣,因为几乎所有这些抱怨都在较新版本的PHP中得到了解决.主要是真正的lambdas和三元快捷算子.此外,通过设置一个简单的错误处理程序,您可以将所有PHP错误(通知,警告等)转换为异常,因此可以通过try/catch块捕获它们. (2认同)
  • 5.3已经修复了#2,就是这样.自定义错误处理程序仍然无法捕获致命错误,因此try/catch仍然无法捕获所有错误. (2认同)
  • @too多php,考虑编译器错误致命错误.在像Java和C#这样的语言中,如果你留下一个分号或者产生一个语法错误而不能让它编译,你会得到一个编译器错误,就像你在php中遇到致命错误一样 (2认同)
  • @Click Upvote:但致命错误与编译错误不同 - 如果你有`null`而不是一个对象而不是试图调用一个方法会导致致命错误.如果NullPointerException立即崩溃你的程序并且没有办法捕获异常,你能想象尝试构建一个可靠的Java程序吗? (2认同)

Chr*_*son 135

C++

  • 很容易随机破坏内存并创建几乎不可能发现的错误(尽管,Valgrind在解决这个方面还有很长的路要走).
  • 模板错误消息.
  • 使用模板时,很容易将所有内容都包含在一个文件中,然后获得愚蠢的编译时间.
  • 标准库是现代时代的笑话(默认情况下仍然没有线程或网络?)
  • 很多令人讨厌的小点C(特别是short/int/unsigned/etc之间的所有转换......)

  • @Kieveli const正确性实际上是我在其他语言编程时最想念的事情之一.特别是动态类型的.raii是我经常想念的一大特色. (29认同)
  • Unicode格式.我尊重ascii的简洁,但为了善良,我们现在已经进入了21世纪. (22认同)
  • 我同意STL,但我会说_I_非常好. (13认同)
  • +1"模板错误消息". (7认同)
  • 大多数C++问题来自ISO标准并被锁定了10年. (6认同)
  • Const Correctness - 为如此微小的收益付出了太多的努力. (2认同)
  • 我完全不同意#4 - 这在操作系统上的处理方式完全不同,任何将其固定到标准的尝试都会变得一团糟. (2认同)

Jon*_*eet 129

C#/ .NET:

  • 默认情况下应该密封类
  • 应该没有lock声明 - 相反,你应该有特定的锁定对象,并且应该有Acquire返回一次性锁定令牌的方法.推论:每个对象都不应该有监视器.
  • GetHashCode()并且Equals()不应该System.Object- 不是所有的东西都适合散列.取而代之的是,有一个IdentityComparer它做同样的事情,并保持IComparer<T>,IComparable<T>,IEqualityComparer<T>以及IEquatable<T>界面自定义比较.
  • 对不变性的支持不足
  • 发现扩展方法的方法很差 - 它应该是一个更有意识的决定,而不仅仅是我使用命名空间的事实.

这些都是我的头脑 - 明天问我,我会想出一个不同的5 :)

  • 默认情况下,密封意味着您已经考虑过某些人可能希望从您的班级继承的所有可能原因,并且您认为其中任何一个都没有意义.对不起,但我们都不是那么聪明. (88认同)
  • 在那种情况下,我不够聪明,你可以从我的代码派生出来:因为我无法预测未来可能会发生什么变化会破坏你的代码.这是一个非常重要的问题,IMO.密封代码更具限制性,但可以带来更多的实现自由度和健壮性. (69认同)
  • 默认密封:继承应该设计成一个类(这需要时间并限制将来的选项)或禁止.hashCode/equals:它也很糟糕.有一天,我会写一篇关于它的长篇博文.阅读Effective Java,了解为什么equals在继承链中很难实现. (22认同)
  • Jon Skeet没有设计C#是好事,或者我的列表看起来像"1.默认密封类; 2.锁定太复杂; 3.大多数对象都不可清"! (20认同)
  • 我不敢相信没人提到"goto case"语法,我讨厌那个! (11认同)
  • @Matt:对我来说,HttpContext应该实现一个合适的接口,而不是它应该被解封.覆盖任意类的方法而不理解其中一个方法是否通常会调用另一个方法只是用一个不同的方法替换一个问题,即IMO. (7认同)
  • 我真的不同意默认密封的课程.但是,嘿,这是我认为的列表. (4认同)
  • 我会'杀死'任何会使所有课程默认密封在.Net中的人,即使它试图隐藏在月球的另一边.其实我有一个更好的"想法",禁止密封关键字.... (4认同)
  • @Pop:我想我们不得不同意不同意.我*强烈*敦促你阅读Josh Bloch关于这个主题的"有效Java". (4认同)
  • @Pop:我认为死亡威胁是一个非常极端的反应,这个建议和安全带一样合理. (4认同)
  • @Musigenesis:我认为我们必须对"极端"有不同的看法.我说我相信*默认*应该是密封的.我不是要禁止继承 - 你仍然可以明确地开启一个类.通过明确表示,你会表明你已经考虑过后果. (4认同)
  • 我将继续并同意Jon Skeet关于默认密封课程的问题.如果你想要一些东西可以继承,那就去做吧.但是,不要假设每个类都应该是可继承的. (4认同)
  • +1默认密封.计划继承:类的契约必须描述派生类必须,可能和不可以执行的操作. (4认同)
  • +1不良的不变性支持.我总是喜欢不可变的数据结构. (4认同)
  • @Eric:对于大多数课程来说,派生没有意义,大多数课程实际上支持它很差.默认情况下,每个虚拟类都应该是抽象的,并且每个其他类都是密封的,这意味着您只能将叶类作为动态类型,而不是继承层次结构中的节点类. (3认同)
  • @Buu:当只有一种平等感是明智的时,你通常只使用IEquatable,这通常会排除未密封的类型.对于其他情况,你会使用IEqualityComparer,它对上下文非常敏感:"我将以<this>方式比较相等,因为这就是我所关心的." (3认同)
  • 好清单.我同意每一点,尤其是"默认密封",并且没有对比较/哈希码的隐式支持.基础对象中应该尽可能少的内置事物,并且应该明确指定类支持它的所有其他内容. (3认同)
  • Java将hashCode()和equals()方法作为Object上的方法,我发现这是一个非常合理的设计.因为它使每个对象能够将自己与其他对象进行比较并生成自己的哈希代码具有语义意义,所以我不理解为什么你反对这一点. (2认同)
  • 密码类默认为+1.我坚信(并且Jon已经在上面说过),设计一个正确支持继承的类比设计一个密封的,不可变类更难.因此"允许继承"应该是一个有意识的决定. (2认同)
  • 你真的不讨厌阵列协方差!? (2认同)
  • @Gabe:锁定仍然很容易做*对* - 它只是*坏*锁定(例如锁定在"this"或typeof(...))会被破坏.你仍然可以在哈希表中使用任何类型 - 只需使用显然需要的ReferenceEqualityComparer. (2认同)
  • @Thorbjørn:他们仍然是一样的,因为它发生:) (2认同)

Mic*_*urr 113

C

  • 字符串操作.

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

  • 同意.字符串操作是我讨厌C的事情的第1到第5项. (50认同)
  • C字符串操作很糟糕,但就语言问题而言,它并不是最糟糕的. (5认同)
  • 我们需要一个针对五件事的线程,我们不讨厌C ...... (4认同)
  • strcat要连接,但是等待......目标是否有足够的空间......好吧,必须插入if语句来检查...但是等一下,如果我的字符串在堆上怎么办?好吧,必须保持一个变量来跟踪大小...这可以继续...... (3认同)

小智 94

我恨"我讨厌某些语言的事情"列出的五件事怎么样?:d

5-绘制橙红色不会成为苹果.

设计语言时,设计师通常会考虑到它的用处.将它用于完全不同的东西可以起作用,但抱怨它不是愚蠢的.以Python为例.我确信有人会或某人有一天会创建一个实用程序来从Python代码创建exe.为什么上帝的地球,你会这样做?这将是整洁的 - 不要误解我 - 但它没有用.所以不要抱怨它!

精心设计的项目可能包含来自多种语言的代码.这并不是说你不能用一种语言完成一个项目.有些项目可能完全符合您使用的任何语言的能力.

你站在木腿上吗?

平台可以对语言的作用产生很大影响.随着时下的垃圾收集者,或甚至帕斯卡早期尝试"垃圾收集",可以帮助内存淡化(也许malloc更多ram ??).计算机速度更快,当然,我们期望更多的语言.坦率地说,我们可能应该这样做.但是,为了方便编译器创建哈希表或字符串或各种其他概念,需要付出巨大的代价.这些东西可能不会继承到它们所使用的平台.要说它们很容易包含在一种语言中,只是告诉我你可能没有一条腿站立.

3-谁的错是真的吗?

错误.你懂.我喜欢虫子.为什么我喜欢虫子.因为这意味着我可以继续工作.没有错误,会有很多封闭的披萨店.但是,用户讨厌错误.但这里有一点冷水.每个bug 都是程序员的错.不是语言.具有如此严格语法的语言可以显着减少可能生成的错误数量,这将是一种完全无用的语言.它的能力可能一方面可能被计算在内.你想要灵活性还是力量?你有错误.为什么?因为你并不完美,而且你犯了错误.在C中采用一个真正可识别的例子:

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;
Run Code Online (Sandbox Code Playgroud)

我们都知道会发生什么.然而,我们可能有些人没有意识到的是......功能可能非常有益.取决于你在做什么.缓冲区溢出是该功能的成本.上面的代码.如果我真的把它发布给公众.那又是..跟我说吧......"我的错".不是C允许我这样做.

2-我们不应该把它放在回收站里吗?

很容易指出我们不理解的语言中的某个功能,因为我们不经常使用它并称之为愚蠢.抱怨它就在那里等.后藤总是在招待我.人们总是抱怨goto是一种语言.但我打赌你的最后一个节目包括一种goto.如果你曾经使用过休息或继续,你已经使用了goto.就是这样.当然,这是一个"安全"的转到,但它就是它.Goto有它们的用途.是否使用"隐式"getos,如continue或break,或使用显式gotos(对于任何语言使用实际关键字"goto").并非语言开发人员完美无缺,但通常......如果功能自时间开始就存在(对于那种语言).可能这方面是该语言的定义质量.意思是......由于向后兼容性,它正在被使用并且可能不会被闲置.它今天正在使用.和5分钟前一样.并且使用得当.嗯..可以说有人也使用它不正确,但这与我名单上的#3有关.

1. - 一切都是对象.

好吧..这个真的是#2的一个子集.但这是迄今为止我在仇恨列表中看到的最烦人的抱怨.并非一切都是对象.有很多不属于或不需要成为对象的概念.把东西放在他们不属于的地方只是丑陋而且会降低程序的效率.当然.也许并不多,取决于语言.这也与#5有关.这意味着......是的.全球还可以.与静态方法相关的函数是可以的.将OO编程与全局函数相结合是可以的.现在..这并不意味着我们都应该走出去,并从它的对象模型中"释放"我们的代码.在设计一段代码或整个项目时,在将它们组合在一起时应考虑幕后发生的事情.不仅在这个概念存在的地方还有许多其他因素.为什么将全局函数包装在类或名称空间概念中,如果它没有用处?获取静态成员变量.这非常让我感到高兴,因为......好吧......当然,取决于语言和实施,但总的来说,你刚刚宣布全球化.是的,有一些理由将这些非OO概念包装在OO包装器中.其中一个当然是自我记录代码.这是有道理的.所以......就像我说的那样.不要出去"免费"你的代码.但是,任何优秀的现代语言都将在其OO建模之外具有全局概念.是的,我特别指出,没有全局概念的OO编程语言很可能存在严重的设计缺陷.虽然..再次取决于语言的意图和设计,所以我不是试图挑选任何特定的语言,而且这里有太多的东西要分析.Anywho,考虑代码应该存在的位置并且是最有效的.将一堆闪光添加到不添加功能或支持的东西只会更快地磨损键盘.它没有任何好处.嗯..除非你喜欢那些可能错误地教你一切都是对象的人的布朗尼点.

简而言之,编程不仅仅是盲目地敲击键盘.任何项目都有很多设计考虑因素.我知道这是陈词滥调,但你必须从各个角度来看待它.即使是现在的类型安全语言.你不仅要删除代码并期望它能够正常工作.当然..它可能有用,但它可能不是正确的方法.总的来说,选择最适合特定工作和环境的语言和格式.但没有一种语言能够消除它背后的思想.如果你不在想......你只是在打字.

  • 语言并不完美,如果你列出一些你厌恶语言的东西,你可能会得到一些有趣的评论和想法.首先,它允许其他人为您提供您不知道存在的解决方案(通过帖子,您将看到一些已经学到的东西).其次,它构成了语言开发人员的用户反馈(如果您的用户想出了他们最讨厌您的软件的5件事情的列表,您会不会感兴趣?),第三,思考这些缺陷是有趣的你的工具 (19认同)
  • 从源代码创建可执行文件"没用"?什么? (17认同)
  • 如果你在那个级别查看它不仅中断和继续是getos,而且循环是gotos(如果条件满足则跳转循环的开始),如果是goto(如果条件不满足跳过块,函数调用转到(跳转到函数的开头然后跳回),... (4认同)
  • 自80年代末以来,Perl可以从Perl文件创建可执行文件.分发一件事很有用.不需要a)安装Perl,b)安装程序组件,c)也许写一个脚本来设置路径并执行所有...是的,真的没用. (4认同)

Rya*_*chi 88

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

  1. 尽管我是Java Generics的粉丝,但它的设计方式却有很多奇怪之处.因此,泛型中存在无数令人讨厌的限制(其中一些是类型擦除的结果).
  2. Object.clone()和Cloneable接口工作的方式完全被破坏了.
  3. Sun没有采取高速公路并将所有东西都作为对象(a.la.SmallTalk),而是创建了两种截然不同的数据类型:对象和基元.因此,现在有两种基本数据类型的表示和奇怪的好奇心,例如装箱/拆箱,并且无法将基元放入集合中.
  4. 秋千太复杂了.不要误解我的意思:Swing可以做很多很酷的事情,但它是过度工程的一个很好的例子.
  5. 最后的抱怨同样是Sun和那些为Java编写XML库的人的错.Java XML库太复杂了.为了简单地读入XML文件,我经常要担心我使用的解析器:DOM还是SAX?每个API都同样令人困惑.用于轻松解析/编写XML 的语言的本机支持将非常好.
  6. java.util.Date糟透了.它不仅不必要地复杂化,而且所有有用的方法都已被弃用(并被其他增加复杂性的方法所取代).

  • 你忘记了java.util.Date! (32认同)
  • 很难做一些简单的事情,比如打开一个文件并从中读取. (12认同)
  • 另外:"Cloneable"接口没有"clone()"方法.这使得Cloneable接口成为Oxymoron.由于clone()返回一个Object,因此类型安全性不在窗口内(即使在J2SE 5.0中引入了泛型后,也没有出现任何纠正这种情况的尝试). (3认同)
  • @Ryan clone()不一定需要返回"Object".使用J2SE 5.0,Java引入了协变返回类型,这意味着您可以返回基类的任何子类型.所以公共MyType clone()是可能的! (3认同)
  • 只要我们抨击克隆,也可以包括所谓的Serializable"接口".每当使用它时,我总是想要刺伤自己. (2认同)

Myr*_*rys 73

Ruby有许多与其速度相关的缺陷,但我并不讨厌这些缺陷.它也有社区传福音过火的缺陷,但这并没有真正困扰我.这些是我讨厌的:

  • 闭包(块)具有4种不同的创建语法,并且它们都不是最佳的.优雅的语法是不完整的,并且与哈希模糊不清,完整的语法很难看.
  • 社区倾向于反对真正的文档,倾向于"阅读代码".我发现这幼稚和懒惰.
  • 元编程滥用,特别是在图书馆中,使得bug成为追踪的噩梦.
  • 在相关的说明中,普遍的元编程使得全面的IDE很难(如果不是不可能的话)制造出来.
  • 阻止传递给函数的方式很愚蠢.没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield).我认为块应该被赋予一个不那么模糊的语法(或者哈希可以使用不同的分隔符;也许是<>而不是{}),并且作为参数传递给方法应该像所有其他参数一样.

    object.method(1, {|a| a.bar}, "blah")
    
    Run Code Online (Sandbox Code Playgroud)

    这些奇怪的东西,比如块必须是传递的最后一个参数,并且传递多个块是不同的,语法更长,真的很烦我.

  • 我认为元编程滥用被称为"惯用的红宝石":) (37认同)
  • 我觉得有趣的是,其中3个与人而不是语言本身有关.Ruby仍然是我最不喜欢的语言. (13认同)
  • 虽然它越来越好,但是次优m17n和unicode支持.1.9仍然很复杂...... (2认同)
  • akway:另外两种语法是*lambda*和*Proc.new*. (2认同)
  • 重新记录,我曾经听过一个在Pragmatic Programmers出版社工作的人的讲话,他说当公司成立时,他们想要一本Ruby书,因为唯一可用的是日语.所以他们本可以将这本书翻译成公司出版.但他们做了什么而不是阅读源代码的内容:-) Ruby书籍显然是推出实用程序员的书籍之一. (2认同)
  • 我认为可能是语言能力和IDE能力之间存在固有的权衡.使语言更具表现力可能会对IDE能提供多少帮助设置严格的限制.如果是这样的话,我会每次都去寻求语言能力,因为我发现强大的IDE对于编写代码比阅读代码更有帮助,而且我会做更多的后者. (2认同)

Bra*_*ert 72

Perl的

  • 混合使用的印记

    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;
    
    Run Code Online (Sandbox Code Playgroud)
    • 例如没有这些是一样的:

      $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'
      
      Run Code Online (Sandbox Code Playgroud)

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  • 缺乏真正的OO

    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'}
    }
    
    Run Code Online (Sandbox Code Playgroud)

    Perl6写道:

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

    /(?=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
    
    Run Code Online (Sandbox Code Playgroud)

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • 缺乏多次派遣

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    
    Run Code Online (Sandbox Code Playgroud)

    Perl6写道:

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
    Run Code Online (Sandbox Code Playgroud)
  • 运算符过载不良

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    
    Run Code Online (Sandbox Code Playgroud)

    Perl6写道:

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    
    Run Code Online (Sandbox Code Playgroud)

  • 看起来你选择批评一种不是你最喜欢的语言(你应该批评perl6) (13认同)
  • 我不认为缺乏真正的OO就像你做的那样糟糕.有时,它是一个救世主,特别是当您使用的CPAN模块没有想到暴露您需要的东西时.并且缺少多次发送可能会更糟糕:perl可能是强类型的;-) (5认同)
  • 与perl 6比较有什么意义?你是建议perl 6修复你的问题,还是继续它们? (5认同)
  • 我喜欢Perl没有强类型,但添加一些类型信息会很有用. (3认同)
  • 我怀疑我需要说的更多:http://www.ozonehouse.com/mark/periodic/ (2认同)

I G*_*ICE 57

我会按照自己喜欢的方式做PHP,Python会做得太多.

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

  • 在功能方面缺乏标准:数组函数将针作为第一个参数,haystack作为第二个参数(参见array_search).字符串函数通常首先使用haystack,第二针(参见 strpos).其他函数只使用不同的命名方案: bin2hex,strtolower, cal_to_jd

    一些函数具有奇怪的返回值,这是正常情况:这会强制您在不知情的情况下声明第三个变量,而PHP可以通过其类型juggling有效地将空数组解释为false.几乎没有其他功能在做同样的事情.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
    Run Code Online (Sandbox Code Playgroud)
  • 该语言(直到PHP6)尽力尊重近乎延迟的向后兼容性,使其在不需要时携带不良实践和函数(请参阅 mysql_escape_stringmysql_real_escape_string).

  • 语言从模板语言演变为全后端语言.这意味着任何人都可以在他们想要的时候输出任何东西,并且它会被滥用.你最终得到了模板语言的模板引擎......

  • 它很糟糕,导入文件.你有4种不同的方法(include,include_once,require,require_once),它们都很慢,很慢.事实上整个语言都很慢.至少,比python(甚至是框架)和我收集的RoR慢得多.

不过我还是喜欢PHP.这是网络开发的链锯:你想要一个真正快速完成的中小型网站,并确保任何人都可以托管它(尽管配置可能不同)?PHP就在那里,它无处不在,安装一个完整的LAMP或WAMP堆栈只需要5分钟.好吧,我现在要回Python了......

  • no_really_now_mysql_escape_the_string_im_serious() (17认同)
  • 喜欢点4的讽刺:) (4认同)
  • 我认为第1点是在5.3中实现的.虽然param排序越来越好,命名仍然很差.我同意后向兼容性. (4认同)
  • 得爱#4.这也是我一直困扰着我的事情之一. (4认同)
  • 命名空间schmamespaces.PHP在万维网上,所以一切都应该是全球性的 (2认同)

Dón*_*nal 50

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

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

  • 除了捕获多个异常外,C#修复了所有这些问题.通用泛型,使用/ IDisposable替换析构,通过anon方法和lambdas实现闭包,取消选中异常,有集合文字,并且有'var'以避免指定构造类型两次. (7认同)
  • 当语言有GC时,我不会将缺少析构函数称为缺陷,并且每次发布时GC都会越来越好.在java 1.1.8中错过了析构函数,但在java 6中却没有,因为gc得到了极大的改进. (3认同)
  • Anon内部类是NOT闭包:尝试使用类似"sum + = current.amount()"的东西创建一个访问者回调,其中"sum"是来自封闭范围的非final变量.关闭,但没有雪茄. (2认同)

gri*_*eve 40

C++

  1. 模板语法
  2. 钻石继承问题
  3. 现代语言所拥有的过多/缺乏标准库(虽然提升很接近).
  4. 输入输出流
  5. IOStreams周围使用的语法

蟒蛇

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

  • 您可以将"自我"称为"您",这是您真正想要的(尽管其他人可能很难遵循)."Self"不是关键字,您可以根据需要为变量命名. (80认同)
  • 你去,我会在Python中列出空白(特别是缩进)的意义,作为其最大的优点之一...;) (36认同)
  • "空间有意义"是python的最佳功能之一!ps尝试在"来自__future__ import braces"的解释器中运行它 (22认同)
  • 就个人而言,如果我要列出这个列表,我会列出"空间有意义"3或4次. (4认同)
  • 除了线程支持之外,我几乎不同意你的整个python列表.空白没有意义,缩进是有意义的; 这有很大的不同. (4认同)
  • 哇.就像没有人发明一个文本编辑器那样突出/显示空格/标签作为特殊字符(你在记事本中编码什么?).此外,如果您将标签扩展到空格,请在火灾中死亡. (3认同)
  • @Oliver - 我同意,但是当你混合使用空格和标签时会让人感到困惑.选项卡空间与任意数量的空格不同. (2认同)
  • python方法的实现方式(它们只是一个以对象作为第一个参数的函数)允许各种灵活的技巧,例如猴子修补.为每种方法写一次"自我"真的很难吗? (2认同)
  • 我非常喜欢Python的"自我"方面.它终于教会了我如何思考OOP.现在用C编写C++程序是非常容易的(关于类)."方法"将对象(结构)作为其第一个参数.当然,C中仍然缺少很多东西,但从OOP的角度来看,现在必须更简单. (2认同)

Ken*_*ner 37

Objective-C的

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

2)图书馆在RegEx支持等重要领域仍然存在一些漏洞.

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

4)我喜欢保留/释放模型,但它比释放引用更容易,然后意外地使用它.

5)虽然不是真正的语言功能,但Xcode与Objective-C的使用密切相关,我不禁想到这方面......基本上自动完成,非常不确定.它更像是一个奖励你找到你想要的东西的系统,然后把它作为一个选择.但后来我想我从来没有喜欢自动完成引擎.

  • 实际上我真的很喜欢Lisp和ObjC的那个方面 - 你只需要一个具有良好支撑匹配的编辑器,比如Emacs或XCode.在我输入任何内容之前,我通常会成对输入大括号,因此我不会遇到匹配问题...而且XCode也可以通过双击包含大括号来突出显示大括号括起来的区域. (6认同)
  • 也许我是一个受虐狂,但我喜欢带前缀的类名.它使谷歌和文档搜索变得清晰,如果该类被称为NSString,那么你使用什么类型的字符串永远不会有任何混淆. (3认同)
  • 同意命名空间,用字母代码为类添加前缀是愚蠢的.我会添加缺少对实际类变量的支持,我不喜欢用文件静态伪装它们. (2认同)
  • Objective-C属性.说真的,他们很震惊,我无法理解炒作,特别是看到C#做得多好. (2认同)

pet*_*hen 36

C++

  • 字符串.
    它们不能与平台字符串互操作,因此您最终会在一半的时间内使用std :: vector.未定义复制策略(写入或深层复制时复制),因此无法为直接语法提供性能保证.有时它们依赖于不太直观的STL算法.太多的库自己滚动,不幸的是使用它们更加舒适.除非你必须将它们结合起来.

  • 各种各样的字符串表示
    现在,这是一个平台问题 - 但我仍然希望,如果之前可用的不那么顽固的标准字符串类会更好.我经常使用的以下字符串表示:

    • 通用LPCTSTR,
    • 由CoTaskMemAlloc分配的LPC(W)STR,
    • BSTR,_bstr _t
    • (w)的字符串,
    • CString的,
    • 的std ::矢量
    • 一个滚动我自己的类(叹气),它将范围检查和基本操作添加到已知长度的(w)char*缓冲区
  • 建立模型.
    我厌倦了所有的时间,包括什么,包括什么,前进声明,优化预编译标题,包括至少保持增量构建时间可以忍受等等.这在八十年代是伟大的,但现在呢?收拾一段代码有很多障碍,所以可以重复使用,甚至妈妈的狗也会听我的无聊.

  • 难以解析
    这使外部工具特别难以编写,并且正确.今天,我们C++人员大多缺乏工具链.我喜欢我的C#反思和代表,但我可以没有它们.没有很好的重构,我不能.

  • 线程太难了
    语言甚至不认识它(到现在为止),编译器的自由 - 虽然很棒 - 但是很痛苦.

  • 静态和按需初始化 从技术上讲,我在这里作弊:这是"用于重用的包装代码"中的另一个难题:只有在需要时才能初始化某个东西是一场噩梦.所有其他redist问题的最佳解决方案是将所有内容放入标题中,这个问题说"neeener - 你不能".


当然,其中很多都超出了严格的语言范围,但IMO需要对整个工具链进行评判并需要进化.


Dan*_*idy 35

JavaScript:

  • Object原型可被修改.程序中的每个对象都会获得新属性,而某些东西可能会中断.

  • 所有对象都是哈希映射,但很难安全地使用它们.特别是,如果您的某个钥匙恰好是__proto__,那么您就遇到了麻烦.

  • 函数参考时没有对象关闭.实际上,this只要使用对象表示法或new运算符调用函数,就不会设置任何对象闭包.导致很多混乱,特别是在创建事件回调时,因为this没有设置为程序员期望的.

    • 推论:调用没有对象表示法的函数或new运算符导致this设置等于全局对象,导致很多破坏.
  • 尽管两个操作根本不同,但加载运算符也会执行字符串连接.当您期望为数字的值实际上是字符串时会导致痛苦.

  • ==!=操作员执行类型强制.不同类型之间的比较涉及一系列规则,凡凡人都无法完整记住.这是由存在减轻===!==运营商.

  • 既存在nullundefined存在,具有微妙的不同但又多余的含义.为什么?

  • 用于设置原型链的奇怪语法.

  • parseInt(s)期望一个C风格的数字,所以将前导零的值视为八进制等.您至少可以parseInt(s, 10)但默认行为令人困惑.

  • 没有块范围.

  • 可以多次声明同一个变量.

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

  • with { }.

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

  • @nickf:哈希的关键是一个字符串.字符串可以包含任何值,包括保留字.特别是值""for"`作为散列键有效.`__proto__`不是保留字.当用作散列键时,不能按预期工作的特殊字符串值违反了关联数组如何在任何语言中工作的合理期望.它们也违反了EcmaScript规范. (5认同)
  • 对于`null`和`undefined`:有时你真的想知道变量是否已被赋值.由于null是一个值,因此undefined是唯一可以判断的方法.当然,我发现这个有用的唯一一次是创建getter/setter函数. (3认同)
  • Thomas:Newline并不总是结束声明.因此,合理的编码人员用分号终止每个语句,以使代码更清晰. (2认同)
  • `换行可能会也可能不会根据上下文结束声明`是我的前5个列表中的一个 (2认同)

Gre*_*ill 34

蟒蛇:

  • 缺乏静态类型
  • 默认参数处理(特别是您可以更改未来调用者的默认参数!)
  • 需要的下划线太多(必须调用构造函数__init__)
  • 缺乏适当的私有成员和函数(约定只是说大多数以下划线开头的东西都是私有的,除了所有类似的东西__getattr__都没有)
  • print转到文件的有趣语法(但他们在Python 3中修复它)

  • 如果您更喜欢静态类型,为什么Python是您最喜欢的语言? (90认同)
  • 我想要的是使用静态类型的*选项*. (10认同)
  • finnw:静态类型对于某些类型的程序来说很棒,而其他类型并不是真正需要的.我通常不介意缺少静态类型,但是当你需要它时,至少拥有该选项真的很不错. (9认同)
  • 我会说缺乏静态类型是一个功能,而不是缺少功能...... (8认同)
  • BTW:__ init__不是构造函数,当你进入那里时已经创建了对象(猜猜自己是什么......).构造函数是__new__,您可以访问要实例化的类. (4认同)
  • 实际上,以单一**下划线开头的事情按惯例被视为"私人".带有前缀且后缀为双下划线的名称由语言保留. (2认同)

Jay*_*uzi 32

C#

  • 我希望我可以switch()在任何类型,这case可能是任何表达.

  • 不能将对象初始化程序语法与'readonly'字段/ private setautoprops一起使用.一般来说,我希望语言帮助制作不可变类型.

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

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

  • 我想要一个do关于查询语法的子句,就像foreach.但那不是一个真正的问题.

我真的到了这里.我认为C#太棒了,而且很难找到很多被打破的东西.

  • +1用于切换任何类型 (14认同)
  • linq查询的+1.特别是当你只想要一个对象返回时.而不是(从y中选择).first(),为什么不是(从x中选择前1)或者更接近实际sql语法的东西. (2认同)

Mat*_*ger 26

PHP

  1. 如果你不控制服务器,没有调试功能,即便如此,他们还是很糟糕
  2. 大量错误的PHP代码浮出水面给所有PHP程序员一个坏名字
  3. 函数命名不一致
  4. 如果我想要一个无法获得静态类型变量(我90%的时间都是动态类型的忠实粉丝)
  5. REGISTER_GLOBALS是魔鬼

  • REGISTER_GLOBALS曾经吃过我的狗:( (25认同)
  • #2:天哪,不要让我开始.作为一名PHP开发人员,我总是要为那些只看过许多人用PHP创建的混乱局面的人辩护. (5认同)
  • #2 == Wordpress (3认同)
  • 1:我推荐xdebug和一个GUI客户端,如MacGDBp.这确实减轻了一些痛苦......我同意其他观点. (2认同)

Bil*_*ard 25

C(好吧,这不是我的最爱,但还没有完成.)

  • 套接字库语法.
  • 没有功能重载.
  • C风格的字符串.
  • 缓冲区溢出.
  • 隐秘的语法.我不知道有多少次我抬头看过像atoi这样的东西,打了我的额头,然后喊道"当然!"

编辑:如果我使用更多的库代码(就像我使用套接字,但那些特别糟糕),我可能会想出更多,但我已经觉得我在欺骗选择C.这么多语言只存在C的好部分,取而代之的是它有点像打死马.

  • 什么socket语法?C没有套接字的概念. (22认同)
  • +1我嘲笑"C风格的琴弦".而@brain_d_foy:如果你不理解它,指针算法就会很糟糕. (8认同)
  • 哦,来吧!你可以拿出五个.指针算术不是很糟糕吗?:) (3认同)
  • 指针算术是一种功率锯 - 效率非常高,但你冒着整条腿的风险 (2认同)

Dav*_*ley 24

Common Lisp:

  1. 关键词往往过于冗长.
  2. 图书馆支持是可怜的.
  3. 在想要更严格地处理内存的操作系统中不能很好地工作.
  4. 没有良好的设施与操作系统进行交互.
  5. "循环"设施没有明确定义,肯定看起来不像Lispy.

  • 你不是说关键词 - 太罗嗦吗? (3认同)
  • 'loop'可能不是lispy,但对它的定义很差? (2认同)
  • 我自己没有看过这个标准,我主要是关于Paul Graham的"On Lisp".他说标准主要是例子,并没有很好地定义角落案例. (2认同)

a p*_*erd 24

BrainF*CK

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

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

  • 没有网络库.我想要的只是刮一个网页,GOSH.

  • 没有一流的功能.恭喜你 - 你得与你的Java朋友同情.

  • 一个无限的磁带存储,没有别的.这非常自命不凡,我们不妨写Lisp.

  • 没有命名空间或动态模块支持.如何在没有这些基础知识的情况下编写化工厂控制系统? (6认同)

Bol*_*ait 23

JavaScript的

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

  • -1,这个列表主要是关于浏览器问题,而不是语言本身. (14认同)
  • typeof"a string"=="string".typeof new String("另一个字符串")=="object.新字符串('a').构造函数=="a".constructor.typeof new Array()=='object' (7认同)
  • 作为字符串的数字很容易修复.如果你有一个字符串,你需要parseInt(x,10).巨人失败的是当你遗漏了10,并且它将'017'解释为OCTAL (4认同)
  • false == 0 == [] ==""但是null和NaN不是.NaN!= NaN.null == null. (3认同)

oko*_*man 20

PHP:

  • 人们永远无法确定所有网络服务器上都可以使用某些几乎常见的扩展.
  • 尝试成为未来的一切(goto,closures,...)
  • 无经验用户的许多安全风险
  • 更多的运算符重载会很好
  • 所有那些不学习如何使其正常工作的穷人程序员,并给它一个坏名字

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

  • 完全同意第5点 - 也将在Javascript列表中. (4认同)

Asr*_*n29 18

VB6

  1. 仅限Windows.
  2. 不再支持.
  3. 数组可以从任何数字开始,而不是全部被标准化为0.
  4. 编译的应用程序依赖于许多dll来正常运行.
  5. 许多复杂的控件(如浏览器控件或复杂的代码段)在运行未编译的代码时往往会破坏IDE,但在编译时工作正常.

  • 怎么样"On Error Resume Next"...就像说"这段代码是F**KED,但让我们继续运行它.=) (14认同)
  • VB是某人最喜欢的语言?O_O.为什么"syntaz完全不同,与其他语言不兼容","在其他语言方面给出了不良习惯"? (13认同)
  • 我实际上发现#3是一个非常强大的功能,而不是一个bug - 我真的很喜欢VB.NET.从某种意义上说,AWK有它,但是在AWK阵列中真的是伪装的哈希:( (3认同)
  • 在1和4上,.NET C#不需要完整的框架和操作系统??? (嘿,我听说你单声道偏执...它对你来说仍然是一个"完整的框架",我怀疑debian dist会吃掉它).关于5,没有正确的VB6程序员(当天回来)保持默认的"Compile On Demand"选项ON ... (3认同)
  • 还是要偶尔支持vb6.Pet pieves:无法在声明时初始化变量,没有参数化构造函数,每个文件一个类等等......如果他们能解决这些问题,语言可以再持续10年了. (2认同)

Ori*_*rds 18

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

  • 绿色线程+阻塞C库=巨型失败
  • 太痛苦了
  • 标准库本身与它的使用不一致!方法
  • 模块包括+ extend是凌乱的.
  • "Open Classes"不能作用域 - 我想添加一个String #dostuff,但我不希望它泄漏到所有第三方库中
  • 无二进制部署打包解决方案

  • 你试过Ruby 1.9.1吗?与Ruby 1.8.6相比,它提供了巨大的加速 (3认同)

Too*_*the 17

德尔福:

  • IDE有点不稳定.
  • 代码洞察有时会混淆.
  • 调试有时会出错.
  • 更新多个项目文件可能很麻烦.
  • 如果在一个或多个程序包不可用时启动,则会多次弹出错误消息.

  • 大概是因为Object Pascal是完美的;-) (11认同)
  • 所有这些似乎都是关于Delphi IDE而不是Delphi语言的抱怨(AKA Object Pascal) (5认同)
  • 我有点迟到了,但无论如何都要进行: - 必须两次写下方法签名(接口+实现) - 单元名称必须与文件名相同.WTF?!? (3认同)

And*_*ech 16

JavaScript的

  • 每个脚本都在一个全局"命名空间"中执行......在使用来自不同来源的脚本时,您必须注意这一点

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

  • 浏览器供应商按照自己的意愿制定标准,为使用这种美丽语言的开发人员编写代码应该比它应该更难

  • 区分大小写 - 考虑到没有合适的IDE来开发具有编译时检查的js

  • 解决方法(如使用hasOwnProperty方法)执行一些,否则操作简单.


wno*_*ise 15

哈斯克尔:

  1. 空间泄漏来自懒惰评估.
  2. 数学层次结构不是根据数学抽象构建的.
  3. 严格的monadic IO会使调试变得更加困难.
  4. 大型实现以一种似乎与标准不兼容的方式处理I/O. (特别是,输出字符只输出低8位 - 然后构建使用此假设进行二进制I/O的代码.Ick.)
  5. ($)可以改变运算符的相关性以使某些表达式更漂亮.

其中大多数都没有达到仇恨的程度,并且有人试图为这些中的每一个修复或构建固体解决方法.

编辑:关于第5点有一些混乱.特别是有些人似乎认为我的意思是参数的顺序,我不这样做.而不是解释我的意思,我只是将人们指向以下链接,http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity,它表达得很好.

  • 你错过了非常糟糕的一个:Haskell程序员使用一个字母变量名的倾向. (10认同)
  • 你为什么要改变($)的关联性?'fghx'括号为'((fg)h)x'和'f $ g $ h $ x'括号为'f(g(hx))'...... (3认同)

Ste*_*ont 13

短暂聊天

  • 我不想再用java,delphi,c#或ruby开发了(这是不切实际的,因为我公司的主要开发语言是c#,delphi和java).
  • 从左到右的评估.
  • 有一个类评论但没有方法评论(至少在Squeak)
  • 没有真正的标准库,细节上有很多差异
  • 缺少名称空间

  • Smalltalk让我对其他语言更加不满意,这并不好. (5认同)

Bla*_*ppo 13

我知道我迟到了,但仇恨是永恒的!

Java的

  • 的Runtime.exec(). 那么,如果我不手动清除STDOUT和STDERR缓冲区,我的代码会挂起吗?哇.死,PLZ.
  • 空指针异常. 负责任的编程意味着我必须对待大多数对象,例如它们是未爆炸的炸弹,这是一种面向对象语言的pisser.当不可避免的事情发生时,我有点需要知道哪个物体在我脸上爆炸,但是Java显然觉得我会欺骗.
  • 文件I/O. 为什么我要跳过这么多箍来阅读dang文本文件?在复制文件时,我必须将源文件汇集到我的代码中并手动处理输出字节缓冲区?你认真吗?
  • 原始与原始包装. 请注意,Java现在有许多功能,允许您在某些地方将原语及其包装器对象视为可互换,但在其他地方则不然; 别担心,编译器会让你知道哪个是哪个.这对于从根本上进行设计决策的工作感觉就像是一个黑客.它是.(编辑: 实际上,编译器是一个比我想象的更安全的网络,特别是在进行相等检查时.如果`a`和`b`是整数,'a == b`保证只有至少在预期的情况下运行其中一个是`int`类型.如果它们都是'Integer`类型,那么只有当两个数字在-128和127之间时,该语句才能做你想的.`Engger a = 1000; Integer b = 1000 ;返回a == b;`将返回`false`.真的.)
  • XML. 我有这个简单的小XML文件,我需要创建,我必须做什么?

  • 嗯,不.它会告诉我它在哪个LINE上.如果只有一个对象在该行上可以为null,那就足够了.如果该行上有多个可能为null的对象,我必须猜测. (3认同)

Phi*_*Lho 12

LUA

我喜欢这种语言,但有些事情让我困扰多年!

  • 没有(内置)支持二进制操作(从5.1开始,它可能带有5.2).
  • 应该有一个内置的二进制缓冲区实现,例如允许长字符串连接.
  • 我知道它在语法上不合适,但有时候我会想念longVariableName ++或verboseVariableName + = 5.
  • 参考假定知识C(我有它,但它对新手来说是减号)并且推迟一些对C参考的帮助!有时它太简洁了.
  • 它开始拥有大量的图书馆,但你必须从不同的地方获得它们.另一方面,下载量非常小!;-)


Sti*_*ack 11

VB.NET

  • 行为AndAlso/ OrElseAnd/ Or似乎倒退了.也许他们应该被转换.
  • When只能用于异常捕获.When对某些其他事情做一个有条件的能力会很好.
  • 在VS IDE中没有friggin Refactoring(不是真正的语言错误)就像C#一样
  • Not <obj> Is Nothing.是的,这已经得到了补救IsNot,但由于某种原因,我看到Not Is过于频繁使用.(对于那些把英语作为第二语言的开发者来说,我更频繁地看到它,从这个角度来看它是否更有意义?)
  • 它不需要()on ToString()和大多数功能.(导致草率的编码习惯)
  • _打破一条线时必须要做.
  • 它允许可选参数.(导致草率的编码习惯)
  • 声明一个数组是UpperBound由容量完成的,而不是由容量完成的."Dim arr(2)as String"实际上将包含3个元素.
  • =是一个比较赋值运算符.

  • c#正在获取可选参数,我想念它们 (3认同)

jfs*_*jfs 11

蟒蛇

  • 1-3:没有一个明显的包装/建造/文档化系统的选择(诸如Perl的cpan,POD或Ruby的gem,rake,rdoc).

  • 4:Python 3.0不兼容,每个Python项目需要两个源分支(2.x和3.x).但是Python 3.0是足够的不兼容来证明它.大多数py3k的优点都太微妙了.

  • 5:Jython,IronPython,CPython不兼容.


jam*_*att 10

目标Caml

  1. 非并发垃圾收集器. 我可以整天编写多线程程序,但它们一次只能获得我的八个核心之一.这让我很伤心.

  2. 没有类型类(或他们的道德等价物). 有Furuse-san的GCaml,但它是A)不如类型类好,而B)不在INRIA发行版中.

  3. 非常需要可可桥. 认真.如果我用基于DNA的生命形式的实际接口编写更多代码,那么我可能会分解并自己编写这个该死的东西.为什么没有其他人这样做呢?

  4. 教友是可恶的. 说真的,模块应该是一流的价值观.应该只有一种功能.在你激怒我之前,请阅读Montagu和Rémy.

  5. 应该使用LLVM作为其后端. 我是谁必须谋杀才能让OCaml为我愚蠢的小ARM6核心编译?

所以,是的,我有一些问题.我仍然喜欢这种语言.这真是太棒了.


Lan*_*rts 9

VBA(包括MS Office IDE):

1)不良文档
2)差错误消息
3)阵列操作例程不足
4)不得不重复DIM语句的类型
5)不会打印彩色(必须购买第三方插件)

  • 因为这是我必须完成的大部分工作.我必须支持大量复杂的,互连的Excel电子表格.我希望有一天能在控制台应用程序中重写它,但这需要一段时间. (2认同)
  • 我感到非常抱歉... :( vba是垃圾 (2认同)

Sad*_*ido 9

我自己的前5名"我真的很讨厌c ++":

[5]自动生成构造函数,析构函数和赋值运算符.伙计,每当我不在课堂上宣布某些东西时,这意味着不需要,而不是我忘记它.你,编译器,听到我吗?!

[4]模板语法.哦,每当我决定从类体中提取定义时,我真的需要输入所有这些"<"和">"吗?

[3]字符串.Jeez,我厌倦了"const char*",我必须处理NULL情况,我必须浪费O(N)来获取它的长度,我必须为concat操作分配一个缓冲区.

[2]宏观处理.每当我不明白,我的编译器发生了什么,我就开始寻找一个宏.

[1]运算符重载.我看到代码"A + B*C",我不能说出这段代码是什么,直到我看到A,B和C的实际类型.

  • Re:运算符重载:它不是语言的错误,而是程序员的错误,如果他们编写了那些不做他们传达的奇怪的重载运算符.我喜欢运算符重载的灵活性. (9认同)
  • 生成构造函数和析构函数不是因为您忘记了它们,而是因为无论编译器需要它们在哪里.构造使编译器可以同样调用成员变量和析构函数的构造函数. - 没有其他明智的地方可以打电话给他们. (2认同)

utk*_*tas 8

Delphi(又名Object Pascal),我将谈论本机版本,而不是.NET.

  • Var块!
  • 该语言中的接口在设计时考虑了COM的使用 - 因此比C#或Java中的更复杂.即.除非您明确禁用引用计数,否则引用计数
  • 没有 try except finally end;
  • 对象创建过于明确:

    var obj: TMyObject;
    ...
    obj := TMyObject.Create;
    try
      ...
    finally
      obj.Free;
    end;
    
    Run Code Online (Sandbox Code Playgroud)

而是像

auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block. 
Run Code Online (Sandbox Code Playgroud)
  • 好的,语言非常好,我真的不能再想了所以我在推动自己:像字符串,整数...或枚举这样的内置类型会更好地拥有方法.即.i.ToString而不是IntToStr(i).


Sea*_*rds 7

LUA:

  • 我理解原因,但认真.默认情况下,变量应该是本地的,带有global关键字,反之亦然.
  • 我一般不是do/end风格语义的忠实粉丝.我更喜欢C型支架.
  • 动态打字.我知道,有些人会去"嗯?" 但是我已经完全知道确切地知道给定变量中的数据类型.常数if (type(var) == "string") then stuff() end是一种痛苦.
  • 变量在使用之前无需定义.我更愿意明确我要做的事情,而不是冒着打字错误导致我喜欢称之为"古怪的豆子".

PHP:

  • 再次,动态打字.
  • 缺乏关闭.我知道,你可以这样做,$function($arg);但这不算数.
  • 再次,变量可以在定义之前使用.我有一个个人策略,在使用它之前总是将任何变量显式初始化为已知值,并且我将其扩展到我有任何控制权的最佳实践文档.

C/C++:

  • 标题=颈部疼痛.
  • 不支持关闭.(我很高兴C++ 0x,它有它们.)
  • 静态打字."等等,"你说."你刚才说你不喜欢动态打字!" 是的,我确实这么说过.但静态打字也可能是一个痛苦的屁股.(如果给出了一个选择,我仍然会选择静态类型.)最好我喜欢默认情况下静态输入的语言,但也支持动态类型.(而且我也喜欢小马,五十亿美元,请世界.)

  • 关于静态/动态类型,您理想的系统似乎是对C#的描述. (2认同)

bri*_*ian 7

红宝石:

  1. 这太慢了
  2. 自负的社区
  3. 它不是很小
  4. 在nil上调用方法时的错误,而不是仅仅返回nilàlaObjective C
  5. 非本机线程


Jon*_*ker 7

C

  1. 没有参数多态(即C++模板).它使得编写可重用的数据结构和算法变得很麻烦(并且几乎没有任何静态检查).例如,参见qsort和bsearch的比较器参数:比较器获取无效指针:(
  2. 没有数据结构库.我真的很讨厌写自己的哈希表.我也非常讨厌在网上搜索可重用数据结构库.特别是如果事实证明是不完整的.
  3. 字符串.表示效率低下,如果你理智,笨拙,太难以安全地输入一个字符串.没有标准snprintf.sprintf使用它创建格式字符串太困难了,然后使用它以sprintf安全的方式再次创建字符串.
  4. 只有词汇宏.如果不同的编译器期望在不同的地方使用函数注释,我必须将它们放在HAS_NO_SIDE_EFFECTS不同的地方.为什么我不能只是抓住函数,切换编译器类型,然后通过宏调用将它插入正确的位置?
  5. 没有用于常见功能的可移植库.对于套接字和线程,我使用SDL ---一个frigging 游戏库.对于.ini风格的解析器,我能找到的唯一一个为ubuntu打包的库,我在每日wtf上发布(它计算一个哈希值数组,然后通过它进行线性扫描......)

C++

  1. 模板语法很重且不合适.让我们看看,for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it).
  2. STL中的设计错误.你的向量的更改分配策略是否真的会改变它的类型
  3. 过于复杂的类型系统.类型T1具有convert-to-T2方法,T2具有隐式的from-T1构造函数.这就是所谓的?重载,覆盖和多重继承如何交互?不好,我猜......
  4. 来自模板的令人难以置信的冗长和笨拙的错误消息.你知道我的意思...
  5. 引用意味着您无法在呼叫站点看到输出参数.在C中,您可以猜出哪些foo(bar, &baz)可以修改,哪些不可修改.

  • +1 for C++ point 4.模板错误消息让你的眼睛流血. (2认同)

zmf*_*zmf 6

我的语言是Java.以下是我讨厌的事情:

5.)缺少指针
4.)异常捕获
3.)布尔类型
2.)BigDecimal类型
1.)C#fanboys和Java fanboys

Boolean可以为null.我发现这违反直觉.

BigDecimal是一个图书馆,而不是语言功能.我有烦恼BigDecimalException追赶主要源于写作已通过了一堆箍跳得到实际完成工作的测试类.我应该澄清我对这些事感到恼火,我不打算游说改变.


Cla*_*diu 6

蟒蛇:

  1. 太慢了!
  2. list操作不返回列表,因此你不能做list.append(4).append(5).(我的意思是对同一个清单的引用,而不是副本).这是一个小小的抱怨; 它只出现了几次.
  3. 语句不返回值(if,print,while,for等).这只是处理lambda时的一个问题.
  4. lambdas只能是一个表达式.这种限制并不是真正需要的,因为它们与其他方式的功能相同.如果我想要一个调用两个功能的按钮按下事件怎么办?我需要创建一个命名函数来为动作监听器提供该功能,同时执行"lambda:f1(); f2()"不会受到伤害.
  5. 你只能把标准的a-zA-Z_0-9作为名字.有像"真的?"这样的功能.和"+"会很棒.当然,这可能导致可怕的混淆,但我并不是说我们立即将所有函数重命名为"p @ $%3".你觉得哪个更清楚:"dec2bin"或"dec-> bin"?("store_results"或"storeResults")或"store-results"?

  • 我对第5号的直觉反应令人震惊.今年夏天,我不得不清理那些有斜线,空格,问号,parens,冒号等的列名.不好玩. (12认同)
  • "lambda:(f1(),f2())"是我在少数情况下使用过的技巧. (10认同)
  • 你的第二点是太小了.你为什么不list.extend([4,5])? (5认同)
  • 如果langauge允许在函数名称中使用+,解析将是地狱!a + b是函数名称还是表达式?如果你有一个名为"a + b"的函数和两个变量a,b那么a + b应该做什么? (5认同)

Ken*_*tle 6

Groovy中/ Grails的

  1. 鸭打字
  2. 假设您了解"公约",则公约优于配置
  3. 你讨厌春天的一切
  4. 你讨厌Hibernate的一切
  5. [Groovy]跨集合的常见操作不是(但是最近的版本改进了这个)


小智 6

ColdFusion的

  1. 编译大型Flash表单的时间.
  2. 动态变量类型(有时我讨厌它们.)
  3. CFScript缺乏功能.
  4. CFTable(永远不能让它显示正确).
  5. CFChart缺少图表类型.
  6. 完全缺乏NTLM支持(企业准备好 - 是的)
  7. CFCs中的Moronic var范围
  8. 没有真正的NULL的概念 - 你的变量就消失了!
  9. 无法测试某些事物的存在(如范围,只是其中的成员)

  • 天啊......冷融合.为什么它没有死? (7认同)
  • ColdFusion是一个僵尸.僵尸已经死了......然而不知怎的,它们仍然起来,仍然咬着脸上的人.(我得说:我每天都在工作.) (2认同)

kri*_*ina 6

JavaScript的

  1. 函数对象语法:

    f = new Function( "foo", "bar", "return foo+bar;" );
    
    Run Code Online (Sandbox Code Playgroud)

    (它需要n个参数,第一个n-1是函数的参数,然后nth是实际函数,以字符串形式.这只是愚蠢.)

  2. 函数参数可以重复.

    f = new Function( "foo", "foo", "return foo;" );
    
    Run Code Online (Sandbox Code Playgroud)

    最后一次重复是唯一使用过的重复:

    f( "bye", "hi" ) // returns "hi"
    f( "hi" ) // returns undefined
    
    Run Code Online (Sandbox Code Playgroud)
  3. E4X应该死了.我的用户总是抱怨它不会按照他们的想法运作.让我们面对现实吧,当你需要一个页面和一半的伪代码作为一个setter时,是时候重新思考一下了.

  4. stdin/stdout/stderr(和文件!)的标准概念会很好.

  5. null!=未定义

    必须处理它们是令人恼火的.有时候它很有用,但是大多数语言都设法用一个人来li.

  • 另外,为什么你会使用函数构造函数?f = function(foo,bar){return foo + bar; } (8认同)

has*_*sen 6

蟒蛇

  • __init__
  • 有些库很尴尬,比如smtplib
  • 'self'必须在方法声明中!
  • (对于3.0之前的版本)unicode支持有点差
  • 缺乏内联尝试
  • 没有直接引用"this"/ current模块(而是必须使用sys.modules[__name__])


Iai*_*ain 6

ActionScript/AS3

  • 没有抽象类
  • 没有私有构造函数(所以单例是一个黑客)
  • FP10之前没有类型化数组
  • Flash IDE中的编译/发布时间非常慢
  • 内置函数(例如Math)的性能很慢

否则它实际上是一种很好的语言 - 比JavaScript更好,与流行的看法相反,比PHP好几百万倍.


EMP*_*EMP 6

C#

它是一种很棒的语言,尤其是LINQ,但与C++相比,泛型支持很差.它有很大的潜力,但目前的实现仅对强类型集合和类似的琐碎事物有用.它失败的一些例子:

  • 泛型参数不能仅限于枚举(仅限类或结构).
  • 泛型参数不能是静态类.为什么?这似乎是一种完全人为的限制.
  • 您不能指定泛型类型必须具有带有特定签名的构造函数,因为您不能在接口上具有构造函数.为什么不?它只是另一种特殊名称为".ctor"的方法.
  • 类似地,您不能指定泛型类型必须具有静态方法,因为那些也不能在接口上声明.像static T Parse(string s)往常会有用的东西.
  • 编译器过于急于禁止程序员知道实际工作的某些强制转换,因此它们需要像丑陋一样丑陋 (TheRealType)(object)value
  • 没有协方差,例如.IList<string>无法转换为IList<object>,即使string[]可以转换为object[].(不过,微软可能会在C#4.0中解决此问题.)


Spo*_*ser 6

蟒蛇.

虽然已经提到了python处理范围的奇怪方式,但我认为最糟糕的结果是这是有效的:

import random

def myFunction():

    if random.choice(True, False):
        myString = "blah blah blah"

    print myString
Run Code Online (Sandbox Code Playgroud)

也就是说,if块内部与函数的其余部分具有相同的范围,这意味着变量声明可以在condional分支内发生,并且可以在它们之外访问.大多数语言会阻止你这样做,或者至少为你提供某种严格的模式.

此函数有时会成功,有时会抛出异常.虽然这是一个人为的例子,但这可能会导致一些微妙的问题.

  • 我认为语言的范围规则通常是简单且一致的,具有自己范围的条件块和循环不是_more_规则,它是递归应用的相同规则. (4认同)

Pau*_*nty 6

哈斯克尔:

  • 空间泄漏 - 默认为懒惰付出的代价 - 可能价格过高?
  • 即使是纯粹的功能head,tail也可以调用error并启动你IO.
  • fail来自Monad- 带回来MonadZero.
  • Num班- (+)本来应该AdditiveGroup或相似.
  • Monad不是Applicative.


Dav*_*sky 6

Perl 5的更多内容,从创建了大量Perl模块的人的角度出发,特别是在Moose上工作.

  1. 重载和绑定变量的可怕破碎.这两个功能都是尝试允许透明扩展内置类型的尝试失败.

    它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说"永远不要将重载的对象传递给foo()方法".这两种选择都不可接受.

  2. 缺少适当的钩子进入编译过程和元模型.如果Perl核心允许我们通过一个允许我们挂钩到元模型(包,类等)的合理API来影响编译过程,那么Moose,特别是角色使用可以变得更加安全

  3. 语言中缺少命名参数.相反,每个人都重新改造.它很烦人.

  4. 同样,缺少可选类型.我不想要静态语言,但是指定类型和约束的能力,特别是函数/方法参数,将是很好的.Perl 6做对了.类型是可选的,但非常丰富,内置和用户定义类型之间没有根本区别.

  5. 向后兼容警察.这更像是一个文化问题.由于Perl 5对向后兼容性的强烈承诺,因此上述许多问题永远无法解决.因此,即使要添加某些东西,有效地取代当前的束缚和重载球,这些功能也永远不会被删除.当然,向后兼容性也是Perl 5最大的优势之一.

  6. 奖金仇恨:Perl的内置异常机制是一个笑话.异常可能是一个字符串或对象这一事实会导致异常繁琐的异常代码,而语言语法中缺少一个问题就是疣上的疣.


sta*_*san 5

我有一本书探索SNOBOL的各种项目.第一章探讨了围绕SNOBOL编程和语言的历史和文化,并花了一些时间来证明一个优秀的程序员喜欢一种语言而不是因为它的缺陷,而是尽管它们.

我最喜欢的语言是Icon/Unicon.但仍有一些事情让我烦恼:

  1. 它并不为人所知,也不是很受欢迎.
  2. 与PHP,Perl,Java等相比,它有一个小得多的库.数据库访问是通过ODBC完成的,这实际上非常烦人.
  3. 对于所有它的优秀列表处理,我想念PHP的内置explode()implode().
  4. 它没有表常量.列表,是的,表,没有.
  5. 它是一种编译(实际翻译)的语言.


Pau*_*han 5

C++

  • 库中的不一致与char*和std :: string有关.所有C++库都应该使用std :: strings.

  • 字符不是相对于iostream的字节.我做了很多面向字节的工作.具有"字节"类型和"字符"类型将显着地使其更简单.这也将允许更容易扩展到Unicode.

  • 位操作在值上应该很容易.我应该能够访问和设置值的第n位而无需播放和/或跳舞.

  • 缺乏GUI的标准化界面.这就是微软真正能够很好地利用C#定位的地方.OS制造商提供的标准接口绑定对我的工作来说非常有用.


nam*_*min 5

F#

  1. 类型推断是有限的.

    1. 它只向前传播.

    2. F#不会尝试根据使用的方法和属性推断对象类型:当它没有线索时,您将获得"查找不确定对象类型"错误.

  2. 一个不能混合浮点数和整数:1 + 2.3是类型错误.

  3. 为了定义monad或计算表达式,必须创建一个构建器对象有点尴尬.在Haskell或Scala中,您可以直接在monadic对象上定义monad操作.

  4. 虽然首选#light语法,但缩进规则有时不是很直观或变得麻烦.

  • 不,F#不是来自Fortran,而是来自OCaml.与F#一样,OCaml不会自动从int转换为浮点数.与F#不同,+运算符在OCaml中不会过载:它仅适用于整数和+.用于漂浮物. (2认同)

Log*_*man 5

PHP

  1. 没有构造函数重载
  2. 函数命名不一致(str_replace,但是strtolower)
  3. define()不像C++那样直接替换全局变量.
  4. 当与XHTML结合使用时,if语句之类的语句必须以没有缩进的方式开始,即使XHTML是缩进的,如果你想保持XHTML缩进的一致性.

例如:

你必须输入:

<?php
if($x == NULL)
{
?>
                     <p><?= $x . ' is null' ?></p>
<?php
}
?>
Run Code Online (Sandbox Code Playgroud)
  1. 捕获错误很糟糕

(不知道为什么SO再次将#5改为#1但是无论如何)

  • 你的示例代码非常令人震惊......你打破PHP部分输出一些文本,但是你再次进入PHP输出一个字符串.我建议`<p> <?= $ x?>是空的</ p>`.另外,你可以做`<?php if(...):?> [HTML] <?php endif; ?>`哪个更具可读性. (5认同)

Kim*_*ece 5

C:

  • 函数指针(可执行文件)和数据指针之间缺乏区别(你真的不想执行它).
  • 极不可读.使代码看起来像它所做的那样比使它首先完成任务要难几个数量级.
  • 缺乏对lisp-think的明确支持.几乎没有做功能性的事情,但目前尚不清楚.
  • 库之间关于如何返回错误代码的严重不一致.
  • 过时的字符串处理.字符串不是字符串,它们是以空值终止的blob.这是各种畏缩的方式.

Lisp的:

  • ()涉及按下shift键.每次我做很多口齿不清,我交换它和[].


小智 5

德语

我的母语......虽然它听起来比克林贡语更美,但这是一个语法地狱......

  1. 结合:即使是常规动词也有不同形式的每个人和每个人(少数例外)......例如:我看,你看,他/她/它看到,我们看到,你看,他们看到,翻译成:Ich sehe, du siehst,er/sie/es sieht,wir sehen,ihr seht,sie sehen.
  2. 礼貌的地址形式:等于第三人称复数,习惯于在中年时代等于第二人称复数...我真的讨厌区分"Du"和"Sie"的概念,因为我的哲学是每个人都应该被认为是平等的在它的尊重量值得(我的意思是,什么是发誓的话,嗯?)
  3. 标点符号:告诉我一种定期使用更多逗号的语言!
  4. 缺少合适的词语:例如.没有真正的德语相当于"方便"或这个词的任何衍生物...几乎在每种情况下你都无法将它翻译成另一个德语单词并保留其含义......相反,你必须构成一个完整的子集形容它有点足够......
  5. AnglicismsDenglish:当然,英语有"Kindergarten"或"Poltergeist",除了德语之外什么都没有人们需要的Anglicisms ......更糟糕的是:我们重新定义了我们采用的一些词,例如.在德语中"Handy"意味着一部手机,与英语中的形容词无关......语法也有涌入,导致"Denglish"表达(见维基百科的链接文章)还有更多,但我我不想夸大这一点,这些是我个人对德语的讨厌的Top5 ......


Bas*_*ard 5

蟒蛇:

  • 您通常在文件末尾有程序的入口点.(因为如果它调用模块中定义的任何函数,它必须在源中的那些函数之后发生.)我讨厌当你不得不花时间寻找程序的入口点时,所以我总是有一个简单的main.py文件:

    def main():
        ...
    
    if __name__ == '__main__':
        main()
    
    Run Code Online (Sandbox Code Playgroud)
  • 引发异常时,只能由主线程捕获.或类似的东西.

  • 析构函数是没用的,因为用Python编写它们可能会破坏垃圾收集IIRC.

  • 我从未弄清楚相对导入在Python 2中是如何工作的.

  • 我想在标准库中看到更多的集合.例如:链表,线程安全集合,......


xen*_*ide 5

Perl 5从最烦人到最少.

1.)向后兼容警察.是的backcompat是一种力量,但Perl 5太过分了.现在我们甚至没有用我们的语言获得新功能而无需明确启用它们.我更喜欢反向,如果一个新功能导致问题让我禁用它或强制执行旧的行为.例如perl 5.10添加say我宁愿拥有no feature 'say'如果我有自己的say实现而不是必须放use feature 'say';use 5.010; 如果5.8工作但5.10没有.我宁愿不得不use 5.008;限制我的代码只使用可用的功能,如果没有use version;定义则包括5.8,那么它应该默认为你正在运行的任何版本,并建议不要限制它,除非你必须这样做.

2.)过多的锅炉板.

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use autodie;
use English '-no_match_vars';
use 5.010;
package Package::Name;

BEGIN {
    Package::Name::VERSION = 0.1;
}

sub somesub {
    my $self = shift;
    my ( $param1, $param2 ) = @_;
}
1;
Run Code Online (Sandbox Code Playgroud)

现在你可以开始编码.由于#1,这不会改变.当然有这些东西的快捷方式,use common::sense; 或者use modern::perl;会缩短上述内容,你可能需要一些略有不同的模块或pragma.但由于#1,我们永远无法将其减少到.

#!/usr/bin/perl
package Package::Name 0.01;

sub somesub ( $param1, $param2 ) {
}
Run Code Online (Sandbox Code Playgroud)

一些模块正在帮助解决这个问题,5.0.12中有新的软件包版本,虽然我认为它use 5.012;首先需要,Method::Signatures但允许使用该语法,但它永远不会完全解决(用语言).

3.)变量选择不佳

啜食一个文件

#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
Run Code Online (Sandbox Code Playgroud)

wtf是$!$/?重写要清晰易读.

#!/usr/bin/perl
use strict;
use warnings;
use English '-no_match_vars';
open my $fh, "< foo" or die $ERRNO;
local $INPUT_RECORD_SEPARATOR; # enable localized slurp mode
my $content = <$fh>;
close $fh;
Run Code Online (Sandbox Code Playgroud)

并且不要忘记,'-no_match_vars'如果你不想受到性能影响,必须在那里.

怎么'没有直接创建匿名标量的方法?

#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };
Run Code Online (Sandbox Code Playgroud)

难道他们不能想出什么?

#!/usr/bin/perl
my $scalar_ref = <>;
Run Code Online (Sandbox Code Playgroud)

哦,如何perl线程不友好,因为所有变量(包括特殊变量)默认是全局的.至少现在你可以使用my $_;词法范围,并local在其他范围内使用.

4.)非常难看的语法

MooseX :: Declare是一个更好的语法.我也希望 - >替换为.(个人喜好并不重要)

5.)太多的TIMTOWTDI太多的最佳实践似乎你必须阅读3-5本书才能弄清楚你应该做的事情.

6.)之前(不再适用).不合理的发布.5.10.0具有功能5.10.1具有没有设置时间的功能直到下一个版本.现在它是每季度更新的功能发布.

7.)象牙塔透视.社区问题,似乎是大量想要进入高门槛的开发者,并认为可以不尊重地对待n00bs(或者真的是不同意他们的人).

8.)疯狂版本数字/字符串 Perl有浮点版本号,它们很难看.哦,开发人员不知道并非所有下游都以相同的方式处理版本比较.不是真正的语言问题

0.012 # simple
5.012001 # semantic 
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease
Run Code Online (Sandbox Code Playgroud)

perl中的所有有效版本...我们不能像...那样使用...

0.12 # simple
5.12.1 # semantic
20100713 # time based (just use the date and be careful not to need to release more than 1 a day)
0.35-beta2 # prerelease
Run Code Online (Sandbox Code Playgroud)

加成

9.)升级后没有明显的方法可以重新安装所有XS模块


dan*_*n04 5

Python(3.1)

  • T if C else F条件语句的奇怪的无序语法.
  • bytes文字看起来太像str文字了.我们应该有类似的东西x'414243'而不是b'ABC'.
  • str在某些平台上是UTF-16,在其他平台上是UTF-32.(虽然至少它比2.x字符串有所改进.)
  • 具有相同的运算符以进行添加和连接.这类伤害很痛苦numpy.array.
  • 慢慢地跑.