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

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

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

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

Q&A

8回答

1444閲覧

プログラムの処理の流れとは

siaron

総合スコア8

C

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

0グッド

1クリップ

投稿2018/05/29 20:07

basicだかHSPではインタプリタで一行ずつ処理されるみたいな話は聞いたことがあります
上から処理されるとか

Cとか本格的なのは違うと言う事はわかりますが
厳密にはどういうなんでしょうか?
どこに書いても大丈夫と言うのってそんなのありましたっけ?

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

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

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

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

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

a_saitoh

2018/05/30 02:24

ここでの「処理」とはどういうことを指しているのでしょう?それによって回答は変わってきます。
guest

回答8

0

質問のポイント(どの辺が疑問)かによるのですが、コンパイル型言語かインタプリタ型言語かと、ソースプログラムファイルのどこから実行されるかは関係ありません。

言語により、ファイル先頭の実行文から実行されるか、最初に実行される関数・メソッドが決まっているか(最初に何を実行するか外部から指定する物もあるかと)、どちらかです。
また、ちょっと説明が難しいですが、宣言文も、静的に解釈されるか、動的に処理されるか、言語によって違います。

なお、現在メジャーな言語では、純粋なインタプリタ型言語はおそらくありません。コンパイル結果をファイルとして書き出さない言語でも、実行の最初に何らかの形式にメモリ上でコンパイルして、そのコンパイル結果を(仮想マシンとかのインタプリタ部分が)実行します。

投稿2018/05/30 01:40

編集2018/05/30 04:52
otn

総合スコア84423

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

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

pepperleaf

2018/06/02 01:07

純粋なインタプリタ... 今時のWindowsソフトって何だろう? コンパイルしてネイティブコードを出力もするけれど、主力は、MSILにコンパイルして仮想計算機で実行。これってある意味、インタプリタ? すごく曖昧な気がします。
siaron

2018/06/02 15:41

