403

最近在 Stack Overflow 上出现了一大群 Perl 仇恨,所以我想我应该把我的“关于你最喜欢的语言的五件事”的问题带到 Stack Overflow。用你最喜欢的语言,告诉我你讨厌它的五件事。这些可能只是让您烦恼、承认设计缺陷、公认的性能问题或任何其他类别的事情。你只需要讨厌它,它必须是你最喜欢的语言。

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

每当有人试图将他们最喜欢的语言强加给我时,我都会问这个问题,有时作为面试问题。如果有人找不到他最喜欢的工具的五个讨厌的地方,那么他对它的了解还不够充分,无法提倡它或使用它赚大钱。他还没有在足够多的不同情况下使用它来充分探索它。他提倡将其作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,那我就错了。

我不在乎你使用哪种语言。不想使用特定语言?然后不要。您通过尽职调查做出明智的选择,但仍然不使用它?美好的。有时正确的答案是“你有一个强大的编程团队,拥有良好的实践和丰富的 Bar 经验。换成 Foo 会很愚蠢。”


这对于代码审查来说也是一个很好的问题。真正了解代码库的人会对它提出各种建议,而不太了解它的人则会有非具体的抱怨。我会问诸如“如果你可以重新开始这个项目,你会做些什么不同的事情?” 在这片梦幻之地,用户和程序员可以抱怨任何他们不喜欢的事情。“我想要一个更好的界面”、“我想将模型与视图分离”、“我会使用这个模块而不是另一个模块”、“我会重命名这组方法”,或者他们真正不需要的任何东西不喜欢现在的情况。这就是我了解特定开发人员对代码库了解多少的方式。这也是一个关于程序员有多少的线索'

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

4

182 回答 182

215

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

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

...还有一些讨厌它的额外理由,无需额外费用

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

我讨厌 Java 的五件事:

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

我知道,我应该看看 Scala。

于 2008-11-24T16:04:07.173 回答
159

JavaScript

  1. 所有最酷的东西都是极其复杂的,但是,所有的酷也都被包裹在如此少量的代码中,以至于你为努力遵循它而感到愚蠢

  2. '+' 是弱类型语言中连接运算符的荒谬选择。他们是吓跑菜鸟吗?

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

  4. 它通常是不受信任的 - 与诸如阻止后退按钮、永不消失的弹出窗口等垃圾相关。

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

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

于 2008-11-12T00:26:19.933 回答
148

PHP:

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

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

2) 一个 lambdas 的实现如此蹩脚,它大致相当于使用eval(),而且非常错误,我从未使用过它(参见http://www.php.net/create_function)。

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

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

5) 如果不编写两次或构建自己的函数或使用“@”运算符,就无法安全地从 $_POST 中提取内容:

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

6)奖励答案:'@'。如果您不介意正确编写代码,只需添加“@”,这对于以后必须调试代码的任何人来说都太糟糕了。

于 2008-11-11T23:59:12.047 回答
135

C++

  • 随机破坏内存并创建几乎不可能找到的错误太容易了(尽管Valgrind在修复这个问题上走了很长一段路)。
  • 模板错误消息。
  • 使用模板时,很容易最终不得不将所有内容都包含在一个文件中,然后编译时间就会变得愚蠢。
  • 标准库在现代是个笑话(默认情况下仍然没有线程或网络?)
  • 很多讨厌的 C 代码(特别是 short/int/unsigned/etc 之间的所有转换)
于 2008-11-11T22:41:21.377 回答
129

C#/.NET:

  • 默认情况下,类应该是密封的
  • 不应该有任何lock声明——相反,您应该有特定的锁定对象,并且应该有诸如Acquire返回一次性锁定令牌之类的方法。推论:不应该对每个对象都有一个监视器。
  • GetHashCode()并且Equals()不应该在System.Object- 不是所有东西都适合散列。相反,使用which 做同样的事情,IdentityComparer并保留IComparer<T>、和接口以进行自定义比较。IComparable<T>IEqualityComparer<T>IEquatable<T>
  • 对不变性的支持不佳
  • 发现扩展方法的糟糕方式 - 这应该是一个更明智的决定,而不仅仅是我使用命名空间的事实。

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

于 2008-11-11T22:21:00.967 回答
113

C

  • 字符串操作。

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

于 2008-11-11T22:27:42.187 回答
94

关于“我讨厌某些语言的事情”列表中我讨厌的五件事怎么样?:D

5- 涂上橙红色并不代表它是苹果。

当设计一种语言时,设计者通常会考虑它的用途。将它用于完全不同的事情可能会奏效,但是当它不起作用时抱怨只是愚蠢的。以 Python 为例。我敢肯定,总有一天有人会或有人会制作一个实用程序来从 Python 代码创建 exe。为什么在上帝的地球上你会要这样做?它会很整洁——不要误会我的意思——但它没有用。所以别再抱怨了!

一个设计良好的项目可能包含来自多种语言的代码。这并不是说你不能只用一种语言完成一个项目。有些项目可能完全在您使用的任何语言的能力范围内。

4-你站在木腿上吗?

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

3-真的是谁的错?

错误。你知道。我喜欢虫子。为什么我喜欢虫子。因为这意味着我可以保住工作。没有虫子,就会有许多关闭的比萨店。但是,用户讨厌错误。但这里有一点冷水。每个错误都是程序员的错。不是语言的。具有如此严格语法的语言将显着减少可能生成的错误数量,这将是一种完全无用的语言。它的能力恐怕只能用一只手来计算。你想要灵活性还是力量?你有错误。为什么?因为你并不完美,你会犯错误。在 C 中举一个真正可识别的例子:

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

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

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

用我们不理解的语言指出一个特性是很容易的,因为我们不经常使用它并称它为愚蠢。抱怨它在那里等等。Goto 总是让我开心。人们总是抱怨 goto 是一种语言。但我敢打赌,你的最后一个程序包含了一种 goto。如果您曾经使用过 break 或 continue,那么您就使用过 goto。就是这样。当然,这是一个“安全”的 goto,但它就是这样。Goto 有它们的用途。是使用“隐式” goto(如 continue 或 break)还是使用显式 goto(对任何语言使用实际关键字“goto”)。并不是说语言开发人员是完美无缺的,而是通常......如果功能从一开始就存在(对于该语言)。这方面可能是该语言的决定性品质。意思是..它' s 正在使用,并且由于向后兼容性而可能不会闲逛。今天正在使用它。就像 5 分钟前一样。并且使用得当。好吧..可以说有人也在不正确地使用它,但这与我列表中的#3有关。

1. - 一切都是对象。

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

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

于 2009-06-17T05:20:46.963 回答
88

我讨厌Java(目前是我最喜欢的语言)的五件事,排名不分先后。

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

Ruby有很多与速度有关的缺陷,但我并不讨厌这些。它也存在社区布道过度的缺陷,但这并没有真正困扰我。这些是我讨厌的:

  • 闭包(块)有 4 种不同的创建语法,它们都不是最优的。优雅的语法是不完整的,并且与散列有歧义,完整的语法是丑陋的。
  • 社区倾向于反对真实的文档,倾向于“阅读代码”。我觉得这既幼稚又懒惰。
  • 元编程滥用,特别是在库中,使错误成为追踪的噩梦。
  • 与此相关的是,普遍的元编程使得一个全面的 IDE 变得困难,如果不是不可能的话。
  • 将块传递给函数的方式很愚蠢。没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield)。我认为块应该被赋予一个不那么模棱两可的语法(或者哈希可以使用不同的分隔符;也许是 <> 而不是 {}),并且作为参数传递给方法应该就像所有其他参数一样。

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

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

于 2008-11-11T23:29:13.840 回答
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;
    
    • 例如,这些都不相同:

      $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;
    
  • 缺乏真正的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'}
    }
    

    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) { ... }
    
于 2008-11-12T01:10:28.473 回答
57

我有时会按照我喜欢的方式来做PHP,而 Python 会做得太多。

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

  • 在函数方面缺乏标准:数组函数将针作为第一个参数,干草堆作为第二个参数(参见array_search)。字符串函数通常先是大海捞针,其次是针(参见 strpos)。其他函数只是使用不同的命名方案: bin2hexstrtolowercal_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 了……

于 2008-11-11T23:02:02.240 回答
50

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

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

C++

  1. 模板语法
  2. 钻石继承问题
  3. 现代语言所拥有的标准库过多/缺乏(尽管提升很接近)。
  4. IO 流
  5. 围绕 IOStreams 使用的语法

Python

  1. 空间是有意义的(有时)
  2. 带下划线的关键字
  3. 有限的线程支持(至少目前)
  4. “自我”而不是“这个”
  5. 空间是有意义的(有时)
于 2008-11-11T22:26:42.467 回答
37

Objective-C

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

2) 图书馆在 RegEx 支持等重要领域仍有一些漏洞。

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

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

5)虽然不是真正的语言功能,但 Xcode 与 Objective-C 的使用如此交织在一起,我不禁想到这方面......基本上是自动完成,非常不确定。它更像是一个系统,奖励你找到你想要的东西,然后将其作为选择呈现。但后来我想我从来不喜欢自动完成引擎。

于 2008-11-12T03:01:42.833 回答
36

C++

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

  • 各种字符串表示
    现在,这是一个平台问题——但我仍然希望,如果更早提供不那么顽固的标准字符串类,情况会更好。我经常使用以下字符串表示形式:

    • 通用 LPCTSTR,
    • 由 CoTaskMemAlloc 分配的 LPC(W)STR,
    • BSTR, _bstr _t
    • (w)字符串,
    • 字符串,
    • 标准::向量
    • 一个滚动我自己的类(sigh),它将范围检查和基本操作添加到已知长度的 (w)char * 缓冲区
  • 建立模型。
    我厌倦了花时间在谁包含什么、前向声明、优化预编译头文件和包含以保持至少可以承受的增量构建时间等问题上。这在八十年代很棒,但现在呢?打包一段代码要重用它有很多障碍,以至于即使是妈妈的狗也会厌倦听我说话。

  • 难以解析
    这使得外部工具特别难以编写和正确。而今天,我们 C++ 人主要缺乏工具链。我喜欢我的 C# 反射和委托,但我可以没有它们。没有伟大的重构,我不能。

  • 线程太难了
    语言甚至不承认它(现在),编译器的自由——虽然很好——是痛苦的。

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


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

于 2008-11-15T10:35:47.840 回答
35

JavaScript

  • Object原型可以修改。程序中的每个对象都会获得新属性,并且可能会出现问题。

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

  • 在函数引用时没有对象关闭。事实上,根本没有对象闭包——相反,this每当使用对象表示法或运算符调用函数时,都会设置对象闭包new。导致很多混乱,特别是在创建事件回调时,因为this没有设置为程序员所期望的。

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

  • ==!=运算符执行类型强制。不同类型之间的比较涉及一个凡人无法完整记住的规则列表。===和运算符的存在减轻了这种情况!==

  • 两者都null存在undefined,具有微妙不同但多余的含义。为什么?

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

  • parseInt(s)需要一个 C 样式的数字,因此将带有前导零的值视为八进制等。您至少可以,parseInt(s, 10)但默认行为令人困惑。

  • 没有块范围。

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

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

  • with { }.

  • 使用 JavaDoc 之类的工具真的很难记录。

于 2008-12-07T02:16:16.903 回答
34

Python:

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

C#

  • 我希望我可以switch()在任何类型上,那case可以是任何表达方式。

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

  • 用于命名空间{}、类方法以及属性/索引器块多语句块数组初始值设定项。当它们相距很远或不匹配时,很难弄清楚你在哪里。

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

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

我真的到了这里。我认为 C# 很棒,而且很难找到很多损坏的地方。

于 2008-12-22T05:36:30.717 回答
26

PHP

  1. 如果您不控制服务器,则没有调试功能,即使那样它们也很烂
  2. 大量的糟糕的 PHP 代码让所有 PHP 程序员名声扫地
  3. 函数命名不一致
  4. 如果我想要一个静态类型变量,就无法拥有一个(我 90% 的时间都是动态类型的忠实粉丝)
  5. REGISTER_GLOBALS 是魔鬼
于 2008-11-13T14:37:57.510 回答
25

C(好吧,这不是我最喜欢的,但还没有完成。)

  • 套接字库语法。
  • 没有函数重载。
  • C 风格的字符串。
  • 缓冲区溢出。
  • 神秘的语法。不知道有多少次,我查过atoi之类的东西,拍了拍我的额头,喊道:“当然!”

编辑:如果我使用更多的库代码,我可能会想出更多(就像我对套接字所做的那样,但那些特别糟糕),但我已经觉得我在欺骗 C。这么多语言的存在只是为了接受C 的好的部分并替换掉坏的部分,这有点像打死马。

于 2008-11-11T22:38:47.593 回答
24

普通 Lisp:

  1. 关键字通常过于冗长。
  2. 图书馆的支持很可怜。
  3. 在想要更严格地处理内存的操作系统中效果不佳。
  4. 没有与操作系统交互的良好设施。
  5. “循环”设施没有很好的定义,而且看起来不像 Lispy。
于 2008-11-11T22:50:52.140 回答
24

脑筋急转弯

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

  • 缺少对象。来吧,人们!就像,你好...

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

  • 没有一流的功能。恭喜——你开始同情你的 Java 朋友了。

  • 用于存储的无限磁带,仅此而已。这太自命不凡了,我们还不如写 Lisp。

于 2010-05-26T06:33:28.197 回答
23

JavaScript

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

PHP:

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

尽管如此,PHP 是脚本)语言。;-)

于 2008-11-11T22:32:36.683 回答
18

VB6

  1. 仅限窗户。
  2. 不再支持。
  3. 数组可以从任意数字开始,而不是全部归一化为 0。
  4. 编译的应用程序依赖于许多 dll 才能正常运行。
  5. 当您运行未编译的代码时,许多复杂的控件(如浏览器控件或复杂的代码片段)往往会破坏 IDE,但在编译后却可以正常工作。
于 2008-11-12T03:54:41.697 回答
18

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

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

德尔福:

  • IDE有点不稳定。
  • 代码洞察力有时会令人困惑。
  • 调试有时是错误的。
  • 更新多个项目文件可能很麻烦。
  • 如果在一个或多个包不可用时启动,则会多次弹出错误消息。
于 2008-11-11T22:44:07.003 回答
16

JavaScript

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

  • 如果使用了变量但事先没有定义,则认为它是全局变量

  • 浏览器供应商随心所欲地制定标准,使我们开发人员使用如此优美的语言进行编码比应有的困难

  • 区分大小写 - 考虑到没有像样的 IDE 用于开发带有编译时检查的 js

  • 变通方法(例如使用hasOwnProperty方法)来执行一些原本简单的操作。

于 2008-12-07T15:19:00.240 回答
15

哈斯克尔:

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

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

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

于 2008-11-12T01:25:07.320 回答
13

