日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2013年12月19日木曜日

プログラミング言語勉強中

※12月9日:書籍情報と各プログラミング言語に関する画像を追加し、一部内容を変更しました。
また今回からAmazonアソシエイト・プログラムに参加しています。

このブログ内で紹介した書籍で気に入った物がありましたら、このブログ内の書籍名のリンク(Amazon.co.jpへのリンク)からAmazon.co.jpで購入していただけると、数パーセントが私の収益となります。
ブログを続けていく励みになりますので、ご協力していただけるとうれしいです。
協力を望まれない方は、その限りではありません。

--------------

ここ数ヶ月でプログラミング言語について、勉強しています。

自分のプログラミング言語の経歴というと学生の頃にBasic、そして10年ほど前にCASLIIを勉強したことはありましたが、いずれもさらっと一通り書籍を読んで勉強し、後は他の人の書いたプログラムを入力(いわゆる写経)をした程度です。
ここ数年はMelをちょこちょこ使っていますがこれは厳密にはスクリプト言語ですね。


今回は、CASLII(アセンブラ言語)の勉強し直しから始め、C言語、Processing、Sunabaという感じで勉強を続けています。
それぞれに良いところがあり、おもしろいところがあり、CASLII以外は並行して勉強を続けています。
ある程度区切りがついたらScratch、C++の勉強をする予定にしています。
ただ今更プログラマーになろうとは(なれるとも)思っていません。
(なれるのなら良いですがw)

プログラミングの勉強をする理由は色々ありますが大まかに
①プログラマ的な思考法になれる
②プログラミング対する抵抗感を無くす
③CGのスキルアップ
④電子工作、工作に使う
⑤将来の子供の教育
⑥コンピュータをより使いこなす
⑦論理的思考を鍛え、生活に役立てる

CG以外の目標があるのは、意外に思われる人も居るかも知れませんが、
プログラミングはそもそもコンピュータを使うための技術であり、CGはその中の一つの分野に過ぎません。
自分にとっては用途をCGに限定してしまっては、プログラミングの魅力が半減してしまって長続きしなくなることが目に見えているからです。

なので、あえて多くの目標を含めることで動機が続くようにしています。
もちろん欲張りすぎているので進歩していくスピードは遅くなるであろう事もわかっています。

②の「プログラミングに対する抵抗感を無くす」は自分にとって非常に大きな物です。
プログラミング的要素が多いCGに対する抵抗感にも関連しているからです。
抵抗感という言い方をしていますが、無意識下でおきる反射的な抵抗感も含んでいます。
これはCGの勉強する上で多くの機械の損失と、理解不能を招き、結果的に時間のロスになるからです。
それを駆逐することを目的としているので、単にプログラミングを勉強すればいいと言う物でもなく、その抵抗感が一つ一つなくなっていくことを、記憶ではなくて感覚として身につくことを早めることを目標としています。

子供に教えるというのは、やはりこれから先(というか現時点においても)、プログラミングは生活の中で重要な地位を占めていきます。
プログラマーにならずともその思考方法、そして電子機器がどのような原理で動作するのかを知っておくことは、仕事をする上でも重要な要素となる可能性があります。
もちろんコンピュータに関係無い仕事につく可能性もありますが、それらにコンピュータを活用できればより効率的に出来ます。
むしろプログラミングを学ぶと言うよりも、その延長線上にある「いかにそれを生活に活かしていくか?」ということを教えていく事を重視しています。
実際に子供が勉強する年齢に達したときに始めていたのではおそすぎます、よりよいサポートをするには自分自身が、いまから試行錯誤/体験していくことが必要ではないかと思います。

ではCGに関してはまったく意図してないのかというとそうではありません。
むしろその逆です。
CAではVFXの仕事は少なくなっており、より優秀な人でなければ仕事はとれなくなってくるでしょう。
そのためにスキルアップは欠かせません。
プログラミングの勉強が役に立つ事はあっても役に立たないことはないでしょう。
今まで理解出来なかったアルゴリズムを理解するだけでも、CGソフトを使う助けになります。



