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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

C

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

7回答

2039閲覧

プログラムの実行の仕組みが分かりません

WeilSpinor

総合スコア170

機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

C

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

6グッド

3クリップ

投稿2019/03/05 11:34

プログラムの実行の仕組みが分かりません。

プログラミング初心者です。
基本的な話ですが、調べてもよく分からなかったので質問させていただきます。

昔、C言語で「画面に『Hello World』と表示するプログラム」を作って、exeファイルをコマンドプロンプト上で実行したのを覚えています。すると、コマンドプロンプトの黒い画面に「Hello World」と表示されました。
しかし、教科書に「コマンドプロンプトを使え」と指示があっただけで、なぜコマンドプロンプトなのか、よく分かりませんでした。
これだけだと、
「C言語とは、Windowsのコマンドプロンプトというアプリケーションに文字列を出力するためのプログラム言語なのか?」
と思ってしまいますが、恐らくそれは違って、もっと幅広い使い方が出来るのだと思います。

私の仮説では、カギは「コンパイラ」にあるのではないか、と思っています。

C言語で書かれたソースコードを、

『コマンドプロンプト用機械語』に翻訳すれば、
「ダブルクリックするとコマンドプロンプト画面に『Hello World』と表示されるプログラム」になり、

『Word用機械語』に翻訳すれば、
「ダブルクリックするとWord画面に『Hello World』と表示されるプログラム」になり、

『Microsoft Edge用機械語』に翻訳すれば、
「Microsoft Edge画面に『Hello World』と表示されるプログラム」になる、

という感じです。

つまり、
プログラムを実行したいアプリケーションの数だけ『C言語コンパイラ』が存在して、それを端末にインストールした状態で実行すれば、そのアプリケーションでHello Worldを表示できる、
という感じです。

しかし、
Hello Worldを表示する程度の単純なプログラムならまだしも、
「スマブラのゲーム」みたいな、映像を使ったりキャラを操作したりする大規模で高度なプログラムになると、
さすがにコマンドプロンプトみたいなショボいアプリケーション上では実行できないので、
Nintendo Switchのような「スマブラ専用のOSやアプリケーション」が必要になる、という感じです。

Androidアプリ開発においても同様のことが言えて、
Javaで書いた家計簿プログラムが、Android上でAndroidアプリとして動くのは、
「Android Studioが、Java家計簿ソースプログラムを『Android語』にコンパイルしてくれているから」
という感じです。

こんな感じで合っているでしょうか?

また、こういったソフトウェア工学に関する基本的な事項ってどういう本に載っているのでしょうか?何というカテゴリの属するのでしょうか?

ご回答よろしくお願いします。

bochan2, DrqYuto, BeatStar, yohhoy, dice142, atata0319👍を押しています

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

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

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

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

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

guest

回答7

0

こんにちは。

プログラムの実行の仕組みが分かりません。

これって難しいですよね。
C言語は高級アセンブラとも称されるほどプリミティブに近い言語ですので、C言語で開発したプログラムが実行される時の仕組みを理解するには、マシン語が実行される仕組みを把握しないと厳しいと思います。

メジャーなOS(例えばWindowsやLinux、macOSなどなど)ではざっくり以下のイメージです。

  1. そのOSが指定する形式で、マシン語で書かれたプログラムが記録された実行形式プログラム・ファイルが存在します。
  2. それを実行する際、OSはそのファイルの内容をメモリにロードし、そのエントリー・ポイントを呼び出します。
  3. 以降、そのプログラムが実行されます。この時、文字を表示したり、キーボードから入力したり、マウスのデータを受け取ったり、ウィンドウへ描画したりするには、OSが用意したAPIを呼び出して行います。

プログラマが特定のプログラミング言語で書いたプログラムを解釈してマシン語を出力するものがコンパイラです。そしてコンパイラが出力する1つまたは複数のマシン語ファイルを必要に応じて標準ランタイム・ライブラリ等と結合して、OSが指定する形式の実行形式プログラム・ファイルを出力するのがリンカです。

そのようなプログラミング言語の1つがC言語です。C言語でかかれたプログラムをマシン語に変換するコンパイラは非常に多数あります。メジャーなものは Visual C++、gcc、clangと思いますが、他にも山程あります。(なお、現代のほとんどのC言語ではコンパイラに含めてリンカも提供されます。)

『Word用機械語』に翻訳すれば、

「ダブルクリックするとWord画面に『Hello World』と表示されるプログラム」になり、

WordはOSではありませんので、『Word用機械語』というものは存在しません。『Microsoft Edge用機械語』も同様です。(これらはマシン語プログラムをロードして実行する機能をユーザへ提供していません。)

