質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

Q&A

解決済

1回答

1789閲覧

コンパイラーを作るとき、変数の中身を見て何ビットいるかをチェックしてレジスタを選んでいるのか?

maiko0318

総合スコア876

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

0グッド

0クリップ

投稿2016/12/07 05:11

かなり昔の話にはなるのですが、参考にお伺いします。

質問です。
コンパイラーを作るとき、変数の中身を見て何ビットいるかをチェックしてレジスタを選んでいるのか?
ということです。マイナス値はプラスで計算し、
桁落ちを使いたいのはなんとなく分からないではありませんが。

ちょっと長くなりますが事の詳細を。
cobolという言語のベータバージョンを使って開発していました。
ベータバージョンですからバグはいっぱいある前提です。
あるひとはループさせてある数から2をマイナスになるまで引くというプログラムです。
どんな数字を入れようがいつか終わりますよね。
テストですからそんなに大きな数も入れません。
そしたら無限ループしてしまいまして調査の結果14を足している事が判明しました。
「4ビットでマイナスになってない」ことは想像できました。

また、

-1を掛ける操作を作って'-1'を入れると'95'が返ってきました。
(画面は2桁表示ですので)
で、'-2'を入れると'90'が返ってきました。
「5を引くなんてどこにも書いた覚えはないぞ?」と思って
'-3'を入れると'85'になりました。
「これはおかしい」と思って内部の値を調べると4294967295になっていました。
原因は?「32ビットでマイナス忘れてる」またか、と思いまたがそこはベータ版。

文句はいえません。報告を上げるとアメリカの会社に報告を上げるの?と嫌な雰囲気。
そこはあの人の出番でしょうと某海外企業の日本支社に努めている方に報告したところ、
「原因企業がわからないからOSは仕方ないとしてcobolだけにしてくれ」と言われ、
(データベースとオンラインも含んでいたため)そしてやっとアメリカに報告できました。
「プログラムの方は直しておいた」って聞かされ、ん?と思って見ると'-1'固定で掛けていたので、
(zero - input)と書いてありました。変数でマイナスを掛ける処理は注意するようにと注意されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コンパイラーを作るとき、変数の中身を見て何ビットいるかをチェックしてレジスタを選んでいるのか?

そんなコンパイラーは無いと思います。普通、ソースコードの変数の宣言内容でビット幅が決まるので、それを収容できるレジスタで演算を行います。

投稿2016/12/07 05:32

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maiko0318

2016/12/07 06:15

ありがとうございます。 考えてみればそんなロジック複雑すぎますよね。 では、固定で2を引き、や-1を掛ける場合はレジスタは選ぶのですか?
mit0223

2016/12/07 06:25

レジスタというよりも命令を選びます。四則演算については、CPUの命令セットによって、最適な命令が異なります。命令セットによっては符号付き演算、符号なし演算、10進パック演算などがやりやすいような命令が用意されていたりします。 また、定数の演算については最適な命令がCPUの性能特性によって異なる場合があります。-1をかける場合は掛け算命令を使うよりビット反転命令を使うほうが早かったりします。 バグの内容を見ているとCPUのビット幅が狭い(8ビットとか16ビット)時代に汎用機のコンパイラをパソコンやオフコンに移植したものではなかったのでしょうか。汎用機には10進パック演算の専用命令があったりしましたが、パソコンは普通の整数演算しか命令がなくコンパイラを移植した人が苦労したのではないかと推測されます。
maiko0318

2016/12/08 02:28

コメントいただいたメールが来なかったので目を話していてお礼が遅くなってしまいました。 よくわかりました。ありがとうございます。 >CPUのビット幅が狭い(8ビットとか16ビット)時代に汎用機のコンパイラをパソコンやオフコンに移植したものではなかったのでしょうか。 そのとおりです。UNIXでCOBOLを動かそうとしたからですね。
maiko0318

2016/12/08 02:29

×話して ○離して すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問