<CASLII>
まず最初に手を付けたのは「CASLII」でした。
アセンブラ言語はCPUの内部の動作、メモリ動作を強く意識する言語です。
これを最初に選んだのは、以前一度勉強したことがあり、その時の疑問を今解決することで
プログラミングにおける自信を回復する一助とすることでした。
また、MelやGUIのソフトを触り続けていたことで失われた「ハードを意識する」感覚を呼び戻すこともこの言語を選んだ理由です。
ただCASLでいろいろなプログラミングができるようになることは目標ではなく、
あくまで「疑問を無くすこととハードの動作を理解すること」だけのための勉強です。
CASLは情報処理試験用に作られた仮想コンピューター用のアセンブラ言語なので
その当たりが非常にシンプルにできており、最近は無料のエミュレータもあり
コマンド一行ごとにCPU内部の動作がどうなっているのかを目で確認しながら勉強できるという利点があります。
たとえば、今回は以下のWCASL-II-シミュレーターをつかいましたが以下のような表示が出来ます。

メモリ、ALU(演算装置)、FR(フラグレジスタ)、GR(一般レジスタ)など、ハードで実装されているものがアセンブラ言語の命令でどのように動作するのか(変化していくのか)を目で見て確認することが出来ます。
こういったコンピュータの内部動作を実感しておくことは他の高級言語を勉強するときに内部動作のイメージがしやすいので、ストレスが減ります。


Webにあるチュートリアルなどで一通りの動作を勉強しました。
チュートリアルは上記シミュレータを提供しているページにあるチュートリアルを行い、
その後、検索して見つかった練習問題をいくつかやりました。
http://www.ics.teikyo-u.ac.jp/wcasl2/
さらっと一通りのことをやるだけなら、だいたい1週間ほどでできます。
がっつりやりたいなら情報処理試験関係のサイトや書籍がたくさんあります。


<C言語>
どうせやるならC++だろう?という意見もきかれますが、いろいろ相談した結果
C言語をまずやっておくほうがよいということになりC言語から始めました。

利用したのはWebサイト「苦しんで覚えるC言語(通称:苦C)」です。
(書籍も販売されているようです 「苦しんで覚えるC言語」  )

C言語はコンパイラとよばれるソフトが必要で、これは現在Microsoftから「Visual Studio Express(以下VSE)」という無料の開発環境が提供されています。
こういった開発環境はバージョンが違うと動作や操作方法がちがったりでチュートリアルによっては初心者はプログラミングを学ぶと言うこと以外のところではまってしまいます。

その点「苦C」は独自の開発環境が無料で提供されており、書かれているとおりの動作が確認できるので、非常に助かりました。




















ネット上で無料で利用できるC言語入門サイトというとこの「苦C」と「猫C(猫でもわかるC言語)」が有名なようですが「猫C」のほうはVSEを使用しての説明なのですが、ややバージョンが古いものを使用しているので、そういったことを気にしないで済む「苦C」を選びました。
( 「猫C」も書籍版が販売されています。「猫でもわかるC言語 」 書籍版は未確認ですがバージョンがアップデートされている可能性はあります。)

ただ将来のために、少しずつ馴れておくために並行してVSEも使用しました。
苦C開発環境で実行できたものをVSEのほうで使ってみて、動作しない場合は原因をネットで調べて、違いを補正しました。
これにより自分のプログラミングが間違いないことを確認しながら、VSEがどのように一般的なものと違うのかを理解することが出来ますから、あまり時間を無駄にせずに済みました。

C言語の前にCASLを勉強したことでメモリを意識するポインタについては理解しやすかったです。
C言語をやることで、良かったのはMelに対する理解度が高まったということです。
Mel自体がC言語を元に作られているので、当然なのですが、MelとC言語の共通点や、そうでない部分が理解出来ると、Melがなんだか特別な物には見えなくなってきます。
以前のような抵抗感はかなり少なくなったのは事実です。
こんなことならもっと早くにやっておけばMelの上達も早かっただろうと思ったほどです。

苦Cは第一部と第二部があるのですが、とりあえず終わったのは第一部だけです。
というのは終わり頃には、理解よりも記憶することに気をとられすぎていたのでこのまま進めても仕方がないと思ったからです。

どちらにしても経験から、どうせ一度やったところで覚えきらないのはわかりきっていたので、今回はここでおわりにしました。
Webから学ぶということは可能なんですが、やはり書籍のほうがじっくり取り組めます。
今は「定本 Cプログラマのためのアルゴリズムとデータ構造」 を購入して届くのを待っています。



