2010-12-20 21 views
4

私はかなりの間これを疑ってきました。彼らはすでにたくさんあり、過負荷になる可能性があるので、最後までやり直してカスタムオペレータを許可してみませんか?私はそれが素晴らしい追加だと思う。なぜC++はユーザ定義演算子を許可しないのですか?

これは、言語をコンパイルするのが難しいと言われてきました。これは私には不思議ですが、C++は本当に簡単にコンパイルできるように設計されていないので、元に戻すことはできますか?もちろん、静的テーブルと文法のLRパーサーを使用して、

E → T + E | T 
T → F * T | F 
F → id | '(' E ')' 

のような文法を使用すると、それはうまくいかないでしょう。通常、オペレータ優先順位パーザAFAIKで解析されるPrologでは、新しい演算子を簡単に定義できますが、言語ははるかに簡単です。さて、オペレータが文法にハードコードされているすべての場所で、文法はidentifiersを受け入れるように書き直すことができます。

他にどのようなソリューションとパーサーのスキームがあり、他にどのようなことが設計上の決定に影響していますか?

+0

あなたは私が推測するどこかに線を描く必要があります。そして、コンパイラを書くことを試みたことがある人は、コード化するのが簡単ではないことに感謝します。 – Matt

答えて

10

http://www2.research.att.com/~bs/bs_faq2.html#overload-operator

、それはすでに複雑な言語になるだろう

など、私はC++型システムが少し助けることができると仮定し、それが関連性のような問題を解決に役立つだろう

可能性は何度か考えられていますが、そうした可能性のある問題が可能性のある利点を上回ると判断するたびに、

言語的な問題ではありません。私が1983年に最初にそれを検討したときでさえ、私はそれがどのように実行されるかを知っていました。しかし私が経験したことは、最も単純な例を超えてみれば、人々はオペレータの使用の「明らかな」意味の微妙な意見を持っているようです。古典的な例はa**b**cです。 **がべき乗を意味すると仮定します。今度はa**b**c(a**b)**cまたはa**(b**c)となりますか?答えは明白で、私の友人たちは同意したと思っていました。そして、どちらの解決策が明白なのか私たちは同意しませんでした。私の推測では、このような問題は微妙なバグにつながると考えています。

+0

ああ、私はこの文書について知らなかった!知っておいて、ありがとう! –

+5

関連引用を追加しました。一般的に、単純にリンクを回答として投稿すると、SOが怒られます。読者が概観を得るのが難しくなります(5つの異なる答えがあり、それぞれにリンクがあり、それ以外のものがない場合は、どちらの回答が良いか、どれが悪いかを把握する作業が多くなります)。ちょうど無関係)だけでなく、リンク先のページが将来削除されるか、またはそのページのテキストが変更される可能性があるためです。要するに、人々があなたの答えをアップアップすることを望むなら、あなたは何かを貢献しなければなりません。リンクしたページからの直接引用であっても – jalf

1

これにより、言語がさらに複雑になります。それは明らかに望ましくないでしょう。

まだ、Boost Spiritをチェックしてください。多くのテンプレートメタプログラミングトリックを使用して、あなたが言ったようなものを可能にすることは、長い道のりになります。

0

実際には、解析とコンパイルが非常に簡単です。 Cには32個の定義済みキーワードがあり、他のすべてのトークンは関数と変数です。

C++にはもう少ししかありません。どのトークンがどれであるかを簡単に識別できるので、+トークンなどを使用するときに何を探すかを知ることができます。

+1

簡単に解析してコンパイルできますか?一般的な合意は、C++は、コンパイラを書くために存在する最も難しいプログラミング言語の1つである(例えば、http://stackoverflow.com/questions/575143/writing-my-own-c-compiler/575155#575155を参照)。 –

+0

本当に、私はそれを信じることができませんでした... C++では、実行時型の推論サブシステムが非常に複雑ですが、それは自明であり、些細なことではないテンプレートの置換や、純粋な(私の頭の中にある私自身のC + +パーサが時々限界を見つける2つの事柄である関数ポインタとtypedef)があると思います。 –

+0

自然言語の解析と比べて簡単です:)、それは比較的簡単に機械で解析できるように設計されています。どのような類似した言語を解析するのが簡単かは別の問題です。 ASMは間違いなくマシンの観点から最も簡単です。オペレータのオーバーロードやテンプレートがないため、CはC++よりも簡単です。したがって、公正であるためには、他のOOP言語と比較する必要があります。これらの言語に比べて比較的同等です。 – ewanm89

2

既にコンパイルするのはさらに難しくなります。また、オペレータの優先順位には問題があります。どのように定義しますか?コンパイラに、ユーザー定義の演算子が別の演算子より優先されるように指示する方法が必要です。

はほとんど確かにそれは可能だが、私はC++が

0

:-)足で自分自身を撮影するの方法を必要としない独自の演算子を許可するとの問題はあなたもプログラマを許可する必要があると思います演算子の使用方法の構文を指定します。はるかに複雑...

0

これは通常、大部分のコードが1人の人間によって書かれているため、コードは「レビュー可能」であり、言語の「望ましい」機能ではないからです。

Joel Spolskyはこれについてgood articleを持っています。

0

私は、実際には、オーバーロードされた演算子と非常によく似た何かを達成することが実際に可能であることを知りました。検討する

Vector v, a, b; v = a /vectorProduct/ b; 

既存の演算子で区切られたダミークラスを使用してカスタム演算子の動作を実現することができます。 =)

関連する問題