プロが教えるわが家の防犯対策術!

題記の通りなんですが、私はこの辺りの分野には詳しくないため、セマンティックスと言う言葉の概念を、できれば身近な例で説明して頂ければと思います。

シンタックスと対比する言葉と言われても(実際、検索するとそう書いてあるのですが)、???です。

サルにも分かるセマンティックスでお願いします!!

A 回答 (3件)

> と言うことは、ロジックで破綻してエラーになっているということですか?



そうですね。セマンティクスレベルでのエラーは、プログラムでは通常バグと呼ばれます。
バグってのは、コンパイルは通って(シンタクスはOKで)一応実行ファイルはできるけど、
思ったとおりに動かない(つまりプログラムにプログラマの意図がちゃんと伝わってない)ことをさします。
コンパイルすら通らないのはバグとは言いません。
# 「プログラムは思った通りには動かない。書いた通りに動く」などとよく言われますが、
# プログラムには基本的に「相手の意図を汲み取って~」とかいう親切心がないのです。

> どう処理をしているか、などロジックチェックして、「ダメだ!」と付き返されてしまうようなものなのでしょうか?

コンパイラは基本シンタクスレベルなので、あまりここまで面倒見てくれませんけど、
人間相手のレビューはセマンティクスレベルなので、ロジックに駄目だしされますね。

最後は、実際に走った結果があわないとか、「実行時例外」がおきるとかになるわけですが、
「ダメだ!」とつき返されるのは通常こっちに相当するかと。

例えば、「日本語で原稿を書いて英語に翻訳してもらい英語論文を教授に提出する」
(プログラム言語でソースを書いて機械語に翻訳してもらい実行するに相当)として、
理論の組立が駄目でつき返されるのは、通常教授からです。(プログラムで言えば実行時エラー)

翻訳者(コンパイル時)は内容については専門ではないでしょうし、
あくまで文法のチェックと翻訳変換がお仕事ですから、そこまで面倒見てくれないでしょう。

プログラムの場合、例えば昨今のC/C++コンパイラは、セマンティクスエラーと思われる場合に「警告」を出したりすることはあります。
これは「文法的には正しいけど、よく間違えやすいミス」に対しての注意喚起です。
switch文のcaseにbreakがないとか、「内容に意味がない」とか、まぁそのレベルです。
「山って普通走らないですよね?ここは山が走るって書いてありますけど…そういう比ゆ表現ですか?もしかしてミス?」

とはいえ、内容には責任を負いませんし関知しませんから警告を出しても翻訳自体はやってくれます。
内容までチェックできないってのもありますし、
(C/C++では特に)コンパイラが「チェックするべきではない」ってのもあります。
# 翻訳頼んだのに内容の質問をたくさん受けるなんてうっとうしい。
# 内容はこっちで見るものだから黙って訳してくれないかな。という思想。

もしも実行時エラー(教授からの赤点評価)を避けたい場合、チェックは「内容がわかる人(教授かもしれませんし、研究室の先輩かも。プログラムなら別のプログラマとか?)」にお願いするわけです。
このときは翻訳者には頼みませんよね。
    • good
    • 0
この回答へのお礼

丁寧に回答して頂いて、本当に感謝しています。

>コンパイラは基本シンタクスレベルなので、あまりここまで面倒見てくれま>せんけど、
>人間相手のレビューはセマンティクスレベルなので、ロジックに駄目だしさ>れますね。
これですね!概要がつかめたようです。

北京原人からとうとう、クロマニョンまで昇格した気がします。
親切にありがとうございました。

お礼日時:2006/12/17 12:15

微妙に違いますねぇ。


エラーの例が余計に混乱させましたか?

エラーチェックが厳密とか、融通が利くとか言うのは「結果的にそうなる」というだけの話で、本質ではないです。

繰り返しになりますが、

■シンタクスというのは、基本的に「文法」です。「書式/形式」です。
字句解析(syntax analysis)ってのは「書式のチェック」に相当します。

内容がよく理解できない論文でも、日本語で書かれていれば
ある程度の誤字脱字チェックくらいはできますよね。
記名がないとか、書式のチェックなどもできますよね。

プログラミング言語の文法は日本語より厳密なので、
人間様ではないツールでも文法チェックくらいはできるのです。
# ツールは文法(プログラム言語の"てにをは")だけわかればいい。

で、大抵のプログラミング言語は文法にちょっとでも違反するとエラーなので
(テストで言えば、誤字脱字が一つでもあると、はなから採点されないようなもの)、
結果として厳密なエラーが出てくることになります。

■セマンティクスというのは、基本的に「文意」です。「内容」です。
意味解析(semantic analysis)には「書かれている意味を理解する」必要がありますし、
「セマンティクスに注目する」と言えば「意味的にどうか?」を考えることになり、
「シンタクスに注目する」といえば「書式はどうか?」を考えることになります。

知らない分野の難しい論文を渡されて内容の妥当性をチェックしろといわれても、
素人には手が出ない。翻訳家さんやネイティブだったとしても、
専門知識なしに完全なチェックをすることは不可能でしょう。

同様に、プログラミング言語においても、ツールには完全なチェックができません。
# コンパイラなどのツールは「コンピュータとの通訳」であって、
# プログラマのように判断できる人間ではないのです。

