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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

248閲覧

コンパイラの中身とcpu以外の装置について。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/01/22 07:19

編集2018/01/22 07:30

自作コンパイラにどの様なファイルが必要なのでしょうか?
例えば、画面に横100px、縦100pxの赤色の画像を表示するプログラムがあるとします。そのプログラムを
コンパイルするにあたって、cpu以外にもメモリやほかの装置にも命令がいくはず、ならばコンパイラのソースコードにはcpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?
今まで質問とは違いコンパイラとハードウェアの質問ですが、どうかよろしくお願いします。

(修正)
補足ですいません。命令や関数を自作する場合、
コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか?
使うcpu自体の事も理解していないとちゃんと動作する命令や関数が作れないと思うのですが。
コンパイラのソースコードには二進数などの命令も書かれてありどのようにcpuで動くなども記述されているのでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

cpu以外にもメモリやほかの装置にも命令がいくはず、

そのお膳立てをしているのが「OS」です。例えばWindowsは、画面に絵や文字を表示したり、音を鳴らしたり、キーボードやマウスの入力を制御したり、ファイルを読んだり書いたり、そういった機能を有しています。そして、OSの開発者はそれらの機能をユーザーに使ってもらえるように「API (Application Programming Interface)」を公開しています(OSのAPIはシステムコールとも呼びます)。APIは究極的にはCPUのCALL命令やソフトウェア割り込み命令などで実行されます。

コンパイラーは、ソースコードを読み取って最終的に「API呼び出しをするCPU命令」を生成することで、OSが提供する機能(CPU以外のハードウェアの制御)を実行することができるのです。

つまり、

cpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?

コンパイラーの自作が目的なら、「所望の機能を実行するAPIを呼び出す命令を生成する処理を書く」、ということになります。

コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか?

当然そうなります。ソースコードをどのように解釈し、どのようなCPU命令を生成するかをきっちり設計しなければコンパイラーは作れません。

コンパイラのソースコードには二進数などの命令も書かれてありどのようにcpuで動くなども記述されているのでしょうか?

それはコンパイラーの責務ではありません。CPUがどのような命令でどのように動くかはCPUのマニュアルに書かれています。そして、それを提供しているのはCPUメーカー(インテルとかAMDとか)です。通常、コンパイラーの開発者はCPUメーカーからCPUのマニュアルを入手し、それをよりどころにコンパイラーを開発します。

ただし、JavaやC#のような「仮想マシン」用の命令を生成するような場合は、コンパイラーの開発者がその「仮想マシン」の仕様を詳細に定めることになります。

ちなみに、命令が必ずしも二進数(バイナリデータ)で書かれるとは限りません。いったんアセンブリ言語のコードを生成して、それをアセンブラーでアセンブルしてバイナリデータにする、という方式も多いです。アセンブラーはコンパイラーとは別に用意されている場合もありますし、コンパイラーに内蔵されている場合もあります。

いずれにしても、コンパイラーの自作はかなりハードルが高いですよ? 初心者の状態からだと、おそらく年単位でかかると思います(どのようなコンパイラーを想定しているのかにもよりますが)。

投稿2018/01/22 09:01

catsforepaw

総合スコア5938

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

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

carnage0216

2018/01/22 09:26

自作と書きましたが、最初は既にあるgccのCコンパイラをいじって新しい命令を作ろうと考えています。 その場合にも使っているPCのCPUメーカーが必要だと思いますが。 いじったりして実験するようなサイトや本はないでしょか? 言語は特に決めていないのであるならば教えていただきたいです
carnage0216

2018/01/22 09:26

詳しい解説、どうもありがとうございます
catsforepaw

2018/01/22 11:32

gccをいじるのもまたハードルが高いですよ。コード量が膨大な上にGNUのコードはお世辞にも読みやすいとは言いがたいですから。 まずはコンパイラーの解説書でコンパイラーを作るための知識を体系的に学んだ方が効率が良いでしょう。コンパイラーを作ることを目標に順を追って解説している本も見たことがあります。とりあえず技術書がたくさん置いてあるような大きな書店で手に取ってぱらぱらと流し読みしてみて、判りやすそうなのを選ぶのがよろしいかと思います。 gccをいじるにも、基本的なコンパイラーの仕組みは知っておかないと訳が判らないと思いますから。
carnage0216

2018/01/22 11:56

わかりました。 あの、コンパイラからは話がずれるかもしれないのですが、cpuでコンパイルできてもcpu以外のメモリやほかの装置にはosが働くならば、osにはコンパイルされた後の機械語がどのようにメモリやほかの装置に行くなどが書いてあるのでしょうか? 以上がもし正しいならば、仮にコンパイラが自作できても、その自作したコンパイラがメモリやほかの装置に働くように自作コンパイラ用のosを作らないといけないのですか? 勘違いなどがあるかもしれませんが、どうかよろしくお願いします。
catsforepaw

