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

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

ただいまの
回答率

90.86%

  • C

    3196questions

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

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

受付中

回答 8

投稿

  • 評価
  • クリップ 1
  • VIEW 327

siaron

score 2

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • a_saitoh

    2018/05/30 11:24

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

    キャンセル

回答 8

+2

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/02 10:07

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

    キャンセル

  • 2018/06/03 00:41

    仮想と言うものが出来てから曖昧ですよね(理解できてないけど
    色んな環境でもできるようになるのはいいけど回りくどい気はする
    OS違い的な

    速度とか気にしたらコンパイルしての方がいいだろうし
    わかりやすくするか、実装者の技術力とかってことなのかなぁ

    キャンセル

  • 2018/06/03 20:28

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

    キャンセル

+1

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

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

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

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

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


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

 a=i;
  i++;


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/03 00:53

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

    キャンセル

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/02 10:25

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

    キャンセル

  • 2018/06/03 00:06

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

    キャンセル

  • 2018/06/03 10:22

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

    キャンセル

  • 2018/06/03 18:18

    > 最近のCPUも~
    そうですね。
    > HDLは~ソフトウェアで OK
    そうですね。CPUは汎用的なので基本的にどのようなものでもエミュレートできます。
    自然に実行できるか、不自然かの違いですね。
    > Prologも~(形式)同時実行
    > 専用マシンとかいう話も
    そうなのですね。参考になります。
    > ハーバードアーキテクチャ
    ハーバードかフォンノイマンかは特に主題に関係ないと思います。
    > ディレイドブランチ
    その辺もコンパイラやCPUが順序を入れ替える話ですね。

    > スタック
    特にスタックの話はしていませんが。
    > 複数の流れがあって全てがカウンタ上がったらカウンタが上がるみたいな
    ちょっと勘違いされている気がしますね…。
    (マルチコアなら1コアごとに)1つだけのカウンタがあり、そのカウンタの数値の示す場所の命令が実行されます。

    キャンセル

  • 2018/06/03 20:23

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

    キャンセル

0

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

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


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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/02 23:51

    度々ありがとうございます
    ふむふむ
    スペックの問題はありますね、そう見えるようにしてるだけで結局処理が遅ければそう見えないみたいなことなのかなぁ
    実装者次第ですか色々増えたのも良かったですがやっぱり内部わからないの使うのって個人的には好ましくないので自分で出来るようになれたらいいですけど

    どのみち整理しないとだし疑似的に同時にタイミング合わせるのとなにか違うのでしょうか
    パソコンで言う所の同時っていうのがよくわからない
    4コアとかそういうあれですかね

    キャンセル

  • 2018/06/03 10:16

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

    キャンセル

-2

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • C

    3196questions

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

閲覧数の多いCの質問