<Processing>
Processingはビジュアルアートのためのプログラミング言語です。





















Processing」で検索すれば静止画も動画もたくさんみつかります。
どちらかというとVFXというよりはモーショングラフィックス系の映像が多いですね。
参考:「Beautiful Motion Graphics Created With Programming: Showcase, Tools and Tutorials

Houdiniのチュートリアル「VEX Wrangle Workshopを見ているときにそのチュートリアルで使われているある「方程式」は「Generative Design」 という本を参考にしたと言うことで紹介されていました。

しかもこの本「すげーいいから」とお勧めといっています。

Processingの存在は以前から知っていたのですが、これで「そうか!」とひらめきました。
Houdiniなどをやっていてこれはモーショングラフィックス系の動きをだすには便利だろうなとおもっていたのですが、そのアルゴリズムというか、そこでつかわれる方程式をひとつひとつ独力でさがして、学んでいくのは大変だなとおもっていました。

しかしProcessingならその道が短縮できそうだとおもったのです。

その理由はProcessingは簡単かつ非プログラマーの方にも広く使われ、どちらかというとモーショングラフィックス、もしくは複雑なプロシージャルな形状を生み出すためにつかわれている事例が山のようにあると言うことです。


もう一つは、映画のVFXのみに絞るのであれば、直接的には役に立たない可能性もありますが、やらないよりはやっていた方が理解は深まります。
LAで生き残るにはモーショングラフィックス系の能力は役に立つと思います。

それらのスキルアップを早めてくれるという期待もあります。


Processing自体、他の言語を勉強したことがあれば非常に簡単です。
Melスクリプトより簡単な気がします。(まだ深いところまで流行ってませんのでわかりませんが)
なので基礎の勉強は、すぐに終わりました。
利用したのはProcessing公式サイトのチュートリアル
 もう一つはこちら「Processing入門講座
Processingは他にも数多くの入門サイトがあります。

勉強していると、画像の処理の仕方とか昔懐かしいベーシックを思い出して楽しいものでした。

一通り触ったので、今は一旦中止して、買った本「ジェネラティブ・アート -Processingによる実践ガイド」 が届くのを待っています。
先ほどおすすめといわれた「Generative Design」とは違います。
理由はGenerative Desginは英語のみ。ジェネラティブアートは日本語があるからです。
またAmazonでも、プログラミングではなくそれを使った表現に主眼があるという旨のことが書かれていたからです。
Processingの文法的な物はおそらく独学でも問題なく、むしろそういった点を学びたいとおもっていたからこちらの本を選びました。
またこの本を読了できたら、Processingにもなれたころだと思うので英語の「Generative design」に手をだしてもよいのではないかと思っています。
それ以前に手を出したらただの金の無駄になりそうなので...。


どちらにしても、Processingは画像処理におけるアルゴリズムや方程式を学ぶために勉強を続けようと思っています。


<Sunaba(砂場)>
この言語を知ったのは平山尚氏の著作「プログラムはこうして作られる―プログラマの頭の中をのぞいてみよう 」からです。
「初心者がプログラミングを勉強する」という限定された用途においては非常に良くできた言語だとおもいます。
プログラムの入力にはWindowsのメモ帳を使い、実行はダウンロードしたSunabaにドラッグ&ドロップするだけです。













アセンブラ言語においてはCASLが非常にわかりやすいものでしたが、C言語などの高級言語においては、このSunabaはCASLに匹敵するぐらい、シンプルかつわかりやすい入門用言語ではないかと思います。
このプログラミング言語についてはサイト「プログラミング言語Sunaba」で説明されています。
プログラマ人生の最初の100時間を過ごすための言語です。 100時間経ったら他の言語に行く前提なので、極めて低機能です。 

正直、日本語で入力するプログラミング言語は以前に触ったことがあるんですが、初心者がじっくり読んでいくにはわかりやすい面もある反面、入力はしづらいんですよね。
ぱっと見もわかりにくいし。でもこの本を読みながら、さわってみてるとなるほどなという感じがしました。

自分は、かなり良い本だとは思うのですが、中途半端に「変数」とか知っているとちょっと抵抗感がある表記もあるかもしれません。
念のため他の方の書評も。>リンク