仮想と言うものが出来てから曖昧ですよね(理解できてないけど 色んな環境でもできるようになるのはいいけど回りくどい気はする OS違い的な 速度とか気にしたらコンパイルしての方がいいだろうし わかりやすくするか、実装者の技術力とかってことなのかなぁ
pepperleaf

2018/06/03 11:28

> 速度とか気にしたらコンパイルしての方がいいだろうし 確かにコンパイルの方が速いですが、採用するアルゴリズムの方が影響大です。ここで悩むより、効率良いアルゴリズムを採用する事をお勧めします。コンパイラが速いというのは、その後の話です。
guest

0

C,C++,Java,C#あたりだと、「上から下に1行ずつ実行する」というのは変わりません。
ただ、例えばCではmain()関数の先頭が最初に実行されるので、「ソースコードの先頭から実行される」訳ではありません。

あと、Prologとかではまた違った流れになるのですが、私はこの言語苦手なので識者の方に解説はおまかせします。

投稿2018/05/29 21:39

rtr1950x

総合スコア298

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

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

0

普通のプログラミング言語は、インタプリタ・コンパイラ問わず、処理の流れは基本的に(意図的に操作しない限り)上から下に流れるものとして書きます。

この処理の流れというものの実体が何なのかですが、CPUの中ではプログラムカウンタ(PC)というものが次に実行する命令の位置を指しており、このカウンタが何もしなければ命令を実行した後に次の命令を指すようにカウンタの数値が増えます。
普通のプログラミング言語はCPUで実行しやすいような構成で書きますので、ソースコード上で処理の流れはプログラムカウンタの動きに合わせて一方向に進みます。
人間が読みやすいように普通は上から下です。(普通でない例: https://ja.wikipedia.org/wiki/Befunge )

なお実際には処理順序はコンパイラやCPUが勝手に入れ替えますが、上から下に処理されたときと同一の結果になるようになっています。

並列処理をさせたい場合、処理の流れが複数に分裂することになります。
この場合でも、分裂したそれぞれは上から下に処理を進めます。

さて、CPUでないもので実行する言語では処理の流れという概念が無いものもあります。
FPGAやASIC(専用IC)のようなCPUでない集積回路の動作を記述するHDL(hardware description language)は、複数行に書かれた内容が同時に実行されます。

他にはPrologなどの自動定理証明あたりも処理の流れの概念の無い言語になりそうな気がします(がちょっと調べた限りではよく分かりませんでした)。

投稿2018/06/01 19:42

ikadzuchi

総合スコア3047

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

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

pepperleaf

2018/06/02 01:25

最近のCPUもマルチコアなんで、同時実行あり。それなりのコードを記述しないとマルチでの動作はしませんが。 HDLは使った事ありませんが、PC上で設計、評価できると思いました。要するにソフトウェアで OK (ただし、実用的かは別) Prologも昔、かじっただけですが、(形式)同時実行。シーケンシャル実行では、遅いので専用マシンとかいう話もあったようですが、コスト的に見合わないため、消えたようです。ハーバードアーキテクチャとかありましたが、(最近、聞かない?) 用途を限定すれば、有効なようです。ただし、コストが見合うか? 処理順序の入換えは、一時、ディレイドブランチなんてのがありました(RISC) 。分岐命令の実行前に次の命令を実行する。
siaron

2018/06/02 15:06

スタックとかはアセンブラのサイトで見たことある気がします 分岐前に実行とか今までに経験ないのでわかりませんが 複数の流れがあって全てがカウンタ上がったらカウンタが上がるみたいな 変数でのフラグ管理みたいなものなんでしょうか? HDLやら色々な言葉ありますね、大変ではあるけど知識が増えるのは嬉しいですね
pepperleaf

2018/06/03 01:22

> 分岐前に実行とか アセンブラを触らないとまず、関係無いと思います。CPU内での分岐は、次にCPUに読み込む命令を変更する操作ですが、既に読み込んだ命令はどうするか? 実行しちまえ、つてのが一時、ありました。
ikadzuchi

2018/06/03 09:18

> 最近のCPUも~ そうですね。 > HDLは~ソフトウェアで OK そうですね。CPUは汎用的なので基本的にどのようなものでもエミュレートできます。 自然に実行できるか、不自然かの違いですね。 > Prologも~(形式)同時実行 > 専用マシンとかいう話も そうなのですね。参考になります。 > ハーバードアーキテクチャ ハーバードかフォンノイマンかは特に主題に関係ないと思います。 > ディレイドブランチ その辺もコンパイラやCPUが順序を入れ替える話ですね。 > スタック 特にスタックの話はしていませんが。 > 複数の流れがあって全てがカウンタ上がったらカウンタが上がるみたいな ちょっと勘違いされている気がしますね…。 (マルチコアなら1コアごとに)1つだけのカウンタがあり、そのカウンタの数値の示す場所の命令が実行されます。
pepperleaf

2018/06/03 11:23

ちょっと余談ですが、、、 > ディレイドブランチ 当時のコンパイラはどんなコードを出力しているか、見たら、nopを入れてました。
guest

0

関係のありそうな事を列記してみます。その中にsiaronさんが知りたい事の一部が含まれると思いますので。[※ 以下の説明では、 C言語を例に使っています。]

・プログラムの中で、実行ブロック(ひとまとめに処理されるコード部分)とコードの行が一致しているとは限りません。
例えば、C言語はセミコロン(";")や閉じ中括弧("}")でブロックを区切ります。改行は関係ありません。そのため、C言語のプログラムは改行文字を全て削除することで1行のプログラムにできます(ものすごく読みにくいです(^o^))
区切り文字や制御構文(For等のループ、IF-Then-Elseなどの条件分岐、etc.)に注意しながらコードを読むと、実行ブロックがどういう構成になっているのかが判ります。
小さな実行ブロック(例:i++;)が、さらに大きな実行ブロック(例:For(i=1;i<=5;i++){a[i]=b[i];})の部品になっている事もよくありますので、「処理」の流れをどのぐらいの大きさの実行ブロック単位で見ていくのかという方針を持つと理解しやすいです。

・「処理」の流れは、上から下、左から右、が基本ですが、制御構文(「ループは処理ブロックの最後まで実行したら、ループの初めの部分に戻る」等)、演算子間の実行優先度(「乗除算(,/)は加減算(+,-)より優先度が高いので、a+bc+dという式はb*cが先に処理され、その後でa,dと加算される」等)、代入(「変数への代入は、=の右側(右辺)の処理(計算)が先に行われ、その結果が変数に入る」等)といった例外もたくさんあります。

・"どこに書いても大丈夫"(入れ替えてもOK)というのは、相互依存がなければ成り立ちます。
例えば、次のコードの3行は、どのように入れ替えてもOKです。

a=2; b=3; c=4:

でも次のコードは入れ替えると結果が変わるのでダメです。(aに代入される値が、iとi+1になる)

 a=i; i++;

上のコードのように、同じ変数が両方で使われている場合は依存性を疑ったほうが良いです。
ポインターは別の変数でも、それが差している先が同じという事が考えられるので、慎重に考えたほうが良いです。

投稿2018/05/30 01:20

coco_bauer

総合スコア6915

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

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

siaron

2018/06/02 15:53

気にせず使っている所でも実は流れがあると言う事ですね ポインタはまだ勉強してませんが ただ送りと受け手があるってことですよね、ざっくり言うと 同じのを指定していたら書き換えで前に入れたやつが消えてしまう、とか
guest

0

C言語は、main()関数から、実行される。
それぞれの関数内は、上から、実行される。それだけですね。
一応、制御文として、ifとか、for とか、return とかありますが。

他の言語にもそれぞれの文法に従った、実行順序があります。
同時実行なんてのもありますが、計算機内部でどう動くかは、実装者次第。
マルチCPUならば、同時実行ありでしょうが、シングルだったら、仮想的に同時実行でしょう。分散処理ならば、複数の計算機で実行される。
インタプリタ言語は、ソースコードを先頭から読み込んで実行する事を前提に設計された言語ですね。実際に、一行ずつ読み込んで実行するのも有りでしょうが、コンパイルして実行しても良いですね。(実装者依存)

C言語は、元々、テープ言語と聞いています。テープに行は無いので、セミコロンで区切ったと。ただ、#で始まる疑似命令が入った時点で、行の概念はありますね。コメントも /* */ は良かったですが、 // は行ですね。

他の方にコメント付けたのですが、ちょっと方向が違ってきたので、こちらに書きます。

投稿2018/06/02 01:57

pepperleaf

総合スコア6383

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

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

siaron

2018/06/02 14:51

度々ありがとうございます ふむふむ スペックの問題はありますね、そう見えるようにしてるだけで結局処理が遅ければそう見えないみたいなことなのかなぁ 実装者次第ですか色々増えたのも良かったですがやっぱり内部わからないの使うのって個人的には好ましくないので自分で出来るようになれたらいいですけど どのみち整理しないとだし疑似的に同時にタイミング合わせるのとなにか違うのでしょうか パソコンで言う所の同時っていうのがよくわからない 4コアとかそういうあれですかね
pepperleaf

2018/06/03 01:16

疑似的に同時実行、、、マルチタスクの事です。処理を細かい単位に分けて、複数のプログラム(処理)を同時に進める事。(基本的には、OSの仕事) こうして、文字を打ち込んでいる間に、メールが来たとかの表示が行われるのもマルチタスクだからです。(意識する事も少ないですが)
guest

0

おそらく、コンパイルを要する言語とインタプリタによる言語の違いの話だと思います。

コンパイルを要する言語は、ソースコード(テキスト)のままではプログラムを起動できません。プログラムの起動には、コンパイル、リンクという過程を経て機械語(実行ファイル)を作成することが必要です。一方、プログラムを起動するコンピュータにはコンパイラは不要です(別のコンピュータでコンパイルしても良い)。

インタプリタ型言語はコンパイルを要しないものです。(コンパイルできるものもある)プログラムを起動するコンピュータは、ソースコードを読み取るソフトウェア(インタプリタ)が別途必要です。

念のため(こういう意味の質問ではないと思いますが)

少なくとも「一行」に一処理という規則はCやHSPにはないです。Cは2つ以上の半角空白と改行は同一視されます。したがって、プリプロセッサを除き一行だけでプログラムを書くことも文法上間違いではありません。(見づらいのでやりたくないですけど)

投稿2018/06/01 15:50

編集2018/06/02 01:27
HogeAnimalLover

総合スコア4830

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

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

0

「一行ずつ処理される」について
その言語にとって「行」がどういう意味を持つかによって違います。
BASICは多分、行が意味を持っていたと思いますが、Cは行に意味はありません。
Cの規格や参考書には
「空白を置けるところでは改行する事が出来る」
的な解説があると思います。つまり、

if (a != 0) foo(a + 1); else bar(-1); printf("%s", "Hello\n");

見たいに
一行に複数の文を書くこととができる。1個の文を複数行に分けて書くことができる
と言うことです。

「上から処理される」
は大半の言語がそうだと思います。
書いた文を「下から」処理されては、人間の思考が追いつきません。
ただし、順序の流れを変えること、上に書いた関数とかメソッドを呼び出す事は出来ます。

投稿2018/05/30 01:54

nob.

総合スコア711

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

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

0

投稿2018/05/29 20:20

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問