web-dev-qa-db-ja.com

好きな言語で嫌いな5つのことは何ですか?

最近、Stack OverflowにはPerl嫌悪の集団がありました。そこで、「 お気に入りの言語について嫌いな5つのこと 」の質問をStack Overflowに持ち込むと思いました。あなたの好きな言語を取り、あなたがそれについて嫌いな5つのことを教えてください。それらは、単にあなたを困らせたり、設計上の欠陥を認めたり、パフォーマンスの問題を認識したり、その他のカテゴリにしたりするかもしれません。あなたはただそれを嫌う必要があり、あなたの好きな言語でなければなりません。

他の言語と比較したり、すでに嫌いな言語について話したりしないでください。好きなことを好きな言語で話さないでください。私はあなたが嫌い​​であるが、他のすべてのものを使用できるように許容するものを聞きたいです、そして私はあなたが他の人が使用したい言語についてそれを聞きたいです。

誰かが私に自分の好きな言語をプッシュしようとするたびに、そして時々インタビューの質問としてこれを尋ねます。お気に入りのツールについて嫌いなものを5つ見つけられない場合、そのツールを提唱したり、それを使って大金を引き寄せたりするのに十分な知識がありません。彼は完全に探求するのに十分な異なる状況でそれを使用していません。彼はそれを文化や宗教として主張しています。つまり、自分の好きなテクノロジーを選択しなければ、私は間違っているということです。

どの言語を使用するかはあまり気にしません。特定の言語を使用したくないですか?しないでください。デューデリジェンスを経て、十分な情報に基づいた選択を行い、それでも使用しないのですか?いいよ正しい答えは、「あなたには良い実践とBarでの豊富な経験を持つ強力なプログラミングチームがいます。Fooに変更するのは愚かなことです」です。


これは、コードレビューにも適した質問です。コードベースを本当に知っている人はそれについてのあらゆる種類の提案を持ち、あまりよく知らない人は非特定の苦情を持ちます。 「このプロジェクトをやり直すことができたら、どうしますか?」この幻想的な土地では、ユーザーとプログラマーは、自分が好きではないあらゆるものに不平を言うようになります。 「より良いインターフェースが欲しい」、「モデルをビューから分離したい」、「このモジュールの代わりにこのモジュールを使用したい」、「このメソッドのセットの名前を変更したい」、またはそれらが本当にするもの現在の状況が好きではありません。これが、特定の開発者がコードベースについてどれだけ知っているかを把握する方法です。それはまた、プログラマーの自我がどれだけ私に言っていることに縛られているかについての手がかりでもあります。

憎しみは、人々がどれだけ知っているかを理解する唯一の側面ではありませんが、私はそれがかなり良いものであることがわかりました。彼らが嫌いなものは、彼らが主題についてどれだけよく考えているかを示す手掛かりにもなります。

404
brian d foy

PHP

  • ほとんどすべての標準機能はグローバルスコープにあります
  • 一貫性のない関数引数の順序
  • 一貫性のない関数の命名
  • 大文字と小文字を区別しない関数
  • スクリプトは、php.iniファイルによって異なる動作をする場合があります
  • 未定義の変数を使用できること
  • 関数で使用する前に結果を変数に割り当てる必要がある場合があります

そしてはるかに主観的に:

  • 動的な入力
2
Yacoby

Python

  1. DjangoにPythonはありません3。
  2. 静的タイピング。はい、動的型付けは素晴らしいことですが、時々静的にしたいです。
  3. 適切なUnicodeサポート(Python 3で修正)
  4. コンストラクターの命名。私はこのすべてのアンダースコアを嫌います__in__私のコード。
  5. スレッドはあまり効率的ではありません
2
Davinel

共通のLISP

  • インターフェースはほとんど同じですが、条件はクラスではありません(クラスは後で来たため)
  • 名前の一部は、たとえば、flet/labels(違いのみ:scope)、defvar/defparameter(違いのみ:既に定義されている場合の動作)、または任意のビット調整関数(dpb、ldbなど)です。
  • パッケージは...本当に正しいのは難しいです-私はそれらを理解すると思うたびに、彼らは私がしたいことをしません
  • 組み込みのデータ構造と関数は、可能な限り汎用的ではありません(たとえば、なぜ独自のハッシュ関数を移植可能に定義できないのですか?)
  • 関数、変数などの複数の名前空間(原理的にはこれに反対ではありませんが、CLは複雑すぎます。ノービグは仕様からはわかりませんが、少なくとも7つの名前空間があるようです)
2
Ken

私のお気に入りの言語で一番嫌いなのは、私の選択が変わり続けることです。 The Oneを見つけたと思うたびに、5つ(またはそれ以上)嫌いなものを見つけます。そして、あそこの芝生はもっと緑に見えます...

2
WReach

Python:

私はまだpythonの適度なユーザーであるため、私の苦情は知識のロックまたは誤用である可能性があります。コメントを歓迎します。私はこの言語が大好きです。

  1. 不十分なスレッドサポートとGIL。マルチコアプラットフォームを使用したい場合、ほとんどのpythonプログラマーはおそらくマルチプロセッシングまたは何らかの処理を推奨しますが、スレッドを使用しないでください。期待するパフォーマンスが得られません。
  2. インスタンス変数のみのプロパティ。 _class_var = property(classmethod(some_method))は機能しません。プロパティラップクラス変数を取得するにはどうすればよいですか?
  3. アクセス制御なし。すべてのアクセス制御は構文マングリングです。 privateが__privateであるように、protectは_protectedなどです。そして、すべてのプログラムがpython命名規則に従うことを望みます。さあ、私たちはそれよりもうまくやることができます。
  4. 私は、pythonのシンプルで明確な構文という哲学に同意しますが、サポートされていないいくつかのシンプルで明確な構文は、良い判断の鍵のようです。 a ++、++ a、a-、-a、self-de/incrementなど、何が問題なのでしょうか? foo =(a> b?a:b)単項演算、何が問題なのですか? (私はpy2.6に似たものが導入されていることを知っていますが、それらの単純な構文のためにほぼすべての他の言語の大規模なサポートを考えると、なぜホイールを再発明しますか?なぜベストプラクティスに従うだけではありませんか?良いことを続けるべきではありません"形"?)
  5. インターフェイスするプログラム。 Pythonにはインターフェースも抽象クラス概念もありません(py3kにはabcと呼ばれるものがあります)、すべてが具体的です。クラススケルトンを構築し、クラスの継承と拡張を保護するために「インターフェイス」または「抽象」キーワードを提供することは、悪い考えではないでしょう。トップダウン設計に役立ちます。現在、各メソッドにNotImplementedErrorを入力するだけで、非常に退屈な仕事です。
  6. これを追加する必要があります。 3.x未満のバージョンにはstr型とunicode型があります。これは本当の悪夢です。アスキーと非アスキー/ユニコードの混合が失敗する可能性が最も高くなります(悪い、悪い)

私は人々が速度について文句を言うのを見ました。わかりません。そのインタープリター言語、ランタイムまでマシンコードにコンパイルされないコード、それはまさにその性質です。インタプリタ言語とコンパイルされた言語の速度を比較することはできません。私が見る限り、インタープリタ/スクリプト言語の中で、pythonは遅くありません。

2
jimx

PHP:

  • 不条理なassert()関数...それは内部のコードでeval()を実行します
  • ?>タグは、それに続く改行を削除しますか?!
  • 数値文字列の奇妙な処理(配列キーとして試してください)
  • もはやと思われる痛みを伴うUnicodeサポートはPHP 6によって解決されます
  • エントリーの低コストは、95%がPHPプログラマーに恐ろしい名前を付けることを意味します。
2
user350443

共通のLISP

  • 最新の機能(ソケット、スレッドなど)のための標準ライブラリの欠如
  • ネイティブウィンドウシステムにマップする標準化されたUIを使用できます
  • ラムダ式を変数に割り当て、関数呼び出しとして変数を直接使用するSchemeの機能は、FUNCALLに当てはまります。複数の名前空間を持つことの副作用、私は推測する
  • ライブラリの複数の実装から簡単に使用できるように、ライブラリの標準化されたソースレベルのパッケージングシステム

