你最喜欢的语言有哪五件事你最讨厌?

What are five things you hate about your favorite language?

最近有一个Perl讨厌栈溢出的集群,所以我想我会把我的"你讨厌你最喜欢的语言的五件事"问题带到栈溢出中。带上你最喜欢的语言,告诉我五件你讨厌的事情。这些事情可能只是让你恼火,承认设计缺陷,公认的性能问题,或任何其他类别。你只需要恨它,它必须是你最喜欢的语言。

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

每当有人试图把他们最喜欢的语言强加给我时,我就会问这个问题,有时也会作为一个面试问题。如果有人找不到五件事来恨他最喜欢的工具,那么他对它的了解就不足以鼓吹它或者用它赚大钱。他没有在足够不同的情况下使用它来充分探索它。他主张把它作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,我就错了。

我不太在乎你用哪种语言。不想使用特定的语言?那就不要了。你通过尽职调查做出一个明智的选择,但仍然不使用它?好的。有时候正确的答案是"你有一个强大的编程团队,有良好的实践经验,在酒吧有很多经验。换成foo是愚蠢的。"


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

仇恨不是了解人们了解多少的唯一维度,但我发现它是一个很好的维度。他们讨厌的事情也给了我一个线索,告诉我他们对这个主题的思考有多好。


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

  • 跨实现的语法不一致
  • 细微的代码差异可能由于看似模糊的原因而导致大量的性能后果。
  • 不支持文本操作
  • 容易的入门成本,但在掌握语言方面有陡峭的学习曲线。
  • 在整个社区中实现最低限度的标准化以获得最佳实践,这包括语法样式。

…还有一些讨厌它的额外理由,不用额外收费

  • WHERE子句位于最后一个,使提前执行更新或删除变得容易,从而破坏整个表。相反,应该去前面的某个地方。
  • 关系划分很难实现。
  • 我可以将一个值设置为空,但不能用空来测试它是否相等。我可以检查是否为空,但这会使代码复杂化——在我看来,这是不必要的。
  • 为什么我们需要完全重新指定分组列的公式,而不是在列上设置别名,然后按别名分组(或按列索引进行排序)?


我讨厌Java的五件事:

  • 没有一流的功能。
  • 没有类型推断。
  • 在EG图形中缺少健全的默认值。
  • NullPointerException不包含有关空值的详细信息。
  • 无意义的"可配置"框架/服务提供者接口/工厂类/依赖注入系统的激增。可配置性几乎从未被使用过,dry被严重破坏,代码的大小是4倍,可读性是2倍。

我知道,我应该去斯卡拉看看。