短暂聊天

  • 我不想再用 java、delphi、c# 或 ruby​​ 进行开发(这是不切实际的,因为我公司的主要开发语言是 c#、delphi 和 java)。
  • 从左到右的评价。
  • 有类注释但没有方法注释(至少在 Squeak 中)
  • 没有真正的标准库,细节差异很大
  • 缺乏命名空间
于 2008-11-11T22:48:39.803 回答
13

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

爪哇

  • 运行时.exec()。 那么,如果我不手动清除 STDOUT 和 STDERR 缓冲区,我的代码会挂起吗?哇。去死吧,请。
  • 空指针异常。 负责任的编程意味着我必须将大多数对象视为未爆炸的炸弹,这在面向对象的语言中有点令人讨厌。当不可避免的事情发生时,我有点需要知道哪个物体在我的脸上爆炸了,但 Java 显然觉得告诉我会作弊。
  • 文件 I/O。 为什么我必须跳过这么多圈才能阅读一个当当的文本文件?并且在复制文件时,我必须将源文件汇集到我的代码中并手动处理输出字节缓冲区?你是认真的吗?
  • 基元与基元包装器。 请注意,Java 现在有许多特性允许您在某些地方将原语及其包装对象视为可互换的,但在其他地方则不能;别担心,编译器会让你知道哪个是哪个。这感觉像是解决一个根本性破坏性设计决策的黑客行为。它是。(编辑: 实际上,编译器的安全网比我想象的要糟糕得多,尤其是在进行相等检查时。如果 `a` 和 `b` 是整数,则只有在至少其中一个是`int`类型。如果它们都是`Integer`类型,那么只有当两个数字在-128和127之间时,该语句才会执行您的想法。`Integer a = 1000; Integer b = 1000 ; return a == b;` 将返回 `false`。真的。)
  • XML。 我有这个非常简单的小 XML 文件需要创建,我必须做什么?
于 2009-04-09T16:23:32.147 回答
12

卢阿

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

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

VB.NET

  • 行为AndAlso/OrElseAnd/Or似乎倒退了。也许他们应该被交换。
  • When只能用于异常捕获。做When有条件的能力对于其他一些事情会很好。
  • VS IDE 中没有 friggin 重构(实际上不是语言的错),就像 C# 一样
  • Not <obj> Is Nothing. 是的,这已被 纠正IsNot,但由于某种原因,我看到它Not Is被使用得太频繁了。(我更经常看到将英语作为第二语言的开发人员,从这个角度看是否更有意义?)
  • 它不需要()onToString()和 most 功能。(导致草率的编码习惯)
  • _断线时必须做的事情。
  • 它允许可选参数。(导致草率的编码习惯)
  • 声明一个数组是UpperBound由容量而不是容量完成的。“Dim arr(2) as String”实际上将包含 3 个元素。
  • 具有=比较赋值运算符。
于 2008-11-13T13:00:22.557 回答
11

Python

  • 1-3:打包/构建/文档系统没有一个明显的选择(例如 Perl 的cpanPOD或 Ruby 的gem,,,rakerdoc

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

  • 5:Jython、IronPython、CPython 不兼容。

于 2008-11-26T19:26:10.480 回答
10

客观凸轮

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

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

  3. 急需一座可可桥。 严重地。如果我写更多的代码与基于 DNA 的生命形式的实际接口,那么我可能会分解并自己编写该死的东西。为什么其他人还没有这样做?

  4. 函子是可恶的。 说真的,模块应该是一流的价值。应该只有一种功能。在你为此激怒我之前,请阅读蒙塔古和雷米。

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

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

于 2009-05-27T04:25:07.077 回答
9

VBA(包括 MS Office IDE):

1) 糟糕的文档
2) 糟糕的错误消息
3) 不充分的数组操作例程
4) 必须为 DIM 语句重复类型
5) 不会彩色打印(必须购买第 3 方插件)

于 2008-11-11T23:03:05.267 回答
9

我自己的前 5 名“我在 C++ 中真正讨厌什么”:

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

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

[3] 字符串。天哪,我受够了“const char*”,我必须处理 NULL 情况,我必须浪费 O(N) 来获得它的长度,我必须为 concat 操作分配一个缓冲区。

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

[1] 运算符重载。我看到代码“A + B * C”,在看到 A、B 和 C 的实际类型之前,我无法说出这段代码的含义。

于 2009-06-16T13:27:33.883 回答
8

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

  • 变量块!
  • 该语言中的接口在设计时考虑了 COM 的使用——因此比 C# 或 Java 中的接口更复杂。IE。除非您明确禁用它,否则涉及引用计数。
  • try except finally end;
  • 对象创建过于明确:

    var obj: TMyObject;
    ...
    obj := TMyObject.Create;
    try
      ...
    finally
      obj.Free;
    end;
    

取而代之的是

auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block. 
  • 好的,语言太好了,我真的想不出更多了,所以我在这里推自己:字符串,整数..或枚举等内置类型最好有方法。IE。i.ToString而不是IntToStr(i).
于 2008-11-14T00:59:57.003 回答
7

卢阿:

  • 我明白其中的原因,但很认真。默认情况下,变量应该是本地的,带有global关键字,反之亦然。
  • 我一般不是 do/end 样式语义的忠实粉丝。我更喜欢 C 风格的大括号。
  • 动态类型。我知道,你们中的一些人会说“嗯?” 但是我完全被给定变量中确切的数据类型所宠坏了。恒定if (type(var) == "string") then stuff() end是一种痛苦。
  • 变量在使用之前不需要定义。我宁愿明确说明我正在尝试做的事情,也不愿冒一个错字导致我喜欢称之为“古怪的豆子”的风险。

PHP:

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

C/C++:

  • 标题 = 颈部疼痛。
  • 不支持闭包。(我对拥有它们的 C++0x 感到兴奋。)
  • 静态类型。“等等,”你说。“你刚才说你不喜欢动态打字!” 是的,我确实说过。但是静态类型也可能会让人头疼。(如果有选择,我仍然会选择静态类型。)最理想的情况是,我想要一种默认为静态类型的语言,但也支持动态类型。(我还想要一匹小马,500 亿美元,还有全世界,拜托。)
于 2009-01-12T00:47:42.737 回答
7

红宝石:

  1. 真他妈慢
  2. 自负社会
  3. 这不是小事
  4. 在 nil 上调用方法而不是仅仅返回 nil à la Objective C 时出错
  5. 非原生线程
于 2009-01-12T00:50:58.253 回答
7

C

  1. 没有参数多态性(即 C++ 模板)。它使编写可重用的数据结构和算法变得很痛苦(并且几乎没有任何静态检查)。例如,参见 qsort 和 bsearch 的比较器参数:比较器采用 void 指针:(
  2. 没有数据结构库。我真的很讨厌编写自己的哈希表。我也非常讨厌在网上搜索可重用数据结构库。特别是如果它被证明是不完整的。
  3. 字符串。低效的表示,如果你让它理智起来就很笨拙,很难安全地输入一个字符串。没有标准snprintf。用 来创建格式字符串太难了sprintf,然后用它以sprintf安全的方式再次创建字符串。
  4. 只有词法宏。如果不同的编译器在不同的地方期望函数注释,我必须HAS_NO_SIDE_EFFECTS在不同的地方放同样的。为什么不能直接抓取函数,切换编译器类型,然后通过宏调用将其插入到正确的位置?
  5. 没有通用功能的可移植库。对于套接字和线程,我使用 SDL ——一个非常有趣的游戏库。对于 .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)可以修改,什么不能修改。
于 2009-05-28T09:21:41.607 回答
6

我的主要语言是 Java。这是我讨厌它的地方:

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

Boolean可以为空。我觉得这违反直觉。

BigDecimal是一个库而不是语言功能。我的烦恼BigDecimalException困扰主要源于编写测试类,这些类必须跳过一堆圈才能完成实际工作。我应该澄清我对这些事情感到恼火,我不打算游说改变。

于 2008-11-11T22:24:56.357 回答
6

Python:

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

Groovy/Grails

  1. 鸭子打字
  2. 约定优于配置,假设您知道约定
  3. 你讨厌春天的一切
  4. 你讨厌 Hibernate 的一切
  5. [Groovy] 跨集合的通用操作不是(但最近的版本改进了这一点)
于 2008-11-11T22:40:53.140 回答
6

冷融合

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

JavaScript

  1. 函数对象语法:

    f = new Function( "foo", "bar", "return foo+bar;" );
    

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

  2. 函数参数可以重复。

    f = new Function( "foo", "foo", "return foo;" );
    

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

    f( "bye", "hi" ) // returns "hi"
    f( "hi" ) // returns undefined
    
  3. E4X 应该死了。我的用户总是抱怨它没有按照他们认为的方式工作。让我们面对现实吧,当你需要一页半的伪代码作为 setter 时,是时候重新考虑一下了。

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

  5. 空!=未定义

    不得不同时处理它们很烦人。有时它很有用,但大多数语言都能很好地适应一种。

于 2008-11-26T20:04:12.993 回答
6

Python

  • __init__
  • 有些库很尴尬,比如 smtplib
  • 'self' 必须在方法声明中!!!
  • (对于 pre-3.0)有点差的 unicode 支持
  • 缺少内联 try-catch
  • 没有直接引用“this”/当前模块(而是必须使用sys.modules[__name__]
于 2008-12-05T18:18:36.680 回答
6

动作脚本/AS3

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

否则它实际上是一门好语言——比 JavaScript 好得多,这与流行的看法相反,比 PHP 之类的语言好一百万倍。

于 2008-12-08T15:29:46.723 回答
6

C#

它是一门很棒的语言,尤其是 LINQ,但与 C++ 相比,泛型支持很差。它有很大的潜力,但目前的实现只对强类型集合和类似的琐碎事情有用。它掉下来的一些例子:

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

Python。

尽管已经提到了 python 处理范围的奇怪方式,但我觉得它最糟糕的后果是这是有效的:

import random

def myFunction():

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

    print myString

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

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

于 2009-01-08T15:29:46.023 回答
6

哈斯克尔:

  • 空间泄漏——默认情况下为懒惰付出的代价——也许代价太高了?
  • head甚至像and这样的纯函数也tail可以调用error和引导你到IO.
  • failMonad- 带回来MonadZero
  • Num班级 -(+)应该是AdditiveGroup或类似的。
  • Monad不是一个Applicative.
于 2009-07-07T07:45:57.203 回答
6

这里有更多关于 Perl 5 的内容,从创建了很多 Perl 模块的人的角度来看,特别是在Moose上工作过。

  1. 重载和绑定变量的可怕破坏。这两个特性都是对内置类型进行透明扩展的失败尝试。

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

  2. 编译过程和元模型缺乏适当的挂钩。如果 Perl 核心允许我们通过允许我们挂钩到元模型(包、类等)的健全 API 来影响编译过程,那么 Moose,尤其是角色使用,可以变得更加安全。

  3. 缺乏语言内置的命名参数。相反,每个人都重新发明了这一点。它很烦人。

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

  5. 向后兼容性警察。这更像是一个文化问题。上述许多问题永远无法真正解决,因为 Perl 5 对向后兼容性做出了非常坚定的承诺。因此,即使要添加一些东西来有效地取代当前的平局和超载,这些功能也永远不会被删除。当然,向后兼容也是 Perl 5 的最大优势之一。

  6. 奖励讨厌:Perl 的内置异常机制是个笑话。异常可能是字符串或对象这一事实导致了繁琐的异常捕获代码的永恒,而语言语法中缺少捕获是疣上的疣。

于 2010-05-25T20:19:00.570 回答
5

我有一本书探讨了SNOBOL中的各种项目。第一章探讨了 SNOBOL 编程和语言的历史和文化,并花一些时间来论证一个好的程序员喜欢一门语言不是因为它的缺陷,而是尽管有缺陷。

我最喜欢的语言是Icon / Unicon。但是还是有一些让我讨厌的地方:

  1. 它不是众所周知的,也不是那么受欢迎。
  2. 与 PHP、Perl、Java 等相比,它的库要小得多。数据库访问是通过 ODBC 完成的,这实际上很烦人。
  3. 尽管它在列表处理方面非常出色,但我想念 PHP 的内置explode()implode().
  4. 它没有表常量。列表,是的,表格,不。
  5. 它是一种编译(实际翻译)的语言。
于 2008-11-11T23:04:27.290 回答
5

C++

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

  • 相对于 iostream,字符不是字节。我做了很多面向字节的工作。拥有“字节”类型和“字符”类型会显着简化它。这也将允许更容易地扩展到 Unicode。

  • 对一个值进行位操作应该很容易。我应该能够在不玩 AND/OR 跳舞的情况下访问和设置值的第 n 位。

  • 缺乏用于 GUI 的标准化接口。这就是微软真正能够用 C# 很好地定位自己的地方。操作系统制造商提供的标准接口绑定对我的工作有很大帮助。

于 2008-11-26T19:46:32.373 回答
5

F#

  1. 类型推断是有限的。

    1. 它只向前传播。

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

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

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

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

于 2008-12-04T08:42:50.573 回答
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
}
?>
  1. 错误捕捉是可怕的

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

于 2009-01-04T01:46:34.000 回答
5

C:

  • 函数指针(可执行文件)和数据指针(你真的不想执行它)之间缺乏区别。
  • 极度不可读。让代码看起来像它所做的事情比让它首先完成任务要困难几个数量级。
  • 缺乏对 lisp-think 的明确支持。做功能性的事情是可能的,几乎没有,但还不清楚。
  • 库之间关于如何返回错误代码的严重不一致。
  • 过时的字符串处理。字符串不是字符串,它们是以 null 结尾的 blob。这一切都值得畏缩。

语言:

  • () 涉及按 shift 键。每次我做很多 lisp 时,我都会把它和 [] 交换。
于 2009-01-12T02:43:48.943 回答
5

德语

我的母语……虽然它听起来比克林贡语还要优美,但它是一个语法地狱……

  1. 共轭:即使是规则动词对于每个人和时间也有不同的形式(除了少数例外)......示例:我看到,你看到,他/她/它看到,我们看到,你看到,他们看到翻译成:Ich sehe, du siehst, er/sie/es sieht, wir sehen, ihr seht, sie sehen。
  2. 称谓的礼貌形式:等于第三人称复数,中年用来等于第二人称复数……我真的很讨厌区分“杜”和“锡”的概念,因为我的哲学是每个人都应该被认为是平等的尊重它应得的(我的意思是,什么是脏话,嗯?)
  3. 标点符号:告诉我一种经常使用更多逗号的语言!
  4. 缺少合适的词:例如。没有真正的德语相当于“方便”或这个词的任何派生词......在几乎所有情况下,您都无法将其翻译成另一个德语单词并保持其含义......相反,您必须组成一个完整的子集形容一下就够了……
  5. Anglicisms和Denglish:当然,英语有“Kindergarten”或“Poltergeist”,但德语中充斥着没有人需要的 Anglicisms……更糟糕的是:我们重新定义了我们采用的一些词,例如。在德语中,“Handy”的意思是手机,与英语中的形容词无关......语法上也有大量涌入,导致“Denglish”表达(参见维基百科上的链接文章)还有更多,但我不想夸大这一点,这些是我个人最讨厌德语的前五名……