コマンド・プロンプトはWindowsが提供するプログラム実行環境の1つですので、『コマンドプロンプト用機械語』は存在すると言っても間違いではないと思います。『コマンド・プロンプトを使用する、Windows用の実行形式プログラム・ファイル』と言った方がより実態に近いと思います。有名な"Hello, World!"プログラムをコンパイル/リンクしたものはその1つです。

投稿2019/03/05 13:52

編集2019/03/05 13:54
Chironian

総合スコア23272

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

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

WeilSpinor

2019/03/07 11:15

ご回答ありがとうございます。参考にさせていただきます
guest

0

ベストアンサー

色々勘違いが有るようですが、以下を参考にされたらどうでしょう?
プログラミングの楽しさ: プログラムが動く仕組み
「追記」

プログラムを実行したいアプリケーションの数だけ『C言語コンパイラ』が存在

ではなく、プログラムを実行したいOSの数だけ『C言語コンパイラ』が存在・・・ですかね?
(実際はCコンパイラも、ソースから実行するOS用にコンパイルできます)
アプリケーションは、プログラムですからそれが実行できるOSが必要です。(OSもプログラムだけれど・・・)
例えばfirefoxというウェブブラウザがありますが、OS単位(windows,macOS,Linux・・・)のものが配布されています。
「追記」カーニハンの「hello, world」をclangでコンパイルしてみました

c

1#include <stdio.h> 2 3main( ) 4{ 5 printf("hello, world\n"); 6}

コンパイル結果(最適化はしていません)

asm

1 .text 2 .file "hw.c" 3 .globl main # -- Begin function main 4 .p2align 4, 0x90 5 .type main,@function 6main: # @main 7 .cfi_startproc 8# %bb.0: 9 pushq %rbp 10 .cfi_def_cfa_offset 16 11 .cfi_offset %rbp, -16 12 movq %rsp, %rbp 13 .cfi_def_cfa_register %rbp 14 subq $16, %rsp 15 movabsq $.L.str, %rdi 16 movb $0, %al 17 callq printf 18 xorl %ecx, %ecx 19 movl %eax, -4(%rbp) # 4-byte Spill 20 movl %ecx, %eax 21 addq $16, %rsp 22 popq %rbp 23 .cfi_def_cfa %rsp, 8 24 retq 25.Lfunc_end0: 26 .size main, .Lfunc_end0-main 27 .cfi_endproc 28 # -- End function 29 .type .L.str,@object # @.str 30 .section .rodata.str1.1,"aMS",@progbits,1 31.L.str: 32 .asciz "hello, world\n" 33 .size .L.str, 14 34 35 36 .ident "clang version 9.0.0 (trunk 354955)" 37 .section ".note.GNU-stack","",@progbits 38 .addrsig 39 .addrsig_sym printf 40

これを実行ファイルにすると・・・main()のみ抜粋(真ん中の16進数が機械語です)

asm

10000000000400500 <main>: 2 400500: 55 push %rbp 3 400501: 48 89 e5 mov %rsp,%rbp 4 400504: 48 83 ec 10 sub $0x10,%rsp 5 400508: 48 bf b4 05 40 00 00 movabs $0x4005b4,%rdi 6 40050f: 00 00 00 7 400512: b0 00 mov $0x0,%al 8 400514: e8 e7 fe ff ff callq 400400 <printf@plt> 9 400519: 31 c9 xor %ecx,%ecx 10 40051b: 89 45 fc mov %eax,-0x4(%rbp) 11 40051e: 89 c8 mov %ecx,%eax 12 400520: 48 83 c4 10 add $0x10,%rsp 13 400524: 5d pop %rbp 14 400525: c3 retq

投稿2019/03/05 12:16

編集2019/03/06 10:27
cateye

総合スコア6851

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

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

cateye

2019/03/05 12:58 編集

「プログラムの実行の仕組み」と言うと本が一冊書けるwと思います。なので、どの程度の(Cのソースをコンパイラに書けると機械語の実行ファイルが出来る・・・までは分かるとか?)知識を必要としているのか?が分かるともっと答えやすくなると思います。https://sites.google.com/site/whatsacomputerhtml/home ←この辺も参考になるかも? ちなみに組み込み用(車載、電気炊飯器、電子レンジなど)もちっちゃなOS(アセンブラで2〜3千行ていど)が入っています。
cateye

2019/03/06 10:33

カーニハンの「hello, world」は、今となっては古い文法(main()に返り値が無いとか色々あります)ですがワーニングを出しながらちゃんと実行ファイルは出来ますv^^;
WeilSpinor

2019/03/07 11:21

