プログラムの実行の仕組みが分かりません。
プログラミング初心者です。
基本的な話ですが、調べてもよく分からなかったので質問させていただきます。
昔、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語』にコンパイルしてくれているから」
という感じです。
こんな感じで合っているでしょうか?
また、こういったソフトウェア工学に関する基本的な事項ってどういう本に載っているのでしょうか?何というカテゴリの属するのでしょうか?
ご回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
こんにちは。
プログラムの実行の仕組みが分かりません。
これって難しいですよね。
C言語は高級アセンブラとも称されるほどプリミティブに近い言語ですので、C言語で開発したプログラムが実行される時の仕組みを理解するには、マシン語が実行される仕組みを把握しないと厳しいと思います。
メジャーなOS(例えばWindowsやLinux、macOSなどなど)ではざっくり以下のイメージです。
- そのOSが指定する形式で、マシン語で書かれたプログラムが記録された実行形式プログラム・ファイルが存在します。
- それを実行する際、OSはそのファイルの内容をメモリにロードし、そのエントリー・ポイントを呼び出します。
- 以降、そのプログラムが実行されます。この時、文字を表示したり、キーボードから入力したり、マウスのデータを受け取ったり、ウィンドウへ描画したりするには、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総合スコア23272
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総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/06 10:33
2019/03/07 11:21
2019/03/07 13:51 編集
2019/03/07 13:18 編集
2019/03/07 14:27
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
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/10 22:57
0
他の方が色々と書かれていて、それぞれ正しいと思うのですが、以下の点について、
教科書に「コマンドプロンプトを使え」と指示があっただけで、なぜコマンドプロンプトなのか
コマンドプロンプトを使うが、現実的で容易な方法だと(教科書の作者は)考えたのではないかと思います。
画面に文字やら、絵などを表示するために、色々と準備が必要になります。それに対し、コマンドプロンプトで、文字を表示する方法は容易です。
(裏では色々とコンピュータが仕事してますが)
コマンドプロンプトは、コマンドプロンプト上で動くプログラムに対し、文字の入力と出力をサポートしています。プログラムが文字を出力するには、コマンドプロンプトに対し、文字を表示してくださいと依頼するだけで済みます。
それに対し、画面上に文字を出力するには、画面のどの場所に、どの大きさで、何色で、、と色々と指定が大変になります。(最近の言語環境は省略できるのも多いですが)
この辺が、コマンドプロンプトを使う理由では無いかと思います。
では、コマンドプロンプトが何をしているとかと言うと、
文字を表示してくれと言われたら、その文字に対応する絵(文字)を用意し、現在のカーソルに位置にその絵(文字)を置き、カーソル位置を移動する処理を行うことになります。この時、右端まできたら、画面表示を一行動かすなど、色々な処理をしています。
では実際の絵(文字)を書く処理は、、と言うと、、、今どきのコンピュータではは、専用のハードウェア(GPU等)に処理を依頼することになります。
と、実際の処理は、必要に応じてそれぞれの下請けに依頼しています。この下請けは、環境によって、Win32API とか、.NET とか呼ばれます。
質問には、0/1の機械語になって実行されるとありますが、最近のコンピュータでは、それも不正確で、Javaなんで、(普通の)機械語で無く、Java用の機械語(一般には中間言語)になり、Javaがそれを読み込みながら(解釈しながら)、実行します。ここでは、一つの機械語が、WindowsでもLinuxでも動きます。(という事になっている) HTMLだと、テキストで書かれたコードが、IEや、Edge、Chrome 等、どこでも動きます。
投稿2019/03/07 15:09
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/06 10:26
2019/03/07 11:14
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/07 11:15