JavaScript的:

  • 所有的事情insanely式最酷的是复杂的,然后所有的凉爽,是包在这样一个小的量的代码,你可以遵循它,愚蠢的奋斗

  • "+"是一个荒谬的选择算子A的concatenation弱型语言。他们试图吓唬人非禽兽?

  • 它是一块雷区的跨浏览器兼容(不介意它甚至山或不)

  • 它通常与不信任(如scummery阻塞后面的按钮,弹出窗口永远不会的。

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

  • 如果它不是为jQuery可能安静,我恨它多用于AS I:)


    PHP:

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

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

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

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

    4)regex支持和lambda支持一样差劲,因为它必须写在常规字符串中,这使得学习编程工具的难度是学习编程工具的三倍。而PHP应该是一种"简单"的语言???????

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

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

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


    C++

    • 太容易随机破坏内存,并且几乎不可能找到错误(尽管,Valgrind在解决这个问题上走了很长的路)。
    • 模板错误消息。
    • 当使用模板时,很容易最终不得不将所有内容都包含在一个文件中,然后得到愚蠢的编译时间。
    • 标准库在现代是个笑话(默认情况下仍然没有线程或网络?)
    • 大量令人讨厌的小部分C(尤其是短/int/无符号/等之间的所有转换)


    C:#。

    • 类的默认应密封
    • 有没有lock语句应为特异性,你要锁定的对象,方法,如有应Acquire这回报一次性锁定令牌。corollary:有不应该是一个对象的监视器。
    • GetHashCode()Equals()不在时一切都很System.Object特瑞科散列。相反,有一个IdentityComparer这是同样的事情,和保持IComparerIComparableIEqualityComparerIEquatable定制接口,和比较。
    • 支持immutability普尔
    • 可怜的方式扩展方法应该发现更多的不只是有意识的决策(事实上我使用的命名空间。

    那些是我的头离顶问我明天和我来了一个不同的5:)


    c

    • 字符串操作。

    有一个手动的字符串缓冲区的交易是易错的疼痛。因为这么多的计算是非常移动和调整字符串(如使用电脑不太多的大数运算的东西为人们的思想方式,当他们的反馈),它真的很可以使用托管C + +语言的字符串或对象要处理的论文。当我必须做它在直C,它感觉游泳在流沙。


    我讨厌"我讨厌某些语言"的五件事怎么样?D好的。

    涂上橘红并不代表它就是苹果。好的。

    当一种语言被设计出来时,设计者通常会想到它对什么有用。把它用在完全不同的事情上是可行的,但抱怨的时候却不是傻乎乎的。使用Python。我肯定有人或者有人会有一天用python代码创建exe的实用程序。你为什么要在上帝的世界上这么做?这会很好,不要误会我,但没有用。所以别抱怨了!好的。

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

    你是站在木腿上吗?好的。

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

    3-到底是谁的错?好的。

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

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

    我们都知道会发生什么。然而,我们中的一些人可能没有意识到的是……这种功能非常有益。取决于你在做什么。缓冲区溢出是该功能的成本。上面的代码。如果我真的把它公开了。这又是…跟我说……""我的错"。不是因为允许我这么做。好的。

    我们不应该把它放到回收站吗?好的。

    很容易指出一种我们不理解的语言中的某个特性,因为我们不经常使用它,称之为愚蠢。抱怨它在那儿等等。哥多总是招待我。人们总是抱怨Goto使用的是一种语言。不过,我敢打赌,你上一个节目中有一种goto。如果你曾经使用过休息或继续,你就使用了goto。就是这样。当然,这是一个"安全"的后盾,但它就是它。Goto有它们的用途。是否使用"隐式"goto(如continue或break)或显式goto(使用任何语言的实际关键字"goto")。不是说语言开发人员是完美无缺的,而是典型的……如果功能在时间的黎明就已经存在(对于这种语言)。这方面可能是该语言的一个定义性质量。意思是…由于向后兼容性,它正在被使用,并且可能不会被挂起。今天正在使用。就像5分钟前一样。正确使用。好。。可以说,也有人不正确地使用它,但这与我名单上的3有关。好的。

    1。-一切都是一个物体。好的。

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

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


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

  • 尽管我是Java泛型的粉丝,但它的设计方式却有很多奇怪之处。因此,泛型有许多令人讨厌的限制(其中一些是类型擦除的结果)。
  • object.clone()和可克隆接口的工作方式完全被破坏了。
  • 而不是走大路,把一切都变成一个物体(A.LA.smalltalk),sun wimped创建了两种不同的数据类型:对象和原语。因此,对于基本数据类型和wierd好奇(如装箱/拆箱)现在有两种表示,并且无法将原语放入集合中。
  • 摆动太复杂了。别误会我:秋千有很多很酷的东西,但它是过度工程的一个很好的例子。
  • 最后一个抱怨同样是Sun和那些为Java编写XML库的人的错误。Java XML库太复杂了。为了简单地读取XML文件,我经常要担心我使用的解析器是什么:dom还是sax?每个API都同样令人困惑。语言中的本机支持,以便于解析/编写XML将是非常好的。
  • java.util.date糟透了。它不仅不必要地复杂,而且所有有用的方法都已被弃用(并被其他增加复杂性的方法所取代)。

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

    • 闭包(块)有4种不同的创建语法,它们都不是最佳的。优雅的语法是不完整和不明确的哈希,完整的语法是丑陋的。
    • 社区倾向于反对真实的文档,倾向于"阅读代码"。我觉得这很幼稚和懒惰。
    • 元编程的滥用,特别是在库中,使错误成为跟踪的噩梦。
    • 一个相关的注意事项是,普适性元编程使得一个全面的IDE很难(如果不是不可能的话)实现。
    • 传递给函数的块的方式是愚蠢的。没有理由块应该传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield)。我认为应该给块提供一个不那么模棱两可的语法(或者哈希可以使用不同的分隔符;也许<>而不是),并且作为参数传递给方法应该和所有其他参数一样。

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

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


    Perl

    • 混合使用sigils

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      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;
      • 例如,这些都是一样的:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        $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写:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      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写:

      1
      2
      3
      4
      5
      6
      7
      8
      class Dog is Mammal {
          has $.name ="fido";
          has $.tail is rw;
          has @.legs;
          has $!brain;
          method doit ($a, $b, $c) { ... }
          ...
      }
    • 设计特点不匹配

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      /(?=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
      " })/;  # run perl code

      它是在Perl6写:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      / <?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
    • 漆多址调度

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

      它是在Perl6写:

      1
      2
      3
      4
      multi sub f( int $i ){ ... }
      multi sub f( num $i ){ ... }
      multi sub f( $i where $i == 0 ){ ... }
      multi sub f(     $i ){ ... } # everything else
    • 可怜的操作符重载

      1
      2
      3
      4
      5
      package my_object;
      use overload
        '+' => \&add,
        ...
      ;

      它是在Perl6写:

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


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

    • 没有命名空间;所有内容都在一种非常大的名称空间更大环境下的地狱

    • 缺乏标准函数:数组函数接受针尖第一个论点,干草堆作为第二个(参见数组搜索)。字符串函数通常采用先干草堆,后针(见斯特罗普斯)其他功能只是使用不同的命名方案:bin2hex,strtolower,卡尔塔托伊德

      有些函数有奇怪的返回值,超出正常值:这是迫使你有第三个变量当php能有效地解释一个空的数组类型为false杂耍。几乎没有其他的功能相同。

      1
      2
      3
      $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_string与mysql_real_escape_string)。

    • 语言是从将语言模板化为完整的后端系统。这意味着任何人可以在需要的时候输出任何东西,它会被滥用。你结束了模板引擎语言…

    • 导入文件很糟糕。你有4种不同的方法(包括,包括一次,要求,需要一次),他们都很慢,非常慢。事实上,整个语言是缓慢的。至少,漂亮比python慢(即使有框架)和ROR集合。

    不过,我还是喜欢PHP。这是Web开发的链锯:您希望一个中小型站点能够真正快速地完成,并确保任何人都可以托管它(尽管配置可能有所不同)?PHP就在那里,它无处不在,安装一个完整的灯或wamp堆栈只需要5分钟。好吧,我现在要回去和python一起工作……


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

    • 泛型类型的擦除(IU)reified仿制药)
    • 无法捕捉多(不同类型异常的catch块,单)A
    • 缺乏破坏者(finalize()是一个非常穷的替代品)
    • NO的支持关闭或用作数据处理(匿名内部类类是一个非常详细的替代品)
    • 在总检查异常,或更特别制作检查(例如,unrecoverable SQLException异常)
    • NO水平的支持所有的语言文字
    • 当NO的推理型constructors of通用类是所谓的单位类型参数(S)必须重复在双方的"="


    C + +

  • 模板语法
  • 金刚石的继承问题
  • 在1994:14 /漆是现代语言的标准库的一个小的升压是close)。
  • iostreams
  • 在iostreams的语法使用
  • Python

  • 空间是有意义的(有时)
  • underscored关键字
  • 公司的线程支持(至少现在)
  • "自我"而不是"这个"
  • 空间是有意义的(有时)

  • Objective-C

    1)没有命名空间的命名公约手册,"I Don’t心灵这类分离的条件,但我是做小姐能进口类定义的所有命名空间A A线(样单进口com.me.somelibrary。*)。

    2)有一些孔在图书馆安静区样重要的正则表达式的支持。

    3)物业是一位笨拙的语法要求,三线(两个单独的文件中声明a)物业。

    4)我喜欢保留/释放模型,但它是更容易比它应该释放a参考然后小心化妆后使用它。

    5)在需要的语言特征是A,是一intertwined Xcode使用Objective-C i不能帮助思考这方面的……完成基本的酒店,是非常iffy。它更像一个系统奖励的东西你想你发现了它的存在,然后后来作为一个选择。然后我想我从来没有喜欢自动完成的引擎。


    C++

    • 串。它们与平台字符串不可互操作,因此您最终有一半时间使用std::vector。未定义复制策略(写时复制或深度复制),因此无法为直接语法提供性能保证。有时它们依赖于STL算法,这些算法使用起来并不十分直观。太多的图书馆都有自己的图书馆,不幸的是,它们使用起来更为舒适。除非你必须把它们结合起来。

    • 字符串表示的多样性现在,这是一个平台问题-但我仍然希望当一个不那么顽固的标准字符串类可以在更早的时候使用时会更好。我经常使用以下字符串表示:

      • 普通lpctstr,
      • 由cotaskmemalloc分配的lpc(w)str,
      • BSTR
      • (W)字符串,
      • CString
      • STD::载体
      • 将范围检查和基本操作添加到已知长度的(w)char*缓冲区的roll-my-own类(sigh)
    • 建立模型。我已经厌倦了花在和谁包括什么、转发声明、优化预编译头和包括保持至少增量构建时间可承受等方面的所有时间。这在80年代是伟大的,但现在呢?打包一段代码有很多障碍,所以它可以被重用,甚至连妈妈的狗也会厌倦听我说话。

    • 难以解析这使得外部工具特别难以编写,并且很难正确地编写。今天,我们C++的成员大多缺少工具链。我喜欢我的C思考和代表,但没有他们我也能活下去。如果没有伟大的重构,我就不能。

    • 线程太硬语言甚至不认识它(到目前为止),而编译器的自由——虽然伟大——也会带来痛苦。

    • 静态和按需初始化从技术上讲,我在这里作弊:这是"打包代码以便重用"中的另一个难题:只有在需要时才初始化某些东西是一个噩梦。对于所有其他redist问题,最好的解决方案是将所有内容都放到头中,这个问题说"neener-你不能"。

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


    JavaScript:

    • 可以修改Object原型。程序中的每一个对象都会得到新的属性,有些可能会中断。

    • 所有对象都是散列图,但是很难安全地使用它们。尤其是,如果你的钥匙恰好是__proto__,你就有麻烦了。

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

      • 推论:调用不带对象符号的函数或new运算符会导致this被设置为与全局对象相等,从而导致许多破坏。
    • 尽管这两个操作根本不同,但重载的加法运算符也执行字符串连接。当您期望的值实际上是一个字符串时,会导致痛苦。

    • ==!=运算符执行类型强制。不同类型之间的比较包括一个没有人能完全记住的规则列表。这可以通过===!==运营商的存在来缓解。

    • nullundefined都存在,它们的含义有着微妙的不同,但又是多余的。为什么?

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

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

    • 没有块范围。

    • 不能多次声明同一个变量。

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

    • with { }

    • 很难用类似javadoc的工具来记录。


    Python:

    • 缺乏静态类型
    • 默认参数处理(特别是您可以更改将来调用方的默认参数!)
    • 所需下划线太多(构造函数必须称为__init__)
    • 缺乏适当的私人成员和职能(公约只是说,大多数以下划线开头的东西都是私人的,除了像__getattr__这样的东西以外,其他东西都不是私人的)
    • print转换为一个文件的有趣语法(但它们在python 3中修复了这个语法)。


    C.*

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

    • 不能将对象初始值设定项语法与"readonly"字段/private setautoprops一起使用。通常,我希望在生成不可变类型方面获得语言帮助。

    • 对命名空间和类、方法、属性/索引器块以及多语句块和数组初始值设定项使用{}。这使得你很难知道他们是分开的还是错配的。

    • 我讨厌写《江户记》1(4)。我不想回到方法调用语法,因为查询语法缺少某些内容。

    • 我想要一个查询语法的do子句,类似于foreach。但那不是真正的查询。

    我真的够到这里了。我认为C非常棒,很难找到很多坏掉的。


    PHP

  • 如果您不控制服务器,就没有调试功能,即使这样,它们也有点糟糕。
  • 大量错误的PHP代码四处浮动,给所有的PHP程序员起了一个坏名字。
  • 函数命名不一致
  • 如果我想要一个静态类型的变量,就不能使用它(90%的时候我都非常喜欢动态类型)
  • 注册全球是魔鬼

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

    • 套接字库语法。
    • 没有函数重载。
    • C型字符串。
    • 缓冲区溢出。
    • 神秘语法。我不知道我找过多少次像阿托伊这样的东西,拍了拍我的额头,然后大喊"当然!"

    编辑:如果我使用更多的库代码,我可能会想出更多的方法(比如使用套接字,但那些代码特别糟糕),但我已经觉得自己在选择C时作弊了。有这么多语言存在,只是为了利用C的好部分来替换坏的部分,这有点像打败一匹死马。


    智力测验

    • 你的重点是你的图灵完成了?!我可以在Perl正则表达式中做更多的工作!

    • 缺少对象。拜托,大家!就像,你好…

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

    • 没有一流的功能。恭喜你,你会同情你的爪哇朋友。

    • 一个无限的存储磁带。这是一种非常矫揉造作的论调,我们不妨写点口齿不清的话。


    普通Lisp:

  • 关键词往往过于冗长。
  • 图书馆的支持是可怜的。
  • 在希望更严格地处理内存的操作系统中工作不好。
  • 没有很好的工具与操作系统进行交互。
  • "循环"功能没有很好的定义,当然看起来不那么含糊。

  • JavaScript

  • 数字作为字符串-数学可以当数字是以字符串的形式出现。5+2=52?GRRR…
  • 权限-所有最好的东西都需要用户的权限!
  • 屏幕更新-浏览器必须处于稳定状态才能更新屏幕。似乎没有办法强制屏幕在脚本中间进行更新。
  • 慢-虽然谷歌的Chrome很不错…
  • 浏览器的不同使得使用这种语言成为一种[审查过的]。

  • PHP:

    • 我们永远不能确定所有Web服务器上都有某些几乎常见的扩展。
    • 试图成为未来的一切(goto,闭包,…)
    • 对于没有经验的用户来说,许多安全风险
    • 更多的操作符重载会更好
    • 所有不知道如何使它正常工作的可怜的程序员,给它起了个坏名字。

    然而,PHP是(脚本)语言。;-)


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

    • 绿色线程+阻塞C库=巨大失败
    • 太慢了
    • 标准库本身与Bang的使用不一致!方法
    • 模块include+extend混乱。
    • "开放类"不能确定范围-我想添加一个字符串dostuff,但我不希望它泄漏到所有第三方库中。
    • 没有二进制部署打包解决方案。


    VB6

  • Windows只。
  • 不再支持。
  • 阵列可以在任何数,而当时所有被标准化为0。
  • 许多应用程序依赖于编译DLL的运行时间。
  • 浏览器控件的许多复杂的控制或像一个复杂的代码块,打破当你运行在IDE未编译的代码,但只是当编译工作精细。

  • Delphi:

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


    JavaScript

    • 每个脚本都在一个全局"名称空间"中执行……在处理来自不同源的脚本时,必须注意这一点

    • 如果使用了一个变量,但在手工之前还未定义,则该变量被视为全局变量。

    • 浏览器供应商根据自己的喜好制定标准,使美国开发人员使用如此漂亮的语言进行编码的难度超过了应有的水平。

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

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


    哈斯克尔:

  • 从懒惰的评价空间泄漏。
  • 数字层次的困境与重构abstractions到数学。
  • 使它更严格的一个IO总线调试。
  • 大手柄实现I/O方式似乎相当不兼容的标准。(这是唯一的输出,输出低8位人物——然后使用内置的代码,那么这是假设待办事项二进制I / O ICK)。
  • 结合大学($)算子可以让一些prettier表达的变化。
  • 大多数的论文不要上升到水平的恨,和有人试图修复或固体解决方案构建每个大学的论文。

    编辑:这是个有点混乱。有些人似乎认为这是一个良好的命令参数,但我不想解释什么,我不是。我只是人,我到下面的链接点,http://hackage.haskell.org TRAC / / / / changedollarassociativity Haskell wiki的素数,这表示它好。


    我知道我参加晚会迟到了,但仇恨是永恒的!

    爪哇

    • runtime.exec()。所以,如果我不手动清除stdout和stderr缓冲区,我的代码会挂起吗?真的。死吧,PLZ。
    • 空指针异常。负责任的编程意味着我必须像对待未爆炸的炸弹一样对待大多数对象,这在面向对象的语言中是一种pisser。当不可避免的事情发生时,我需要知道哪个对象在我的脸上爆炸了,但是Java显然感觉告诉我会作弊。
    • 文件I/O。为什么我要跳过这么多圈才能读取DAG文本文件?在复制文件时,我必须将源文件漏斗状地放到我的代码中,然后手动处理输出字节缓冲区?你是认真的吗?
    • 原语与原语包装。请注意,Java现在有许多特性,允许您在某些地方处理原语及其包装对象,而不是在其他地方可互换,不用担心,编译器会让您知道哪个是哪个。这就像是一个围绕着一个基本上是断断续续的设计决策工作的黑客。就是这样。(编辑:事实上,编译器是一个比我想象的更糟糕的安全网,尤其是在进行相等性检查时。如果"a"和"b"是整数,"a==b"只有在其中至少一个类型为"int"时才能保证其行为符合预期。如果它们都是"integer"类型,那么只有当这两个数字介于-128和127之间时,该语句才会执行您认为的操作。` integer a=1000;integer b=1000;return a==b;`将返回'false`。真的。
    • XML。我有一个非常简单的小XML文件需要创建,我必须做什么?


    Salm Talk

    • 我不想在Java、Delphi、C语言或Ruby中开发(这是不实用的,因为我公司的主要开发语言是C语言、Delphi和Java)。
    • 从左到右的评估。
    • 有类注释,但没有方法注释(至少在squak中)
    • 没有真正的标准库,细节差异很大
    • 缺少命名空间


    卢阿

    我喜欢这门语言,但有一些东西多年来一直困扰着我!

    • 不支持二进制操作(从5.1开始,它可能随5.2一起提供)。
    • 应该有一个内置的二进制缓冲区实现,例如允许就地长字符串连接。
    • 我知道它不适合语法,但有时我会怀念longvariablename++或verbosaviablename+=5。
    • 参考文献假设了C的知识(我有它,但对于新来的人来说是一个减号),并推迟了一些对C参考文献的帮助!有时也太短了。
    • 它开始拥有大量的图书馆,但是你必须从不同的地方获得它们。另一方面,下载量非常小!;-)


    Python

    • 1-3:没有明显的打包/构建/文档系统选择(如Perl的cpanPOD或ruby的gemrakerdoc

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

    • 5:Jython,Ironpython,CPython不兼容。


    VB.NET

    • AndAlso/OrElseAnd/Or的行为似乎是倒退的。也许应该换个位置。
    • When只能用于异常捕获。有条件地执行When的能力对于其他一些事情来说是很好的。
    • 在vs-ide中没有friggin重构(实际上不是语言的错误),就像在c中一样。#
    • Not Is Nothing。是的,这已经由IsNot进行了修复,但出于某种原因,我看到Not Is使用得太频繁了。(我更频繁地看到,在把英语作为第二语言的开发人员中,从这个角度看,它有更好的意义吗?)
    • 它不需要ToString()上的()和大多数功能。(导致草率的编码习惯)
    • 断线时必须做_
    • 它允许可选参数。(导致草率的编码习惯)
    • 声明数组是由UpperBound完成的,而不是由容量完成的。"将arr(2)变暗为字符串"将实际容纳3个元素。
    • 使=成为比较和赋值运算符。


    目标凸轮

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

  • 没有类型类(或其道德等效类)。这里有furuse-san的gcalm,但是它是a)不如类型类好,b)不在inria分布中。

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

  • 函数是可恶的。说真的,模块应该是一流的值。应该只有一种功能。读蒙塔古和R_我之前,你火焰我为这个。

  • 应该使用llvm作为后端。我要杀谁才能让ocaml为我的愚蠢的小ARM6核心编译?

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


    VBA(包括MS Office IDE):

    1)文件质量差2)错误信息差3)阵列操作程序不足4)必须对dim语句重复类型5)无法彩色打印(必须购买第三方加载项)


    我自己的Top5"我真正讨厌C++":

    [5]自动生成构造函数、析构函数和赋值运算符。伙计,每当我在课堂上不申报什么东西,就意味着我不需要它,也不是我忘了它。编译人员,听到了吗?!

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

    (3)弦。天哪,我受够了"const char*",我必须处理空的情况,我必须浪费O(n)来获取它的长度,我必须为concat操作分配一个缓冲区。

    [2]宏处理。每当我不理解编译器的情况时,我就开始寻找一个宏。

    [1]运算符重载。我看到代码"A+B*C",在看到A、B和C的实际类型之前,我一个字也说不出这个代码是关于什么的。


    Delphi(又称对象pascal),我将讨论本机版本,而不是.NET。

    • VAR块!
    • 语言中的接口是用COM使用来设计的,因此比C语言或Java更复杂。也就是说,除非您明确地禁用了引用计数。
    • try except finally end;
    • 对象创建过于明确:

      1
      2
      3
      4
      5
      6
      7
      8
      var obj: TMyObject;
      ...
      obj := TMyObject.Create;
      try
        ...
      finally
        obj.Free;
      end;

    而是像

    1
    auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block.
    • 好吧,语言太好了,我真的想不起来了,所以我把自己推到这里:内置类型,如字符串、整数。或者枚举最好有方法。即用i.ToString代替IntToStr(i)


    Lua:

    • 我明白原因,但我是认真的。默认情况下,变量应该是本地的,使用global关键字,而不是相反。
    • 一般来说,我不太喜欢do/end风格的语义。我更喜欢C型背带。
    • 动态键入。我知道,你们中有些人会说"啊?"但我完全被宠坏了,因为我知道给定变量中的具体数据类型。持续的if (type(var) =="string") then stuff() end是一种痛苦。
    • 变量在使用前不需要定义。我更愿意对我要做的事情直截了当,而不是冒着打字错误的风险去做我喜欢称之为"古怪豆"的事情。

    PHP:

    • 同样,动态输入。
    • 没有封口。我知道,你可以做$function($arg);,但那不算数。
    • 同样,变量可以在定义之前使用。我有一个个人策略,在使用任何变量之前,总是将其显式初始化为已知值,并将其扩展到我可以控制的任何最佳实践文档中。

    C/C++:

    • 头部=颈部疼痛。
    • 不支持关闭。(我对C++0x感到兴奋,这有它们。)
    • 静态类型。""等等,"你说。你刚才说你不喜欢动态打字!"是的,我确实说过。但是静态打字也会让人很痛苦。(如果给我一个选择,我仍然会选择静态类型。)最理想的情况是,我想要一种默认静态类型的语言,但也支持动态类型。(我还想要一匹小马,五百亿美元,请告诉全世界。)


    红宝石:

  • 该死的慢
  • 自负的群体
  • 不是很小的谈话
  • 对nil调用方法时出错,而不只是返回nil_la目标C
  • 非本机线程

  • C

  • 无参数多态性(即C++模板)。它使编写可重用的数据结构和算法成为一种痛苦(几乎没有任何静态检查)。例如,请参见qsort和bsearch的comparator参数:comparator接受void指针:(
  • 没有数据结构库。我真的讨厌自己写哈希表。我也真的不喜欢在网络上搜索可重用数据结构库。尤其是如果它是不完整的。
  • 串。表示效率低下,如果使其正常,就太难安全地输入字符串,那么就太难处理了。snprintf没有标准。很难用sprintf创建格式字符串,然后用它以安全的方式再次使用sprintf创建字符串。
  • 只有词汇宏。如果不同的编译器期望函数注释出现在不同的地方,那么我必须将相同的HAS_NO_SIDE_EFFECTS放在不同的地方。为什么我不能抓住函数,切换编译器类型,然后通过宏调用在正确的位置插入它呢?
  • 没有用于公共功能的可移植库。对于插座和线程,我使用SDL——一个无聊的游戏库。对于.ini风格的解析器,我能找到的唯一一个为Ubuntu打包的库,我发布在每日的wtf上(它计算哈希值数组,然后对其进行线性扫描…)
  • C++

  • 模板语法很重而且不受欢迎。让我看看,for(map::const_iterator it = mymap.begin(); it != mymap.end(); ++it)
  • STL中的设计错误。改变向量的分配策略真的应该改变它的类型吗?
  • 过于复杂的类型系统。类型T1有一个convert-to-t2方法,t2有一个隐式的from-t1构造函数。哪个叫?重载、重写和多重继承是如何交互的?糟糕,我想…
  • 来自模板的异常长和笨拙的错误消息。你知道我的意思…
  • 引用意味着您在调用站点上看不到输出参数。在C语言中,您可以猜测foo(bar, &baz)可以和不能修改的内容。

  • JavaScript

  • 函数对象语法:

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

    (它采用n个参数,第一个n-1是函数的参数,然后n是实际函数,in字符串形式。这太傻了。)

  • 函数参数可以是重复的。

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

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

    1
    2
    f("bye","hi" ) // returns"hi"
    f("hi" ) // returns undefined
  • E4X应该就死了。我的用户是总是抱怨没有按他们认为的方式工作。我们面对现实吧,当你需要一页的时候半个伪代码塞特,是时候反思一下了。

  • 一个标准的概念stdin/stdout/stderr(和文件!)会很好。

  • 无效的!=未定义的

    必须处理是件令人恼火的事两者都有。有时候它很有用,但大多数语言都是一瘸一拐的还有一个很好。


  • C.*

    这是一种很好的语言,尤其是LINQ,但是泛型支持比C++更差。它有很大的潜力,但是当前的实现只对强类型集合和类似的琐碎事情有用。它的下落示例:

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