• ベストアンサー

コンパイラーとアセンブラの違い

 今晩は。  コンパイラーとアセンブラとは何がどう違うのでしょうか。 またコンパイラー、アセンブラは、その後に更に機械語に変換されるとききましたが、なぜ一気にソースコード から機械語に変換しないのですか。  他にCalsという言語もあると聞きましたが、この言語も機械語とは違うと聞きました、とするとそもそもこの 言語自体の役割は何なんでしょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.10

あなたの質問は頭の中でもやがかかっているから皆さんの回答が整理できないのです。 あなたの観点に立ってぶっちゃけて言えば、コンパイラもアセンブラも同じなのです。 両方ともソースから機械語をつくります。 >その後に更に機械語に変換されるとききましたが、とあるのは勘違いでしょう。 あるいはリンカのことを言っているのかもしれませんが、簡略化のために割愛します。 では何が違うのか。ソースコードの違いです。 アセンブラは実質機械語と1対1です。数学の問題を解いているようなものです。 ソースを書くのに凄く時間がかかります。とても生産性は低いです。 メリットは超高速のプログラムが組めます。マシン語と1対1ですから。 しかし、あまりにも効率が悪いのでもっと高級な言語を開発してくれと要求が出ました。 こうして英文を書いているかのような感覚で次々に高級言語が登場します。 これがC言語をはじめとしたコンパイラです。 コンパイラは高級になるために色々と装飾していますので、 それで生成される機械語はいろいろと余分なものがついて効率が悪くなっています。 そのため速度を要求されるオンライン処理とかではアセンブリ言語で開発されます。 以上で解説は終わりますが、とりあえずはソースを書いて経験を積むことです。 CASLの問題を解いてみれば数学みたいで、私の言っていることもよく分かるでしょう。

その他の回答 (9)

noname#119957
noname#119957
回答No.9

機械語     CPU実行するプログラム(コード) アセンブリ言語 機械語と1対1に対応する言語で翻訳が必要 コンパイル言語 高級言語で翻訳必要(c,pl1,cobol,JAVA,basic) スクリプト言語 高級言語で翻訳不要(perl,php,phyton) インタプリタ言語 高級言語で会話型言語(翻訳しながら実行)(basic) -- アセンブラー アセンブリ言語の翻訳プログラム コンパイラ  コンパイル言語の翻訳プログラム ■なぜ一気にソースコードから機械語に変換しないのですか。 >>プログラムは部分的に作成した方が扱い安い場合がおおいからです。 部分的に開発した複数のプログラムを1つの実行形式のプログラムに変換する際に、いろいろなライブラリ関数を組み入れたりプログラム間の変数参照などをさせます。 ■claslは、実存しない仮想マシンのアセンブリ言語です。 役割は、国家試験用の言語です。 間違いがあるかもしれませんが、だいたいこんな感じと思ってください。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.8

質問者の言う「ソースプログラム」とは何ですか? ソース(source)という言葉が指しているのはただ「源であるもの,入力元になるもの」という意味ですから,言語処理系(コンパイラもアセンブラもこれに該当します)に対して与えられるプログラム,変換元となるプログラムはすべて「ソースプログラム」と呼べます。 http://eow.alc.co.jp/source/ >ソースプログラムからコンパイルされる場合と、アセンブルされる場合 あるソースプログラムがコンパイルもアセンブルもできると勘違いなさっていらっしゃるような書き方に思えました。 高水準言語のソースプログラムは,コンパイルはできますが,アセンブルはできません。 低水準言語のソースプログラムは,アセンブルはできますが,コンパイルはできません。 >直接ソースプログラムから>アンブルされるのはどのような場合でしょうか。 前述のとおり,ソースプログラムが低水準言語で書かれている場合です。 低水準言語の具体例がどんなものかはすでに No.7 で回答しました。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.7

