「教えて!ピックアップ」リリース!

プログラムの記法 ? で、 インラインコードとは、どんなコードですか ?
できれば通常の書き方と、インラインコードの例を教えてください !

質問者からの補足コメント

  • 以下の内容についての疑問です。
    Javascript の場合はどうなるのか、例が欲しいと思いました。

    インラインコードとは、プログラミングにおいて、サブルーチンを呼び出すためのコードの代わりに、直接コード内に記述するサブルーチンの内容のこと。
    インライン展開と呼ばれている。コンパイラによるコード最適化の手法の一つ。
    インラインコードにより、サブルーチンを呼び出す際に行われているレジスタの退避や回復、スタック調整、といった処理が不要。サブルーチンの呼び出しに伴うオーバーヘッドがなくなり、処理の高速化を図れる。特にループ処理が多数存在するプログラムの場合は、インラインコードを行うことで大幅な速度向上が期待できる。
    他方、インラインコードを複数の場所で何度も呼び出されるサブルーチンを、都度直接記述することになる。サイズは肥大しやすく、必要なメモリ容量が増大になる。

      補足日時:2022/06/16 23:09

A 回答 (5件)

ついでに補足しておくと、今のJavascriptは多くの場合、


コンパイラーて中間言語に変換されVMで実行されるのが普通。
純粋なインタープリター方式は生き残ってないと思います。

ブラウザに画面がロードされる時にコンパイルが実行されます。

この時、最適化の一つとしてインライン化が行なわれても
なんら不思議ではありません。この場合、インライン化は
プログラマから見えないです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/06/18 23:43

○インライン というのは、「何かの中に別の何かを埋め込む」という意味で使われる。


「何」を「何」に「埋め込む」のかは、その文脈で違ってくる。

その説明にあるのは「サブルーチンの処理」を「そのサブルーチンを呼び出す
箇所」に埋め込むもの。

○サブルーチンは一連の処理をまとめて実行できるようにしたもので、
プログラミング言語によって「関数」「メソッド」「プロシージャ」等と名前がついていることがある。


○例えば
「xの関数 f(x) =a・x を a を変えつつグラフにする」
というプログラムを考える。そうすると、次のような感じになる。

コード1: 関数f(x,a) をそのまま使用
/*関数 f(x) 、aを指定できるようにする */
function f(x,a) { return a * x ; }

/* メインルーチン */
...
for(x0 = xmin ; x0 <= xmax ; x0 += step ) {
 /* y座標を計算 */
 y0 = f(x0,1) ;
 /* 座標(x0,y0)にプロット */
....
}

for(x1 = xmin ; x1 <= xmax ; x1 += step ) {
 /* y座標を計算 */
 y1 = f(x1,2) ;
 /* 座標(x1,y1)にプロット */
....
}


これを、 f(x,a) をインラインに展開すると次のようになる

コード2: 関数f(x,a) をインラインに展開する
/* inlineにするので不要
function f(x,a) { return a * x ; }
*/

/* メインルーチン */
...
for(x0 = xmin ; x0 <= xmax ; x0 += step ) {
 /* y座標を計算 */
 y0 = 1 * x0 ; /* f(x0,1) をinline展開 */
 /* 座標(x0,y0)にプロット */
....
}

for(x1 = xmin ; x1 <= xmax ; x1 += step ) {
 /* y座標を計算 */
 y1 = 2 * x1 ; /* f(x1,2) をinline展開 */
 /* 座標(x1,y1)にプロット */
....
}

○プログラミング言語や実行環境によっては、コード1と同じ(または、ほとんど同じ)書き方をしても、コード2のようにインラインに展開されたものして実行するものもある。
・C,C++の関数型マクロ、インライン関数 等

※ 「コンパイラによるコード最適化の手法の一つ」という記述からは、こちらの「言語によるインライン展開」を想定しているように思える

※ 一方「都度直接記述することになる」という記述は コード2 のようなものを想定しているように思える。コンパイラで展開されるのなら「都度直接記述」する必要が(プログラマには)無いから。


○メリット、デメリットは説明にある通り。

加えて、コード2 のような記述が必要となる場合、コードの保守性もデメリットになる。
・実引数(例では x0,1 と x1,2 ) と仮引数x,aとの対応を自分でやらなければならない。
→対応間違いが発生する可能性がある。記述箇所が多ければそれだけ発生する確率が増える。
・「f(x) = ax^2 + 10 のグラフ」に変えることを考える。
コード1では関数f(x,y)の中だけ変えればいい。
→変更忘れ、変更間違いが発生するとしても、1箇所だけ。
コード2では、複数の箇所で変更が必要。
→変更忘れ、変更間違いが発生する確率が増える。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/06/18 18:58

見た目は普通の「関数」ですよ。


Cだと関数の宣言の先頭に inlineって書くだけ。
そうすると、コンパイラに、ちょっとメモリを無駄にして
良いから、関数を「呼び出す」のではなく、関数のコードを
関数を実行する場所に埋め込む
コードを吐いて欲しいと指示したことになる。

でもコンパイラはその指示に従わないかもしれないし、
inlineの指示が無くてもコンパイラの独自の判断で
inline化するかもしれない。

結局のところ、コンパイラの最適化、高速化のヒントに過ぎない
ので、見た目にはほとんど影響しない。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/06/18 18:58

> Javascript の場合はどうなるのか、例が欲しいと思いました。



ん〜〜。
多分JavaScriptにはそれは「ない」?

通常、JavaScriptでインラインって言えば、単にJavaScriptのソースコードファイルを作らないで、HTMLに直書きする事を言うんじゃないのかしらん。

Javascriptの記述方法。インラインと外部ファイルのメリットとは?:
https://cr-note.com/blog08/

例えば、一部の高級言語では、ソース記述してる途中で「アセンブリ言語をぶっこめる」とか言う機能を「インライン」とか呼んだりするけど、そういう事でもないでしょ?言語仕様がそういうのを許してる言語ばっかでもないし。
多分貴方が引っ張ってきた説明のブツは、JavaScriptには無いと思いますね。

いや、でも、プログラミング用語ってメンド臭いね(笑)。同じ名前で違う事指してる事とかちょくちょくあるから。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/06/17 00:19

何の話だろ?


例えばANSI Common Lispだと関数呼び出しを簡略化して高速化する為に「インライン展開」とか言うのを行えますが、それに近い質問かしらん?

(defun my-max (i1 i2)
 (if (> i1 i2)
   i1
   i2))

(defun main ()
  (proclaim '(inline my-max)) ;ここで my-max をインライン展開する
 (format t "~a~%" (my-max 1 5)))
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/06/17 00:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング