プログラムをやったことがある人なら誰もが知っていることですが、プログラム言語によって実行をする方法・手順として「インタープリタ」と「コンパイル」という2種類があります。
このことは、学習者が学習をする ”スタイル” にもよく似た状況が見られるような気がします。
そこで、今回は「学習スタイル考察(インタープリタ型とコンパイル型)」ということで考えてみたいと思います。
恐らく、こんなつまらない(?)考えは誰もしないように思うのですが、子供が Python と C++ でプログラミングをしていたので、何となく気になりました。
インタープリタとコンパイラは、プログラムのソースコードをコンピュータが理解できる形に変換する方式です。
ソースコードを一行ずつ読み込んで実行する方式。プログラムの実行開始が早いという利点がある。一行ずつ処理を行うため、全体の実行速度は比較的遅くなる。エラーがあった場合、その行を実行するまでエラーに気付かない。PythonやJavaScript、Rubyなどのスクリプト言語はインタープリタ方式。
(コンパイル:compile)
ソースコード全体を一度に読み込んで実行可能な形(オブジェクトコード)に変換。この変換過程で、ソースコード全体のエラーチェックが行われる。変換後のコードは、CPUが直接実行できる形式であるため、実行速度は非常に高速。一度に全体を変換するため、プログラムの実行を開始するまでに時間がかかる。CやC++などの言語はコンパイラ方式。
(インタープリタ型のプログラム言語)のメリットとデメリットは、
(メリット)
・即時実行
ソースコードを一行ずつ読み込み、それをその場で実行するため、コンパイル時間が不要であり、プログラムのテストとデバッグが容易。
・ポータビリティ
一部のインタープリタ型言語は、異なる種類のコンピューターシステムで実行できる。ソースコードが直接実行されるためであり、コンパイラ型言語のように特定の機械コードに変換する必要がないため。
・動的型付け
多くのインタープリタ型言語は動的に型を決定するため、プログラミングが柔軟で自由度が高くなる。
(デメリット)
・実行速度
インタープリタ型言語はソースコードを一行ずつ実行するため、全体のプログラムを一度にコンパイルして実行するコンパイラ型言語に比べて実行速度が遅くなる可能性がある。
・パフォーマンス
一行ずつ解析・実行するため、大規模なプログラムではパフォーマンスが低下する可能性がある。
・セキュリティ
ソースコードがそのまま配布されるため、プログラムのロジックが容易に解読されてしまう可能性がある。
(コンパイル型のプログラム言語)のメリットとデメリットは、
(メリット)
・実行速度
ソースコードを一度に機械語に変換するため、実行速度が速く、パフォーマンスが高い。
・エラーチェック
コンパイル時にソースコード全体をチェックするので、実行前に多くのエラーを検出できる。
・セキュリティ
コンパイルされたバイナリ形式でプログラムを配布するため、ソースコードの内容を直接見られることはなく、一定のセキュリティを確保できる。
(デメリット)
・移植性
コンパイル時に特定のプラットフォーム向けの機械語に変換されるため、異なるプラットフォームに移植する際には再コンパイルが必要。
・コンパイル時間
大規模なプログラムでは、全てのソースコードをコンパイルするのに時間がかかる場合がある。
・デバッグ
コンパイル後の実行ファイルでエラーが発生した場合、その原因を特定するのが難しい場合がある。
インタープリタを”同時通訳”、コンパイルを”翻訳作業”みたいに表現することもありますね?
学習者が「学習」をする際、
・インタープリタのように1つずつ理解していく人
と、
・全体系を把握して必要なモノを組み合わせて理解していくタイプ
があります。
学校や塾で行われる授業を受けるというのは、大概がインタープリタのように提示された内容を(1行ごと)習得することが多いですね?
そのため、急に「問題解決」だとか、「探索学習」だといわれてもどうしていいのかわからなくなる人が多いのです。
では、最初からコンパイル型のように必要な内容を集めて学習し、というのもなかなかハードルが高いと思います。
ジョン・デューイなどが掲げた社会を巻き込んだ理想の教育ができる状況であればいいのですが、現実的には不可能です。
「課題中心型のインストラクション:TCI(Task -Centered Instruction)」なども、コンパイル型の学習を習得するにはとても適していると思うのですが、学校、塾の教育がインタープリタ型なので、適応するにはとても時間がかりますね?
そんな現状で、「答えのない問題」だとか「先が見えない状況で思考」などというのはとても無責任に感じられます。
そして、コンサルがよくやる「フェルミ推定」などというわけのわからない(無意味な)モノが珍重されたりするわけですね?
インタープリタ型学習者を、コンパイル型学習者に変換する必要などないのではないか、、、、と思ったりします。
高度成長期の日本人は目の前の仕事に集中していたインタープリタ型の典型でしょう?
それが少し余裕ができて、「全体を俯瞰して」、とか「VUCA」など言い出してから、
「コンパイル型に移行できないからダメだ、、、」
というのは多分間違っていて、
”インタープリタ型を極める”、、という発想が全く無いのは、恐らく ”教育の敗北”(最近このコトバを使う人がやたら多いので使ってみました、、、)です。
インタープリタ型を極めて、コンパイルの世界に入ればいいのではないかと考えます。
何を言っているかよくわからないかもしれませんが、、、、
「単純な記憶」と「応用」、インストラクショナルデザインでいうと「言語情報」と「知的技能」です。
「記憶」=「言語情報」=「インタープリタ」
「応用」=「知的技能」=「コンパイル」
ということが近いように思ったりします。
プログラムの世界では、今はPython や JavaScript のような「インタープリタ」が持て囃されますが、一通り習得した後は C++ のような「コンパイル」で「効果・効率」を向上させる、、、、(ちょっと違うか、、、? )。
思いつきで記してきたので纏まりませんが、そんな気がするのです。