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

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

ただいまの
回答率

90.75%

  • Python

    6810questions

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

  • C

    3444questions

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

  • C++

    3239questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 345

carnage0216

score 120

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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 18:26

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

    キャンセル

  • 2018/01/22 18:26

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

    キャンセル

  • 2018/01/22 20:32

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

    キャンセル

  • 2018/01/22 20:56

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

    キャンセル

  • 2018/01/22 21:42

    > osにはコンパイルされた後の機械語がどのようにメモリやほかの装置に行くなどが書いてあるのでしょうか?

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

    キャンセル

  • 2018/01/22 21:45

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

    キャンセル

  • 2018/01/22 22:22

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

    最後に好奇心なのですがAPI自体はいじれないのでしょうか?

    キャンセル

  • 2018/01/22 22:30

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

    キャンセル

  • 2018/01/22 23: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は呼ぶものであって動くものではありません。
    おそらく、その辺の仕組みが理解できておらず、ただ漠然とした疑問をぶつけているように思います。
    コンピューターやプログラミングの入門書・解説書等で体系的に学ぶことをお勧めします。

    キャンセル

  • 2018/01/23 09:18

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

    キャンセル

  • 2018/01/23 09:40

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

    キャンセル

  • 2018/01/23 19:43

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

    キャンセル

+1

こんにちは。

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

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


【補足への追記】

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 18:37

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

    キャンセル

+1

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

  1. 直接CPUが処理できる命令に置き換えるもの
    実行速度は速い

  2. 中間コードに変換し、ランタイムプログラムが中間コードを解釈して実行するもの
    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 18:27

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

    キャンセル

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 18:34

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    リバースエンジニアリングの練習

     リバースエンジニアリングに挑戦しているのですが、逆アセンブリしたコードが上手くc言語に訳せません。  何かいい練習方法があれば教えてください

  • 解決済

    構造体変数のファイル出力におけるパディングの問題

    パディングを無視して、構造体変数自体を保存できる理由が分かりません。 以下のサイトで、可変長配列メンバを利用した、構造体変数自体のファイル出力を行っています。 ただ、パディ

  • 解決済

    メモリについて

    例えば、char i = 'A'; とC言語で宣言した場合、メモリ上にchar分の領域が確保されると思うのですが・・・ OS側はどのようにしてメモリを確保しているのでしょうか?

  • 解決済

    c言語のint型のポインタサイズ

    C言語を勉強しています。 ポインタの勉強の中でポインタのサイズを表示させるコードを作って実行したところ、int型が8byteと表示されす。 int型は4byteと表示されるはずなの

  • 解決済

    C言語にてint型のメモリを動的に確保するとき

    C言語でint型のメモリを確保するときの動作について質問です。 #include <stdio.h> #include <stdlib.h> #include <string.

  • 解決済

    アセンブリと高級言語

    C言語はアセンブリ言語を基にして開発されていますが、逆にC言語などのような高級言語(Java, php, Ruby etc)などからアセンブリ言語でソースを作ることは可能でしょうか

  • 解決済

    GPUのツールcudaについて。

    GPUでopencv入門を始めたのですが、ツールはcudaを使っています。 そこで質問なのですがcudaはC言語やc++でもプログラミング可能と書いてあったのですが、ということはG

  • 解決済

    標準ライブラリ関数と自作関数に関して

    今、opencvを勉強中に好奇心で質問したいのですがよろしいでしょうか? もちろん、勉強中の画像処理とはほぼ関係がないため怒られるかもしれませんが、一度好奇心をもってしまうと知りた

同じタグがついた質問を見る

  • Python

    6810questions

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

  • C

    3444questions

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

  • C++

    3239questions

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