teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

色々追記

2017/08/25 10:48

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -58,9 +58,9 @@
58
58
 
59
59
  このコードの正しい解釈は、`a`という変数が定義され(この時点では`a`にはundefinedが入っています)、その後に`a`という変数に関数が代入されて、`a`は関数として使用できるようになったと言うことに過ぎません。`a`が先行して宣言されたわけではないのです。
60
60
 
61
- なお、仕様上は、章の題名には「Function Definitions(関数定義)」という言葉を使いながら、文法(syntax)では「FunctionDeclaration(関数宣言)」という言葉を使っています。文法では関数**宣言**という名前ですが、実際は具体的な中身が必ず存在するため、最初に述べたC言語での意味での定義がされていると言って差し支えありありません。(ECMAScriptの用語として「定義」がどうなっているかはまた別の話です)
61
+ なお、仕様上は、章の題名には「Function Definitions(関数定義)」という言葉を使いながら、文法(syntax)では「FunctionDeclaration(関数宣言)」という言葉を使っています。仕様上の文法では関数宣言という名前ですが、実際は具体的な中身が必ず存在するため、最初に述べたC言語での意味での定義がされていると言って差し支えありありません。**これは、ECMAScriptの仕様書上の用語として「宣言」と「定義」がどうなっているかはまた別の話であり、決して混同しないでください。**もし、混乱してしまったのであれば、私の書き方が悪かったのだと思われまので、文章力に不足があり、申し訳ありません。仕様書の「宣言」と「定義」について知りたい場合は、think49さんの回答が参考になりますから、そちらを読んでください。この回答をいくら読んでも、仕様上の意味での解釈については一切助けにはなりません。
62
62
 
63
- では、ECMAScriptには定義が無い宣言が無いのかというとそうではありません。import宣言とexport宣言があります。import宣言ではこの外部ファイルをインポートしますという宣言だけです。具体的な中身は外部ファイルに書いてあり、importで定義しているわけではありません。export宣言では具体的な中身を書くこともできますが、名前だけ指定してexportすることも可能です。つまり、この変数や関数はエクスポートしますと宣言するだけで、その中身は別の所に書いてあると言うことができます。
63
+ では、ECMAScriptには定義が無い宣言が無いのかというとそうではありません。importとexportがあります。importではこの外部ファイルをインポートしますという宣言だけです。具体的な中身は外部ファイルに書いてあり、importで定義しているわけではありません。exportでは具体的な中身を書くこともできますが、名前だけ指定してexportすることも可能です。つまり、この変数や関数はエクスポートしますと宣言するだけで、その中身は別の所に書いてあると言うことができます。
64
64
 
65
65
  ####Rubyでの宣言と定義
66
66
 
@@ -92,4 +92,10 @@
92
92
 
93
93
  ---
94
94
 
95
- 動的な言語(プログラムの途中で、識別子の意味が動的に変わっていく言語、ECMAScriptとかRubyとか)においては、宣言と定義は一緒の場合が多いように思えます。でも、静的な言語(コンパイル時に、識別子の意味が静的に決定される言語、JavaとかC#とか)であっても、最近の言語は一緒の場合が多いように思えます。宣言と定義の分離は、マシンの性能もコンパイラの品質も貧弱な時代に、静的な言語でコンパイルするための助けになるという意味では有用だったのかも知れませんが、現在においては、単に面倒なだけとされて、廃れた手法になっていっているのかも知れません。
95
+ 動的な言語(プログラムの途中で、識別子の意味が動的に変わっていく言語、ECMAScriptとかRubyとか)においては、宣言と定義は一緒の場合が多いように思えます。でも、静的な言語(コンパイル時に、識別子の意味が静的に決定される言語、JavaとかC#とか)であっても、最近の言語は一緒の場合が多いように思えます。宣言と定義の分離は、マシンの性能もコンパイラの品質も貧弱な時代に、静的な言語でコンパイルするための助けになるという意味では有用だったのかも知れませんが、現在においては、単に面倒なだけとされて、廃れた手法になっていっているのかも知れません。
96
+
97
+ ---
98
+
99
+ 最後に、上では関数の宣言と定義だけで、変数については、少しぼかした表現で、詳しく書いていません。C言語上では、その変数の実体が作られるところ(メモリ領域が確保されるところ)が定義になるのですが、細かく言うとさらに倍の内容になりますので、省いています。PHPのglobalキーワードが変数で宣言と定義がわかれている例になるのですが、PHPについては全てを語るほど詳しくないと言うこともあり、触れていませんでした。
100
+
101
+ また、もう一つぼかして書いていることで「関数が定義される」と「作成された関数が入っている変数が定義される」の(動作の違いでは無く)**意味的な**違いを詳しく解説していません。申し訳ありませんが、そこまで話をしてしまうと、どんどん話がずれて言ってしまうので、避けてしまいました。どこかで機会があれば、網羅的に宣言と定義について、記事を書きたいとは思いますが、ここでの回答はここまでとさせていただきます。

2

強調

2017/08/25 10:48

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -1,4 +1,4 @@
1
- 宣言(declaration)と定義(definition)という言葉について何を意味するのかは言語によっては特殊な意味を持つも事があります。ですが、ほとんどの場合はC言語での意味とほぼ同じになるでしょうから、C言語での宣言と定義が意味するところが、各言語においてどうなるかを説明していきます。
1
+ 宣言(declaration)と定義(definition)という言葉について何を意味するのかは言語によっては特殊な意味を持つも事があります。ですが、ほとんどの場合はC言語での意味とほぼ同じになるでしょうから、**C言語での宣言と定義が意味するところが**、各言語においてどうなるかを説明していきます。
2
2
 
3
3
  ####C言語での宣言と定義
4
4
 

1

C言語での意味での話ですと言うことが、私自身混乱していました。

2017/08/22 22:02

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  このコードの正しい解釈は、`a`という変数が定義され(この時点では`a`にはundefinedが入っています)、その後に`a`という変数に関数が代入されて、`a`は関数として使用できるようになったと言うことに過ぎません。`a`が先行して宣言されたわけではないのです。
60
60
 
61
- なお、仕様上は、章の題名には「Function Definitions(関数定義)」という言葉を使いながら、文法(syntax)では「FunctionDeclaration(関数宣言)」という言葉を使っています。そのため、文法では関数**宣言**という名前ですが、実際は具体的な中身が必ず存在するため、定義いって差し支えありありません。
61
+ なお、仕様上は、章の題名には「Function Definitions(関数定義)」という言葉を使いながら、文法(syntax)では「FunctionDeclaration(関数宣言)」という言葉を使っています。文法では関数**宣言**という名前ですが、実際は具体的な中身が必ず存在するため、最初に述べたC言語での意味での定義がされてると言って差し支えありありません。(ECMAScriptの用語として「定義」がどうなっているのかはまた別の話です)
62
62
 
63
63
  では、ECMAScriptには定義が無い宣言が無いのかというとそうではありません。import宣言とexport宣言があります。import宣言ではこの外部ファイルをインポートしますという宣言だけです。具体的な中身は外部ファイルに書いてあり、importで定義しているわけではありません。export宣言では具体的な中身を書くこともできますが、名前だけ指定してexportすることも可能です。つまり、この変数や関数はエクスポートしますと宣言するだけで、その中身は別の所に書いてあると言うことができます。
64
64