于 2010-05-26T16:10:06.587 回答
5

Python:

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

    def main():
        ...
    
    if __name__ == '__main__':
        main()
    
  • 当引发异常时,它只能被主线程捕获。或类似的东西。

  • 析构函数毫无用处,因为当用 Python 编写时,它们可能会破坏垃圾回收 IIRC。

  • 我从来没有弄清楚相对导入在 Python 2 中是如何工作的。

  • 我希望在标准库中看到更多集合。例如:链表、线程安全集合、...

于 2010-06-01T12:34:23.927 回答
5

Perl 5按从最讨厌到最不讨厌的顺序。

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

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;

现在你可以开始编码了。由于#1,这不会改变。当然,这些东西有一些捷径,比如use common::sense;use modern::perl;会缩短上面的内容,你可能需要一些稍微不同的模块或编译指示。但是由于#1,我们永远无法将其减少到。

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

sub somesub ( $param1, $param2 ) {
}

一些模块正在帮助解决这个问题,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;

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;

并且不要忘记'-no_match_vars'如果您不想受到性能影响,则必须存在。

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

#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };

他们就不能想出点什么吗?

#!/usr/bin/perl
my $scalar_ref = <>;

哦,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

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

添加

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

于 2010-07-16T03:37:30.217 回答
5

蟒蛇 (3.1)

  • T if C else F条件语句的奇怪的乱序语法。
  • bytes文字看起来太像str文字了。我们应该有类似的东西x'414243'而不是b'ABC'.
  • str在某些平台上是 UTF-16,在其他平台上是 UTF-32。(尽管至少它是对 2.x 字符串的改进。)
  • 具有相同的加法和连接运算符。这对像numpy.array.
  • 运行缓慢。
于 2010-08-20T04:21:48.827 回答
4

Python

  • 调试时错误/异常不明确
  • 我不在工作中使用它
  • 在类中使用 __init__、__repr__、__str__ 等
  • 不能简单地编译可执行文件(.exe 或其他)
  • 我还没有尝试过的其他一些事情,但我肯定会打扰我

对于所有那些 C 语言程序员来说, self 对我来说比这更有意义,因为对象指的是它的 self

于 2008-11-14T20:45:55.283 回答
4

Python:

  • 数字运算慢。这不会是什么大问题,除了它......
  • 没有一种简单的方法可以将 C 代码包含在您的程序中,该程序在导入时会自动编译。
  • 在 py3k 接管之前,我们仍然必须忍受愚蠢的整数除法规则。
  • 在 py3k 接管之前,我们仍然必须忍受 imap 和 izip 这样的好东西在一个单独的模块中。
  • 在 py3k 能够接管之前,我们必须做很多工作。
于 2008-11-24T04:24:58.210 回答
4

Emacs Lisp

  • 没有足够的商业市场可以全职使用 elisp 编码
  • GNU Emacs 与 XEmacs 不兼容
  • Scheme 中的嵌套函数很简洁,我希望 elisp 有这个概念 [1]
  • 用于简单循环列表的 do 循环或其他一些工具不是标准的(当然,您现在可以使用 lambda 进行 mapc)[1]
  • (function (lambda (...))) [1] 应该有一个简写形式

[1] 当然,Lisp 的一大优点是在你自己的代码中用单行代码修复这些东西并不难。仍然让我恼火的是它不是内置的。

好问题; 我有点尴尬,我想不出更好的东西来讨厌,但老实说,大人,没有什么可讨厌的。

于 2009-01-08T07:27:34.967 回答
4

自己

  • 没有真正的代码浏览器,而是数百个小窗口飞来飞去。
  • 只是一个研究项目,不够稳定,没有活跃的社区。
  • 没有适用于 Linux 或 Windows 的快速版本。仅限 Mac OS X。
  • 不支持标准键盘命令。
  • 哦!而且关于编写原生插件的文档已经过时了!
于 2009-01-08T15:09:33.083 回答
4

C#(嗯,其中一部分是 VisualStudio IDE,我猜):

  • 没有协方差(还),即使 type派生自 type ,Class<D>也不能使用 like 代替。 Class<B>DB
  • 图形设计师不支持基于泛型的继承(或从抽象类继承),即使如果您通过添加额外的继承级别来解决设计器问题,那么继承本身就可以正常工作,这样设计人员总是可以看到代码的具体非泛型变体.
  • 没有构造函数继承
  • 泛型类型参数的 where 子句中没有构造函数
  • 在打开解决方案时,VisualStudio 似乎倾向于神秘地检出文件(如项目文件和/或单元测试定义),即使这些文件似乎实际上并没有被更改。

如果你明天再问我,可能是不同的列表。尽管协方差和设计器的问题在我解决之前会排在前 5 位(在 C# 4.0 中添加了方差,这似乎至少发生在其中一个...)。

于 2009-01-08T19:32:09.933 回答
4

甲骨文 SQL

  1. DUAL桌子 。

  2. 不能GROUP BY化名。

  3. 我永远记不起分析函数的语法,所以我忘记/懒得使用它们。

  4. 缺乏组合LIKEIN条件运算符。(不过,在 10g 之后,有一个REGEX_LIKE操作员可以做到这一点。)

  5. 尴尬的连接语法。

SQL 并不是我最喜欢的语言,但它是我日常使用的三大语言之一。可能还有更多项目,但这些是我最关心的。

我有一大堆问题SQL*PLUS。我编写了一个 Perl 替代品,它可以从命令行执行我想要的操作,并将其sql.el用于Emacs交互式SQL会话。这些工具帮助我解决我的SQL*PLUS问题。


说到这里:

Perl

  1. “只能perl解析 Perl。” (但这主要是语法高亮中的一个问题,我不想再对任何语言使用太多了。)

  2. 我有时对“简单(但偶尔令人惊讶)的规则......:它看起来像一个函数,因此它是函数,优先级无关紧要”感到惊讶。(来自perlfunc(1)

  3. 取消引用复杂的数据结构有时会让人感到困惑。我无法确定这是 Perl 中的真正缺陷,还是仅仅是拥有非常强大的数据结构设施的结果。无论哪种方式,我通常可以通过花几分钟思考我在做什么来做对。

  4. 没有像 DBI 模块那样导致系统调用引发错误的选项。(感谢 brian d foy,我现在知道autodieCPAN 上的模块可以做到这一点,但我希望它是内置的。)

  5. 默认情况下,脚本中未启用警告和限制。(该-e选项将关闭它们以供命令行使用。)

同样,肯定会有更多的事情,但这些是我最近注意到的问题。我会在 中添加对=overand=back和古怪L<...>语法的需求POD,但也许这应该是一个单独的列表。


现在是三连击:

KornShell

  1. 使用参数获取文件会替换父脚本参数的值。(执行. file arg1puts arg1in $1。)

  2. ksh不是一个理想的交互式 shell,默认为vi键绑定,而不是emacs. (我的解决方案是bash用于交互式外壳。)

  3. 通用实用程序(例如grep)在不同平台上的实现方式不同,从而妨碍了完美的可移植性。一些有用的命令需要安装在某些平台上,并且是其他平台上操作系统核心的一部分。

  4. 条件句的语法过于繁重。( if [ ... ]; then ... fi)

  5. 尽管它是图灵完备的,但您最终还是会想要升级到像 Perl 这样更具表现力的语言。

#4的一种解决方案是习惯于短路评估:

[ ... ] && ...
于 2009-02-19T08:22:36.890 回答
4

D

  • 我们有 in 运算符,但没有 !in 运算符?
  • 动态数组“长度”属性 - 你可以做

    array.length += 512;

  • 没有退出语句 - 如 python 的 sys.exit() 等。当然,你可以调用 C 的退出,但未刷新的输出不会被刷新
  • 关联数组文字 + 字符串文字很烂

    在关联数组文字中按原样找到的字符串文字被解释为静态的,因此这

    char[][char[]] hash = ["hello":"world","goodbye":"angels"];

    由于不同长度的字符串文字,尽管
    a. 我没有要求将其解释为静态数组
    b。无论如何,关联数组中不允许使用静态数组

  • 不允许循环依赖(想要移植那个 java lib?重新设计类层次结构很有趣)

有人检查我这些;不确定它们是否仍然相关。

于 2009-02-19T23:41:17.527 回答
4

爪哇

  1. 检查异常
  2. 类型擦除
  3. 缺少运算符重载(例如 BigInteger/BigDecimal)
  4. 缺少正则表达式/日期/持续时间/复杂文字
  5. 对不变性的支持很差
于 2009-04-09T23:57:54.257 回答
4

第一篇文章,所以请放轻松:) ... 很棒的社区网站,顺便说一句!

我尝试阅读所有其他 C# 回复,以免我的回复重叠

C# ... 没有特别的顺序:

1) switch 语句中的 case 没有失败。如果没有失败……为什么必须显式键入break?反正?它只是迟钝和混乱,因为它意味着没有休息的能力;!!!

2)不能在子作用域中声明同名变量,但可以声明与类变量同名的变量?要么都允许,要么都不允许。否则,它没有意义。

3) 函数中没有可选/默认参数

4) finally{} 中的异常应该为每一行隐式捕获。或者至少,只是 NullReferenceException 异常。例如,在访问数据库后,应该始终清理。所以,finally 块应该是这样的:

finally
{
  if(par1 != null)
    par1.Dispose();
  if(comm != null)
    comm.Dispose();
  if(conn != null)
    conn.Dispose();
}

如果它可以写成这样会更干净:

finally
{
    par1.Dispose();
    comm.Dispose();
    conn.Dispose();
}

但是,不......你必须检查你是否正在访问一个空对象,否则它可能会从 finally 块中抛出一个 NullReferenceException ......并且无论如何谁真的需要 finally 块中的异常?

5) 泛型:您可以指定 new() 来实例化您的泛型对象,但该对象需要有一个默认构造函数。为什么你不能指定一个签名,这样就不需要创建空的构造函数,如果它还没有它们,只需使用它有的构造函数。

于 2009-06-16T01:12:23.553 回答
4

哈斯克尔。

  1. Prelude 是默认导入的。
  2. 类型类的范围是通用的。
  3. 模块不是一流的。
  4. 类型不能依赖于值。
  5. Monad 没有与 Functor 统一。
于 2009-06-16T01:48:09.600 回答
4

我不敢相信,我最喜欢的 Python 小毛病还没有被提及:

  1. (在 3.x 之前)相对导入看起来像绝对导入。

    import foo
    

    这是从您所在的目录还是从 sys.path 导入 foo?

  2. 压缩鸡蛋,导致 sys.path 充满垃圾。压缩鸡蛋意味着你不能使用grepfind(除其他外调试问题1)!幸运的是,有点子。使用点子。
  3. 一些随附的电池是非pythonic。使用它们很有趣。
  4. 可能是发行版和打包程序的错,但仍然:在安装/编译时将 sourcefile-encoding 设置为 fscking ASCII。怎么回事?意味着我必须在我制作的每一个 .py 文件中添加“# coding: UTF-8”-stuff。

Py3k 修复了我的其他几个讨厌的问题,例如坚持字符串是 unicode 并且 8 位的东西被区别对待......

于 2009-10-30T14:10:09.957 回答
4

C++:

1:头文件。

链接你的代码比编译它更难。此外,要求模板具有该翻译单元中的完整源代码是荒谬的。它在那里的另一个文件中结束了.. 你两秒钟前编译的那个。去那里看看。愚蠢的编译器。

2:空标准库。

我的意思是,是的,C++0x 中有 std::thread,但没有 std::socket 或类似的东西。没有跨平台代码的主要原因是您必须为要在多个平台上执行的每个功能学习一个新库。如果没有作为标准提供的 OS 标头或 OS 函数,C++ 仅适用于推送位。

3:没有多重返回或返回值重载

双 x,int y,char z = func(); 与 void func(double x, int y, char z); 一样有效。请。没有返回值重载的唯一原因是因为我们“可能”编写模棱两可的代码。可能!请在我实际编写模棱两可的代码时给我悲伤,而不是以前。

4:无反射

可以使反射编译时。确实如此。没有任何库会使编写大量库变得困难,充其量,并且严重惹恼了我。我可以滥用预处理器但是..

5:鸭子在模板上打字

雅格。请,概念和正确的模板错误消息。几乎不可能使用像 Boost 这样的库,因为如果你弄错了,你就是在黑暗中拍摄。

于 2010-05-04T10:09:15.113 回答
4

卢阿:

  • 元表在“点击”之前非常令人困惑
  • 缺少像这样的赋值运算符a += 20很痛苦
  • 没有集成的面向对象解决方案意味着每个人和他的狗都使用自己的风格
  • 用于注释 ( --) 的语法排除了前后递增/递减运算符的可能性
  • 如果不破解 C 端,就不可能拥有任何类型的先发制人的多任务系统
于 2010-06-02T05:27:04.880 回答
3

C/C++

  1. 缺乏完整的 SWAP 功能
  2. 模板语法
  3. 你不能#define a #define(没有多遍)
  4. 编译器之间的结构打包不兼容
  5. char 是有符号还是无符号?

爪哇

  1. 边缘的不变性
  2. 没有像 C# 这样的 ref 关键字
  3. 到处尝试/捕获块
  4. 运行时性能不佳
  5. 所有与字符串相关的东西

Python

  1. 没有“主要”(我已经习惯了!)
  2. 带下划线的关键字
  3. 有限的线程支持
  4. “自我”而不是“这个”
  5. 缺乏类似 C/C++ 的语法
于 2008-11-12T06:41:12.843 回答
3

在这里再次为 C++ 投票......仍然是我最喜欢的几个密切追随者 - C 和 Python。这是我目前的仇恨列表,不分先后:

  • 从 C 继承的大量整数类型 - 有符号与无符号错误导致的问题太多
  • 复制构造函数和赋值运算符 - 为什么编译器不能自动从另一个创建一个?
  • 可变参数疯狂 - va_list 只是不适用于对象,我厌倦了 sprintf()、snprintf()、vsnprintf() 以及它们所有的亲戚所产生的问题。
  • 模板实现需要在编译时完全可见 - 我正在考虑缺乏“导出”实现或至少可用的实现
  • 缺乏对属性的支持——我想要一个像“ax”这样的只读成员,它可以公开读取并且只能在内部分配。我真的很讨厌“val=obj.getX()”和“obj.setX(val)”。我真的想要具有访问控制和一致语法的属性。
于 2008-11-29T05:44:01.233 回答
3

