コンテンツにスキップ

言語別の処理方式@言語

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. エントリーポイント

エントリーポイントとは

プログラムを実行する時の開始点となるファイルや関数のこと。

エントリーポイントのファイルや関数を開始点として、そのプログラムの全てのファイルの処理が実行される。


動的型付け型言語のエントリーポイント

▼ 特徴

動的型付け言語では、エントリーポイントの定義方法が強制されず、指定したファイルの先頭行がエントリーポイントになる。

▼ PHPの場合

慣例として、index.phpファイルをエントリーポイントとすることになっている。

▼ Python

特になし。


静的型付け型言語のエントリーポイント

▼ 特徴

静的型付け言語では、エントリーポイントの定義方法が強制される。

main』という名前の関数でエントリーポイントを定義させる言語が多い。

▼ Javaの場合

修飾子が『public static』、返却値型が『void』、引数名が『args』、引数型が『String[]』であるmain関数が、自動的にエントリーポイントになる。

import java.util.*;

public class Main
{
    // エントリーポイントとなる関数
    public static void main(String[] args)
    {
        // 他の全ファイルに繋がる処理
    }
}

▼ Goの場合

パッケージ名が『main』であるmain.goファイルが、自動的にエントリーポイントとなる。

package main

// エントリーポイントとなる関数
func main() {
    // 他の全ファイルに繋がる処理
}


02. 並行処理 (Concurrent processing)

並行処理とは

プロセスでシングルスレッドが実行されている場合、複数の処理を『独立的』に実行すること。

開始も終了もバラバラであるが、処理の実行が重複する場合がある。


言語別の並行処理

記入中...


03. 並列処理 (Parallel processing)

並列処理とは

プロセスでマルチスレッドが実行されている場合、各スレッド上で複数の処理を『同時発生的』に実行すること。

開始は同時であるが、終了はバラバラになる。


言語別の並列処理

▼ PHPの場合

parallelパッケージを使用する。

▼ JavaScriptの場合

Web Workerを使用する。

▼ Goの場合

Goroutinesを使用する。

ただし、実行環境によっては並列処理にならずに、並行処理になってしまうことがある。

それが理由か否かはわからないが、Goのドキュメントでは、Goroutinesはconcurrencyの項目に記載されている。


04. 同期処理 (Synchronous processing)

同期処理とは

完了を待って (同期ブロッキング) から後続の処理が始まるような処理のこと。


05. 非同期処理 (Asynchronous processing)

非同期処理とは

完了を待たず (非同期ノンブロッキング) に後続の処理が始まり、後続の処理と同時に実行されるような処理のこと。

そのため、処理の完了を待たずに後続の処理が開始する。

後続の全処理が非同期処理と無関係であれば、そのままで問題は起こらない。

しかし、後続の処理に非同期処理の結果を使用するものが含まれている場合、この処理だけは非同期処理の後に実行されるように定義する必要がある。


非同期処理の結果を使用する後続処理

▼ 後続処理の定義

後続の全処理が非同期処理と無関係であれば、そのままで問題は起こらない。

しかし、後続の処理に非同期処理の結果を使用するものが含まれている場合、この処理だけは非同期処理の後に実行されるように定義する必要がある。

言語別に、非同期処理の成否を管理し、後続する処理を定義できる機能が提供されている。

▼ JavaScriptの場合

▼ Node.jsの場合

JavaScriptと同じような記法で実装できるNode.jsについて、Node.jsのビルトイン関数 (特にI/O処理系) は、非同期処理化するための実装がなされている。

そのため、後続の処理に非同期処理の結果を使用するものが含まれている場合、この処理だけは非同期処理の後に実行されるように定義する必要がある。

const input;

fs.readFile("/foo.txt", "utf8", function(err, data) {
  input = data;
});


// readFileメソッドの結果を使用する
// readFileメソッドの完了を待たずに実行されてしまう。
console.log(input);