Go FAQでthis questionに出会ったばかりなので、しばらく私を悩ませていたことが思い出されました。残念ながら、私は本当に答えが得られているのか分かりません。なぜ多くのプログラミング言語は変数名の後に*型を置くのですか?
それはほとんどすべての非Cに似た言語がそうのように、変数名の後にタイプを置くように思える:
var : int
ただ、純粋な好奇心から、なぜこれが?どちらかを選ぶことに利点がありますか?
Go FAQでthis questionに出会ったばかりなので、しばらく私を悩ませていたことが思い出されました。残念ながら、私は本当に答えが得られているのか分かりません。なぜ多くのプログラミング言語は変数名の後に*型を置くのですか?
それはほとんどすべての非Cに似た言語がそうのように、変数名の後にタイプを置くように思える:
var : int
ただ、純粋な好奇心から、なぜこれが?どちらかを選ぶことに利点がありますか?
Keith Randall氏によれば、解析の問題がありますが、彼の記述ではありません。 「宣言であるか表現であるかを知らない」という言葉は重要ではありません。とにかくすべてを構文解析するまでは、式か宣言かどうかは気にしません。その時点であいまいさは解決されます。
コンテキストフリーのパーサーを使用すると、型が変数名の前後にあるかどうかは少しでも重要です。重要なのは、型指定を理解するためにユーザー定義の型名を調べる必要がないということです。現行のトークンを理解するために前に来たすべてを理解する必要はありません。
パスカル構文は文脈自由です。完全ではないにしても、少なくともこの問題をWRTしてください。変数名が最初に来るという事実は、コロン・セパレータや型記述の構文などの詳細より重要ではありません。
構文はコンテキスト依存です。parserがタイプ記述がどこで終了し、どのトークンが変数名であるかを判別するためには、与えられた識別子トークンが変数名であるのか、それとも別のトークンであるのかを判断できるように、型の記述
C言語の構文はコンテキスト依存であるため、yacc/bisonなどの従来のパーサジェネレータツールを使用して解析するのは非常に困難ではありませんが、不可能ではありませんが、同じツールを使用して解析するのは簡単です。つまり、CやC++の構文にも対応できるパーサージェネレータが存在するということです。それは適切に文書化されていないか、または1.にありますか?私の個人的なお気に入りはKelbtです。これはバックトラックLRを使用し、意味論的な「取り消し」をサポートしています。投機的な解析が間違っている場合、基本的にシンボルテーブルへの追加を元に戻します。
実際には、CおよびC++パーサーは通常、手書きで作成され、再帰的な降順および優先順位の解析が混在しています。私は、JavaとC#にも同じことが当てはまります。
ちなみに、C++の構文解析におけるコンテキストの感度の問題は、多くの不満を引き起こしています。 C++ 0xの "Alternative Function Syntax"は、型指定を最後に移動して区切り記号の後に置くことで、同様の問題を回避しています。これは、関数の戻り型についてはPascalのコロンに非常によく似ています。コンテキスト感受性を取り除くわけではありませんが、パスカル風のコンベンションを採用することで、管理が容易になります。
* EDIT * - confession - 再帰的な降下では、構文が開始の近くで容易に識別可能であれば解析するのがやや簡単です。スタート地点の近くにキーワードを置くことはそれに適しています。私は本当にこれの中にC型の変数名を数えていませんが、変数型の変数より前の構造を本当に識別していないからです。変数の宣言や関数宣言、代入の左辺の変数の関数型の型キャスト、あるいは... – Steve314
これはコロンの関数ではありません?同様に、 'var:int'はコロンのために変数名であることがわかります。 'int:var'(ちょっと醜いかもしれませんが:-))と同じように簡単にできるようです。 –
@ Jason Baker - 遅れて申し訳ありません。コンパイラは、 "int"がキーワードであると仮定して、 "varname int"または "int varname"を処理できます。しかし、 "varname mytype"や "mytype varname"はもっと問題になります。 "mytype"は正確に識別子ではなく、どのシンタックス構成が適用されるかを決定するために辞書ルックアップが必要なためです。構造体名が有効な型名でない古いC構文( "struct structname myvar;"と書く)は、 "struct"接頭辞が型*が*型であることを構文的に示しているので、より簡単でした。結腸が助けることができますが、それは全体でも唯一の解決策でもありません。 – Steve314
これは言語の設計方法です。 Visual Basicは常にこのようになっています。
ほとんどの(すべてではないにしろ)中かっこ言語が、最初に型を入れます。同じ位置がメソッドの戻り値の型を指定するので、これは私には直感的です。したがって、入力はかっこ内に入り、出力はメソッド名の後ろに出ます。
タイプを最後に置くラグジュアリー戻り値の型を最後に入れてください。例:name(arg:type):return_type –
C++ 0xは、関数の戻り値の型を最後に置きます: 'auto func(int arg1) - > int' – jmucchiello
あなたが話す「最も他の」言語は、より宣言的なものです。彼らはあなたが考えている線に沿ってもっとプログラムすることを可能にすることを目指しています(あなたが命令的思考に囲まれていないと仮定して)。
タイプの最後には、として読み込み、値が何のためにあるのか
これは「NAMEと呼ばれるタイプを作成する」と言っへのコースの反対があるが、あなたはそれについて考えるとき、「型TYPEのNAMEという変数を作成します」タイプよりも重要ですが、タイプは単にデータのプログラム上の制約に過ぎません
+1 15文字以上。 – wheaties
私は確信していませんが、「名前と名詞」の概念と関係があると思います。
基本的に、型を最初に置くと( "int varname"など)、 "integer varname 'という名前が宣言されます。つまり、型のインスタンスに名前を付けることになります。しかし、最初に名前をつけ、次にタイプ( "varname:int"など)を指定すると、 "これは 'varname'です;これは整数です。最初のケースでは、名前のインスタンスを指定しています。 2番目の例では、名詞を定義し、それが何かのインスタンスであると宣言しています。
テーブルを家具として定義している場合はちょっとです。 「これは家具であり、私はそれを「テーブル」と呼びます(最初にタイプする)とは、「テーブルは家具の一種です」(最後にタイプする)とは異なります。
最初に型を入れると、解析に役立ちます。あなただけのx
を解析する場合たとえば、Cには、あなたが
x int;
のような変数を宣言した場合は、xが宣言または式であるかどうかわかりません。これとは対照的に、
int x;
であなたがint
を解析するとき、あなたは宣言でいる知っている(種類は常にある種の宣言を開始します)。
言語の解析が進んでいる現在、このわずかな助けは、今日はあまり役に立ちません。
構文解析が簡単な場合は、var: 'var i:int'や' var int i'などのすべての変数宣言を導入するキーワードがあります。 – jmucchiello
また、ユーザー定義型(typedef)の場合は:xyz abc; - 型と名前はどちらですか?言語がルールに同意する限り、問題はありません。言語がルールに同意できない場合は、おそらく解析できません。 –
何について動的に(歓声@wcoenen)タイプの言語ですか?あなたは変数を使うだけです。
「動的に型指定された」という意味です。 「weakly vs strongly typed」は、「静的に対動的に型指定された」と同じ区別ではありません。たとえば、Pythonは動的で強く型付けされた言語です:http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language –
弱い型付け言語awkや(古い)Perlのように。またはFortranの暗黙の型付き変数 - IからNで始まる名前は整数です。残りはリアルです。 –
変数の名前が列0から始まる場合は、変数の名前を見つける方が簡単です。
は今、あなたの典型的なC++ヘッダーは可能性がどのくらい読みやすく想像
QHash<QString, QPair<int, QString> > hash;
と
hash : QHash<QString, QPair<int, QString> >;
を比較します。
最初に+1の名前を読みやすくすると、文章がすぐに動いていることがわかります。もちろん、意味のある変数名を使用していると仮定します。 – bobince
公式言語理論と型理論では、ほとんどの場合、常にvar: type
と書かれています。例えば、型付きラムダ計算に使用すると、証明のような文を含む表示されます:
x : A y : B
-------------
\x.y : A->B
私はそれが本当に重要とは思わないが、しかし、私は2つの正当化があると思う:1であることを、「X:A」 "xはタイプA"であり、もう1つは型が集合のようなものである(例えばint
が整数の集合である)という表記であり、記法は "xεA"に関連している。
あなたが考えている現代の言語に先行するものもあります。
傾向が増えているのは、タイプをまったく記述しないか、オプションでそのタイプを記述することです。これは、変数に型が実際に存在しない動的型付き型変数でも、コンテキストから型を推測する静的型付き型言語でもかまいません。
型が与えられ、時には推論される場合は、オプションのビットがその後に来たら読みやすくなります。
言語がC学校や機能学校などからのものであるとみなしているかどうかの傾向もありますが、これは時間の無駄です。前任者の能力を向上させ、学習価値のある言語は、メリットに基づいてすべての異なる学校からのインプットを受け入れる意思のある言語であり、フィーチャの遺産を嫌うものではありません。
Fortranのは、第1のタイプ置く:
REAL*4 I,J,K
INTEGER*4 A,B,C
をとはい、(非常に微弱な)冗談は、Fortranに精通している人のためにそこにあります。
これはCよりも簡単であると主張する余地があります。これは、型が複雑な場合(たとえば関数へのポインタなど)、型情報を名前の周りに置きます。
あなたは難読FORTRANを発明しました。よくやった。 – jmucchiello
私はいつもCのやや独特の方法だと思っていました。タイプを構築する代わりに、ユーザーは暗黙的に宣言しなければなりません。変数名の前後だけではありません。一般的には、型属性に変数名を埋め込む必要があります(実際に宣言した場合は、がとなる空のスペースを埋め込む必要があります)。
パターンマッチングの弱い形として、それはある程度分かりやすいですが、特別なメリットもありません。また、関数ポインタ型を書き込む(または読み取る)と、簡単に知能を上げることができます。だから、全体的にCのこの側面は不利な点であり、私はGoがそれを後に残しているのを見てうれしいです。
"過去を覚えていない人は、それを繰り返すと非難されます。"
変数の前に型を入れても、FortranとAlgolで無意識に開始されましたが、変数の前にいくつかの型修飾子が適用されているCでは実際にはおかしくなりました。 Cであなたが一緒目的なたわ言を解読するためにあるユーティリティ(CDECL)と
int (*p)[10];
または
void (*signal(int x, void (*f)(int)))(int)
ような美しさを持っている理由です。 Pascalで
は、タイプは、変数の後に来る、第1の実施例は
q: array[10] of pointer to int
、Cのある
p: pointer to array[10] of int
コントラストとなり、Cで
int *q[10]
ありますこれをint(* p)[10]と区別するためにかっこが必要です。 Pascalでは括弧が必要ではなく、順序だけが重要です。
信号機能はまだ
signal: function(x: int, f: function(int) to void) to (function(int) to void)
一口が、少なくとも人間の理解の領域内であろう。
公平で、問題はCが名前の前に型を置くのではなく、前にビットとピースを置くこと、そして名前の後に他のものを置くことを嫌うということです。
しかし、あなたが名前の前にすべてを置くしようとした場合、注文はまだ直感的です:
int [10] a // an int, ahem, ten of them, called a
int [10]* a // an int, no wait, ten, actually a pointer thereto, called a
だから、答えは次のとおりです。結果はもっとあるので、賢明に設計されたプログラミング言語はタイプする前に変数を置きます人間のために読むことができます。
@ジュリーリー - 私はそれについて論争しません。私は、ある方法と別の方法をやることに利点があるのであれば、好奇心をそそられていました。 –
@Jurily、完全に正確であるために、_everyone_は姓がlast :-)です。公平になるためには、ほとんどの人が偏見のない形でそれを見るとすれば、(中国語やハンガリー語のように)一般的なアプローチから一般的にアプローチする方が意味があるということに同意すると思います。 –
https://stackoverflow.com/questions/1891775/any-reason-for-having-val-capacity-int-instead-of-val-int-capacity-in-scal/1893263 – starblue