かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

後輩SEとの勉強会(2018/09/22)

今日のトピックは2つほど、だったけど途中から良い疑問が湧いて理解が深まった!

Three.js

f:id:name_untitled:20180922163115p:plain

彼は今Three.jsというブラウザ上でアニメーションを表示できるライブラリで作品を作っているらしい。WebGLというコンピュータ上で3Dアニメーションを表示する機能を手軽に利用できるライブラリ。特徴としてはThree.jsはCPUではなくGPUを使うので早いのだとか。

www.chromeweblab.com

Chromeでしか見れないかもしれないけどこのサイトは小さなかけらが舞っていてずっと見てられる。これはいい。

 

プログラミング言語の分類

あと、自分の勉強も兼ねてプログラミング言語の種類を整理しているんだとか。で、教えてもらったのがこのサイト。言語間の影響が視覚化されてる。これは面白い。

exploring-data.com


実行の方法で分けると、コンパイル方式、インタプリタ方式に分けられる。
コンパイル方式はプログラムを機械語に変換して実行するプログラム。C言語のプログラムをコンパイルして、Windowsで実行可能なexeを作るのがそれ。

この方式はコンピュータ上で直接実行されるため、処理速度が速いが変換する手間がかかるのと、環境ごとに実行ファイルを作らないといけない。

一方のインタプリタ方式は処理のタイミングでプログラムを解析して実行する。プログラムでPHPJavascriptでちょっと触ってブラウザ上ですぐ確かめられるのがそれ。

この方式はPHPやブラウザがプログラムを解析して都度実行しているため、処理速度は遅いが、簡単に確認することができ、環境問わずに動く。

 

その合いの子というのが、JavaC#などの実行環境上で動作する言語。
これらは、プログラムを中間言語に一度変換し、それをJVM.NET Frameworkなどの実行環境が解析して実行される。インタプリタ方式よりかは早いけど、コンパイル方式は遅い。でも、環境変わっても動く(はず)、といったいいとこどりを目指した位置付け。

 

全般的にコンパイル方式はメモリの確保、解放など低レベルの操作が出来るけど、インタプリタ方式ではあまりやらない気がする。と、ここで彼が良い疑問を出してきた。

WebGLGPU使うというのはスクリプト言語なのにどういうこと?

たしかに、Three.jsはJavascriptだからインタプリタ方式だと思うけど、GPUを使っているらしい。これってどうやって呼び出しているんだろう。

 

で、調べた。

まず、CPUとGPUの違いは左脳と右脳の違いといった感じらしい。CPUはアルゴリズムの処理が早い。一方でGPUはざっくりの処理が早い。この辺りはAidemyのブログが分かりやすい。GPUは仕事早いけど雑、CPUは仕事出来るけど真面目すぎる。で、これまではGPUはCPUの処理した結果を画面に表示するのに使われていた。それが、CPUの計算量が頭打ちになったころにNvidiaがCPUの代わりにGPUを使う方法を提案してGPUが大流行りし出したとか。それが、雑な仕事でしくじってるところを見つけて直すというもの。これで、計算量の多い機械学習とかでもGPUが使われるようになった。

blog.aidemy.net

 

で、WebGLといっても描画に元々GPU使うんじゃないのと思ったけど、それはちょっと違うらしい。伝統的なやり方でアニメーションを描くと、CPUで計算して、画面に再描画するからCPUに負荷がかかる。それを、GPUレイヤー(このあたりよく分かってない)を使うと、描画済みの絵を動かしていることになるから、絵が移動しても再描画という扱いにならず、スムーズなアニメーションが表示できるらしい。このサイトのGPU使うパターンと使わないパターンが試せる。

un-tech.jp

 

ここまで来て、その違いは分かったけど、仕組みがよう分からんとなった。普通に書いて実行したら、CPU呼ばれるだけでは?と思ってしまった。で、また調べたら意外とIBMのサイトが仕組みに踏み込んで説明していて分かりやすい。ブラウザから、OSのドライバを呼び、GPUで処理されるから、CPUに負荷はかからないみたい。

f:id:name_untitled:20180922165601p:plain

 

この辺りから、WebGLの入門は↓のサイトである程度カバーしていていい。

www.ibm.com

 

最後に、実はJavascriptにはいくつか実行エンジンがあって、実行時にコンパイルを行うJIT Compilerを採用しているものが多いとのこと。最近は一概にXXだからスクリプト方式、XXだからコンパイル方式とは言えないのですね、、、。

postd.cc