2018/01/22 12:42

> osにはコンパイルされた後の機械語がどのようにメモリやほかの装置に行くなどが書いてあるのでしょうか? 違います。OS自身がハードウェアを制御するように作られていて、コンパイルで出力された機械語、すなわちアプリケーションは、あらかじめ決められた手続きに従ってOSの機能を利用するだけです。その手続きがAPIと呼ばれているものです。それさえ判っていれば、アプリケーションがOSの中身を知る必要はありませんし何か手を加える必要もありません。ましてや、OSを作る必要など全くありません。 コンピューターが動く仕組みについても学ばれた方が良いでしょう。それを判りやすく解説した本もあります。
carnage0216

2018/01/22 12:45

はい、勉強してみます。どうもありがとうございました。
carnage0216

2018/01/22 13:22

あの回答済みで申し訳ないのですが、「所望の機能を実行するAPIを呼び出す命令を生成する処理を書く」に関してなのですが、「新しい命令」をコンパイラに書くとします。そしてコンパイラから機械語になった命令がAPIの方へ流れる際にAPI自体に「新しい命令」を書き加えておかないといけないのではないでしょうか? 説明が下手かもしれませんが、API呼び出しをする新しいCPU命令であれど、APIが新しい命令を認識してくれないと意味がないのではないでしょか? 最後に好奇心なのですがAPI自体はいじれないのでしょうか?
carnage0216

2018/01/22 13:30

補足で申し訳ありません。APIが呼び出せるような新しい命令をCPUが出力するならば、APIがどのような命令がきたらどのように動くなど理解していなければならないのでしょうか? 質問が多くなってしまいましたがどうかよろしくお願いいたします。
catsforepaw

2018/01/22 14:34

APIというのはOSが提供する「所定の手続き」のことです。OSが提供するAPIは「OSが有する機能の数だけ」存在し、この機能を使うときはこの関数を呼んでね。引数はこれとこれね。」といった具合に機能ごとにきっちりと決められています。 文字を表示するコードをコンパイラーに渡せば、コンパイラーは文字を表示するAPIを呼び出す処理をする機械語を生成します。音を鳴らすコードをコンパイラーに渡せば、コンパイラーは音を鳴らすAPIを呼び出す処理をする機械語を生成します。 要は、すべてのプログラミング言語は、最終的には既存のCPU命令やOSのAPI呼び出しを組み合わせることで成り立っており、その組み合わせを適切に行うのがコンパイラーです。 > 最後に好奇心なのですがAPI自体はいじれないのでしょうか? 基本的にはOSのAPIはOSの開発者しかいじれません。それは、Windowsならマイクロソフトですし、macOSならアップルということになります。 Linuxはカーネルやドライバー、ランタイムライブラリ等が公開されていて自分でビルドできるので、それに意味があるかどうかはおいておくとして、APIをいじることは可能です。ただし、既存のAPIを改変してしまうと、それを使用するアプリケーションが動かなくなる危険性があります。「所定の手続き」というのは、むやみに変えると「所定」ではなくなってしまいますから。 > APIが呼び出せるような新しい命令をCPUが出力するならば、APIがどのような命令がきたらどのように動くなど理解していなければならないのでしょうか? 「新しい命令をCPUが出力」などということはありません。APIは呼ぶものであって動くものではありません。 おそらく、その辺の仕組みが理解できておらず、ただ漠然とした疑問をぶつけているように思います。 コンピューターやプログラミングの入門書・解説書等で体系的に学ぶことをお勧めします。
carnage0216

2018/01/23 00:18

解答ありがとうございます。そして、理解力が乏しくて申し訳ありません。 あのお手数をおかけするのですが、解答者様からおススメの書物はないでしょうか? 自作os入門などはあるのですが、それだけで答えが得られるか不安です。 どうかよろしくお願い致します。
catsforepaw

2018/01/23 00:40

お勧めと言われてもその辺の情報をウォッチしている訳ではないので、残念ながらすぐには答えられません。私がその手の本を熱心に読んでいたのは30年以上前の話で、今とはだいぶ様子が違いますから。まぁ、私が初心者だった頃は、本屋を何軒もはしごしてコンピューター関連の書籍を片っ端から手にとってみて、理解できそうなやつを何冊も買っていました。漫画で解説しているものとかもありましたね。「なぜ二進数なのか」というような基本中の基本から学んだものです。
carnage0216

2018/01/23 10:43

どうもありがとうございます。 大きな書店に行って理解しやすいものを買います。 本当にありがとうございました。
guest

