![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.10ベストアンサー
- 回答日時:
あなたの質問は頭の中でもやがかかっているから皆さんの回答が整理できないのです。
あなたの観点に立ってぶっちゃけて言えば、コンパイラもアセンブラも同じなのです。
両方ともソースから機械語をつくります。
>その後に更に機械語に変換されるとききましたが、とあるのは勘違いでしょう。
あるいはリンカのことを言っているのかもしれませんが、簡略化のために割愛します。
では何が違うのか。ソースコードの違いです。
アセンブラは実質機械語と1対1です。数学の問題を解いているようなものです。
ソースを書くのに凄く時間がかかります。とても生産性は低いです。
メリットは超高速のプログラムが組めます。マシン語と1対1ですから。
しかし、あまりにも効率が悪いのでもっと高級な言語を開発してくれと要求が出ました。
こうして英文を書いているかのような感覚で次々に高級言語が登場します。
これがC言語をはじめとしたコンパイラです。
コンパイラは高級になるために色々と装飾していますので、
それで生成される機械語はいろいろと余分なものがついて効率が悪くなっています。
そのため速度を要求されるオンライン処理とかではアセンブリ言語で開発されます。
以上で解説は終わりますが、とりあえずはソースを書いて経験を積むことです。
CASLの問題を解いてみれば数学みたいで、私の言っていることもよく分かるでしょう。
No.9
- 回答日時:
機械語 CPU実行するプログラム(コード)
アセンブリ言語 機械語と1対1に対応する言語で翻訳が必要
コンパイル言語 高級言語で翻訳必要(c,pl1,cobol,JAVA,basic)
スクリプト言語 高級言語で翻訳不要(perl,php,phyton)
インタプリタ言語 高級言語で会話型言語(翻訳しながら実行)(basic)
--
アセンブラー アセンブリ言語の翻訳プログラム
コンパイラ コンパイル言語の翻訳プログラム
■なぜ一気にソースコードから機械語に変換しないのですか。
>>プログラムは部分的に作成した方が扱い安い場合がおおいからです。
部分的に開発した複数のプログラムを1つの実行形式のプログラムに変換する際に、いろいろなライブラリ関数を組み入れたりプログラム間の変数参照などをさせます。
■claslは、実存しない仮想マシンのアセンブリ言語です。
役割は、国家試験用の言語です。
間違いがあるかもしれませんが、だいたいこんな感じと思ってください。
No.8
- 回答日時:
質問者の言う「ソースプログラム」とは何ですか? ソース(source)という言葉が指しているのはただ「源であるもの,入力元になるもの」という意味ですから,言語処理系(コンパイラもアセンブラもこれに該当します)に対して与えられるプログラム,変換元となるプログラムはすべて「ソースプログラム」と呼べます。
http://eow.alc.co.jp/source/
>ソースプログラムからコンパイルされる場合と、アセンブルされる場合
あるソースプログラムがコンパイルもアセンブルもできると勘違いなさっていらっしゃるような書き方に思えました。
高水準言語のソースプログラムは,コンパイルはできますが,アセンブルはできません。
低水準言語のソースプログラムは,アセンブルはできますが,コンパイルはできません。
>直接ソースプログラムから>アンブルされるのはどのような場合でしょうか。
前述のとおり,ソースプログラムが低水準言語で書かれている場合です。
低水準言語の具体例がどんなものかはすでに No.7 で回答しました。
No.7
- 回答日時:
コンパイラは,高水準言語を入力して,より下位の(=機械語に近い)変換結果を出力する処理系であって,その変換結果がアセンブラ言語/オブジェクトプログラム/実行可能な機械語のいずれかであるかは問わない。
いずれであっても大きくコンパイラと呼ばれる。この出力結果の差はプログラム言語によるものではなく,コンパイラ製品の機能の差である。同じC言語であったとしても,あるコンパイラ製品はアセンブラ言語を出力できるが別のコンパイラ製品はそれができない,という例があるということである。
>低級言語の場合は、
>ソースプログラム>コンパイル>オブジェクトプログラム>アセンブラ>機械語
>という流れになるということでしょうか。
明らかな間違い。コンパイラが扱うのは高水準言語であり,低水準言語(アセンブラ言語)ではないので。
これは上記のように,低水準言語(アセンブラ言語)を出力できるコンパイラ製品を使って,
高水準言語のソースコード →コンパイル→ 低水準言語のソースコード
の後に,
低水準言語のソースコード →アセンブル→ 実行可能な機械語
という処理をおこなっている例であり,低級言語を扱っているのは後半の処理だけである。
>低水準言語とは、固有名詞であげると具体的にはどのような言語になるのでしょうか。
次のja.Wikipediaの「主なアセンブラ」の項を参照。
http://ja.wikipedia.org/wiki/アセンブリ言語
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コード」なんて言うと目を細めるでしょう(笑))
さらにパフォーマンス稼ぐためにバイトコードをさらにコンパイルして機械語にして実行する・・・なんていうこともやりますから,こうなると三者ごちゃ混ぜですね(笑)
maccha_nekoさん、回答有難う御座います。
皆さんからの回答を色々参考にさせてもらいましたが、実は読めば読むほどわからなくなりました。
再度まとめて、質問致します、宜しくお願いします。
>アセンブル:アセンブラ言語で書いたソースプログラムを機械語に変換すること。
>コンパイル:C言語やPascalと言った高級言語で書かれたソースプログラムをオブジェクトプログラムに訳すこと。
>アセンブラは、CPU固有の機械語命令を1命令づつ記述されたもの(アセンブラ言語)から
中間言語(オブジェクト)を生成するもので、コンパイラは、高級言語と呼ばれるもの
(C/C++言語、COBOL、Fortranなど)を、機械語命令に翻訳し、中間言語(オブジェクト)を
生成するもの。
>http://www.kogures.com/hitoshi/webtext/hs-honyak …
の図を見ると、ソースプログラム>コンパイル>
オブジェクトプログラム>アセンブラ>機械語という流れになるのでしょうか。
しかし、色々と皆さんの回答を読まして頂くと、高級言語の場合は、コンパルのみのような表現もあり、
その場合は直接、ソースプログラム>コンパイル>機械語になる。
低級言語の場合は、ソースプログラム>コンパイル>オブジェクトプログラム>アセンブラ>機械語
という流れになるということでしょうか。
色々と回答を頂いて申し訳ないのですが、使用する言語により、機械語になるまで要は2通りのケースがあるということでしょうか。
>アセンブル:アセンブラ言語で書いたソースプログラムを機械語に変換すること。
>コンパイラは高水準言語を扱い,アセンブラは低水準言語を扱う。
これは、言語によっては、「ソースプログラム」からいきなり「アセンブラ言語」に変換するという意味でしょうか。
低水準言語とは、固有名詞であげると具体的にはどのような言語になるのでしょうか。
No.4
- 回答日時:
こんにちは
補足です。
>またコンパイラー、アセンブラは、その後に更に機械語に変換されるとききましたが、なぜ一気にソースコード
>から機械語に変換しないのですか。
昔の話ですが、Cコンパイラといえば、オプティマイズCぐらいしかない頃、まだC関数ライブラリにバグが多くアセンブリ言語ソースが付いていました。バグっぽかったら自分で調べろというわけです。自分で直してMASMというマイクロソフトがMS-DOSにおまけで付けていたアセンブラ-でアセンブルしてライブラリ化したもんです。とお年寄りからよく聞きます。
次の世代では、昨今はデルファイで有名なボーランドなどがコンパイル速度の高速性をウリにした一気にソースコードから機械語に変換するのPASCALコンパイラを販売し、それがウケてコンパイル高速時代になったりしました。
最近では、マシンも十分高速になった背景もあって、ソフトウェアの商業主義に反発したGNUのCコンパイラをはじめとする高級言語群は、開発と保守の効率化からコンパイラから直接バイナリオブジェクトを吐かずにアセンブラソースに落とし既にあるGNUアセンブラに渡してオブジェクトを得る方式で開発/保守しているようです。 一部のGNUのFORTRANやその他の高級言語では、アセンブラにも落とさずコンパイルでC言語のソースを出すところまでのものが目に付きます。
すばらしい完成度のCコンパイラがあるのなだからそれを使い回そうということと異なるプラットフォーム(CPUが違う、OSが違う)でもCコンパイラとアセンブラさえ移植すれば、高級言語は高い移植性が確保できますってところにポイントがあるのでしょう。
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-hon …
http://ja.wikipedia.org/wiki/オブジェクトファイル
>Calsという言語もあると聞きました。この言語自体の役割は何なんでしょう。
CASLの間違いだと思われる。ja.Wikipediaを参照。
http://ja.wikipedia.org/wiki/CASL
No.1
- 回答日時:
コンパイラは変換器ですがアセンブラはアセンブリ言語と呼ばれる言語です、昔はマシン語又は低級言語と呼びました。
ちなみに高級言語はC言語です。Caslではないでしょうか昔の情報処理技術者試験の問題に使われていた言語でアセンブリ言語の一種です。仕様書が問題に付属しそれを見ながら問題を解いていました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 英語パラフレーズの機械? 昔ネイティブの友達が、英語の文章の単語を類義語に言い換えてくれる機械を使っ 1 2022/12/10 19:24
- AI・ロボット 大規模言語モデル(LLM)といふもの 1 2023/05/02 07:24
- 哲学 大規模言語理論といふもの 4 2023/04/30 09:47
- IT・エンジニアリング エンジニア、技術職でもない社会人が趣味の範囲でプログラム使うとすれば何ですか? 4 2023/07/30 19:51
- 英語 会社で英語を使うことになっての英語の勉強方法 5 2022/07/03 11:49
- 日本語 脳科学の奇妙な言語獲得論 2 2022/04/04 13:13
- 大学・短大 アメリカから日本へ留学。機械工学士になりたい。 1 2022/05/25 03:02
- 経営情報システム 買取業務に興味があるんですか、以前静岡県にベトナム人の方たちが営業している、廃品置き場的な場所で、そ 1 2022/10/27 16:06
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- 哲学 非構造主義 1 2023/04/06 16:02
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
成人してから
-
CASL(アセンブラ言語)に関する...
-
これらのプログラミングで使う...
-
おすすめのプログラミング言語...
-
割り込みベクターをC言語で書...
-
アセンブリ言語からC言語への変...
-
COBOLを覚える秘訣?
-
プログラム言語について
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
C言語で128bitの2進数のビット...
-
ライン数とステップ数の違いは?
-
命令について
-
アセンブラ言語がわかりません。
-
素数を求めるプログラム(アセン...
-
レジストってなんですか?
-
03分22秒36のような時間の単位...
-
程度の低い質問で申し訳ないの...
-
verilog 符号付加減算(最上位...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ものづくりに向いているプログ...
-
昔のゲーム製作に使用する言語...
-
電化製品って何言語?
-
アセンブリ言語からC言語への変...
-
パチンコやスロットについて
-
標準関数の中身について
-
割り込みベクターをC言語で書...
-
フローチャートを書く書かない
-
アセンブラ言語って何をするた...
-
おすすめのプログラミング言語...
-
これらのプログラミングで使う...
-
OSはどんなコンピューター言語...
-
アセンブリ言語について。
-
アセンブリ言語を学ぶことは意...
-
コマンドgcc(あるいはcc),cpp,a...
-
コンピュータ言語とプログラミ...
-
オープン系 Web系 ファー...
-
NS Basic/Palm の入門書ありま...
-
プログラミング言語で今、一番...
-
コンパイラーとアセンブラの違い
おすすめ情報