コンパイラは,高水準言語を入力して,より下位の(=機械語に近い)変換結果を出力する処理系であって,その変換結果がアセンブラ言語/オブジェクトプログラム/実行可能な機械語のいずれかであるかは問わない。いずれであっても大きくコンパイラと呼ばれる。 この出力結果の差はプログラム言語によるものではなく,コンパイラ製品の機能の差である。同じC言語であったとしても,あるコンパイラ製品はアセンブラ言語を出力できるが別のコンパイラ製品はそれができない,という例があるということである。 >低級言語の場合は、 >ソースプログラム>コンパイル>オブジェクトプログラム>アセンブラ>機械語 >という流れになるということでしょうか。 明らかな間違い。コンパイラが扱うのは高水準言語であり,低水準言語(アセンブラ言語)ではないので。 これは上記のように,低水準言語(アセンブラ言語)を出力できるコンパイラ製品を使って,   高水準言語のソースコード →コンパイル→ 低水準言語のソースコード の後に,   低水準言語のソースコード →アセンブル→ 実行可能な機械語 という処理をおこなっている例であり,低級言語を扱っているのは後半の処理だけである。 >低水準言語とは、固有名詞であげると具体的にはどのような言語になるのでしょうか。 次のja.Wikipediaの「主なアセンブラ」の項を参照。 http://ja.wikipedia.org/wiki/アセンブリ言語

eiji_0035
質問者

お礼

jjon-comさん、有り難うございます みなさんの回答をよみ、そのたびに本屋で他の参考書とかを読んで見るのですが、はっきりいって全く理解できせん。 >コンパイラは,高水準言語を入力して,より下位の(=機械語に近い)変換結果を出力する処理系であって,その変換結果がアセンブラ言語/オブジェクトプログラム/実行可能な機械語のいずれかであるかは問わない。いずれであっても大きくコンパイラと呼ばれる。 >コンパイラが扱うのは高水準言語であり,低水準言語(アセンブラ言語)ではないので。 ならば、上の例にならうと直接ソースプログラムから>アンブルされるのはどのような場合でしょうか。 ソースプログラムからコンパイルされる場合と、アセンブルされる場合のフローとかはどのようなものでしょうか。

回答No.6

Cなどの高水準言語(CPUの種類を問わずに記述できるプログラミング言語)が実行可能なファイルになるまでのステップは ・1ステップ目  高水準言語のソースプログラム(文字列)   =>(コンパイラがコンパイル)     =>アセンブリ言語のソースプログラム(文字列) ・2ステップ目  アセンブリ言語のソースプログラム(文字列)   =>(アセンブラがアセンブル)     =>オブジェクトファイル(2進数の羅列) ・3ステップ目  オブジェクトファイル   =>(リンカでライブラリや別のオブジェクトと結合)     =>中間ファイル ・4ステップ目  3ステップ目で生成された中間ファイル   =>(コンバータで実行可能/書き込み可能なファイルを生成)     =>実行や書き込み こんな感じでしょうか. 実際には1と2が一体になっていて,コンパイラが直接オブジェクトを生成するようになっていたり,裏でこっそり呼び出しているため表からは区別できないこともあります. 3ステップ目は大きなプログラムを作るときに全部1本のソースコードにすると大変なことになりますので,分割したり,よく使うものはライブラリとしてまとめておいて利用するためのものです. 3と4がひとつにまとまっていることもあります. どこまでをコンパイラと呼ぶかですが,全部・・すなわち実行可能なファイルを生成するところまでまとめてコンパイラと呼ぶこともあれば,アセンブリ言語のソースコード生成までがコンパイラ(のお仕事)と見るときもあります.どのあたりまでコンパイラと呼んでいるかは文脈から判断することになるでしょう. このあたりがややこしく思える原因かと思います. コンパイラがアセンブリ言語のソースコードを生成するようにするのはなんだか面倒なようですが,他のアセンブリ言語のソースコードと同じように扱うことができますし,オブジェクトファイルの形式が変更になったときでもアセンブラだけ書き換えれば済むといった利便性があるんですね.

回答No.5