強く型付けされたLISPはどのようなものになるのだろうか

2

私は実際にフルタイムで使用することはできないので、手足に出かけますが、とにかく試してみます!

Perl 6

  1. func( "frew")!= func( "frew")
    • それは私を悩ますが、それには正当な理由がある。 Perl 5では、print(5 + 6)* 10stillで時々取得されます
  2. 多くの場所でPerl 5よりも解析しやすいかもしれませんが、それでもエディターを時々殺します
  3. 多くの人を怖がらせるPerl 5の回線ノイズがまだたくさんあります。それは彼らを興奮させることなどが難しいことを意味します。
  4. ライブラリはまだありません。
    • Perl 6が実際にPerl 5をサポートすることになれば、これは問題ではありませんが、負担する価値のない負担になる可能性があります。
  5. REPL、またはルビイストがirbと呼ぶものはありません。
    • タブ補完、カラーコーディングなどを備えた堅牢なインタラクティブPerl 6を使用すると、タブ6の使用と学習が非常に便利になります。
  6. 現在、 documentation は基本的に英語の仕様です。簡単に読むことはできません。
  7. 私はそれが愚かな決まり文句だと知っていますが、まだ出ていません!
    • (私が助けているので、私は文句を言うことが許されます:-P)

最初の3つは言語です。残りは実際には言語そのものではなく、まだ公開されていないという事実です。

2
Frew Schmidt

Perl

私はこの言語が大好きで、すでに使用されているものを追加したくありませんが、誰もまだこれについて言及していないので、私はそれをポットに投げます。この機能を使用したとき、それが私の人生で最も恐ろしい経験であることがわかりました(そして、アセンブリ言語で働いてきました)。

  • write()およびformat()関数。

想像できる最悪の、uい、最も恐ろしい単一の構文がありますが、まだanyよりも多くの機能を提供することはできませんsome(無限にきれいな)printf()が動作します。 誰もeverこれらの2つの関数を使用して出力を行わないでください、単にそれらがいかに悪いかという理由だけで。

私は誰かが意見を異にするだろうと確信していますが、彼らが私の問題を解決することを望んで、彼らを調べたとき、私は彼らが「ビッグ・リボウスキを引用する」「痛みの世界」であるとわかり、Perl6がそれらを使用するか、より良い方法で完全に書き直して、より使いやすく便利なものにします。

2
Chris Lutz

Python

  1. 標準ライブラリは、多くの場所で独自のスタイルガイドラインに従っていません。 (PEP-8)
  2. Py3kのスーパーキーワードは不要な魔法でいっぱいです(別の名前に割り当てることはできず、selfなしで動作します。なぜこの明示的なパラメータがあるのですか?すべて?)
  3. Py2kでのUnicodeサポートは不完全であり、Py3kを吸い込みます(Unicodeの標準入力、バイナリデータなし!WTF?新しいWSGI標準の作成はハッキングです)。
  4. GIL。非常に限られたマルチスレッドサポート(CPythonを使用)
  5. PyPI(Python Package Index)はダメです。 rubygemsをviousむ
2
passy

ハスケル

  1. 型システムが逆に感じることがあります。コンパイラに変数の型を推測させたくない場合はどうすればよいですか?上記の変数の制約チェックを行う逆の場合はどうなりますか?たとえば、リストの要素の型を推測する代わりに、それらがすべて特定の型クラスに属していることを確認します。これは微妙ですが大きな違いであり、UIのプログラミングが困難になります。実行できますが、他の言語で実行するよりも多くの労力が必要です。 HaskellはUI以外の部分を好むが、UIは型付けされていない言語に任せる。

  2. 無限値の構築を許可すると、時には非常にイライラするエラーが発生します。

  3. NoMonomorphismRestriction。

  4. バイト文字列の処理は時々お尻に噛みつき、あなたがそれらを不適切に混ぜたためにプログラムがクラッシュするまであなたはそれを知りません。ここで何かが間違っています。これを防ぐはずの型情報が失われているときです。

  5. 型クラスは、目撃型のような些細な場合に自動的に派生する必要がありますが、乱用の可能性が高いです。

2
user350201

C

  • とても柔軟で強力なので、本当にひどい、またはまったく危険なコードを書くのは本当に簡単です(あるいは、あなたが好むなら、「大きな力には大きな責任が伴います」)。
  • 割り当てには「=」、平等には「==」。 「if」ステートメントで混同しやすい。
  • 言語の多くの基本的な部分の実装はコンパイラに依存しています。例えば基本型のサイズ、ビットフィールドのビットの順序、パディングおよびユニオンのバイト順序。
  • ビットフィールドはパラメーター化できません(つまり、intの配列はできますが、ビットの配列を持つことはできません)。
  • 文字列の処理を改善できます。
2
Steve Melnikoff

c#:

1)静的メソッドはクラスのメンバーでなければなりません

2)静的拡張メソッドは静的クラスにのみ追加できます

3)インターフェイス関数の実装には、「オーバーライド」などのマークが付けられていないため、基本クラスまたはインターフェイスからのものであることが示されます(コードレビューだけで、(正しい署名を使用して)期待するメソッドをオーバーライドすることを困難にします) 。

私はちょうど3を持っています。私はそれがかなり良いと思います。

2

C#

私はその愚かさを知っていますが、データ型を自分で欲しいものに変換したいのです。(int)Convert.ToInt32などを追加する必要はありません。時間を節約できます。そして、intを出力するために何かを書いたときに、longが必要であることが判明した場合、それを機能させるために、行ったことをすべて変更しなければならないことがよくあります。私のためにそれをしてください!

申し訳ありませんが、5つは考えられませんでしたが、私は新しいので、多分私は戻って、後でもっと追加するでしょう:P

2
Sir Graystar

C++が嫌いな5つのこと

  • リンク時間。分散ビルドを使用すると、リンカーの実行にかかると同時にプロジェクト全体を再構築できます。
  • メモリ操作の並べ替えを防止する標準的な方法はありません。書き込み結合メモリを使用するには、通常、volatileキーワードの乱用が必要です。通常、読み取りの並べ替え(SIMD数学パイプラインを処理する際の最適化に重要)は、ルーチンの途中でnull ASMブロックを挿入することで防止できます。
  • 文字列化の問題を回避するマルチステップマクロ:
#define STR_LINE2(x) #x#define STR_LINE(x)   STR_LINE2(x)#define LINE_NUMBER STR_LINE(__LINE__)
  • 文字列操作を行うのは、一般的に苦痛です。
  • 標準化されていないprintfバリアントの増殖(vsnprintf_s対_vsnprintf_s)。
2
Vorlauf

Python、再び:

  1. スイッチキーワードはありません。いいえ、辞書はそれに代わるものではありません。 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
    

追伸:" ".join(l)は素晴らしい人です。文句を言うのはやめましょう、それは明らかではありませんが、イテレータパターンを念頭に置いて、それを行う正しい方法です。

2
e-satis

