basicだかHSPではインタプリタで一行ずつ処理されるみたいな話は聞いたことがあります
上から処理されるとか
Cとか本格的なのは違うと言う事はわかりますが
厳密にはどういうなんでしょうか?
どこに書いても大丈夫と言うのってそんなのありましたっけ?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
質問のポイント(どの辺が疑問)かによるのですが、コンパイル型言語かインタプリタ型言語かと、ソースプログラムファイルのどこから実行されるかは関係ありません。
言語により、ファイル先頭の実行文から実行されるか、最初に実行される関数・メソッドが決まっているか(最初に何を実行するか外部から指定する物もあるかと)、どちらかです。
また、ちょっと説明が難しいですが、宣言文も、静的に解釈されるか、動的に処理されるか、言語によって違います。
なお、現在メジャーな言語では、純粋なインタプリタ型言語はおそらくありません。コンパイル結果をファイルとして書き出さない言語でも、実行の最初に何らかの形式にメモリ上でコンパイルして、そのコンパイル結果を(仮想マシンとかのインタプリタ部分が)実行します。
投稿2018/05/30 01:40
編集2018/05/30 04:52総合スコア84423
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/02 01:07
2018/06/02 15:41
2018/06/03 11:28
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
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/02 01:25
2018/06/02 15:06
2018/06/03 01:22
2018/06/03 09:18
2018/06/03 11:23
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
総合スコア6915
0
C言語は、main()関数から、実行される。
それぞれの関数内は、上から、実行される。それだけですね。
一応、制御文として、ifとか、for とか、return とかありますが。
他の言語にもそれぞれの文法に従った、実行順序があります。
同時実行なんてのもありますが、計算機内部でどう動くかは、実装者次第。
マルチCPUならば、同時実行ありでしょうが、シングルだったら、仮想的に同時実行でしょう。分散処理ならば、複数の計算機で実行される。
インタプリタ言語は、ソースコードを先頭から読み込んで実行する事を前提に設計された言語ですね。実際に、一行ずつ読み込んで実行するのも有りでしょうが、コンパイルして実行しても良いですね。(実装者依存)
C言語は、元々、テープ言語と聞いています。テープに行は無いので、セミコロンで区切ったと。ただ、#で始まる疑似命令が入った時点で、行の概念はありますね。コメントも /* */ は良かったですが、 // は行ですね。
他の方にコメント付けたのですが、ちょっと方向が違ってきたので、こちらに書きます。
投稿2018/06/02 01:57
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/02 14:51
2018/06/03 01:16
0
おそらく、コンパイルを要する言語とインタプリタによる言語の違いの話だと思います。
コンパイルを要する言語は、ソースコード(テキスト)のままではプログラムを起動できません。プログラムの起動には、コンパイル、リンクという過程を経て機械語(実行ファイル)を作成することが必要です。一方、プログラムを起動するコンピュータにはコンパイラは不要です(別のコンピュータでコンパイルしても良い)。
インタプリタ型言語はコンパイルを要しないものです。(コンパイルできるものもある)プログラムを起動するコンピュータは、ソースコードを読み取るソフトウェア(インタプリタ)が別途必要です。
念のため(こういう意味の質問ではないと思いますが)
少なくとも「一行」に一処理という規則はCやHSPにはないです。Cは2つ以上の半角空白と改行は同一視されます。したがって、プリプロセッサを除き一行だけでプログラムを書くことも文法上間違いではありません。(見づらいのでやりたくないですけど)
投稿2018/06/01 15:50
編集2018/06/02 01:27総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「一行ずつ処理される」について
その言語にとって「行」がどういう意味を持つかによって違います。
BASICは多分、行が意味を持っていたと思いますが、Cは行に意味はありません。
Cの規格や参考書には
「空白を置けるところでは改行する事が出来る」
的な解説があると思います。つまり、
if (a != 0) foo(a + 1); else bar(-1); printf("%s", "Hello\n");
見たいに
一行に複数の文を書くこととができる。1個の文を複数行に分けて書くことができる
と言うことです。
「上から処理される」
は大半の言語がそうだと思います。
書いた文を「下から」処理されては、人間の思考が追いつきません。
ただし、順序の流れを変えること、上に書いた関数とかメソッドを呼び出す事は出来ます。
投稿2018/05/30 01:54
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2018/05/29 20:20
総合スコア16415
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。