前々からこのブログでも「変数とは何か?」とか普通の人はこだわらないようなことを突っ込んでいろいろ調べたりしました。
というのも専門用語の概念をつかみプログラミングの本質の部分をうきぼりにしたい、それを身に付けたいという考えがあったからです。

この本は、まだ途中までしか読んでいませんが「変数」「Forループ」などをそういった言葉をつかわないで、その概念を説明しきっています。
正直言ってプログラミングの入門書でそんなことができた本はこれ以外にありません。

よく「やさしいC言語」「はじめてのプログラミング」「これでわかる○×」とかそういった本がありますが、だいたいイラスト多めで簡単そうに見えるけど実際には専門用語がいきなり説明抜きででてきて初心者は戸惑うことも多々あります。
そういった本でプログラミングを難しいと感じ、挫折した人にはお勧めです。
正直、自分はその手の本で何度も挫折感を味わいましたが、この本を最初から手にすることができたら簡単とは言わないまでもずいぶんと助けにはなったと思います。

逆にそういった入門書でも問題が無かった人には逆に回りくどすぎるでしょう。

この本は専門用語を使わずにプログラミングに必要な言語を説明しています。
たとえばForループで入れ子をするには、どういう順序でかんがえていけばいいのか「For」も「ループ」という言葉も出てこないのに、手取り足取りという感じでひとつひとつの思考手順を説明してあります。
「変数」とは箱みたいな物でという説明がないどころか「変数」という言葉も数学での例を示すときを除き出てきません。
通常、先生や講師がそこは自分で考えるべき!というところもしっかり説明してある感じです。


個人的には、画期的な本だと思います。
出版元にはこの本の第0章がPDFで無料公開されています。



<これから>
こんなに短期にいろいろな言語に触っていると混乱するんでは?
と思われるかも知れませんが、とりあえず一通り触っていくこと(チュートリアルを一通り追えること)だけに絞っており、その言語でずっと作り続けているわけではないので、問題はありません。

むしろ様々な言語をさわることで共通点と違いがはっきりとしてきました。
これにより「プログラミング言語」そして「プログラミングという行為」自体への理解が深まり抵抗感が少なくなりました。
とりあえずは目標の一部は達成しつつあります。

もちろんここでの理解は概念的な部分で「実際に動作するプログラムがかける」ということは違う次元のことです。
ちゃんとしたプログラミングが出来るようになるにはまだまだ時間がかかると思いますが、
これは自分には必要なスタートラインです。


さて、これからしばらくは「プログラムはこうして作られる」を読み終わるまで進めていきますが、合間を見てScratch、Aruduino言語、その後はC言語とProcessingの勉強に戻り最終的にはC++の勉強に進みます。

Scratchは子供向けのプログラミング言語で、コマンドがブロックになっておりそれを組み合わせてプログラミングをするものですが、少し触ってみた感じでは、それぞれの要素の関連性を感覚的に理解するには非常に良いと思いました。
自分が今までのプログラミングの勉強でできなかった感覚的な理解を深めるために一度触っておきたいと思っています。













(上の画像は「Scratch始め方ガイド」より引用)

AruduinoIDEは、最近の電子工作でよくでてくるマイコン「Aruduino」をコントロールするための言語で、Processingベースと言うことなのでさほど苦労はしないのではないかと思っている。

Dec29/2016追記 : 
Arduino言語はProcessingを元にしているので似ていますがベースの言語は違います。
 JAVA >>> Processing言語
 C++  >>> Arduino言語
Arduino言語はC++言語コンパイラに独自のライブラリを追加し、簡単に記述できるような工夫がされているものらしいです。そのためC/C++の記述を使うことができます。
ベースとなったProcessingの言語がJAVAであり、ArduinoIDE自体がJAVAで作られているためにArduino言語もJAVAという誤解されているようです。

ファイル:Arduino IDE - v0011 Alpha.png
(上の画像はWikipediaより引用)
ただ目的は、電子部品のコントロールなので、他の言語とは多少違う使い方があることを期待している。
これもプログラミング言語に対する理解を深めるには役に立つし、何よりいろいろと楽しそうだ。



また、これと並行してMayaでのR&D、Houdiniの勉強も進めたいと欲張っていますw