C#

  • メソッド引数の実行時タイプに基づく複数のディスパッチの欠如。 dynamicはこのほとんどを解決するはずですが、まだリリースされていません。
    • インターフェイスの実装は、構造的ではなく宣言的です。 GoogleのGo言語が型を行う方法がとても気に入っています
    • 非同期メソッド呼び出しの作成は本当にかさばります(そして、すべてのスレッドが軽量スレッドではなくOSスレッドであると確信しています)
    • マクロシステムはありません。ここでは、Cスタイルのマクロについては説明していません。私はLISP/Schemeスタイルのマクロを話しています
    • 演算子は静的メソッドであり、そのシグネチャは過度に制約されています(新しいものを作成することはできません)。
  • 2
    Robert Davis

    EL-式言語、JSPページの${...}および#{...}の事柄、および基礎となるJavaコードからデータをプルアップするために使用されるJSF 2.0 Facelets。

    • パラメーターを使用したメソッド呼び出しや注釈ベースの名前付けなど、楽しいことはすべてGlassfish v3でのみ使用可能なJava EE 6のELにのみ存在します。
    • 1)以前のServlet 2.5コンテナに適切なjarを取得し、2)コンテナで利用可能な以前の実装を妨害することなく動作させることは、王室の苦痛です。
    • 1.2のようなJSFの以前のバージョンのみを使用すると、メソッド呼び出しが不要になり、f:setPropertyActionListenerを操作することができます- http://weblogs.Java.net/blog/2009/07/22/say-sayon​​ara -spal -これを信じてください、あまり良くありません。
    • ELパーサーにはno解析および解釈するスニペットがどこから来たのかという考えがあるので、少なくともできるようにすべてにidを与える傾向がありますどのtagが不機嫌になったかを特定します。
    • EclipseはJSF 1.2であるため、すべてのELメソッド呼び出しで警告を出します。だけも。

    C#

    • 参照型はデフォルトでNULL可能です。言語内のnullキーワードは型指定されていません。
    • 差別された組合の欠如
    • defaultなどの例外、非例外的なエラー処理方法-代替手段はあまりありません。
    • 古風なswitchステートメントの構文と制限
    • コンストラクター+静的メソッドの不必要な区別
    • 静的メソッドをインターフェイスの一部にすることはできません
    • 明示的なインターフェイスの実装ではなく、形状によるインターフェイスの実装の欠如-linqクエリ構文、foreach、コレクション、オブジェクト初期化子など、多くの言語設計ハックにつながります。これらはいずれも柔軟に再利用できません。たとえば、オブジェクト初期化子の構文はNiceかもしれませんが、不変オブジェクトではうまく機能しません。
    • 実装とは無関係にクラスの「インターフェース」を継承することはできません-インターフェース、抽象基本クラス、いくつかの一般的な実装を提供するコードの重複とオーバーアーキテクチャ化されたコードにつながり、使用する各ビットを選択する方法がありません。また、インターフェースではなく実装タイプを明示的に参照するのが一般的であるため、特定の実装に密結合しているコードが多すぎます。
    • クラスの「インターフェース」はその実装に密接に結合されているため、合成を介して継承を乗算することはできません。事実上、ミックスインの欠如。
    • 上記のインターフェイスの制限により、どのタイプの階層でも自然に重複しない、実質的に同一のインターフェイスが急増します。 IComparable vs. IEquatable vs. IComparable<T> vs object.Equals vs. operator ==などなど。拡張により、これらすべてを満たすカスタム型を作成することは、必要以上に多くの作業を行います(特にコレクションクラスの場合)。明らかに、言語設計者はこれを認識しているため、linq、foreach、コレクション初期化子など、インターフェイスごとではなく形状ごとに機能するさまざまな回避策があります。
    • Layout-is-structureではなく、括弧と中括弧の冗長な使用。
    • 戻り値は無視でき、型推論の有効性が制限されます。
    • 列挙型は通常の型ではなく、メソッドを持つことはできません。また、列挙値はタイプセーフではなく、値が0でなくても0に初期化される場合があります。フラグ列挙と非フラグ列挙をまとめて比phorを混合する。
    • 適切な値型のサポートの欠如。値型は継承できず、異なるコンストラクタセマンティクスを持ち、CLRの制限によりパフォーマンスが低下します。また、値型に関する混乱したセマンティクス:一部の値は実際に値であり(変更できません)、他の値は実際にはエイリアスがなく、nullでない参照(変数)です。これは、次の問題に関して特に混乱を招きます。
    • フィールドとプロパティの意味的な区別、特に可変性修飾子の欠如との関連(ala C++のconst
    • ジェネリックを専門にできない
    • デフォルトのジェネリック型パラメーターを提供できません(例:ファクトリージェネリック)
    • typedefがないため、ジェネリックを使用するのが苦痛になります(usingは限定的ですが、知っておくと便利な代替品です!)
    • 型以外のもの(関数、プレーンな値、名前など)を一般化することはできません。これは、依存関係プロパティの一般的な実装を行うことができず、依存関係プロパティのような厄介な実装につながり、結果としてコードスニペットと可読性の低いコードの乱用が発生することを意味します。
    • ジェネリック型の要件を指定する制限された機能。 int、double、およびbigintの両方を使用する一般的な合計メソッド(トリッキーで、多くの場合低速のハッキングなし)。
    • インターフェイスメソッドの実装または仮想メソッドのオーバーライドは、より具体的な型を返すことも、より一般的な型を受け入れることもできません。つまり、C#4でも限定された相互/共分散のサポート。
    2
    Eamon Nerbonne

    私がNemerleで再送する5つのこと:

    • ローカル関数は生成できません
    • ラムダをコンパイルする能力は、インライン化されるかどうかに依存する場合があります
    • タプルの一貫性のない値/参照型のセマンティクス
    • 配列インデックスと型引数のあいまいなあいまいさ
    • 一般的な採用の欠如
    2
    Don Reba

    C++

    • テンプレートが関係する場合の不可解なエラーメッセージ
    • テンプレートの制約の欠如(多くの場合、テンプレートのメタプログラミングで回避できますが、ほとんどの場合、コードが読めなくなります(少なくとも平均的なプログラマーにとって)
    • メンバー関数構文へのポインター
    • c ++標準委員会は公式の標準をより頻繁にリリースする必要があります(または、少なくとも標準ライブラリ自体の個別の更新をリリースします)。つまり、実際にはTR1が2005年にリリースされたということです。
    • -
    2
    smerlin

    C

    1. ビットフィールド-それらは言語によって十分に指定されておらず、それらがどのように動作するかはコンパイラ依存であり、アーキテクチャ依存です。
    2. 大量のコードの中で、特定のシンボルがどこで定義されているかを見つけるのは難しい場合があります。そのシンボルがマクロによって生成された場合。思い出させる...
    3. プリプロセッサはかなりいハックであり、あらゆる種類の悪用に適しています。
    4. 標準サイズの整数の欠如(最近uint * _tで修正されましたが、DWORD、Word、BYTEなどのカスタムtypedefまたは#definesを使用して、あちこちに古いコードがたくさんあります)
    5. Perlのcpan.orgに似たものの欠如(その1つについて間違っているのが大好きです。)

    編集:CのCPANについて考えながら、私は...私はそのようなことを何と呼び、「ccan」を考え、それをグーグルで考えて、これに出会いました: http://ccan.ozlabs .org /

    しかし、まだ初期段階にあるようです。

    2
    smcameron

    R(統計のRプロジェクト)

    1. ひどい、ひどい文字列のサポート
    2. クロス集計など、いくつかの単純な記述タスクでは驚くほど難しい
    3. 大規模なデータセット操作はメモリ内で行われます。
    2
    Gregg Lind

    VBA(言語が悪いと思ったため)

    1. 行内の空白は厳密に強制されます。
    2. ステートメントは終了するだけで、次の行にブレークするには「_」が必要ですが、すべてのラインがブレークできるわけではありません。
    3. ++、-、+ =、-=ステートメントはありません。マジ?
    4. 配列は、0だけでなく、どのインデックスからでも開始できます。
    5. 一部のタイプ(つまり、固定小数点の「10進」値)はVariantのサブタイプである必要があり、独自のタイプとして使用できません。
    6. !=および<>。
    7. 「=」は、「=」と「==」に分割する代わりに、コンパレータと割り当ての両方として使用されます。
    8. 「Option Explicit」。
    9. UIは2000年以降更新されていません。
    10. Office2k7はVB.NETにアップグレードしませんでした
    11. ほとんどのオブジェクトモデルは無意味で、非常に冗長です。
    2

    Python

    • lambdasにステートメントがありません。 GRRRR
    • foo( a for b in c if d )は間違っていると感じますが、それを逃すたびに驚きます。 foo( (a for b in c if d) )であってはいけませんか?
    • ディクテーションを理解できますか?
    • マップおよびフィルター演算子にはリスト内包表記に特別な構文がありますが、reduceの場合はどうですか?または並べ替えますか?
    • yieldステートメントを含めるだけで、関数は魔法のようにジェネレーターに変換され、インターフェイスが完全に変更されます。また、そのジェネレーターは、最初のnext()の前に作業を行うことはできません。少なくとも、ジェネレーターを返す関数を使用せずに。

    JavaScript

    • モジュラーコードライブラリを作成するための簡単な構文はありません。パブリックメソッドの辞書を返す関数を呼び出す必要があります。そして、モジュールのインターフェースを変更するたびに(少なくとも)2か所で編集する必要があります。
    • クロージャーを作成するには、( 'sup dog)yo'関数から関数を返す関数からクロージャーを返す必要があります。混乱!
    • for each ( foo )の構文と動作は、後付けのように感じられます。
    • コードが実際に実行されるタイミング(およびその順序)を知ることは、より暗い技術です。確実に正しくするための唯一の方法は、すべて(はい、それも)を1つの大きなファイルに入れることです。そして、それでもdocument.onloadを待つ必要があります
    • 何か不足していますか?手動で値を構築せずにJSONシリアル化された値を取得する簡単な方法はありませんか? (はい、jQueryはこれを行うことができます。).

    Clojure

    • 関数定義のオプションおよびキーワードパラメータの組み込み構文の欠如。もちろん、簡単に追加できますが、ライブラリ作成者は使用しません。広範囲にわたる破壊はまだ良い代用品であると証明されていない
    • メソッドの組み合わせの欠如(Common LISPに見られる種類のメソッドの前後、前後)
    • Java相互運用への過度の依存。組み込みのファイルIOはありません
    • 時々、静的型付けが必要です。これは純粋な憎悪ではありません。私は通常、動的を好みます、そして、2つを混ぜる試みは主に不十分です
    • 組み込みのデータ構造用の組み込み高速バイナリシリアル化形式はありませんが、人々はそれに取り組んでいると聞きます
    2
    Zak

    C#について:

    1. Javaのようなメソッドからスローされる例外を指定するキーワードがないことは嫌です。 XMLコメントを使用するよりもはるかに優れた例外の文書化方法。
    2. また、制約の論理和や論理和などの一般的な制約に対して、より優れた構文が必要です。
    3. メソッドが複数の値を返せないのはなぜですか?
    4. 言語でのアスペクト指向プログラミングのサポートの欠如。
    5. プロパティアクセサのそれぞれに属性を注釈付けできないのはなぜですか?
    6. Perlのような組み込みの正規表現サポートの欠如。
    2
    Ikaso

    C++優れたリファクタリングツールの欠如、チェック済み例外の欠如

    Javaテンプレートの欠如、constキーワードの欠如

    2
    quant_dev

    Java-言語レベルでの構成のサポートなし

    1
    Rostislav Matl

    C#

    1. 型が数値であるかどうかを確認する簡単な方法はありません
    2. これは、おそらくMicrosoftスタックのほとんど、IISおよびMSSQLを使用してスタックしていることを意味します
    3. 特定の問題に対する特定のツールである代わりに、C#はあらゆるパラダイムの言語になろうとします。
    4. コミュニティの欠如。確かに、C#用のオープンソースのフレームワークとライブラリが登場し始めています。 Java開発者が長年利用してきたものと同じもの。
    5. 良い助けを見つけるのは難しい。インターネットには、C#の問題を解決する方法の貧弱な例が散らばっています。これは問題#3に戻ります。
    1
    CountCet

    REBOL

    REBOLはamong私のお気に入りの言語です。 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."
          ]
      ]
      
       
      ] 
       
       notify [[[email protected] http://www.google.com] [[email protected] http:// www .yahoo.com]]
    2. 再帰的な方言はPARSEで検証するのは非常に簡単ですが、評価するのは非常に困難です。 (スタックはここで役立ちます。)

    3. REBOLは、多くの一般的なテクノロジー、特にXMLとの統合が非常に不十分です。 REBOL BLOCK!データ型はXMLでできることのほとんどすべてを実行できるため、これは部分的にthis慢であると思われます。ただし、現実の世界にはXMLが含まれています。
    4. ユニコードなし。
    5. AltMeのおかげで、REBOLのユーザーコミュニティは非常に孤立しています。 AltMeを使用する理由を理解できます。 REBOLで書かれており、その強みを誇示しています。残念ながら、それは彼らを彼ら自身の小さな島に先送りにします。

    今後のREBOL 3では、最後の問題を除き、これらの問題の多くが修正されることを期待しています。

    1
    Gregory Higley

    好きな言語を選択するのは不可能だと思います。動的な型付けと静的な型付けを比較することはできないため、使用するものをリストするだけです

    C++:

    • テンプレートのメタプログラミング構文は見苦しいです。暗黙の::valueを使用すると、より簡潔になります
    • ->.コンパイラがptr.thingを実行していることを理解できず、単に->を実行できないのはなぜですか?
    • 空白が嫌いです。したがって、vector<vector<int>>全体をvector<vector<int> >にする必要があるため、そのコード行を見るたびに集中できず、int[][]または何かを使用する方法を見つけようとすることになります
    • マクロ。個人的にはマクロの概念が大好きです。しかし、C++では、システムはハックである
    • 私は;が嫌いです

    Python:

    • 不変の文字列。 string [4] = "b"ができないようにする
    • 参照によって暗黙的にコピーされるリスト。 [[0] * width] * heightの問題に漏れる
    • 末尾再帰の欠如(再帰関数を誤って入力した場合は、数千のエラーメッセージを吐き出さないようにIDLEをリグする必要がありました)
    • 辞書キーがリスト/辞書を受け入れない
    • 深いスコープの欠如。リストを理解するとき、その中の変数が外側のスコープに影響を与えたくない
    1
    Demur Rumed

    Python:配列の部分選択では、要求したものが得られません。

    a [1]は1つの要素を提供します
    a [1:2]は、[a [1]、a [2]]ではなく、1つの要素を提供します
    a [1:3]は2つの要素を与えます

    私はそれが嫌いですが、多分それは私が主にVerilogで働いているからかもしれません。

    1
    Marty

    多くの人によるとJavaは遅いですが、ある程度の使用には同意します。

    Javaは劇的です。彼らはあなたがしたいただ一つのことのためにたくさんのクラスを持っています。ただし、柔軟性プロパティXDは知っています。

    Javaは最初は難しいが、いつものように楽しい。

    「Hello、World!」を印刷するための簡単なコードを書いているときJavaを使用しないでください! XD私は正当だと確信しています。

    Javaは混合なので、純粋にOOP言語とは言わないでください。

    さらに多くありますが、私は5つのXDに制限されています。ありがとう!

    1
    Richeve Bebedor

    C#

    C#のペット嫌いの一番の理由は次のとおりです。

    (1)イベントはすべてのリスナーへの強力な参照を持っているため、イベントをリッスンするもののガベージコレクションを防ぎます。問題を確認したい場合は、「弱い参照イベントハンドラー」のようなものを作成して問題を解決しようとしたすべての人々をネット上で検索するだけです。

    (2)呼び出す前にイベントがnullに等しいかどうかを確認する必要があるのは、言語で処理する必要があるように思えます。

    (3) XMLシリアライザーには、XMLファイルのコメントを読み書きする方法がありません。 XMLファイルが手作業とC#で記述されたツールの両方で変更される環境では、あまり良くありません。生のXmlDocumentを使用するだけで回避できますが、それをクラスに抽象化できると便利です。

    (4)ビルドプロセスでは、xsdファイルなどに直接アクセスできません。代わりに、C#部分クラスを作成する中間ステップが必要です。また、これにより、XAMLファイルで問題が発生し、変更を適切に行うために2回再構築する必要がある場合があります。

    (5) MMXやSSE 1,2,3,4などのCPU組み込み関数はサポートされていないため、C#アプリを実行するとこれらの貴重なCPU機能は利用できません。

    私のトップ5にならなかった他の人:

    (6)フィールドをプロパティとしてタグ付けできません。すべてのプロパティは、get goから明示的に実装する必要があります。

    例えば。現在あります:

    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、ネットワーク、および構成配管を行うための優れた言語であり、長期的にサポートできる方法で物事を迅速に立ち上げ、稼働させるための私のナンバーワンの言語だと思います。

    1
    John Stewien

    C++

    1. 簡単なコードのスニペットを作成するには、非常に時間がかかります。
    2. for(std :: vector :: const_iterator iter = [...]
    3. vector.remove()は削除しません。
    4. vector.Push_front()は存在しません。
    5. ヘッダーファイル
    6. ラムダなし
    7. 少なくとも1つの仮想関数がある場合、自動の空の仮想デストラクターはありません。
    1
    user35978

    MEL(マヤ式言語):

    • 単一次元配列: 2つ以上のリストを手動で同期させるか、区切り文字列を使用して、より複雑なデータ構造をシミュレートします。当然、それらも不変です。
    • シングルスレッドおよび低速: Mayaアプリケーション全体がタスクの完了中にハングする原因となります。長い操作を強制終了できず、代わりにMayaを閉じて再度開く必要があるというボーナスポイント。
    • スクリプトソーシングパスは再帰的ではありません:スクリプトを保存するすべてのディレクトリをスクリプトパスに追加する必要があります。
    • 名前空間なし:命名規則の一貫性のない使用を強制して、グローバルプロシージャが衝突しないようにします。
    • モーダルコマンド:各コマンドはモーダルです。つまり、作成、変更、クエリ操作はすべてフラグを設定することで処理されます。これにより、開発者はほとんどのコマンドで配列を返すようになりました
    • 一貫性のないコマンドスタイル:ほとんどの配列コマンドは実際に配列を返しますが、Tokenizeコマンドは配列を吐き出すのではなく、配列として参照する必要があります。他の矛盾の中でこれ。

    AutoDeskがPythonを二次的なスクリプト言語として採用した理由は次のとおりです。

    • すべてのMELコマンドがサポートされているわけではありません:ほとんどがサポートしていますが、時々、mel()関数を使用して任意のコードを実行する必要があります。さらに悪いことは、あなたがしなければならない迷惑な脱出です。
    • モーダルコマンドスタイルを継承:同じcreate = True、query = True、edit = Trueを使用する必要があります。
    1
    Soviut

    Python:

    • 速度
    • 静的解析(欠如)
    • 1つの式に制限される匿名関数
    1
    orip

    Delphi for My 5:

    1. パラメータ化されていない場合、プロシージャと関数は必ずしも変数と区別されません(たとえば、x:= GetPositionOnScreen();の代わりにx:= GetPositionOnScreen;などのステートメントを使用できます)
    2. Try/FinallyおよびTry/Exceptはネストする必要があります(以前に一度述べましたが、それも私のものです)。
    3. 大文字と小文字を区別しません。
    4. 同じ名前の複数のオブジェクト(関数、グローバル変数、ローカル変数)を持つことができ、Delphiは喜んでその意味を理解しようとします。名前は一意でなければなりません。
    5. 条件ルールの場合は奇数。単一の条件付きチェックでは()を必要としませんが、複数のチェックを行う場合、各チェックで()を必要とします。
    6. 継承されたインクルードはありません。ベースおよび継承されたフォームのWindowsユニットの機能を参照する必要がある場合は、両方にWindowsを含める必要があります。
    1
    Tom A

    ケニア

    •コミュニティが小さすぎます。近くに別のスピーカーを見つけるのが簡単でない場合、優れた言語イマージョンプログラムを取得することはほとんど不可能です。
    • 不規則動詞。はい、英語とスペイン語でも言及されていることは知っていますが、ケニアは発明でした。なぜ不規則な動詞が必要なのですか?
    •Unicodeのサポートはありません。ほとんどのメッセージを読むには、コンピューターに3つの異なるTengwarフォントが必要です。そのうちのいくつかはカーニングが不十分です。これは、ローマ字表記の存在を考えると、それほど大きな問題ではありませんが、Tengwarはとても美しいので、使用したくありません。

    1
    user218368

    JavaScript

    ECMAScript 5仕様から:

    • 7.6.1.2将来の予約語:

      クラス、列挙、拡張、スーパー、const、エクスポート、インポート

      厳密モード: implements、let、private、public、interface、package、protected、static、yield

    • 11.9.4厳密な等しい演算子(===)対11.9.1 TheEqualsOperator(==)
    • 11.9.6厳密な等価比較アルゴリズム(NaN === NaNはfalse)
    • 8.5数値型-実際の整数はありません。すべてが浮動小数点数です。
    • 4.2.1オブジェクト-プロトタイプ継承

    OK、最後の1つを楽しんでいますが、7種類の混乱を招く

    1
    thejefflarson

    C#

    1)値型のジェネリックを書く実用的な能力の欠如。たとえば、すべてのばか(ほとんどのばか)は、C++でint、float、doubleなどのリストの標準偏差を計算するルーチンを記述できます。簡単に記述でき、読みやすく、高速な非汎用コードとして実行できます。 。他の2つでばかげたことなく、これら3つのうちの1つに近いC#で何かを書くことができれば、あなたは本当に素晴らしいプログラマーだと思います。

    2)共分散と反分散。ただし、これは4に追加されます。

    3)LINQの非常に質の悪いドキュメント(さて、実際には言語の一部ではありません)。

    4)前回と少し違うことを除いて毎回同じことをしたいときにforeach/iteratorを使用しようとしています(たとえば、それらとWordの間、最後の2つの間にコンマで文字列の束を連結します)。 IEnumerableで記述した場合、書き込みと読み取りが難しく、for(int i = 0 i <...)を使用した場合はあまり良くなく、効率も悪くなります。

    5)これについて苦情を申し立てることは知っているが、チェックされた例外はない。これはJavaのように実装する必要はありません(フレームワーク開発者は、なぜそうしなかったのかについて非常に良い点を述べています)。チェックされた例外がオフになることを好まない。

    1
    Brad

    言語があると仮定する必要があります。私たちは?

    1

    Python

    私が理解していないもの...

    • math.ceil()およびmath.floor()は、整数ではなく浮動小数点数を返します(おそらく、基礎となるC関数での整数オーバーフローを回避するためですが、Python longにキャストしないのはなぜですか?)
    • len()はメソッドではなく関数です
    • reload()は非常に制限されており、10回のうち9回はモジュールをリロードしません。モジュールである場合はインポートしたラベルのみをリロードします。つまり、foo自体がモジュールでない場合はfrom bar import foo; reload(foo)
    • 可変デフォルト引数には単一の参照があります(各関数が新しいインスタンスを呼び出すのはなぜですか?)
    • これらすべての下線付きの変数-それらが非常にプライベートである場合、どうして組み込みの変数がコードでそんなに多く見えるのでしょうか?名前空間を入手してください!
    • 文字列は変更可能ではありません-これには十分な理由があるかもしれませんが、特定のキャラクターを微調整したい多くの状況に遭遇しました...

    実装に基づいて意味を成しているが、迷惑なもの...

    • array.sort()は配列を返しません(インプレースで発生すると思います)
    • リスト/ジェネレーターの内包表記は、新しいスコープを定義しません(forループの構文シュガーだけですか?)

    およびPython 3で修正されたカップル

    • デフォルトの整数除算
    • globalは最上位の名前空間のみを参照できます
    1
    Brendan

    Python:

    1. 標準のGUIツールキットはありません(コミュニティはこれについてぐるぐる回っていますが、なにも解決しないようです)。

    2. Pythonアプリとライブラリを配布およびインストールするためのツールと方法の進化は、非常に困難です。 (最近では、これは修正に近づいているようです。)

    3. インタプリタが進むにつれてCPythonはまだ低速です(最近PyPyはかなり見栄えが良いのですが、「標準」Pythonになればこの問題はなくなります)。

    4. 多くのメソッドをオーバーライドせずに、組み込みクラス(リストや辞書など)をサブクラス化することはできません。イベントへの単純なフック(追加または削除されるアイテムへのフックなど)リストから、delitem、append、extend、insert、pop、およびremoveをオーバーライドする必要があります。サブクラス化可能な「変更」イベント通知や、使用される一般的なコードを除外する「保護」メソッドはありません。上記のすべての方法で)。

    5. Virtualenvが発明されるまで、1台のマシン上で異なる目的のために別々のPython環境を維持することは本当に苦痛でした。

    1
    user350432

    C#

    私はC#に非常に満足していますが、これら2つは本当に私を困らせます:

    • 不変クラスのコンストラクタベースの初期化は、インラインオブジェクトの初期化よりもIDEバッキングが少ないため、利便性が低く、直観的ではありません(コードを読んだときに、何に何を割り当てるかがわかりません)。これにより、必然的に可変クラスに傾くようになります。これは以前にも言及したことは知っていますが、不変クラスの初期化構文には厳密に問題があります。

    • switchは冗長すぎます。スイッチが適切である状況を見るときはいつでも、それがより簡潔であるという理由だけでif..else if..を使用する傾向があります(タイピングが30%少ない)。スイッチのフォールスルーはないはずだ、breakが暗示され、caseがコンマで区切られた値のリストを許可するべきだと思う。

    1
    Sedat Kapanoglu

    Scala:

    • 標準ライブラリの奇妙さ:常にベストプラクティスを示すとは限らず、十分に文書化されていない
    • ハードコードされたFunctionX、TupleXクラス
    • プロパティの欠如:ゲッターとセッターは分離されており、DRYに違反し、FRPなどをほぼ不可能にします。
    • プロパティを初期化するための= _の必要性
    1
    thSoft

    ルビー:

    • 重要な空白。インタープリターの場合、ステートメントの継続が必要と思われる場合(または明示的に改行をエスケープする場合)を除き、行末=ステートメントの終わり。
    • スロー
    • Pythonほどではないオンラインドキュメント(防衛面では、Pythonは優れています)
    • 遅いと言った?
    1
    Joshua Swink

    Java:

    1. 非常に一貫性がありません。
    2. グラフィックAPIを使用するのが面倒な場合がある
    3. NullPointerExceptionsは何がnullであるかを教えてくれません
    4. 私が書いたプログラムは別のJVMで動作しないことがありますが、これは非常に苦痛であり、Javaの「一度だけ書いて、どこでも実行」ステートメントと矛盾します。
    5. スイングは本来あるべきほど良くありません。
    1
    TomLisankie

    VB .NET。ただし、VB6はプログラマーの世代全体を汚染したため

    私はVB6ショップだったVB .NETショップで働いており、ここで働いていたVB6開発者だったすべての人は、.NETについて何も学ぶことを断固として拒否しています。彼らはまだVB6であるかのようにコーディングしており、彼らのアプリはVB6アプリがやったように吸います。上司は、他の人が理解するのが難しすぎるのではないかと恐れているため、LINQの使用を積極的に推奨していません。

    MSがC#を使用した場合、私たちはすべて良くなったと思います。これは、中括弧がVBの詳細な終了ステートメントよりもはるかに劣っていると思うからです。

    1
    Bremer

    ルビー。

    1. ストレンジスコープルール-変数、定数、およびメソッドは、それぞれ異なる動作をします。ルールは、クロージャーの作成に使用したキーワードによっても変わります。または、クラス、固有クラス、オブジェクト、モジュール、またはモジュールの自己にいるかどうかについて。次に、instance_evalがあり、ルールを別のルールセットに変更します。そして、モジュールが「含まれる」または「拡張される」と、それらは再び変化します。それらはスコープに対して異なることをします。また、一部のルールセットはメタプログラミングでエミュレートできないため、evalを使用する必要があります。 Ruby 1.9を使用している場合を除き、これらはすべて異なります。
    2. 名前空間は基本的に役に立たない。 Foo :: Fileがある場合、stdlibファイルはおそらくすべてのFooで壊れています。
    3. requireステートメントが壊れています。 2つのファイルが互いに必要な場合、それらのファイルの動作は、どこから最初にロードされたかに応じて劇的に変化します。
    4. ライブラリはAPIを劇的に突然変更するため、すべての依存関係の特定のマイナーリビジョン番号を要求する必要があります。システム上のRubyアプリケーションごとに。
    5. Rubygemsパッケージシステムは、検索パスにファイルを配置するのではなく、「require」をオーバーライドします。なぜなら、システムを置き換えることができるのに、なぜシステムを使用するのですか?
    1
    jes5199

    Python 3

    • インデントに使用できるタブとスペースの両方
      そして、人々は過去から学んでいると思うでしょう(Makefile)。スペースを選択してタブを禁止するだけです。 YAMLは正解です。
    • 一般的なサードパーティライブラリの欠如
      標準ライブラリは優れていますが、Python 2を非常に強力にしているものの多くは、サードパーティの領域にあります。 Python 2はこれを正しく理解しました:-)。
    • IEEE floats
      プログラミング言語の浮動小数点は、数学で使用する方法とは異なるため、混乱を招きます。代わりに、数値演算は、必要な場合にのみ小数点形式に変換される式(つまり、画面への印刷)として表示する必要があります。 MapleとMathematicaはこれで正しいと思います。
    • 識別子の文字セットが制限されすぎています
      list.empty?は、list.is_emptyまたはlen(list) != 0よりも優れています。同様に、process.kill!process.killよりも優れています。 RubyとLISPがこれを正しました。
    • 関数を呼び出すときは、alwaysかっこを書く必要があります
      明確なケースでそれらを省略することができれば、素晴らしいでしょう。またどう? dict.itemsまたはdict.items()Rubyもこれを正しく取得しました。
    1
    Tomas Sedovic

    Ruby

    1. 型推論なし
    2. メソッド/関数はファーストクラスのオブジェクトではありません
    3. ブロック変数のスコープはレキシカルですが、変数のスコープはレキシカルではありません
    4. defの中のdef
    5. superとsuper()の違い
    1
    jmuk

    さらに考えた後、これを書き直し...

    PHPが嫌いな5つのこと(好きではありません):

    • 組み込み関数の命名とパラメーターの順序が矛盾しています。
    • SPLのおかげで配列へのオブジェクト指向アプローチがありますが、残念ながら文字列ではありません。
    • PHP自体には実際の同時実行性はなく、ホスティングWebサーバーのマルチプロセッシングのみを介して
    • JavaScriptのような非同期呼び出しはありません
    • 拡張機能を介したオペコードキャッシングのみ。それほど悪くはありませんが、単に迷惑です。

    それらは私を悩ます言語機能(または欠如)ですが、はるかに大きな問題は、これらのより多くの人々/コミュニティ関連のものです:

    1. PHPを使用する多くの人々が、プログラミングやグッドプラクティス全般について何も知らず、本当に厄介なコードを生成するという事実。 JavaScriptにも同じ問題があります。

    2. 本当に悪い習慣とスタイルを教える膨大な量のチュートリアル/本。これが#3の主な原因である可能性があります。

    3. それが主に#3と#4のために発展した悪い評判。

    1
    selfawaresoup

    C#

    • ジェネリックパラメーターは不変です C#4.0では、ジェネリック型の共分散と反分散が導入されました
    • オーバーライド可能なクラスメンバーは、明示的にvirtualとしてマークする必要があります

    Java

    • 符号なし数値データ型がありません
    • プリミティブデータ型はオブジェクトではありません
    1

    Cは私のお気に入りですが、それはまた恐ろしいです。

    • これまでで最悪のプリプロセッサを搭載しています。なぜm4のようなものを使用しなかったのですか?
    • ヘッダー全体とソースファイルモデルが壊れています。パスカルはユニットでそれを正しく実現しました。
    • Switchステートメントでケース範囲が必要です。
    • Void *からの共用体およびキャストは、型システムを破壊します。これにより、ガベージコレクターが不可能になります。
    • ネストされた関数はありません。 GNU Cにはこれがありますが、標準である必要があります。
    • 割り当てられたメモリの境界チェックはありません。これを発見するツールはありますが、コードの一部がアドレスを誤って計算し、まったく関係のない割り当てられた領域に書き込むエラーを検出しません。ポインター演算全体が嫌いです。
    • 配列の境界チェックはありません。
    • 移植性に関する問題が多すぎます。 wchar_tでさえプラットフォームによって異なります。
    1
    ahmet demir

    Python用にもう1つ追加できます。

    リスト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)のようなリストにcouldあいまいなエントリがあるため、「ユーザーを混乱させる可能性がある」"[foo], [bar, ], []"を返すために決定されました。ただし、これにより、strをデータのダンプだけに使用することはできなくなります。これは、listが「読み取り可能な形式でデータをダンプする」だけだからです。ああ!

    1
    Tetha

    Objective-C 2.0

    ライブラリではなく、特定の順序ではなく、言語とランタイムに厳密にこだわります。

    1. CVarsの欠如。
    2. モジュールなし。名前空間の欠如にひどく不満はありませんが、モジュールは素晴らしいものです。
    3. Ivarベースのプロパティ構文では、3つの場所で変数名を使用した宣言が必要です。それはかなり恐ろしいです。
    4. Cの遺産。 OOとGCを除き、C言語について嫌いなものはすべて存在します。
    5. オブジェクトはスタック上に存在できません。 Obj-Cの問題ではなく、他の言語でのプログラミングの慣行と同じです。たとえば、C++のスタックで戻り値を取得すると、奇妙に感じます。コードを書いているときにライブラリのドキュメントを実際に見ていない場合は、すべての関数がポインターを返すと想定します。
    0
    icodestuff
    • Lengthプロパティは、length()関数と簡単に混同されます。代わりにsize()を使用してください
    • セレクター文字列( '"+ $。month +"')の変数を補間する構文は悪臭を放ちます
    • $(event.currentTarget)は、バブリングとキャプチャに対して常に機能するとは限りません
    • 属性構文は、セレクター構文( ".foot")が何も返さない場所で機能します( "[class = 'foot']")
    • JavaScript(this.className.search( "done")> 0)が機能する場合、セレクターを含む([class〜= done])が時々失敗する
    0
    user350176

    Python:

    1)スクリプト言語であり、完全にコンパイルされたものではありません(バイナリをコンパイルできることを望みます。バイトコードは気にしません)。非常に多くのライブラリを使用する必要がある場合、これは非常に面倒です(つまり、プログラムを使用するすべての人がすべてのライブラリをインストールする必要があります。これは、基本的に、私は不必要であるべき大量の仕事をしています)。私はバイナリを作成する方法を知っていますが、alwaysは機能せず、とにかくバイナリにインタプリタをバンドルしていると思います(そして、私はそれを望んでいません)。これで、インポートしたすべてのファイルのコピーを含むバイトコードコンパイラー(およびそれらのみ)をプログラムのフォルダーに配置できる場合、それは適切な妥協策となる可能性があります(追加のライブラリーをダウンロードする必要はありませんそのような)。また、コンパイル済みのpythonファイルを、これを実行する前にプログラムを実行するファイルとして指定された1つのファイルに圧縮できると便利です。

    2)時々少しバグがあるようです。特に、「from moduleX import *」などのコードに関連するコード、およびその他のインポート関連の問題、および関連するいくつかの問題に関連するいくつかの問題がありました。グローバル変数およびローカル変数。

    3)最大再帰深度はより高くなる可能性があります。もっと高くするために必要だと感じたことが少なくとも一度ありました。

    4)switchステートメントはありません(数値、文字列、範囲を許可するステートメントはもちろんのこと)

    5)新しいPythonバージョンは、多くの便利な文字列操作を廃止しているようであり、それらを使用せずに同じことを行う方法についての簡単なドキュメントがないようです。

    6)強制的な自動ガベージコレクション(手動で行うにはableにしたいが、必ずしもそうする必要はない)。

    7)GUIを使用せずに事前に作成されたTimerクラスはありません(まあ、あるかもしれませんが、検索をすべて行った後、見つけるのは便利ではありません!実際に何かを見つけましたが、それはしませんでしたタイマーとは、x秒ごとに指定された機能を実行し、必要に応じてオフにする機能などを備えたソートを意味します。

    8)例を挙げているコミュニティの人々は、自分がどのモジュールをインポートし、どのようにインポートしたかをめったに伝えません。

    9)Luaとの統合のサポートはあまりありません。

    10)必要な機能を備えたオブジェクトでオブジェクト変数をそのクラスに動的に追加しない限り、クラスの特定のインスタンスに(クラス全体ではなく)追加の機能を追加する方法はないようです。 (それでも、そのために別のクラスを作成する必要があります)。

    0
    Cordilow

    Python:

    • ブロックの終わりを示す区切り文字がないため、あいまいさが生じ、フォーマットが不適切なコードでは自動インデントが機能しません。
    • マクロなし(装飾者はカウントしません)
    • haskellのcabalやPerlのCPANのようなライブラリの自動フェッチはありません
    • 変数constを宣言することはできません(ええ、独自にロールすることは可能ですが...)
    • メタプログラミングは弱体化しています
    • グローバル通訳ロックをほとんど忘れていました
    0
    drhodes

    C#のプリプロセッサの欠如。

    一部の人々が虐待する可能性があるため、彼らがそれを除外したことは知っていますが、私は彼らが赤ちゃんを風呂水で捨てたと思います。コード生成は良いことと見なされており、C++ではプリプロセッサが私の第一線のコードジェネレーターでした。

    0
    Mike Dunlavey

    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(object obj)メソッドを次のように開始する必要があります。MyClass other = obj as MyClass; if(other == null)falseを返します。

    あなただけを書く必要があります:

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

    そして、言語はEquals(object obj)メソッドを提供する必要があります。
    注:otherはnullでないことを保証する必要があります。


    。異なるタイプの三項演算子は使用できません

    これはコンパイルされず、そうすべきだと思います!

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

    2。名前空間プライベートの欠如

    internal保護が好きですが、同じ名前空間内からのアクセスのみを許可する保護があればいいのにと思います。これは、大規模なクラスライブラリでのアクセスをより適切に制御するのに適しています。


    1。多重継承なし

    インターフェースのデフォルト実装には、実際に実装(クラス)継承のみを使用しますが、それだけを行いたい場合がたくさんあります。

    0
    tster

    VB.NET

    1)If Not xは "foo"(<> "foo"の代わりに)
    2)「OrElse」と「AndAlso」の短絡(異なる動作をする「Or」と「And」の代わりに)
    3)なし(Nullの代わり)

    0
    Techgration

    C#でGenericメソッドを作成するときに、Enumを型制約として使用できないことを発見しました。

    Microsoftには、理由について十分な説明がありますが、それでもです。私が怒ってんだ

    public static T MyFunc<T>(string arg) where T:Enum //wont work :(
    
    0
    Midhat

    私は1つしか持っていませんが、共有する価値があると思います。

    CSharp/.NET

    配列の要素数を取得するLengthプロパティと、コレクションの要素数を取得するCountプロパティがあります。 CLRが自動的にIList、ICollection、IEnumerableをシーンの背後にあるゼロベースの1次元配列に追加するという事実を考慮すると、より奇妙に見えます。

    CLRチームとBCLチームはこの問題について議論するのに苦労したと思います;)

    0
    Andrey Taptunov

    C

    • ストリング処理
    • メモリー管理(誰が割り振り、誰が解放するかを決定する)
    • 名前空間なし(最大)
    • 標準ライブラリにはリスト/配列およびその他の基本的なDSはありません


    JavaScript

    • Varなしで変数を使用すると、自動的にグローバルになります
    • セミコロンは必須ではありません
    • 比較演算子「==」と「===」およびそれらの使用法に関する混乱
    • バイナリデータを操作するための適切なサポートなし
    • 再び..名前空間なし
    • 変数にはブロックスコープがありません。 (Cの世界から来る非常に刺激的な)
    0
    Manish

    Python

    • 名前空間はありません。
    • 疑似プライベート属性/名前のマングリング(主にgetattrを使用)。
    • ファイルパスの操作は複数のモジュールに分散しています。 os.path呼び出しをつなぎ合わせるのは見苦しく、読みにくく、ほとんどの場合、DRYに違反します。一般的なファイルパス操作には、ディレクトリ内のファイルのリストを取得するなどの便利な機能がまだありません。 path-これを修正するための型モジュールは拒否されました。

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

    • Pythonドキュメントoptparseとログを確認しています))。組み込み型は、ほぼ10か所で断片的に文書化されています。
    0
    user297250

    HyperTalk:

    • ずっと前に死んだ
    • 単純な割り当てはありません(a := 3と言うだけでなく、put 3 into aと言う必要があります)
    • ネストされた関数はありません
    • 実際のデータ構造はなく、文字列だけです。 「リスト」を作成するには、itemDelimiterで項目を区切り、手動でエスケープします。 get Word 2 of line 5 of txtのような行と単語を取得することもできます

    余談ですが、HyperTalkに固有の最もクールな機能の1つは、特別なit変数です。

    ask "How many years old are you?"
    answer "You are " & it*12 & " months old."
    
    0
    Joey Adams

    JavaFX

    • 型推論は期待どおりに動作しないことがあるため、多くの場合、型を明示的に宣言する必要があります。
    • defはCではconstのように動作し、Javaではfinalではありません
    • インデックス> = seq.lengthにアクセスすることにより、シーケンスに値を挿入できます。これにより、実際にはコンパイラエラーがスローされます(参照によると)。
    • 文字列にnullを割り当てると、デフォルトで「」になります。 Integerにnullを割り当てると、コンパイラエラーがスローされます(参照とは対照的です)。
    • runtimeExceptionsと同じ方法でCheckedExceptionsを処理します
    0
    helpermethod

    Lua

    • Foo.bar(1,2)を実行すると、barメソッド内で 'self'はnilになります。代わりにfoo:bar(1,2)を実行することを忘れないでください。私はむしろ切り替えたほうがいいです(「:」演算子を使用するか、メソッドではない関数を呼び出す場合を除き、デフォルトで「自己」を定義する必要があります)。
    • 変数はデフォルトでグローバルです。私はむしろ「ローカル」キーワードを捨てて、代わりに「グローバル」キーワードを持ちたいです。
    • 宣言されていない変数にはnilが割り当てられます。エラーメッセージが表示されます。グローバルenvのメタテーブルを操作することでこれを回避できますが、デフォルトで実装し、非アクティブ化できるようにします。
    • パラメーターの複数の戻り値はあまりうまく処理されません。 1,2,3(3つの値)を返す関数foo()があり、bar()が4,5(2つの値)を返すとします。 print(foo()、bar())を実行すると、「1,4,5」が取得されます...呼び出し時に「最後の」タプルのみが展開されます。
    • #(テーブル長)演算子は、連続整数でインデックス付けされたテーブルでのみ機能します。テーブルがそうではなく、要素の数を知りたい場合は、ループで解析するか、要素を挿入/削除するたびにカウンターを更新する必要があります。
    0
    kikito

    Java:

    • 手続き型コーディングはありません。手続き型コードにコンパイルされるため、使用させてください。
    • 多重継承はありません。15,000のインターフェイスで同じことをしようとします。
    • 日付クラス、もっと言う必要がありますか。
    • 多態性を最大限に活用できないこと。 Javaは、トリガーするさまざまなパラメータータイプでオーバーライドしません。
    • 5番目の理由について考えることはできません。
    0
    WolfmanDragon

    C#

    • 参照を作成できません(var&t = struct)
    • ローカルスコープデストラクターはありません(IDisposeは近くにありますが、同じではありません)
    • ToString、私はすべてのオブジェクトがそれを持っていることをほとんど嫌っていますが、string.formatのようにそれを使用するすべてが嫌いであることがわかります。むしろ、特定のタイプ(int、float、text、charsのみ)を受け入れるものがあります。そのため、オブジェクトを渡す代わりに、暗黙的な型キャストまたはインターフェイスを使用して何かを渡す必要があります。私はこのようなものを書いて、htmlのテキストを安全にエスケープしました。
    • 仮想タイプキャスト(blah)objは使用できません。 objがblahのインターフェイスを継承しない/持っていない場合は機能しません。簡単な回避策は、変換機能を備えたインターフェースを提供することです。
    • ローカル作成はありません。 var o = new Item();と書く代わりにItem o()(ある場合は自動破棄)を(のような)書きたいです。
    0
    user34537

    Python:

    1)行継続構文:「... \」は機能しますが、「... \」は機能せず、編集者による異常なeolマークなしで、通常、後続のスペースは見えません。
    2)スタックトレースは以前に発生した例外のように見えるため、スタックトレースでは裸の「レイズ」は見えません。
    3)遅い
    4)Webサーバーへの不十分な統合(mod_python:dead、mod_wsgi:操作範囲の制限)。これは3]によって複雑になり、デーモン化または何らかの種類のメモリ持続性が必要です。
    5)タブとスペースの混在に対する許容度が高いため、フローを制御するための変更が非表示のままになることがあります。 (最近のバージョンで修正された可能性があります)

    0
    Rdbhost

    Lua:

    • 組み込みのエラーシステムは絶対に恐ろしいです

      Luaインタープリターを変更することにより、try-catchシステムを実装できます。ただし、組み込み関数によってスローされるエラーとの互換性はありません。

    • セッターとして__setindexの代わりに__newindexを持っているという事実

      ...および__newindexは、キーがまだ存在しない場合にのみ起動されます。存在する場合、メタメソッドはまったく呼び出されません。

    • 適切な型比較システムはありません。

      Type()関数がありますが、基本的なタイプのみを処理します(すべてのテーブルはテーブルです)。型比較のためのメタメソッドが本当に必要です。 「is」演算子と__typeメタメソッドを使用してこれを実装したことがありますが、本当にうまく機能します。

    • 新しいキーワードを定義するのはめったにありません。

      あなたはそれを行うことができますが、Lua内のコードは十分に文書化されていないので、望む結果を得る方法を見つけることは一種の試行錯誤です。これは、上記で説明したことを自分で実装する場合の大きな問題です(ただし、__ setindexではなく、簡単に変更できます)。

    • Webブラウザでは使用できません。

      ええ、言語自体に問題はありませんが、いまいましい、Javascriptの代わりにLuaを使用できるようになりたいです... :)

    0
    June Rhodes

    Object Pascal:

    • インターフェイスと実装は2つの部分に分割されていますが、同じファイルに詰まっているため、編集中のファイルには多くのジャンプがあります。
    • 配列の動的インデックス付け、文字列は1から始まり、固定配列を宣言するときに開始インデックスを指定し、動的に割り当てられた配列は常に0から始まります。
    • クラスとオブジェクト(インターフェイスは言うまでもありません)は言語の上にボルトで固定されており、とりわけレコードのようにスタックを割り当てることはできません。
    • パラメーターなしで関数を呼び出す場合、()はオプションであり、関数ポインターを処理したり、関数名を使用して関数の結果を参照しようとしたりするときに大きな苦痛をもたらします。
    • パラメーターリストは、外部の型定義がないと、固定配列型または関数ポインター型を処理できません。

    これは単なる言語であり、標準ライブラリとすさまじいIDEの残念な言い訳は、独自のリストに値します。

    0
    user350677