0

コンパイラと言っても大きく2種類あります。

  1. 直接CPUが処理できる命令に置き換えるもの

実行速度は速い

  1. 中間コードに変換し、ランタイムプログラムが中間コードを解釈して実行するもの

1に比べると実行速度は遅い。ただしインタープリターよりは概ね速い。

CやC++などは、1の形のコンパイラになります。(C++/CLIは.NETなので別)
C#やVB.NETなどはどちらかと言うと2の中間コード形式です。.NET Frameworkがそのランタイムになります。

画面などハードウェアへのアクセスは、そのハードウェアにアクセスするためのドライバーやライブラリなどが通常は必要になります。

中間コードにする利点は、OSなどのプラットフォームに依存する部分を、ランタイムにすべて任せることができる点です。使用するプラットフォーム向けのランタイムがあれば、中間コードはどのプラットフォームでも動くということになります。(Javaなどがそうですね)

コンパイラーを自作する場合、CPUの命令コードまで吐き出すような物となると、CPUの理解は必須になります。
そうではなく、C言語やC++言語へのソースコードを吐き出して、それを既存のC/C++コンパイラーに掛けるというやり方もありかと思います。
この場合は、コンパイラーというよりトランスレータになってしまいますが、CPUの命令を吐き出すのも一種のトランスレータですから、まあ、有りかと。

(初期のC++は、C言語のソースコードを吐き出すプリプロセッサとして作られました。今は、CPUのコードを吐き出すようなものしか無いと思いますが、それでも1パスではなく複数のパスを通して最終的にCPUのコードを吐き出しています。)

投稿2018/01/22 08:25

PineMatsu

総合スコア3579

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

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

carnage0216

2018/01/22 09:27

難しいですね。 どうもありがとうございます。
guest

0

こんにちは。

メモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?

Pythonは知りませんが、C, C++についてはそれらは標準ランタイム・ライブラリの仕事です。
コンパイラ自身ではないです。ただ、他のコンパイラが提供している標準ランタイムを使わない場合は自力で標準ランタイムを開発する必要があります。


【補足への追記】

命令や関数を自作する場合、コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか?

C/C++の場合は関数を追加するだけならコンパイラを修正する必要は全くありません。普通にその関数をC/C++言語で記述してC/C++コンパイラでコンパイルするだけです。

if文や各種演算子等のコンパイラ組み込みの構文を追加するような場合はコンパイラ自体の修正が必要です。最終的にはコンパイラがマシン語を出力します。マシン語出力まで修正が必要になるかどうかは修正内容次第です。
ですが、難易度高いです。コンパイラの改造はプログラミングに熟練するまで封印しておいた方が良いかも知れません。プログラミングの素人が改造したコンパイラが使い物になるとは思えないですし。

投稿2018/01/22 07:29

編集2018/01/22 08:16
Chironian

総合スコア23272

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

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

carnage0216

2018/01/22 09:37

詳しい回答どうもありがとうございます。 確かに素人の私がいじるのはまずいですね。 まずは関数の自作とOSを勉強します。
guest

0

コンパイラのソースコードにはcpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?

通常、メモリアクセスはCPU自身が管理していてMOVなどCPU自体に命令として組み込まれていますので、アクセスコードという必要はあまりありません(昔のMS-DOSなど一気に使えるメモリが狭い環境では、切り替える処理を生成する必要があるケースもあります)。

一方で、「文字を出力する」とか「キーボードから値を取ってくる」といった処理は、本来であればI/OポートやメモリマップドI/Oなど、ハードウェアごとにアクセス手法が違ってきます(ワンチップマイコンなどだと、自分で管理しないといけません)。

ただ、それでは煩雑すぎるので、抽象化するレイヤーがいくつもあります。いちばん原始的なところではBIOS(Basic I/O System)があって、特定の割り込みを呼び出せばこの動作をする、というようなものを実装しています。

さらに、現代のOSではデバイスドライバを組み込みますが、デバイスドライバがハードウェア間の差異を吸収して、OS上で動くプログラムは個々のハードウェアを考えなくても、OSのAPIを呼び出せば同じ動作をさせられる、というようになっています。

投稿2018/01/22 07:33

maisumakun

総合スコア145184

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

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

carnage0216

2018/01/22 09:34

回答どうもありがとうございます。 あの「I/Oポート メモリマップドI/O」や「現代のOSではデバイスドライバを組み込みますが、デバイスドライバがハードウェア間の差異を吸収して、OS上で動くプログラムは個々のハードウェアを考えなくても、OSのAPIを呼び出せば同じ動作をさせられる、というようになっています」に関して勉強したいのですが、30日でできる! OS自作入門などのOSを入門書でも勉強できるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問