Perl 5:

  1. 现在所有真正好的东西似乎都需要 mod_perl,它在我想去的任何地方都具有低可用性。
  2. 一些真正令人难以置信的功能可以封装在模块中,但引擎盖下的东西通常是脆弱或可怕的:源过滤器、typeglobs,无论 Moose 正在做什么......
  3. DateTime 很棒,但仍然做出了一些非常糟糕的设计决定(减去两个 DateTime 对象时不返回秒表持续时间
  4. 核心和 CPAN 上的双生命模块仍然会导致冲突
  5. 模块作者仍然在他们的模块配置脚本中放置交互的东西,这样它们就不能被自动安装
于 2008-12-05T17:32:47.867 回答
3

.NET框架(库)

  • 很少使用的嵌套类型(例如MessageBoxButton应该是MessageBox.Button
  • 可变结构 ( Rect, Point)
  • System命名空间中的东西太多
  • 太多不同的平等概念(Object.Equals, Object.ReferenceEquals, operator ==, operator !=, IComparable.CompareTo() == 0
  • 数组具有可变成员但不可变长度。

还有一个:

  • XmlSerialization 不适用于不可变类型
于 2008-12-22T05:18:42.877 回答
3

C#

我的大部分抱怨都与假设 C++ 约定自动成为 C# 的最佳选择有关

  • Class 接口中不允许使用静态变量。它仍然是课堂的一部分。为什么它不能成为界面的一部分?!我不得不为此创造出如此愚蠢的 hack-y 变通办法。
  • 区分大小写。我知道此时它会破坏遗留应用程序,但为什么不区分大小写不是从一开始的规则

.NET的奖励之一(不是 C# 特定的)

  • 编译器不够聪明。在 .NET 3.x 中,编译器可以在编译时找出“var”,那么为什么不能进行其他常见优化呢?我们都知道字符串 vs. StringBuilder / 不可变 vs. 可变的东西。为什么在很多情况下 StringBuilder 明显优于多个 concat.s 时,编译器不为您转换它?我敢肯定,默认情况下编译器可以为我们做很多其他优化(带有否决选项)并为我们节省大量时间。
于 2008-12-22T05:47:11.117 回答
3

C#

  1. 当被枚举的集合中的对象发生变化时,foreach 命令会爆炸,
  2. UI 控件吐出假人,因为它们是在错误的线程上访问的。当然,所有 dispatcher.invoke 调用都可以移到 CLR 管道中,
  3. PInvoke,编组等,
  4. 我浪费了两年的时间学习远程,
  5. 它不像Ruby那样性感。
于 2009-03-13T05:54:45.867 回答
3

Objective-C / Cocoa / Cocoa Touch:

  • 缺乏命名空间
  • 使用 Cocoa 的任何有趣且强大的技术(例如分布式对象、通知、KVO)难以使用原始值
  • 与使用快捷点语法访问属性不一致,通常必须使用全长访问器
  • iPhone 上没有 GC,而且通常 GC 对其他高度动态的语言来说是相当晚的
  • 不一致的库支持,至少在 Cocoa Touch 中是这样;一些非常基本的东西直到最近才获得高级支持,例如音频处理。
  • 缺少方块!
于 2009-07-22T21:37:33.317 回答
3

Haskell(包含所有 GHC 扩展,而不仅仅是基本的 Haskell'98 规范)。

我讨厌它只有一件事:它不是主流。

于 2009-10-09T20:39:51.623 回答
3

我最喜欢的是 C#,但 C# 已经有很多答案了,所以我会选择我的下一个“最爱”:

T-SQL

  1. GO语句,以及您在所有方式的 DDL/DML 脚本中都需要它的事实,以及它还破坏事务语义的事实,这使得编写原子脚本比您真正需要的要困难得多为了升级生产数据库。
  2. 分号语义不一致。99% 的语法不需要它,MERGE语句必须以它结尾,WITH语句必须以它开头……下定决心!
  3. WITH CHECK CHECK/ WITH NOCHECK CHECK。呜呜。
  4. UDF 中的可选参数并不是真正的可选参数。调用者必须指定DEFAULT(甚至不要尝试使用NULL)。与真正可选的 SP相比。
  5. “......可能会导致循环或多个级联路径。” 恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨恨
于 2009-12-28T02:13:39.747 回答
3

TCL

这是我最喜欢做几乎所有事情的语言。多年来,它已经发展(缓慢,非常缓慢)以解决大多数让我烦恼的事情。而且语言非常灵活,很容易实现语法糖来覆盖仍然让我烦恼的事情。但是有些东西不能轻易改变,只是打破了它的禅意:

  • 数组(关联类型,Perl 称之为散列)没有正确的值语义。这使得它们难以传递到函数和从函数返回。此外,这意味着它们不能嵌套。出于这个原因,发明了 dicts(字典),但为时已晚,漂亮的数组访问语法:

    $array($foo)

    现在永远被愚蠢的数组用于向后兼容。我们现在被困在:

    dict get $dict $foo

    这更加冗长,对我来说可读性较差。

  • 没有真正的关闭。虽然它可以通过全局变量或命名空间来模拟,但这首先破坏了关闭的原因。虽然,我现在无法真正看到如何在纯值语义系统中实现闭包。

  • Teacup 很难使用,与所有其他存储库工具相比,它一点也不直观。这比 tcl-core 更多是 ActiveState 的错,并且在编码时并没有真正破坏 tcl 的 Zen,但它仍然很烦人。

于 2009-12-28T05:32:21.030 回答
3

C++

(除了 lambda 函数,我已经避免了 Cpp0X 中可用的东西)

  • 不强制使用“this”来访问成员变量,::GlobalFunction 来访问全局命名空间。
  • 中的所有内容(更具体地说,算法中缺少 lambda 函数,将在 0x 中修复)
  • 处理依赖项/头文件和源文件
  • 基本数据类型的愚蠢名称(应命名为 uint8、int16 等)
  • const_cast 功能
于 2009-12-28T13:34:45.970 回答
3

二郎

  • 没有像 Haskell 中那样的静态推断类型。这可能会导致运行时错误,并且需要仔细编写代码或用于 dialyzer(1)发现差异。动态类型也被认为是慢的;
  • 与 C、Java 等相比几乎不为人知;
  • lists(3)模块非常精简,有时我缺少有用的列表处理功能(例如Data.ListHaskell 中的功能);
  • 让我把,每个语句放在子句的末尾,并.放在后者的末尾。
于 2010-05-23T15:47:08.523 回答
3

Erlang 不在此列表中。在我最喜欢的语言中,但肯定有一些缺陷:

  • 句法。这包括 3 个终止标记 (,;.) 和美学,但更普遍的是代码的语义含义如何在文本中表达。一个例子是关于所有小写标记如何是原子,所以要引用一个函数,你不能只命名它,你必须fun my_function/1, 和?PRECEDE_CONSTANTS_WITH_QUESTION_MARKS. 来自 Scheme、Haskell 等,你只是希望你可以使用一个名字。

  • 图书馆支持是蹩脚的。这主要是外部库,甚至是旧的标准库。较新版本的 Erlang 具有合理的 POSIX 正则表达式,但旧版本具有用于基本字符串操作的非常糟糕的库。您也永远不知道何时获得价值,或{ok, Value}.

  • 相关:用于构建和分发的非统一工具。Ruby 有gemrake,RSpec。Perl 有 CPAN。我不知道 Erlang 中的等价物。

  • 少数 Erlang 专用工具非常奇怪。Mnesia 是一个很棒的数据库,但是从 SQL 开始你有很多琐碎的事情要学习。与文档相同@spec,它有一种描述签名的奇怪方式。

  • 当您只想要一点点突变时,功能范式通常会受到伤害。假设你想要一个哈希表,你不能像在 Scheme 或 SML 中那样破解它。 etsdets减轻一些痛苦,但不多。

六、奖金:

  • 模块的导入和导出语法是一堆失败,与 Java 的 80 多行import语句不同。

话虽如此,Erlang 是一种乐趣^_^

于 2010-05-25T20:16:38.113 回答
3

R

不是我最喜欢的语言,但我经常使用它并且有很多可抱怨的......

  • S3 对象只是美化了lists,S4 类仍然将所有数据暴露给用户
  • 赋值运算符可以是<- ->or =,参见Mike Dewar 的咆哮
  • my.var是 OO 语言的一个非常混乱的变量命名约定,请参阅Google 的样式指南
  • 我不应该后悔使用循环
  • 神秘的错误信息
于 2010-05-25T21:09:38.153 回答
3

Scala 是我最喜欢的语言。讨厌的五件事?简单的:

  1. 需要很长时间才能正确学习。我知道您可以将 Scala 编写为“更好的 java”。这也是我们过去常说的关于 C++ 和 C 的说法。我同意这是语言中深刻思想的必然结果。但是还是...

  2. 方法与函数:def f(x: Int) = x*x定义方法 f,而不是函数 f。尽管许多早期的 Scala 教程材料模糊了区别,但方法不是函数。该语言也试图模糊它,因为如果您在某些需要函数的地方提供方法,它就会被接受。我们必须同时拥有方法和功能吗?是的,这是基本的。但它最初让我感到困惑。

  3. 以“蛋糕”模式从 mixins 组合类或对象很容易出现 NPE。egtrait X { val host: String; val url = "http://" + host }是一个mixin,它在实例化时是否会NPE,这取决于它在类声明中的位置。编译器可以告诉您它是否会失败,但不会。(无论如何在 2.7 中。)在复杂的继承图中很难诊断问题。

  4. 2.8 中的数组依赖于隐式来与主要的 scala 集合类型相结合。但隐式并不适用于任何地方。可以在预期 a 的Array地方提供一个。Seq但是Option[Array]不能在Option[Seq]预期 an 的地方提供 an。我知道没有完全“正确”的方法来处理 java 数组。

  5. 类型擦除。说够了。

于 2010-05-26T03:11:37.077 回答
3

C#。

我最讨厌的:

  1. 没有多重继承——想象一下你可以提供任何 GUI 框架基类(控件、窗口等)与 MVC 相关的东西等等......框架/基类不可知!

  2. 没有“朋友”关键字......我知道,RAD - 受害者会因为各种臭代码和搞笑的不当行为而滥用它,但对于 OOD - 执行 demeter 法律的人来说会很好

  3. 没有语言集成 DBC 功能,有合同,但我宁愿拥有那种 Spec# - 带有通用“!”的风格 - 后缀运算符

  4. 没有AOP(我不明白......这种语言有属性,在编译器中添加拦截代码会很容易!)

  5. 没有弱事件委托 - 观察者模式只不过是现在的内存泄漏诱饵...... :-(

于 2010-05-26T08:16:45.817 回答
3

我讨厌所有语言的五件事(至少我知道):

  1. 照我说的/输入的,而不是我的意思
  2. 无疑会遇到那些认为自己是该语言专家,但只是把它弄得一团糟的人(例如,坚持删除注释/未使用的局部变量会加快程序执行时间的人)
  3. 除非该语言已经过时,否则它可能会继续发展(无论是实际的语言,还是有效使用它背后的概念),要求您积极使用它进行开发,以免落后。
  4. 无法修改词法分析器/编译器(添加自己的上下文相关语法)
  5. 没有完美的语言(每种语言都缺少某种有用的功能,这些功能通常要么无法模拟,要么不可避免地具有丑陋的界面,要么需要太多时间来实现并正确处理)
于 2010-05-26T16:39:26.973 回答
2

我使用 Java,我最大的不满是字符串操作的低效率。当您使用 + 运算符时。说真的,编译器不能弄清楚我添加了多少个字符串,然后在后台为我生成 StringBuffer 的东西吗?

通常使用 + 的代码比一系列 StringBuffers 操作更具可读性。

另外,我讨厌原生数组和集合框架之间的冗余。.toArray() 的语法非常难看。

于 2008-11-11T22:35:19.097 回答
2

客观凸轮

  1. 缺乏命名空间设施。
  2. 冗长的类和对象规范化。
  3. 复杂的构建系统。
  4. 不方便做中缀。
于 2008-11-14T00:00:49.870 回答
2

Python:

  1. 全局解释器锁定 - 处理此问题会使并行处理复杂化。
  2. Lambdas 函数有点笨拙。
  3. 没有内置的有序字典类型。
  4. 根据 Python 的编译方式,它可以使用 UCS-2 和 UCS-4 进行内部 Unicode 编码,对于超过默认宽度的多字节字符,许多字符串运算符和迭代器可能会产生意外结果。字符串切片和迭代取决于位宽,而不是检查和计数字符。(大多数其他编程语言也做类似的事情,并且对这些字符有类似的奇怪行为。)
  5. 围绕 Python 的 GUI 框架存在不一致之处。
于 2008-11-14T06:27:52.567 回答
2

方案:

  • 缺乏用户/小社区
于 2008-11-15T10:48:55.880 回答
2

卢阿

我喜欢在 Lua 中编程,但让我感到很痛心的是:

  1. 没有办法用这种语言写下 API——不像 C .h 文件或 Java 接口
  2. 该语言具有一流的功能,但有人忘记告诉设计库的人。
  3. 编写函数的语法太重了。
  4. 语法分为语句和表达式。
  5. 表达式形式是贫乏的:没有'let'形式,没有真正的条件表达式,......

尽管如此,我会坚持认为 Lua 非常棒:-)

于 2008-12-04T08:17:58.033 回答
2

方案

  • 缺乏静态类型
  • 没有静态函数重载(由于上述原因)导致字段访问器的名称过长
  • 没有统一的对象系统
  • 有点慢
  • 相对较小的社区
于 2008-12-10T01:53:22.300 回答
2

C++:

  • 缺乏象征意义。
  • 过度痴迷于 C 兼容性。
  • 可笑的复杂的预处理器。
  • 模板错误几乎是不可理解的。
  • 没有垃圾收集。
于 2009-01-03T03:08:09.563 回答
2

Javascript;

  1. 如果您不确切知道自己在做什么,“this”的动态绑定会非常混乱和危险。
  2. 函数声明需要关键字“function”。我反对的不是打字,而是当我想做一些稍微聪明的事情时阅读它。Hrm 现在我想这也许是一个加号。阻止我做聪明的事情。
  3. 由于数字 2,如果它是一个相当短的惯用语,通常只需复制/粘贴代码段而不是将其声明为函数的代码(就字符而言)。不幸的是,这助长了不好的做法,尤其是在我自己的代码中。
  4. Javascript 通过具有一流的函数和闭包来成为一种函数式语言,但是在运行时或编译时都无法验证函数中的引用透明性。没有这个,一些架构会变得有风险或笨重。
  5. 它的名声非常糟糕,因此我无法在不被嘲笑的情况下向任何人说“我用 javascript 编程”。
于 2009-01-03T13:33:55.837 回答
2

R(R-统计项目)

  1. 糟糕的,糟糕的字符串支持
  2. 对于一些简单的描述性任务(例如交叉制表)来说非常困难
  3. 大型数据集操作在内存中完成。
于 2009-01-06T19:09:21.463 回答
2

Perl

我喜欢这门语言,我不想添加已经用过的东西,但还没有人提到这个,所以我把它扔到锅里。当我使用这个功能时,我发现它是我一生中最可怕的经历(而且我曾使用过汇编语言):

  • write()函数format()

它们拥有可以想象到的最糟糕、最丑陋、最可怕的语法,但它们无法为您提供您已经通过一些(无限漂亮)printf()工作所能实现的功能更多的功能。任何人都不应该尝试使用这两个函数来做任何输出,仅仅因为它们有多糟糕。

我相信有人会不同意,但是当我研究它们时,希望它们能解决我的问题,我发现它们是一个“痛苦的世界”(引用 Big Lebowski 的话),并希望 Perl6 要么废除它们,或者更好的是,完全重写它们以使其更实用和有用。

于 2009-02-19T07:24:03.177 回答
2

C

  1. 位字段——语言没有很好地指定它们,它们的工作方式取决于编译器和体系结构。
  2. 通常很难找到在大量代码中定义特定符号的位置,尤其是。如果该符号是由宏产生的。这使我想起...
  3. 预处理器是一个相当丑陋的黑客,可以接受各种滥用。
  4. 缺少标准大小的整数(最近被 uint*_t 补救,但是有很多旧代码漂浮在那里,带有自定义 typedef 或 DWORD、WORD、BYTE 等的#defines)
  5. 缺少类似于 Perl 的 cpan.org 的东西(很想弄错那个。)

编辑:在考虑 C 的 CPAN 时,我想......我该怎么称呼这样的东西,并想到“ccan”,并在谷歌上搜索它,我遇到了这个: http ://ccan.ozlabs.org/

不过,它似乎还处于起步阶段。

于 2009-02-20T03:55:34.293 回答
2

因为我不能真正全职使用它,所以我会四处走动,但无论如何我都会尝试!

Perl 6

  1. func(“frew”)!= func(“frew”)
    • 这让我很恼火,但这是有充分理由的。在 Perl 5 中 print (5 + 6) * 10仍然时不时地让我
  2. 在很多地方它可能比 Perl 5 更容易解析,但有时它仍然会杀死我的编辑器
  3. 它仍然有很多 Perl 5 的线路噪音,这让很多人感到害怕。这意味着更难让他们兴奋等等。
  4. 还没有图书馆。
    • 如果 Perl 6 确实最终支持 Perl 5,这将不是问题,但这可能是不值得承担的负担。
  5. 没有 REPL,或者红宝石学家所说的 irb。
    • 具有制表符补全、颜色编码等功能的可靠交互式 Perl 6 将使使用和学习它变得更好。
  6. 目前该文档基本上是英文规范。不完全是一个容易阅读。
  7. 我知道这是一个愚蠢的陈词滥调,但它还没有出来!
    • (我可以抱怨,因为我在帮忙:-P)

前三个是语言;其余的并不是真正的语言本身,而是它还没有出现的事实。

于 2009-02-23T04:43:35.590 回答
2

C

  • 它非常灵活和强大,很容易编写非常糟糕或非常危险的代码(或者,如果您愿意,“能力越大,责任越大”)。
  • '=' 表示赋值,'==' 表示相等;容易在“if”语句中混淆。
  • 该语言的许多基本部分的实现依赖于编译器;例如基本类型的大小、位域中的位顺序、联合中的填充和字节顺序。
  • 位域不可参数化(即您可以使用整数数组,但不能拥有位数组)。
  • 字符串处理可以改进。
于 2009-03-13T18:04:16.487 回答
2

Python

  • s中没有陈述lambda。GRRRR
  • foo( a for b in c if d )感觉不对,每次我逃脱它都会让我感到惊讶。不应该foo( (a for b in c if d) )吗?
  • 我可以理解听写吗?
  • map 和 filter 运算符在列表推导中有特殊的语法,reduce 怎么样?或排序?
  • 只需在其中添加一条yield语句,一个函数就神奇地变成了一个生成器,并且它的接口完全改变了。此外,该生成器在第一个next(). 至少,不是不使用返回生成器的函数。

JavaScript

  • 没有用于制作模块化代码库的简短语法。您必须调用一个返回公共方法字典的函数。每次更改模块的界面时,您都必须在(至少)两个位置进行编辑。
  • 创建闭包涉及从一个函数返回它,该函数从 ('sup dog) yo' 函数返回一个函数。杂乱无章!
  • for each ( foo )语法和行为感觉像是事后才想到的。
  • 知道你的代码何时真正运行(以及以什么顺序)更像是一门黑暗的艺术。确定正确的唯一方法是将所有内容(是的,也是如此)放在一个大文件中。即便如此,您仍然需要等待 document.onload
  • 我错过了什么吗?没有手动构建json序列化值的简单方法吗?(是的,jQuery 可以做到这一点)。
于 2009-04-10T12:45:34.800 回答
2

VBA(因为你认为你的语言不好)

  1. 行内的空格是严格执行的。
  2. 语句刚刚结束,需要一个“_”来换行到下一行,但不是每一行都可以换行。
  3. 没有 ++,--,+=,-= 语句。严重地?
  4. 数组可以从任何索引开始,而不仅仅是 0。
  5. 某些类型(即:定点“十进制”值)必须是 Variant 的子类型,并且不能作为它们自己的类型使用。
  6. != 和 <>。
  7. “=”既用作比较器又用作分配,而不是分成“=”和“==”。
  8. “选项显式”。
  9. 用户界面自 2000 年以来未更新。
  10. Office2k7 没有升级到 VB.NET
  11. 大多数对象模型都是无意义的并且过于冗长。
于 2009-06-05T17:35:45.077 回答
2

C#:

1) 静态方法必须是类的成员

2)静态扩展方法只能添加到静态类

3) 接口函数的实现没有标有“覆盖”之类的东西,以表明它们来自基类或接口(很难确保仅通过代码审查来覆盖您期望的方法(具有正确的签名)) .

我只有3个。我想那还不错。

于 2009-06-12T23:25:49.107 回答
2

Python:

我仍然是 python 的温和用户,所以我的抱怨很可能是知识锁定或误用。欢迎评论。我很喜欢这种语言。

  1. 线程支持和 GIL 较差。如果您想使用多核平台,大多数 python 程序员可能会推荐多处理或某种类型,不要使用线程。它不会给你你所期望的表现。
  2. 属性仅适用于实例变量。_class_var = property(classmethod(some_method)) 只是行不通。如何获得属性包装的类变量?
  3. 没有访问控制。所有访问控制都是语法修饰。像private是__private,protect是_protected等等……希望大家编程python都遵循命名约定。来吧,我们可以做得更好。
  4. 我同意简单明了的语法的 Python 哲学,但在我看来,一些简单明了的语法不被支持似乎锁定了良好的判断力。比如,a++,++a,a--和--a,自减/自增,这些有什么问题?foo = (a > b ? a : b) 一元运算,这些有什么问题?(我知道 py2.6 也引入了类似的东西,但是鉴于几乎所有其他语言都对这些简单的语法提供了大量支持,为什么要重新发明轮子?为什么不只是遵循最佳实践呢?一件好事不应该保持良好状态“形式”?)
  5. 程序接口。Python 没有接口或抽象类的概念(py3k 有一个叫做 abc 的东西),一切都是具体的。我认为提供“接口”或“抽象”关键字来构建类骨架并保护类继承和扩展并不是一个坏主意。它有助于自上而下的设计。目前,我只需要用 NotImplementedError 填充每个方法,这是一项相当乏味的工作。
  6. 我必须添加这个。低于 3.x 的版本具有 str 和 unicode 类型。这是一场真正的噩梦。它使 ascii 和非 ascii/unicode 混合最有可能失败(坏,坏)

我看到人们抱怨速度。我不明白。它是一种解释语言,代码直到运行时才编译为机器代码,这就是它的本质。您无法将解释语言的速度与编译语言的速度进行比较。据我所知,在解释/脚本语言中,python 并不慢。

于 2009-06-16T03:34:47.627 回答
2

C++缺乏好的重构工具,缺乏检查异常

Java缺少模板,缺少const关键字

于 2009-07-13T06:32:59.260 回答
2

PHP

  • 几乎每个标准函数都在全局范围内
  • 函数参数顺序不一致
  • 函数命名不一致
  • 不区分大小写的函数
  • 脚本的行为可能因 php.ini 文件而异
  • 能够使用未定义的变量
  • 在某些情况下,必须先将结果分配给变量,然后才能在函数中使用它

更主观的是:

  • 动态打字
于 2009-09-10T08:55:18.250 回答
2

通用 Lisp

  • 缺乏更多现代功能(套接字、线程等)的标准库
  • 可以使用映射到本机窗口系统的标准化 UI
  • Scheme 将 lambda 表达式分配给变量并将变量直接用作函数调用的能力看起来比 APPLY for FUNCALL 更简洁。我猜有多个名称空间的副作用
  • 库的标准化源代码级打包系统,以便可以在多个实现中轻松使用它们

我想知道强类型的 lisp 会是什么样子

于 2009-10-09T19:59:12.220 回答
2

C#

  • 缺少基于方法参数的运行时类型的多重分派。dynamic应该可以解决大部分问题,但尚未发布。
  • 接口实现是声明性的而不是结构性的。我真的很喜欢谷歌的方式语言处理类型 的方式
  • 进行异步方法调用非常庞大(我很确定所有线程都是操作系统线程,而不是轻量级线程)
  • 没有宏系统。我在这里不是在谈论 C 风格的宏。我说的是 LISP/Scheme 风格的宏
  • 运算符是静态方法,它们的签名受到过度约束(您不能创建新的)。

  • 于 2010-03-22T17:58:56.880 回答
    2

    C#

    • 引用类型默认可以为空;语言中的 null 关键字是无类型的。
    • 缺乏受歧视的工会
    • 异常作为默认的、非异常的错误处理方法——没有太多的替代方法。
    • 过时的 switch 语句语法和限制
    • 构造函数+静态方法的不必要区别
    • 静态方法不能成为接口的一部分
    • 缺乏按形状接口实现而不是显式接口实现 - 导致大量语言设计黑客,例如 linq 查询语法、foreach、集合和对象初始化器 - 没有一个可以灵活重用。例如,对象初始值设定项语法可能很好,但对不可变对象表现不佳。
    • 不能独立于实现继承类的“接口”——导致代码重复和提供接口、抽象基类、一些常见实现的过度架构代码,并且无法挑选每个要使用的位。还; 导致太多代码与特定实现紧密耦合,因为通常显式引用实现类型而不是接口。
    • 由于类“接口”与其实现紧密耦合,因此无法通过组合进行多重继承;有效地缺乏混合。
    • 接口的上述限制导致几乎相同的接口激增,这些接口在任何类型的类型层次结构中都不会自然重叠。 IComparablevs. IEquatablevs. IComparable<T>vs object.Equals vs. operator == 等等等等。通过扩展,制作满足所有这些事情的自定义类型比必要的工作要多得多(特别是对于集合类)。显然,语言设计者意识到了这一点,因此针对 linq、foreach 和集合初始化程序等事物的各种变通方法是按形状而不是按接口工作的。
    • 重复使用括号和大括号,而不是布局即结构。
    • 返回值可以被忽略,从而限制了类型推断的有效性。
    • 枚举不是普通类型,不能有方法。此外,枚举值不是类型安全的,尽管没有 0 值,但可能会初始化为 0。通过将标志和非标志枚举混合在一起来混合隐喻。
    • 缺乏适当的值类型支持。值类型不能被继承,具有不同的构造函数语义,并且由于 CLR 限制而性能不佳。此外,关于值类型的语义令人困惑:一些值实际上是值(并且不能修改),而另一些值实际上是非别名、非空引用(变量)。这对于下一个问题尤其令人困惑:
    • 字段和属性之间的语义区别,特别是在缺少可变性修饰符的情况下(ala C++'s const
    • 不能专门化泛型
    • 不能提供默认的泛型类型参数(例如工厂泛型)
    • 缺少 typedef 使得泛型使用起来很痛苦(using是一种有限但值得了解的替代品!)
    • 不能泛化除类型以外的事物(例如函数、纯值或名称)。这意味着您不能执行诸如对依赖属性进行通用实现之类的操作,从而导致诸如依赖属性之类的令人讨厌的实现以及代码片段的过度使用和代码可读性差的结果。
    • 指定泛型类型要求的能力有限,例如同时采用 int、double 和 bigint 的泛型 sum 方法(没有棘手且通常很慢的 hack)。
    • 接口方法实现或虚拟方法覆盖不能返回更具体的类型或接受更通用的类型;即即使在 C# 4 中也有限的协/逆变支持。
    于 2010-05-23T12:07:39.710 回答
    2

    我对Nemerle不满的五件事:

    • 局部函数不能产生
    • 编译 lambda 的能力有时取决于它是否被内联
    • 元组的值/引用类型语义不一致
    • 数组索引和类型参数之间偶尔的歧义
    • 缺乏普遍采用
    于 2010-05-23T12:08:59.633 回答
    2

    Clojure

    • 函数定义中的可选参数和关键字参数缺少内置语法。当然,您可以很容易地添加它,但这意味着库编写者不会使用它。普遍的解构尚未被证明是一个好的替代品
    • 缺乏方法组合(在 Common Lisp 中找到的那种之前/之后/周围的方法)
    • 过于依赖 Java 互操作,例如没有内置文件 IO
    • 有时我想要静态类型。这不是纯粹的仇恨;我通常更喜欢动态,并且尝试将两者混合在一起基本上不能令人满意
    • 内置数据结构没有内置的快速二进制序列化格式,尽管我听说人们正在研究它
    于 2010-05-23T12:46:35.457 回答
    2

    Python,再次:

    1. 没有 switch 关键字。不,字典不是它的替代品。连一堆elif陈述都没有。

    2. 换行处理不一致。为什么我可以这样做:

       test = (1,
               2,
               3)
      

      并不是:

      from itertools import cycle,
                            islice,
                            izip
      

      为什么我不能这样做:

      if stuff \
         and foo \
         or bar:
          return "Formated string with %(arg)s" % \
                 {'arg': "bloody slash"}
      

      不使用斜线?

    3. 没有一种明显且只有一种方法可以做到这一点。Python 在它的座右铭上失败了,就像 Java 在“一次编写,随处运行”失败一样。

      # what somebody from an another language would do
      if not test.has_key('foo'):
          test['foo'] = 0
      n = test['foo'] = test['foo'] + 1
      

      对比

      # what an agnostic beginer would do 
      try:
          test['foo'] += 1
      except KeyError:
          test['foo'] = 1
      n = test['foo']
      

      对比

      # what you end up after looking for dictionary default value in the python doc
      test.setdefault('foo', 0)
      n = test['foo'] = test['foo'] + 1
      

      对比

      # what I would do
      n = test['foo'] = test.get('foo', 0) + 1
      

      最糟糕的是,他们做的事情并不完全相同。有细微的差别。

    4. 空格和制表符之间的选择。应该没有选择。选择,把它放在石头上,停止战斗。

    5. 为什么你可以这样做:

      test = {}
      test['foo'] = 0
      

      但不是:

      test = []
      test[] = 0
      

    PS:" ".join(l)是精人。停止抱怨它,这并不明显,但考虑到迭代器模式,这只是正确的方法。

    于 2010-05-23T13:27:45.457 回答
    2

    通用 Lisp

    • 条件不是类(因为类是后来出现的),即使它们的接口几乎相同
    • 有些名称很奇怪,例如 flet / labels(唯一区别:范围)和 defvar / defparameter(唯一区别:已定义时的行为)或任何位旋转函数(dpb、ldb 等)
    • 包......真的很难正确 - 每次我认为我理解它们时,它们不会做我想要的
    • 内置的数据结构和函数并不像它们应该的那样通用(例如,为什么我不能定义我自己的散列函数可移植?)
    • 函数、变量等的多个命名空间(原则上我并不反对,但 CL 让它太复杂了;Norvig 说他无法从规范中分辨出来,但似乎至少有 7 个命名空间)
    于 2010-05-23T18:01:53.157 回答
    2

    哈斯克尔

    1. 有时类型系统感觉是倒退的。如果我不希望编译器为我的变量推断类型怎么办?如果我想要相反的情况怎么办,它在哪里对所述变量进行约束检查?例如,它不是推断列表元素的类型,而是确保它们都属于特定的类型类。这是一个微妙但巨大的差异,让我很难编写 UI。可以做到,但它比其他一些语言需要更多的努力。Haskell 非常适合非 UI 部分,但我将 UI 留给了无类型语言。

    2. 允许构造无限值有时会导致一些非常令人沮丧的错误。

    3. 无单态限制。

    4. 字节串处理有时会让我很生气,直到你的程序崩溃,因为你不正确地混合它们而你不知道它。当我们丢失本应阻止这种情况的类型信息时,这里出了点问题。

    5. 类型类应该为琐碎的情况自动派生,例如见证类型,但那里有很大的滥用潜力。

    于 2010-05-25T18:35:50.847 回答
    2

    C#

    我知道它很愚蠢,但我希望数据类型能够自行转换为我想要的,而无需我添加(int)Convert.ToInt32其他任何东西。这只会节省我的时间。让我烦恼的是,如果我写了一些东西来输出 anint然后结果我需要 a long,那么我经常必须经历并改变我所做的一切以使其工作。只为我做!

    抱歉,想不到五个,但我是新手,所以也许我会回来再添加更多:P

    于 2010-05-25T18:41:19.447 回答
    2

    我讨厌 C++ 的五件事

    • 链接时间。通过分布式构建,我可以在链接器运行的同时重建整个项目。
    • 没有标准的方法来防止内存操作的重新排序。使用写组合内存通常需要滥用 volatile 关键字。防止读取重新排序(在处理 SIMD 数学管道时通常对优化至关重要)通常通过在例程中间注入空 ASM 块来实现。
    • 用于解决字符串化问题的多步宏:
    #define STR_LINE2(x) #x
    #define STR_LINE(x)   STR_LINE2(x)
    #define LINE_NUMBER STR_LINE(__LINE__)

    • 进行字符串操作通常很痛苦。
    • 非标准化 printf 变体的扩散(vsnprintf_s vs _vsnprintf_s)。
    于 2010-05-25T20:24:25.573 回答
    2

    C++

    • 涉及模板时的神秘错误消息
    • 缺少模板约束(很多情况下可以使用模板元编程来解决,但是在大多数情况下这会导致代码不可读(至少对于普通程序员来说))
    • 指向成员函数语法的指针
    • c++ 标准委员会应该更频繁地发布官方标准(或者至少发布标准库本身的单独更新),我的意思是 TR1 是 2005 年发布的,我们仍然没有标准库中的 shared_ptr、bind 等。
    • -
    于 2010-05-25T20:34:45.823 回答
    2

    关于C#:

    1. 我讨厌没有关键字来指定从 java 中的方法抛出哪些异常。与使用 XML 注释相比,它是一种记录异常的更好方法。
    2. 我还希望为通用约束(如约束的 oring 和 anding)提供更好的语法。
    3. 为什么一个方法不能返回多个值?
    4. 缺乏对语言中面向方面编程的支持。
    5. 为什么不能用属性注释每个属性访问器?
    6. 缺乏像 perl 那样的内置正则表达式支持。
    于 2010-05-25T20:47:35.757 回答
    2

    Python

    1. 标准库在许多地方都违反了他们自己的风格准则。(PEP-8)
    2. Py3k 的 super 关键字充满了不需要的魔法(你不能给它分配一个不同的名字,没有self也能工作,为什么我们有这个显式参数呢?)
    3. Unicode 支持在 Py2k 中是不完整的,并且在 Py3k 中很糟糕(Unicode 中的标准输入,没有二进制数据!WTF?创建一个新的 WSGI 标准是 hacky。)
    4. 吉尔。非常有限的多线程支持(使用 CPython)
    5. PyPI(Python 包索引)很烂。羡慕的一瞥红宝石
    于 2010-05-25T22:25:40.410 回答
    2

    PHP:

    • 荒谬的 assert() 函数......它在里面的代码上运行 eval()
    • ?> 标签会删除它后面的任何换行符?!
    • 数字字符串的奇怪处理(尝试将它们作为数组键)
    • PHP 6似乎不再支持痛苦的 unicode 支持
    • 入门成本低意味着 95% 的 PHP 程序员给 PHP 程序员起一个可怕的名字——试图在 5% 的人中找到一个人来雇用是疯狂的。
    于 2010-05-26T00:37:18.520 回答
    2

    Python

    1. Python 3 没有 Django。
    2. 静态类型。是的,动态类型是很棒的东西,但有时我确实想让它成为静态的。
    3. 适当的 unicode 支持(在 Python 3 中修复)
    4. 构造函数命名。我讨厌所有这些都强调了我的代码。
    5. 线程效率不高
    于 2010-05-26T01:53:17.677 回答
    2

    EL - 表达式语言,JSP 页面和 JSF 2.0 Facelets 中的${...}东西#{...},用于从底层 Java 代码中提取数据。

    • 所有有趣的东西,比如带有参数的方法调用和基于注解的命名都只存在于 Java EE 6 的 EL 中,而后者仅在 Glassfish v3 中可用。
    • 1) 为早期的 Servlet 2.5 容器获取正确的 jar,以及 2) 在不干扰容器中任何先前可用实现的情况下让它们工作是一件非常痛苦的事情。
    • 只有 JSF 的早期版本,如 1.2,带走了方法调用,让您使用 f:setPropertyActionListener - http://weblogs.java.net/blog/2009/07/22/say-sayon ​​ara-spal - 其中,相信我,这不是很好。
    • EL 解析器知道要解析和解释的代码片段来自哪里,所以你倾向于给所有东西一个 id,这样你至少可以识别哪个标签让它变得暴躁。
    • Eclipse 在每次调用 EL 方法时都会发出警告,因为它是 JSF 1.2。也只是。
    于 2010-09-09T17:06:57.373 回答
    2

    到目前为止,我最讨厌我最喜欢的语言的事情是我的选择不断变化。每次我认为我找到了 The One时,我都会发现五件(或更多)我讨厌的事情。然后那边的草看起来更绿了……

    于 2011-01-27T04:44:15.547 回答
    1

    Python:数组部分选择不能满足您的要求。

    a[1] 给你一个元素
    a[1:2] 给你一个元素,而不是 [ a[1], a[2] ]
    a[1:3] 给你两个元素

    我讨厌这样,但也许这只是因为我主要在 Verilog 工作。

    于 2008-11-11T22:52:34.333 回答
    1

    C++

    1. 制作一个简单的代码片段需要花费很多时间。
    2. for(std::vector::const_iterator iter = [...]
    3. vector.remove() 不会删除。
    4. vector.push_front() 不存在。
    5. 头文件
    6. 没有拉姆达
    7. 如果至少有一个虚函数,则不会自动清空虚析构函数。
    于 2008-11-12T01:14:31.897 回答
    1

    C#

    • 泛型参数是不变的C# 4.0 为泛型类型引入了协变和逆变
    • 可覆盖的类成员必须显式标记为虚拟

    爪哇

    • 缺少无符号数字数据类型
    • 原始数据类型不是对象
    于 2008-11-12T08:54:43.963 回答
    1

    Python:

    • 速度
    • 静态分析(缺乏)
    • 匿名函数仅限于一个表达式
    于 2008-11-14T00:24:12.567 回答
    1

    红宝石:

    • 重要的空白。对于解释器,行尾 = 语句结束,除非该语句看起来应该继续(或者您明确转义换行符)。
    • 慢的
    • 在线文档不如 Python 的好(在防御方面,Python 非常好)
    • 我提到慢了吗?
    于 2008-11-14T01:13:38.880 回答
    1

    红宝石

    1. 没有类型推断
    2. 方法/函数不是一流的对象
    3. 尽管块变量的范围是词法的,但变量的范围不是词法的
    4. def 里面 def
    5. super 和 super() 的区别
    于 2008-11-15T08:18:54.793 回答
    1

    我觉得无法选择最喜欢的语言。动态类型和静态类型不能完全比较,所以我只列出我使用的哪个

    C++:

    • 模板元编程语法很丑陋。隐式::value会使它更简洁
    • ->.为什么编译器无法确定我正在为我做ptr.thing并且只是->为我做?
    • 我讨厌空白。所以整体vector<vector<int>>必须vector<vector<int> >让我感到不安,然后每当我看到那行代码时我就无法集中注意力,我最终试图找出一种使用方法int[][]或其他东西
    • 宏。我个人喜欢宏的概念。但是对于 C++,我认为系统是一个 hack
    • 我讨厌;

    Python:

    • 字符串是不可变的。做到了,所以我不能只做 string[4]="b"
    • 通过引用隐式复制的列表。哪个泄漏到 [[0]*width]*height 问题
    • 缺少尾递归(每当我输入错误的递归函数时,我必须安装 IDLE 以不吐出 1000 条错误消息)
    • 字典键不接受列表/字典
    • 缺乏深度范围。当我进行列表理解时,我不希望其中的变量影响外部范围
    于 2008-11-24T04:12:33.617 回答
    1

    我可以为 Python 添加另一个:

    给定一个列表l = [l1, l2, ..., ln], 那么repr(l) = [repr(l1), repr(l2), ..., repr(ln)], 但是str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l)). 之所以这样决定,是因为列表中可能有一些晦涩的条目,例如l = ["foo], [bar,", "],["]并且str(l)会返回"[foo], [bar, ], []"“可能使用户感到困惑”。但是,这使得str仅用于转储数据成为不可能,因为 list 会杀死“仅以可读格式转储数据”。啊!

    于 2008-12-07T02:33:46.680 回答
    1

    MEL(玛雅表达语言):

    • 单维数组:强迫我手动同步两个或多个列表,或者使用分隔字符串来模拟更复杂的数据结构。当然,它们也是不可变的。
    • 单线程且速度慢:导致整个 Maya 应用程序在完成任务时挂起。无法终止长时间操作的奖励积分,而是必须关闭并重新打开 Maya。
    • 脚本来源路径不是递归的:这意味着您要存储脚本的每个目录都必须添加到脚本路径中。
    • 无命名空间:强制使用不一致的命名约定以确保全局过程不会发生冲突。
    • 模态命令: 每个命令都是模态的,这意味着创建、修改和查询操作都是通过设置标志来处理的。这也迫使开发人员导致大多数命令返回数组
    • 不一致的命令样式:大多数数组命令实际上返回数组,但 Tokenize 命令必须将数组作为参考,然后填充,而不是吐出数组。这与其他不一致。

    这些和其他几个原因是 AutoDesk 采用 Python 作为辅助脚本语言的原因,这带来了一些其他令人讨厌的因素:

    • 并非所有 MEL 命令都受支持:大多数都受支持,但您时不时会发现自己不得不使用 mel() 函数来执行一些任意代码。更糟糕的是你必须对它进行所有烦人的逃避。
    • 继承了模态命令样式:必须使用相同的 create=True、query=True、edit=True 的东西。
    于 2008-12-17T03:40:18.323 回答
    1

    C是我最喜欢的,但它也很糟糕。

    • 它拥有有史以来最糟糕的预处理器。他们为什么不使用 m4 之类的东西?
    • 整个头文件与源文件模型被破坏了。帕斯卡在单位方面做得很好。
    • 它需要 switch 语句中的 case 范围。
    • 来自 void* 的联合和强制类型转换破坏了类型系统。这使得垃圾收集器成为不可能。
    • 没有嵌套函数。GNU C 有这个,但它应该是标准的。
    • 不对分配的内存进行边界检查。有一些工具可以发现这一点,但它们不会检测到一段代码错误计算地址并写入根本不相关的分配区域的错误。我讨厌整个指针算术。
    • 没有对数组进行边界检查。
    • 关于便携性的问题太多了。甚至 wchar_t 也因平台而异。
    于 2009-01-03T14:09:53.097 回答
    1

    雷博尔

    REBOL 是最喜欢的语言之一。我不能说我有一个最喜欢的,尽管 Haskell 的排名也很高。

    1. 它奇怪的语​​法吓跑了许多开发人员,甚至在他们尝试之前。

      使用 [电子邮件规则 url] [
      
      
      ; A small DSL that sends email to people about URLs.
      rules: [
          some [
              into [
                  set email email!
                  set url url!
                  (send/subject email url reform [ "Check Out" url ])
              ]
          ]
      ]
      
      ; Global context
      notify: func [ [catch] dsl [block!] ] [
          unless parse dsl rules [
              throw make error! "You screwed up somehow."
          ]
      ]
      
      ] 通知 [[a@b.com http://www.google.com] [b@c.com http://www.yahoo.com]]
    2. 递归方言很容易验证,PARSE但很难评估。(堆栈在这里会有所帮助。)

    3. REBOL 与许多流行技术的集成很差,尤其是 XML。我怀疑这部分是自大,因为 REBOLBLOCK!数据类型几乎可以做 XML 可以做的所有事情。但是,现实世界中有 XML。
    4. 没有统一码。
    5. 感谢 AltMe,REBOL 的用户社区非常孤立。我能理解他们为什么要使用 AltMe。它是用 REBOL 编写的,展示了它的优势。不幸的是,这也让他们离开了自己的小岛。

    即将到来的 REBOL 3 有望解决其中的许多问题,除了最后一个问题。

    于 2009-06-12T23:18:11.137 回答
    1

    C#

    1)缺乏为值类型编写泛型的实践能力。例如,任何白痴(大多数白痴)都可以在 C++ 中编写一个计算 int、float、double 等列表的标准差的例程,它易于编写、易于阅读并且执行速度与非通用代码一样快. 我认为,如果您可以用 C# 编写一些接近于这 3 个中的任何一个而不在其他 2 个上荒谬的东西,那么您就是一个非常出色的程序员。

    2)协方差和反方差,尽管这被添加到 4。

    3) LINQ 的文档极差(好吧,不是语言的一部分)。

    4)当我每次都想做同样的事情时尝试使用 foreach/iterators,除了上次略有不同的事情(例如在它们和单词之间以及在最后两个之间用逗号连接一堆字符串)。如果我用 IEnumerable 编写它,则很难读写,而使用 for (int i=0 i < ...) 并不会好很多,效率也较低。

    5)我知道我会对此提出投诉,但缺乏检查异常。这不需要像在 java 中那样实现(框架开发人员确实对他们为什么不这样做提出了一些非常好的观点),但我会很高兴编译器警告不喜欢检查异常的用户可以关闭。

    于 2009-10-12T16:34:16.463 回答
    1

    昆雅语

    • 社区太小。当附近很难找到另一个演讲者时,几乎不可能进行一个好的语言沉浸式程序。
    • 不规则动词。是的,我知道英语和西班牙语也提到了它们,但昆雅语是发明的。为什么还需要不规则动词?
    • 不支持Unicode。我必须在我的计算机上安装三种不同的 Tengwar 字体才能阅读大多数消息,其中一些字体的字距很差。考虑到罗马化转录的存在,这真的不是一个大问题,但是 Tengwar 是如此美丽,你不想使用它。
    • 并非所有概念都可以在昆雅语中轻松引用,这会导致烦人的迂回曲解,或者诉诸辛达语、努门诺尔语或(Manwë 救我)克林贡语来表达我的观点。

    于 2009-11-25T07:17:56.597 回答
    1

    C#

    一直以来对 C# 最讨厌的人必须是:

    (1)事件对所有侦听器都有强引用,从而防止对侦听事件的任何东西进行垃圾收集。如果您想查看这导致的问题,只需在网上搜索所有试图通过创建某种“弱引用事件处理程序”来解决问题的人。

    (2)在调用之前需要检查事件是否等于 null 似乎应该由语言处理。

    (3) XML 序列化程序无法读取/写入 XML 文件中的注释。在手动和用 C# 编写的工具修改 XML 文件的环境中效果不佳。可以通过仅使用原始 XmlDocument 来解决,但能够将其抽象为一个类会更好。

    (4)构建过程不允许您直接访问 xsd 文件之类的内容,而是需要一个中间步骤来创建 C# 部分类。这也会导致 XAML 文件出现问题,有时您需要重新构建两次才能使更改正确通过。

    (5)不支持 MMX 和 SSE 1、2、3、4 等 CPU 内在函数,因此在运行 C# 应用程序时,这些宝贵的 CPU 功能未被利用。

    其他没有进入我的前 5 名的:

    (6)不能将字段标记为属性,所有属性都必须从一开始就显式实现:

    例如,目前有:

    public class MyClass {
        private int someInt;
    
        public int SomeInt {
            get {
                    return someInt;
            }
            set {
                    someInt = value;
            }
        }
    }
    

    public class MyClass {
        [IsProperty(public, get, set)]
        private int someInt;
    }
    

    (7)不支持多个返回值,例如:

    public int, string, double MyFunction()
    {
        ....
        return x,y,z;
    }
    
    
    public void TestMyFunction()
    {
        int x, string y, double z = MyFunction();
    }
    

    (8)不支持协变返回类型

    我对泛型实现有一些抱怨,但我会在那里切开它。我认为 C# 是一种用于执行所有 GUI、网络和配置管道的出色语言,并且是我以一种可以长期支持的方式快速启动和运行的第一语言。

    于 2010-01-02T08:27:14.147 回答
    1

    Python

    那些我只是不明白...

    • math.ceil()math.floor()返回浮点数,而不是整数(可能是为了避免底层 C 函数中的整数溢出 - 但为什么不强制转换为 Python long?)
    • len()是函数不是方法
    • reload()非常有限,在 10 次中不会重新加载模块 9 次,如果它是模块,则仅重新加载导入的标签 - 即from bar import foo; reload(foo)如果 foo 本身不是模块,则不能这样做
    • 可变的默认参数只有一个引用(为什么每个函数调用都没有一个新实例?!)
    • 所有这些带下划线的变量——如果它们如此私密,我们怎么会在代码中看到如此多的内置变量?获取命名空间!
    • 字符串是不可变的 - 也许有一个很好的理由,但我遇到过很多我想调整一个特定字符的情况......

    那些基于实现有意义但很烦人的......

    • array.sort()不返回数组(我想它发生在原地)
    • 列表/生成器推导没有定义新的范围(只是for循环的语法糖,对吧?)

    和一对在 Python 3 中修复的

    • 默认整数除法
    • global只能引用顶级命名空间
    于 2010-02-07T21:23:28.320 回答
    1

    斯卡拉:

    • 标准库的怪异之处:它并不总是展示最佳实践,而且文档不足
    • 硬编码的 FunctionX、TupleX 类
    • 缺乏属性:getter 和 setter 是分开的,这违反了 DRY,并使 FRP 之类的东西几乎不可能
    • 需要 = _ 来初始化属性
    于 2010-02-16T12:50:21.917 回答
    1

    我的德尔福 5:

    1. 如果没有参数化,过程和函数不一定与变量区分开来(例如,我可以使用诸如 x := GetPositionOnScreen; 而不是 x := GetPositionOnScreen(); 之类的语句)
    2. Try/Finally 和 Try/Except 需要嵌套(之前说过一次,但它仍然是我的一个)。
    3. 不区分大小写。
    4. 可以有多个对象(函数、全局变量、局部变量)命名相同,Delphi 会很高兴地尝试弄清楚你的意思。名称应该是唯一的。
    5. 奇数 if 条件规则。单个条件检查不需要 () 围绕它,但如果我进行多个检查,我需要一个 () 围绕每个检查,有时需要多个嵌套集以进行更大的检查。
    6. 没有继承的包含。如果我需要在基础形式和继承形式中引用 Windows 单元的功能,我必须在两者中都包含 Windows。
    于 2010-03-23T17:09:28.893 回答
    1

    经过一番思考,重新写了...

    尽管我喜欢 PHP,但我讨厌 PHP 的五件事(排名不分先后):

    • 内置函数中的命名和参数顺序不一致。
    • 多亏了 SPL,面向对象的数组方法,但遗憾的是(还没有)。
    • PHP 本身没有真正的并发性,只能通过托管网络服务器进行多处理
    • 没有像 JavaScript 那样的异步调用
    • 仅通过扩展缓存操作码。不是很糟糕,只是很烦人。

    这些是让我烦恼的语言特性(或缺乏),但更大的问题是这些更多的人/社区相关的事情:

    1. 事实上,很多使用 PHP 的人对编程和一般的良好实践一无所知,并且产生了非常混乱的代码。JavaScript 也有同样的问题。

    2. 大量的教程/书籍教授非常糟糕的做法和风格。这可能是#3的主要原因。

    3. 它的坏名声主要是因为#3 和#4。

    于 2010-05-23T11:21:20.230 回答
    1

    不得不假设我们有一种语言。我们要不要?

    于 2010-05-23T12:15:35.217 回答
    1

    C#

    我对 C# 很满意,但这两个真的让我很恼火:

    • 不可变类的基于构造函数的初始化不太方便,不太直观(当您阅读代码时,您不了解分配给了什么),比内联对象初始化具有更少的 IDE 支持。这使您不可避免地倾向于可变类。我知道这之前已经提到过,但是我在不可变类的初始化语法方面确实存在问题。

    • switch太冗长了。每当我看到适当的开关情况时,我真的倾向于使用if..else if..just 因为它更简洁(打字少了约 30%)。我认为 switch 应该没有失败,break应该是隐含的,并且case应该允许逗号分隔的值列表。

    于 2010-05-23T14:59:59.260 回答
    1

    许多人认为 Java 很慢,但我同意一定程度的使用。

    Java 是戏剧性的。他们有很多课程只是为了你想做的一件事。但是你知道灵活性属性 XD。

    Java 一开始很难,但一如既往的有趣。

    当您编写用于打印“Hello,World!”的简单代码时 请不要使用 JAVA!XD 我确信我是有道理的。

    Java 是一种混合体,所以不要说它纯粹是一种 OOP 语言。

    还有更多,但我只限于五个 XD。谢谢!

    于 2010-05-23T16:54:33.900 回答
    1

    C#

    1. 没有简单的方法来检查类型是否为数字
    2. 这意味着您可能无法使用大多数 microsoft stack、IIS 和 MSSQL
    3. C# 不是针对特定问题的特定工具,而是尝试成为每种范式的语言。
    4. 缺乏社区。当然,已经开始有 C# 的开源框架和库。Java 开发人员多年来一直可以使用的相同。
    5. 很难找到好的帮助。互联网上充斥着如何用 C# 解决问题的糟糕例子。这又回到了问题 #3。
    于 2010-05-25T19:05:44.247 回答
    1

    JavaScript

    来自 ECMAScript 5 规范:

    • 7.6.1.2 未来保留字:

      类、枚举、扩展、超级、常量、导出、导入

      在严格模式下: implements、let、private、public、interface、package、protected、static、yield

    • 11.9.4 严格等于运算符 (===) 与 11.9.1 TheEqualsOperator(==)
    • 11.9.6 严格等式比较算法(NaN === NaN 为假)
    • 8.5 数字类型 - 没有真正的整数,一切都是浮点数。
    • 4.2.1 对象——原型继承

    好吧,我有点喜欢最后一个,但它有 7 种令人困惑的地方

    于 2010-05-25T20:30:30.913 回答
    1

    VB .NET,但这只是因为 VB6 毒害了整整一代程序员

    我在一家曾经是 VB6 商店的 VB .NET 商店工作,在这里工作的每个曾经是 VB6 开发人员的人都固执地拒绝学习任何有关 .NET 的知识。他们的代码就好像它仍然是 VB6,他们的应用程序就像 VB6 应用程序一样糟糕。我的老板非常不鼓励任何使用 LINQ,因为她担心其他人难以理解,这是真的,因为没有人想理解它。

    我认为如果 MS 只使用 C#,我们都会变得更好,这让我很难说,因为我认为花括号远不如 VB 冗长的结束语句。

    于 2010-05-25T20:38:42.987 回答
    1

    红宝石。

    1. 奇怪的范围规则——变量、常量和方法的行为彼此不同。规则也会根据您用于创建闭包的关键字而改变。或者你是否在一个类、特征类、对象、模块或模块的自我中。然后是instance_eval,它将规则更改为一组不同的规则。当一个模块被“包含”或“扩展”时,它们会再次改变,它们本身对范围做了不同的事情。并且有些规则集是元编程无法模拟的,所以必须使用eval。除非您使用的是 ruby​​ 1.9,否则所有这些都是不同的。
    2. 命名空间基本上是没用的。如果您有 Foo::File,则所有 Foo 的 stdlib 文件可能都已损坏。
    3. 要求语句被破坏。如果两个文件相互需要,则这些文件的行为可能会发生巨大变化,具体取决于首先从其他地方加载哪个文件。
    4. 库会急剧而突然地更改 API,因此您必须要求所有依赖项的特定次要修订号。对于系统上的每个 ruby​​ 应用程序。
    5. rubygems 包系统覆盖“require”而不是将文件放在搜索路径中 - 因为当您可以替换系统时为什么要使用它?
    于 2010-05-25T21:22:51.993 回答
    1

    蟒蛇 3

    • 制表符和空格都允许缩进
      你会认为人们从过去学习(Makefile)。只需选择空格并禁止制表符。YAML 做对了。
    • 缺乏流行的第三方库
      标准库很棒,但是 Python 2 如此强大的很多原因在于第三方领域。Python 2 做对了 :-)。
    • IEEE 浮点数
      编程语言中的浮点数令人困惑,因为它们与我们在数学中使用它们的方式不同。相反,应将数字运算视为仅在需要时才转换为小数点格式的表达式(即打印到屏幕上)。我认为 Maple 和 Mathematica 做得对。
    • 标识符的字符集过于受限甚至
      list.empty?优于. 同样,会比. Ruby 和 lisp 做到了这一点。list.is_emptylen(list) != 0process.kill!process.kill
    • 当调用一个函数时,你必须总是写括号
      如果我们可以在明确的情况下省略它们会很好。又怎么样了?dict.items还是dict.items()Ruby 也做对了这一点。
    于 2010-05-25T22:06:21.207 回答
    1

    Python:

    1. 没有标准的 GUI 工具包(社区对此进行了反复讨论,但似乎从未解决过任何问题)。

    2. 分发和安装 Python 应用程序和库的工具和方法的演变一直很艰难。(尽管最近这似乎越来越接近修复。)

    3. 随着解释器的使用,CPython 仍然很慢(尽管 PyPy 这些天看起来不错,如果它成为“标准”Python,这个问题就会消失)。

    4. 你不能在不覆盖很多方法的情况下子类化内置类(例如,list 和 dict),即使你想做的只是简单地挂钩到事件中(例如,挂钩到正在添加或删除的项目)从列表中,您需要覆盖delitem、 append、extend、insert、pop 和 remove ——没有可子类化的“更改”事件通知,也没有任何“受保护”方法可以排除上述所有方法使用的通用代码)。

    5. 在 virtualenv 被发明之前,在一台机器上为不同的目的保留不同的 Python 环境是一件非常痛苦的事情。

    于 2010-05-26T00:03:02.190 回答
    1

    Java - 不支持语言级别的组合

    于 2010-05-26T08:30:07.713 回答
    1

    爪哇:

    1. 很不协调。
    2. 图形 API 有时使用起来很痛苦
    3. NullPointerExceptions 不会告诉你什么是 null
    4. 我编写的程序有时无法在不同的 JVM 上运行,这是一个巨大的痛苦,并且与 Java 的“一次编写,随处运行”的声明相矛盾。
    5. 挥杆没有它应该的那么好。
    于 2010-05-29T18:57:57.027 回答
    0

    VB.NET

    1) If Not x Is "foo" (而不是 <> "foo")
    2) "OrElse" 和 "AndAlso" 短路(而不是简单的 "Or" 和 "And",它们的作用不同)
    3) 没有(而不是空)

    于 2008-11-14T00:29:15.770 回答
    0

    C# 中缺少预处理器。

    我知道他们忽略了它,因为有些人会滥用它,但我认为他们把婴儿和洗澡水一起扔了出去。代码生成被认为是一件好事,而在 C++ 中,预处理器是我的第一行代码生成器。

    于 2008-11-24T15:18:20.277 回答
    0

    爪哇:

    • 没有程序编码,它编译成程序代码,所以让我使用它!
    • 没有多重继承,试图用 15,000 个接口做同样的事情很糟糕。
    • 约会课,我还需要多说。
    • 我不能完全使用多态性。Java 不会覆盖要触发的不同参数类型。
    • 我想不出第五个原因,如果我这样做了,我会回来编辑这篇文章。
    于 2009-02-05T00:18:34.800 回答
    0

    Python:

    1)它是一种脚本语言,而不是完全编译的语言(我希望能够编译二进制文件——我不关心字节码)。如果我必须使用非常多的库(即每个使用我的程序的人都必须安装所有库,这基本上意味着没有普通人能够或有耐心正确设置它——除非我做了很多不必要的工作)。我知道制作二进制文件的方法,但它们并不总是工作,我猜他们无论如何都将解释器捆绑在二进制文件中(我不希望那样)。现在,如果我能得到一个字节码编译器,它将包含我导入的所有文件(并且只有那些)的副本放在我的程序文件夹中,这可能是一个合适的折衷方案(那么没有人需要下载额外的库和这样的)。如果可以将编译后的 python 文件压缩成一个文件,并指定一个文件作为在此完成之前运行程序的文件,那也很好。

    2) 有时似乎有点马车;有几次本应工作的代码根本没有(没有程序员错误),特别是与“from moduleX import *”等相关的代码,以及其他与导入相关的问题,以及一些与到全局变量和局部变量。

    3) 最大递归深度可能更高。至少有一次我觉得我需要它走得更高。

    4) 没有 switch 语句(更不用说允许数字、字符串和范围的语句了)

    5) 较新的 Python 版本似乎取消了许多有用的字符串操作,而且它们似乎没有简单的文档说明如何在没有它们的情况下执行相同的操作。

    6)强制自动垃圾收集(我希望能够手动完成,尽管不一定强制这样做)。

    7) 没有使用 GUI 就没有预制的 Timer 类(嗯,可能有一个,但经过我的所有搜索,它肯定不方便找到!我确实找到了一些东西,但它没有当我尝试它时完全可以工作。)通过计时器,我的意思是每x秒执行一次指定功能的排序,并且能够在需要时将其关闭,等等。

    8) 社区中给出示例的人很少告诉他们导入了哪些模块,以及如何导入它们。

    9) 与 Lua 集成的支持不多。

    10) 似乎没有办法将额外的函数添加到类的特定实例(而不是整个类),除非您动态地将对象变量添加到具有所需功能的对象的类中(但是,您仍然必须为此开设另一个课程)。

    于 2009-05-28T08:52:52.803 回答
    0

    C#

    5. 空合并运算符

    这 ??运算符允许您编写:

    x = y ?? z;
    

    代替:

    x = (y == null) ? y : z;
    

    我喜欢这个运算符,但我想要另一个:

    x = y ??? y.foo() : z.foo();
    

    代替

    x = (y == null) ? y.foo() : z.foo();
    

    我一直在使用这种东西,而且我觉得打字很烦人== null


    4.equals应该有更好的支持

    我必须从每个Equals(object obj)方法开始: MyClass other = obj as MyClass; 如果(其他 == null)返回假;

    你应该只需要写:

    public override bool Equals(MyClass other) {...}
    

    并且语言应该注意提供Equals(object obj)方法。
    注意: other 应保证不为空。


    3. 不能使用不同类型的三元运算符

    这不编译,我认为它应该!

    string foo = "hello";
    int bar = 4;
    object baz = foo == null ? foo : bar;
    

    2. 缺少命名空间私有

    我喜欢这种internal保护,但我希望有一种保护只允许从同一个确切的命名空间内访问。这将有助于更好地控制大型类库中的访问。


    1.没有多重继承

    我真的只对接口的默认实现使用实现(类)继承,但有很多时候我想这样做。

    于 2009-11-25T07:13:12.530 回答
    0

    超话:

    • 很久很久以前就死了
    • 没有简单的任务(你不能只说a := 3,你必须说put 3 into a
    • 没有嵌套函数
    • 没有真正的数据结构,只有字符串。要制作“列表”,您可以使用 分隔项目itemDelimiter并手动对其进行转义。您还可以获取线条和单词,例如get word 2 of line 5 of txt

    顺便说一句,我认为 HyperTalk 独有的最酷的功能之一是特殊it变量:

    ask "How many years old are you?"
    answer "You are " & it*12 & " months old."
    
    于 2010-05-04T07:57:12.257 回答
    0

    Python

    • 没有命名空间。
    • 伪私有属性/名称修改(主要使用 getattr)。
    • 文件路径操作分布在多个模块中。将 os.path 调用串在一起很难看,难以阅读,而且在大多数情况下,违反了 DRY。常见的文件路径操作仍然没有方便的功能,例如获取目录中的文件列表。修复此问题的path-type 模块被拒绝。

    ( [f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))])

    • Python 文档(我非常、非常、非常感谢有文档,而且它的格式很好,但我讨厌通过 5000 行快速入门使用示例来查找特定模块的单个函数文档(我'我看着你 optparse 和记录))。内置类型在近 10 个不同的地方被零星地记录。
    于 2010-05-04T08:53:05.133 回答
    0

    卢阿

    • 如果您执行 foo.bar(1,2) ,则 bar 方法中的 'self' 为零。您必须记住改为执行 foo:bar(1,2) 。我宁愿切换('self'应该默认定义,除非你使用':'运算符,或者你调用一个不是方法的函数)。
    • 变量默认是全局的。我宁愿放弃“本地”关键字,而改用“全局”关键字。
    • 未声明的变量被分配为零。我宁愿收到一条错误消息。您可以通过操作全局 env 的元表来回避这一点,但我宁愿让它默认实现并能够停用它。
    • 参数上的多个返回值处理得不是很好。假设您有一个函数 foo() 返回 1,2,3(三个值),而 bar() 返回 4,5(两个值)。如果你做 print(foo(),bar()) 你会得到 "1,4,5" ...只有 "last" 元组在调用时被扩展。
    • #(表长度)运算符仅适用于以连续整数索引的表。如果您的表不是这样,并且您想知道它有多少元素,则需要使用循环解析它,或者每次插入/删除元素时更新计数器。
    于 2010-05-04T09:39:28.760 回答
    0

    我刚刚发现在 c# 中创建通用方法时我不能使用 Enum 作为类型约束。

    微软对原因有足够好的解释,但仍然如此。我生气了

    public static T MyFunc<T>(string arg) where T:Enum //wont work :(
    
    于 2010-05-04T10:13:49.573 回答
    0

    JavaFX

    • 类型推断有时不会像您预期的那样运行,因此您经常需要显式声明类型。
    • def 的行为类似于 C 中的 const 而不是 Java 中的 final
    • 您可以通过访问索引> = seq.length 在序列中插入一个值,这实际上应该引发编译器错误(根据参考)。
    • 如果将 null 分配给字符串,则默认为“”。如果将 null 分配给 Integer,则会引发编译器错误(与参考中所说的相反)。
    • 以与 RuntimeExceptions 相同的方式处理 CheckedExceptions
    于 2010-05-04T11:46:27.410 回答
    0

    C#

    • 无法创建引用(var &t = struct)
    • 没有本地范围的析构函数(IDispose 接近但不一样)
    • ToString,我几乎不喜欢每个对象都有它,但事实证明我不喜欢使用它的所有东西,就像 string.format 一样。我宁愿接受某种类型的东西(如整数、浮点数、文本、字符)。因此,我不需要传入任何对象,而是需要传入带有隐式类型转换或接口的东西。我最终写了这样的东西来安全地转义 html 的文本,效果很好。
    • 不能使用虚拟类型转换 (blah)obj;如果 obj 不继承/不具有 blah 的接口,则不起作用。简单的解决方法是提供具有转换功能的接口。
    • 没有本地创作。而不是写 var o = new Item(); 我想写(类似的东西)Item o()(如果有的话,自动处理)。
    于 2010-05-08T21:37:48.807 回答
    0
    • length 属性很容易与 length() 函数混淆;改用 size()
    • 在选择器字符串中插入变量的语法('" +$.month+ "') 很糟糕
    • $(event.currentTarget) 并不总是适用于冒泡和捕获
    • 属性语法 ("[class='foot']") 在选择器语法 (".foot") 不返回任何内容的地方起作用
    • 包含选择器 ([class~=done]) 有时会在 JavaScript (this.className.search("done") > 0) 工作的地方失败
    于 2010-05-25T17:56:11.840 回答
    0

    Python:

    • 没有表示块结束的分隔符会引入歧义,因此自动缩进不适用于格式错误的代码。
    • 没有宏(装饰器不算)
    • 没有像 haskell 的 cabal 或 perl 的 CPAN 这样的库自动获取
    • 不能声明变量 const (是的,可以扮演自己的角色,但是......)
    • 元编程被削弱了
    • 差点忘了全局解释器锁
    于 2010-05-26T05:31:06.500 回答
    0

    我只有一个,但我相信它值得分享。

    CSharp / .NET

    我们有 Length 属性来获取数组中的元素数量和 Count 属性来获取集合中的元素数量。如果您考虑到 CLR 自动将 IList、ICollection、IEnumerable 添加到从零开始的一维数组背后的事实,它看起来会更加奇怪。

    我相信 CLR 团队和 BCL 团队很难讨论这个主题;)

    于 2010-05-26T08:08:32.970 回答
    0

    对象帕斯卡:

    • 您正在编辑的文件中有很多来回跳转,因为接口和实现分为两部分,但仍然卡在同一个文件中。
    • 数组的动态索引,字符串从 1 开始,在声明固定数组时指定起始索引,动态分配的数组总是从 0 开始。
    • 类和对象(更不用说接口)固定在语言之上,除其他外,不能像记录那样进行堆栈分配。
    • 当调用不带参数的函数时,() 是可选的,当您处理函数指针或尝试使用函数名引用函数的结果时会导致很多痛苦。
    • 没有外部类型定义,参数列表无法处理固定数组类型或函数指针类型。

    这只是语言,标准库和易碎 IDE 的遗憾借口应该有自己的清单。

    于 2010-05-26T08:22:09.737 回答
    0

    Objective-C 2.0

    严格遵守语言和运行时,而不是库,也没有任何特定的顺序:

    1. 缺少 cVar。
    2. 没有模块。我对缺少命名空间并不十分不满意,但是拥有模块会很好。
    3. 基于 Ivar 的属性语法要求在 3 个位置使用变量名进行声明。这是相当可怕的。
    4. C遗产。除了 OO 和 GC,C 语言的任何讨厌之处都存在。
    5. 对象不能存在于堆栈中。与 Obj-C 相比,它对其他语言的编程实践没有什么问题。例如,当我在 C++ 中的堆栈上获得返回值时,我觉得很奇怪。如果我在编写代码时实际上并没有查看库文档,我会假设每个函数都返回一个指针,这通常会在以后进行一些重要的清理。
    于 2010-05-26T19:30:29.933 回答
    0

    Python:

    1) 行继续语法:“...\”有效,但“...\”无效,并且尾随空格通常是不可见的,编辑器没有异常的 eol 标记。
    2) 堆栈跟踪中不可见裸露的“引发”,因为堆栈跟踪看起来像之前引发的异常。
    3) 慢
    4) 与网络服务器的集成不佳(mod_python:已死,mod_wsgi:操作范围有限)。这被 3] 复杂化了,需要守护进程或某种内存持久性才能正常运行。
    5) 过度容忍混合制表符和空格,允许对控制流的更改有时保持隐藏。(可能在最近的版本中修复)

    于 2010-05-27T18:51:59.293 回答
    0

    卢阿:

    • 内置的错误系统绝对可怕

      你可以通过修改 Lua 解释器来实现一个 try-catch 系统;但它与内置函数抛出的错误不兼容。

    • 他们有 __newindex 而不是 __setindex 作为设置器的事实

      ...并且 __newindex 仅在密钥不存在时才被触发。如果是这样,则根本不会调用元方法。

    • 没有好的类型比较系统。

      有 type() 函数,但它只处理基本类型(所有表都是表)。它确实需要一个用于类型比较的元方法。我之前使用 'is' 运算符和 __type 元方法实现了这一点,它工作得非常好。

    • 定义新关键字是个婊子。

      你可以做到,但是 Lua 中的代码没有很好的文档记录,所以要找出如何得到你想要的结果是一种反复试验。当你想自己实现我上面提到的东西时,这是一个主要问题(虽然不是那么多 __setindex,这是一个简单的修改)。

    • 我无法在网络浏览器中使用它。

      是的,语言本身并不是真正的问题,但是该死,我希望能够使用 Lua 而不是 Javascript... :)

    于 2011-01-22T12:06:51.960 回答
    0

    C

    • 字符串处理
    • 内存管理(决定谁应该分配和谁应该释放它)
    • 没有命名空间(最大)
    • 标准库中没有列表/数组和其他基本 DS


    JavaScript

    • 使用不带 var 的变量会自动使其成为全局变量
    • 分号不是强制性的
    • 比较运算符“==”和“===”及其用法的混淆
    • 没有适当的支持来处理二进制数据
    • 再次..没有命名空间
    • 变量没有块作用域。(来自C世界的很烦人)
    于 2011-01-26T11:23:22.770 回答
    -1

    Python

    • 慢的
    • 终于习惯了print语句,现在有了这个print函数???(py3k)
    • 从来没有 py2exe 或 cxFreeze 工作
    • 不标准化(轻微挑剔)
    • 递归深度仅为 100 (iirc)
    于 2009-02-19T06:48:55.353 回答
    -1

    VB.NET

    • 默认情况下弱类型(Option Strict 修复此问题,但默认情况下未启用)
    • 方法上不需要括号(myFunction 而不是 myFunction() 等等)
    • 是否使用括号进行数组定义/使用(myArray(12) 而不是 myArray[12])
    • 不支持直接递增 (i++)
    • 是否支持遗留On Error关键字和整个 VB6 命名空间
    于 2010-01-19T12:12:48.620 回答
    -1

    C# 4.0

    “动态”关键字,很容易被滥用。如果您想/需要使用反射,请使用并使其明显您正在使用它,不要尝试用动态来伪装它。

    于 2010-05-26T19:43:32.900 回答
    -2

    我讨厌Python的地方:

    • 没有编译器
    • 它没有被认真对待

    Python让我烦恼的事情:

    • (self,
    • private
    • 破坏兼容性


    我讨厌PHP 的五件事:

    • 当它显然是一个错误时“按预期工作”
    • goto
    • 错误的引用 ( foreach $arr => &$val... foreach $arr => $val)
    • 没有多重继承
    • 没有一个编译器可以在不向黑暗之神献祭一只羔羊的情况下真正工作
    于 2010-05-04T08:21:37.747 回答
    -2

    SAS

    • 从来没有自己的想法(一切都是借来的)。

    • 贪婪的庞大数据集。

    • 使用 Java,但从未了解对象是什么。

    • 窃取 Perl,但将其隐藏在其数据步骤中。

    • 永远和统计学家说谎!

    于 2010-05-25T20:27:01.480 回答
    -7

    Perl 代表一种可怕的语言。

    1. 没有“公共”或“私人”或“受保护”声明/定义。
    2. “我的 $variable_name;” 不声明子例程之外的全局变量。
    3. “我的 $variable_name;” 被子程序访问但“使用严格;” 或其他“使用”会产生警告。
    4. 函数原型最终会出现无法解释、未证明、不需要或其他一些借口。
    5. 在阅读大量符号时,过度使用符号最终会“酷而快速”。
    6. 当一个人变热时,他们喜欢保持热度,并且不需要任何东西来冷却它们。
    7. 经过一周的 Perl,我最终无法编写函数并对其进行原型设计。
    8. 模块到底是什么,它真的需要“.pm”扩展名吗?
    9. 如果您想创建一个公共变量并从子程序内部访问它,您如何在不产生警告的情况下完成此操作?
    10. 你在哪里可以找到一些可以教人一些简洁的 Perl 的简洁脚本?
    于 2008-12-19T23:43:25.893 回答