セマンティクスエラーというのは、テストで言えば誤字脱字はないけど、
内容が的外れだったり、論旨が破綻してる論文で赤点をもらうようなものです。

一方、例えば片言の英語で外国人とコミュニケーションをとるのは、
シンタクスエラー(単語の羅列で文法はメタメタ)でもセマンティクスは通る(伝えたい内容が理解される)例ですね。
# プログラミング言語の場合は基本的にシンタクスエラーがあると通じない上に、
# セマンティクスもよく理解してない相手なのでこういうことはまずないですが。
    • good
    • 0
この回答へのお礼

再度のご丁寧な回答、本当にありがとうございます。
一回目の回答と二回目の回答を読みながら、しばらく考えていました。

>■シンタクスというのは、基本的に「文法」です。「書式/形式」です。
>字句解析(syntax analysis)ってのは「書式のチェック」に相当します。
シンタックスはクリアしたように思えます。つまり、ある解析ツールで、
"love" "I" "goo!"とあって、"I goo! love"と入力すれば、これはシンタックスエラーで、「"goo!"が来るべき順番で来ていないのでダメ」となってしまうのですよね。

># コンパイラなどのツールは「コンピュータとの通訳」であって、
># プログラマのように判断できる人間ではないのです。
コンパイラは、使用した言語の文法に則っていないと、エラーがずらずらと出て、プログラムが出来上がらないですよね(シンタックスエラーレベル)。


>セマンティクスエラーというのは、テストで言えば誤字脱字はないけど、
>内容が的外れだったり、論旨が破綻してる論文で赤点をもらうようなもの>です。
と言うことは、ロジックで破綻してエラーになっているということですか?どう処理をしているか、などロジックチェックして、「ダメだ!」と付き返されてしまうようなものなのでしょうか?

もしかして、私のこの考えが”セマンティックエラー”・・・?

しつこいようですが、「諦めません、分かるまでは!」
済みません。。。

お礼日時:2006/12/16 23:01

# わかり易さ優先/厳密さは無視して書いてます。



日本語を例に、ざっくりと考えて見ましょう。
・シンタクスというのは「字句」レベルの「文法」です。
  「てにをは」とか名詞とか動詞とか、そんなのと思ってください。

・セマンティクスというのは「意味」レベルの「文意」です。
  こっちは、何が書いてあるか、どんな文脈か、とかと考えてください。

イメージをつかむために、それぞれのエラーを考えてみます。

シンタクスエラーというのは、文法の間違いなので、例えばこんなのです。
「犬はを走った」
文の内容とは関係なく、「は」と「を」が続いてるのは日本語としておかしいですね。
# これがコンパイラなら、構文エラーとかsyntax errorとかいうところです。

一方セマンティクスエラーというのは、例えばこんなのでしょうか。
「山が走った」
これは、文法的には正しい日本語です。名詞、助詞、動詞(過去形)。
でも、内容(意味)がおかしい。
# プログラムならバグかも知れません。

ただし、意味的な解釈というのは、文脈に依存する面もあり(これも特徴のひとつ)、
もしかするとこれが正しい文章の場面もありえるかもしれません。
「山とは僕の友達のあだ名だ。巨漢の山田、山のような山田…由来は今となってはわからない。
中学校以来、山は僕の中で山以外の何者でもない…」
例えばこんなお話の中で「山が走った」とあったらどうでしょう。
あるいは、何かの比ゆ表現かも知れません。

今度は別の側面から、エラーチェックの観点で捉えてみると、
シンタクスのチェックというのはいわゆる「誤字脱字」等の話です。
セマンティクスのチェックというと、「しかし」の前後が逆接になっているかとか、
文章のねじれていないかとか、論旨が正しいかとか、そういう確認になります。

なんとなくイメージがつかめてきましたか?

以下は、ちょっとおまけです。
プログラムとかの字句解析(字句論)/意味解析(意味論)の場合も基本は一緒です。
プログラム言語というのは、意味が一意になるように作られた人工の言語なので、
日本語の場合よりもはるかに厳密なチェックが入ります。
特にシンタクスエラーはコンパイラなどのツールがチェックするので、
コンパイルエラーになるようなのは、たいていシンタクスエラーになります。

セマンティクスのエラーは、文脈次第で正しい可能性などもありますし、
ツールには判断できず、プログラマなどがチェックする必要があるのは普通です。
(警告などがでたり、文法レベルの制限があったりはしますが、
それでも発生してしまうセマンティクスのエラーは
一般的に論理バグなどと言われるバグの一種です)

と、こんな感じでいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。私もサルになれた気がします。。。

文章チェックにおいて、
シンタックスは、厳密なエラーを機械的にはじき出す
けれども、
セマンティックは、機械的ではなくて、もっと融通の利かせた、ある意味で人間の書く文章に近い、キメの細かい文章チェックができるということで合っているのでしょうか?前に流行った言葉で言えば、より高度な”ファジー”さ、というのか(※”ファジー”の厳密な定義ではなく、一般に流通した流行り言葉の”あいまい”の意味で使っています)。

もし、上記イメージでビミョウに違っていたら、遠慮なく指摘をお願いします。

お礼日時:2006/12/16 16:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!