ご回答ありがとうございます。 2つ目のコンパイル結果、というのは、いわゆる、オブジェクトファイル、というものでしょうか? この段階ではまだ機械語ではないのですね…。(アセンブリ言語?) 3つ目の実行ファイルも、機械語以外の文字があるんですね。 「コンピューターは0と1の状態しか理解できない」と習ったので、 実行ファイルは「0と1だけからなる機械語の羅列ファイル」だと思っていました。 16進数のままでは実行できるんでしょうか? (それとも、実行ファイルをメモリに読み込むときに、改めて0と1の機械語に自動翻訳されるようになっている?)
cateye

2019/03/07 13:51 編集

実行ファイルはリンクされたあとに出来るものでアドレスの解決が出来ているものです。(上記もhello, worldをコンパイルして実行ファイル(a.out)を逆アセンブルしたもののmain部分です)。あと、ニモニック(https://www.weblio.jp/content/%E3%83%8B%E3%83%A2%E3%83%8B%E3%83%83%E3%82%AF)というのは人間に読みやすいように逆アセンブルしてあるだけで、実行ファイルには含まれません。16進の例えば先頭(アドレス400500)の55は(push %rbpというのはベースポインタを退避する命令・・参考:https://qiita.com/tobira-code/items/75d3034aed8bb9828981 )2進で表せば'01010101'(8ビット)になります。要は0=OFF,1=ONです。なのでそのまま機械語です。これがメモリに読み込まれて実行されます。
pepperleaf

2019/03/07 14:27

脇から失礼します。 > 「0と1だけからなる機械語の羅列ファイル」 この理解はほぼ、正しいです。ただ、人が読むとき、0/1 の羅列では読みずらいので、16進数表記にする事が多いだけです。で、歴史的事情で、8bit単位で区切る、、と。 多分、「アドレスの解決」の意味も不明ではないかと思いますが、最初は悩まない方が良いと思います。C言語を機械語に変換する時に、関数名/変数名から、メモリ上にアドレスに変換すると言えば、良いでしょうか? 「鈴木さんちに行きたい」言うときに、鈴木さん → xx丁目yyy番地にするようなものです。(こんなたとえで分かるか?)
guest

0

多くのソフトウェアはコマンドプロンプトのような低機能な出力を持っています。
が、見せてないだけです。


「C言語とは、Windowsのコマンドプロンプトというアプリケーションに文字列を出力するためのプログラム言語なのか?」

より正確に言うならば

「C言語の標準ライブラリは、
ファイルもしくは標準入力という「なにか」から文字列を取得し
ファイルもしくは標準出力・標準エラー出力という「なにか」に文字列を出力するためのライブラリ」ですね。

これを超える事は標準ライブラリではできず、なんらかのライブラリが必要になります

例えばお使いのCコンパイラがwindowsのWin32APIライブラリに対応している場合

c

1#include <windows.h> 2 3int main(){ 4 MessageBox(NULL, "Show Messagebox", "test", MB_OK); 5 return 0; 6}

でメッセージボックスを表示するプログラムが作成できるはずです。

投稿2019/03/05 12:14

asm

総合スコア15147

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

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

WeilSpinor

2019/03/07 11:22

ご回答ありがとうございます。参考にさせていただきます
guest

0

『コマンドプロンプト用機械語』に翻訳すれば、

「ダブルクリックするとコマンドプロンプト画面に『Hello World』と表示されるプログラム」になり、

実は『コマンドプロンプト用機会語』なんてものはありません。コマンドプロンプトにHello Worldと書くexeファイルは別にコマンドプロンプトを使わなくても実行できますよ。今どきの方法でビルドすると、勝手にコマンドプロンプトを立ち上げてくれるアプリケーションになるかもしれませんが。

解説:標準入出力というものを使っています。コマンドプロンプトはユーザと標準入出力を介するための手段です。

『Word用機械語』に翻訳すれば、

「ダブルクリックするとWord画面に『Hello World』と表示されるプログラム」になり、

『Word用機械語』というものはありません。Wordは.docとか.docxとか.rtfとか.txtとかいろいろなフォーマットのファイルを読み込めますよね。それを解釈して描画し、編集を反映して書き込むのが「Wordというアプリケーションのお仕事」です。.rtfくらいなら人の目に優しいですから、一回テキストエディタで開いてみると良いでしょう。いろいろな制御情報が書かれているのがわかります。

『Microsoft Edge用機械語』に翻訳すれば、

「Microsoft Edge画面に『Hello World』と表示されるプログラム」になる、

同上。EdgeなどのWebブラウザも(基本的には)HTMLというフォーマットで書かれたデータをきれいに表示するためのアプリケーションです(実際にはCSSとかJavaScript、場合によってはFlashなどが絡んできて混沌としてくる)。


たとえばHello Worldと書かれたファイルを読み込んで、べつにGUIでも音声でも好きな方法で構わないので出力する、というアプリケーションを考えます。

ファイルをメモ帳でGoodbye Worldに書き換えればGoodbye Worldと言う訳で、別にそういうことにコンパイラは関わっていません。そこの線引きが怪しいと後々理解が追いつかなくなるかもしれない。

コンパイラを通って生まれているのは「コマンドプロンプト」とか「Word」とか「Edge」です。いずれもマイクロソフトが(偶然そうだっただけで別にマイクロソフトじゃなくてもいいけど)Cないしそれに類する言語で書いて、x86環境上で動くwindows用にコンパイルして売ってくれました。「Word」や「Edge」のHello Worldが「C言語で書かれてコンパイルされて」いる訳ではないですね。

コマンドプロンプトはちょっと特殊で、コマンドプロンプト上で自作のHello Worldなんかを実行するとそれを別途立ち上げて標準入出力を繋いで・・・ということをやってくれるのですが。それだって「コマンドプロンプト用に書かれたHello Worldが実行される」とは考えない方が良いでしょう。あくまでも「x86環境上で動くwindows用にコンパイルされたHello World(標準入出力仕様)」と捉えた方が自然です。

投稿2019/03/10 16:27

hayataka2049

総合スコア30933

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

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

pepperleaf

2019/03/10 22:57

コマンドプロンプトって元々、外部端末ですね、大昔の。 今でこそ、一体化してますが、シリアル通信とかで接続されて。 標準入出力自体も、"標準"なんで、環境ごとに切替え可能と、、、。 ここまで言い出すと、初心者には理解が難しい? 一旦は機械語を含めて忘れて、全体の概念の理解の必要がありそうな気がします。
guest

0

他の方が色々と書かれていて、それぞれ正しいと思うのですが、以下の点について、

教科書に「コマンドプロンプトを使え」と指示があっただけで、なぜコマンドプロンプトなのか

コマンドプロンプトを使うが、現実的で容易な方法だと(教科書の作者は)考えたのではないかと思います。
画面に文字やら、絵などを表示するために、色々と準備が必要になります。それに対し、コマンドプロンプトで、文字を表示する方法は容易です。
(裏では色々とコンピュータが仕事してますが)
コマンドプロンプトは、コマンドプロンプト上で動くプログラムに対し、文字の入力と出力をサポートしています。プログラムが文字を出力するには、コマンドプロンプトに対し、文字を表示してくださいと依頼するだけで済みます。
それに対し、画面上に文字を出力するには、画面のどの場所に、どの大きさで、何色で、、と色々と指定が大変になります。(最近の言語環境は省略できるのも多いですが)
この辺が、コマンドプロンプトを使う理由では無いかと思います。


では、コマンドプロンプトが何をしているとかと言うと、
文字を表示してくれと言われたら、その文字に対応する絵(文字)を用意し、現在のカーソルに位置にその絵(文字)を置き、カーソル位置を移動する処理を行うことになります。この時、右端まできたら、画面表示を一行動かすなど、色々な処理をしています。
では実際の絵(文字)を書く処理は、、と言うと、、、今どきのコンピュータではは、専用のハードウェア(GPU等)に処理を依頼することになります。
と、実際の処理は、必要に応じてそれぞれの下請けに依頼しています。この下請けは、環境によって、Win32API とか、.NET とか呼ばれます。


質問には、0/1の機械語になって実行されるとありますが、最近のコンピュータでは、それも不正確で、Javaなんで、(普通の)機械語で無く、Java用の機械語(一般には中間言語)になり、Javaがそれを読み込みながら(解釈しながら)、実行します。ここでは、一つの機械語が、WindowsでもLinuxでも動きます。(という事になっている) HTMLだと、テキストで書かれたコードが、IEや、Edge、Chrome 等、どこでも動きます。

投稿2019/03/07 15:09

pepperleaf

総合スコア6383

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

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

0

「プログラムとは何か」の原点からしますと, やや古めですが次の本をご紹介致します.

CPUの創りかた

ただ、ここから「コンパイラ」に繋がる道をどう見つけるかが, 難しいです.

投稿2019/03/06 07:55

jimbe

総合スコア12545

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

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

WeilSpinor

2019/03/07 11:14

ご回答ありがとうございます。参考にさせて頂きます。
guest

0

こういった本でしょうか。

プログラムが動く理由をきっちり学ぶにはかなり幅広い知識が必要ですが、
最近は学校でプログラミングが必修になるということでやさしい本が色々出ています。

大きめの書店のコンピュータ関連エリアの読み物系(プログラミングとか専門書系ではないところ)の集まりにあると思います。
色々あってどれが合うかわからないので、一度パラパラとめくってみるといいと思いますよ。

加えてC言語などの中級言語を勉強すれば理解が早まると思います。

投稿2019/03/05 14:13

toki_td

総合スコア2850

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

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

WeilSpinor

2019/03/07 11:15

ご回答ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問