CPUが実行できるのは言うまでも無く機械語です.機械語の仕様というのはCPUの設計によって決まってきます.世の中にいろいろな種類のCPUがあり,それぞれ機械語は違うのですね. ただ,機械語というのは2進数の並びでしかありません.まぁ普通は4ビットずつ区切って16進数であらわしますけど,たとえば 3E 00 21 00 80 なんて具合です.ただ,こんな風に見せられてもこれが何をする命令の列なのか人間にはわかりにくくて仕方ないですよね?そこで,CPUが直接解釈できる機械語と一対一に対応するような形でわかりやすく文字で表したのがアセンブリ言語で,アセンブリ言語を機械語に変換するソフトウェアがアセンブラです. アセンブリ言語で機械語をどういう風に表現するかは自由です.たとえば,Aレジスタに値10Hをロードする命令を LD A,10H LOAD 10H,A MOV A,10H ・・などなど,いろいろと表現する方法が考えられます.CPUのベンダが決めたものが使われることが多いようですけどね. さて,アセンブリ言語でも結構便利にはなったんですが,やはりCPUとべったりなものなので,もう少し自分がやりたいことを表現しやすくならないの?とは誰しも思うところでしょう. たとえば変数Aと変数Bの値を足して変数Cに入れるのを ・レジスタ#0に変数Aの番地のメモリからデータをロード ・レジスタ#1に変数Bの番地のメモリからデータをロード ・レジスタ#0にレジスタ#1の値を加算 ・レジスタ#0の値を変数Cの番地のメモリにストア なんていう命令を逐一書くのではなくて C=A+B なんて書ければ便利ですよね?ただ,C=A+Bなんてテキストで書いても当然CPUはそのままは理解しようがないので,これを機械語に(まぁ,アセンブラがあるならアセンブリ言語にしても良いですが)するのが「コンパイラ」というわけです.このような高水準な言語は目的や用途に応じていろいろなものが設計されています.Cもそのひとつですね. 別のアプローチとして,C=A+Bというテキストを機械語に翻訳せず,順次解釈しながら実行するようなプログラムを書いてやるということもできます.こちらはインタプリタと呼びます. これらの複合形みたいなのもありまして・・たとえばjavaなどでは一回javaで書かれたソースコードをバイトコードと呼ばれる中間的なコードに変換してこれをインタプリタで実行したりします.(古い人なら「Pコード」なんて言うと目を細めるでしょう(笑)) さらにパフォーマンス稼ぐためにバイトコードをさらにコンパイルして機械語にして実行する・・・なんていうこともやりますから,こうなると三者ごちゃ混ぜですね(笑)

eiji_0035
質問者

お礼

 maccha_nekoさん、回答有難う御座います。  皆さんからの回答を色々参考にさせてもらいましたが、実は読めば読むほどわからなくなりました。  再度まとめて、質問致します、宜しくお願いします。  >アセンブル:アセンブラ言語で書いたソースプログラムを機械語に変換すること。  >コンパイル:C言語やPascalと言った高級言語で書かれたソースプログラムをオブジェクトプログラムに訳すこと。  >アセンブラは、CPU固有の機械語命令を1命令づつ記述されたもの(アセンブラ言語)から  中間言語(オブジェクト)を生成するもので、コンパイラは、高級言語と呼ばれるもの  (C/C++言語、COBOL、Fortranなど)を、機械語命令に翻訳し、中間言語(オブジェクト)を 生成するもの。  >http://www.kogures.com/hitoshi/webtext/hs-honyaku/index.html の図を見ると、ソースプログラム>コンパイル> オブジェクトプログラム>アセンブラ>機械語という流れになるのでしょうか。  しかし、色々と皆さんの回答を読まして頂くと、高級言語の場合は、コンパルのみのような表現もあり、  その場合は直接、ソースプログラム>コンパイル>機械語になる。 低級言語の場合は、ソースプログラム>コンパイル>オブジェクトプログラム>アセンブラ>機械語 という流れになるということでしょうか。  色々と回答を頂いて申し訳ないのですが、使用する言語により、機械語になるまで要は2通りのケースがあるということでしょうか。  >アセンブル:アセンブラ言語で書いたソースプログラムを機械語に変換すること。  >コンパイラは高水準言語を扱い,アセンブラは低水準言語を扱う。  これは、言語によっては、「ソースプログラム」からいきなり「アセンブラ言語」に変換するという意味でしょうか。  低水準言語とは、固有名詞であげると具体的にはどのような言語になるのでしょうか。

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.4

こんにちは  補足です。 >またコンパイラー、アセンブラは、その後に更に機械語に変換されるとききましたが、なぜ一気にソースコード >から機械語に変換しないのですか。  昔の話ですが、Cコンパイラといえば、オプティマイズCぐらいしかない頃、まだC関数ライブラリにバグが多くアセンブリ言語ソースが付いていました。バグっぽかったら自分で調べろというわけです。自分で直してMASMというマイクロソフトがMS-DOSにおまけで付けていたアセンブラ-でアセンブルしてライブラリ化したもんです。とお年寄りからよく聞きます。  次の世代では、昨今はデルファイで有名なボーランドなどがコンパイル速度の高速性をウリにした一気にソースコードから機械語に変換するのPASCALコンパイラを販売し、それがウケてコンパイル高速時代になったりしました。  最近では、マシンも十分高速になった背景もあって、ソフトウェアの商業主義に反発したGNUのCコンパイラをはじめとする高級言語群は、開発と保守の効率化からコンパイラから直接バイナリオブジェクトを吐かずにアセンブラソースに落とし既にあるGNUアセンブラに渡してオブジェクトを得る方式で開発/保守しているようです。 一部のGNUのFORTRANやその他の高級言語では、アセンブラにも落とさずコンパイルでC言語のソースを出すところまでのものが目に付きます。  すばらしい完成度のCコンパイラがあるのなだからそれを使い回そうということと異なるプラットフォーム(CPUが違う、OSが違う)でもCコンパイラとアセンブラさえ移植すれば、高級言語は高い移植性が確保できますってところにポイントがあるのでしょう。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

>コンパイラーとアセンブラとは何がどう違うのでしょうか。 コンパイラは高水準言語を扱い,アセンブラは低水準言語を扱う。違いはja.Wikipediaを参照。 http://ja.wikipedia.org/wiki/高級言語 http://ja.wikipedia.org/wiki/低級言語 >なぜ一気にソースコードから機械語に変換しないのですか。 一般にプログラムというものは,一本のソースコードファイルのみで完結しているものではなく,複数のファイル群でプログラム全体を構成していたり,数多くの機能がライブラリとして提供されておりそれをプログラム中から呼び出したりする。 そのような,自分が現在開発中の「一本のソースコードファイル」以外の構成要素については,毎回毎回ソースコードから機械語に変換するよりも,コンパイル済の状態で保持しておいてそれを連係した方が効率的だから。 ja.Wikipediaの「オブジェクトファイル」の項,および,次のURLの「コンパイル,目的プログラム,連係編集,ライブラリ」の図を参照。 http://www.kogures.com/hitoshi/webtext/hs-os-honyaku/index.html http://ja.wikipedia.org/wiki/オブジェクトファイル >Calsという言語もあると聞きました。この言語自体の役割は何なんでしょう。 CASLの間違いだと思われる。ja.Wikipediaを参照。 http://ja.wikipedia.org/wiki/CASL

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

コンパイラとアセンブラの違い http://oshiete1.goo.ne.jp/qa9745.html

  • nemoax006
  • ベストアンサー率14% (343/2433)
回答No.1

コンパイラは変換器ですがアセンブラはアセンブリ言語と呼ばれる言語です、昔はマシン語又は低級言語と呼びました。ちなみに高級言語はC言語です。Caslではないでしょうか昔の情報処理技術者試験の問題に使われていた言語でアセンブリ言語の一種です。仕様書が問題に付属し それを見ながら問題を解いていました

関連するQ&A