* どの言語を学ぶべき? [#o7f2d040]
一般的には情報量の多さから、C/C++、C#、VB.NET、Java辺りから選ぶのがよさそうです。&br;
スクリプト言語は、変数に型をつけないなど比較的単純なプログラムを記述するため、&br;
初めてプログラミングを学ぶ人にとってはやや適切でない部分があるかもしれません(一概には言えませんが)。

#contents

** 目的別で考えよう [#f46d3938]
どの言語を学ぶかは、「何をやりたいか」で考えると良いと思います。~
ゲームを作りたいとか、便利なツールを作りたいとか、そういう目標があれば楽しく学べるでしょう。

*** ゲームを作りたい(C/C++、Java、C#、Delphi、ActionScript、Python、Ruby) [#a4f553aa]
-一昔前はゲームといえばC/C++という感じでしたが(さらに前はアセンブリ言語)、&br;
最近はPCの性能も上がり色々な言語が選べるようになってきました。&br;
なので、定番のC/C++以外でのおススメを考えてみました。&br;
しっかり学びたい方は少しくらい大変でもジャンルを問わずC/C++をやりましょう。

--3Dバリバリなゲームを作りたい場合、ほぼC/C++になります。&br;
最近ではC#もライブラリが充実してきています。

--2DならJava、C#、Delphi、ActionScriptなどGUIの作りやすい言語や、&br;
ゲームライブラリのある言語(Python、Rubyなど)がオススメです。

--また、ゲーム製作のための言語であるHSPや、&br;
RGSS(Rubyインタプリタを内蔵したゲームエンジンと、その機能を利用したゲームフレームワーク)を搭載し、更にそのフレームワーク部分のコードに手を入れることができるRPGツクールXPに、&br;
高度なカスタマイズ機能を持つアドベンチャーゲーム製作環境吉里吉里/KAGなどもあります。&br;
高度なカスタマイズ機能を持つアドベンチャーゲーム製作環境吉里吉里/KAG、
同じくアドベンチャーゲーム製作ツールなら、LUAで書かれたコードを呼び出せるNScripter、NScripter2などもあります。&br;
ゲームがつくりたいだけならこれらの言語、環境もおススメです。&br;
有名どころでは、TypemoonのFate/Stay nightが吉里吉里/KAGで作られていたりします。(といってもアレはかなり改造されてるので吉里吉里とは別モンだとおもった方がいい)

*** GUIツールを作りたい(Visual Basic、Delphi、Java、C#、VB.NET、なでしこ) [#da09e157]
-デスクトップで動くちょっとした小物(時計や電卓、システム情報を表示するソフトなど)のような小さめのGUIアプリを作りたい場合、&br;
GUIアプリの製作が簡単なVisual BasicやDelphi、Java、C#、VB.NET、なでしこなどをオススメします。

*** ちょっとした作業を効率よくやりたい (Perl、Python、Ruby)[#hc7eb69e]
例えば、「nekomimiフォルダの中の全画像に対して、ファイル名の先頭に「neko_」とつけたい」などといった、日常でのちょっとした作業(でも、画像が100枚あったら大仕事ですよね)をささっとやりたい場合、スクリプト言語であるPerl、Python、Ruby、もしくはなでしこがおススメです。

Mac? MacでリネームするならAutomatorかAppleScriptの方が楽ですよ。

*** Web上で動くものを作りたい(Perl、Python、Ruby、PHP、Java、C#、VB.NET) [#v0b8f0c6]
-掲示板やwikiなどのサービスを作成したい場合、サーバで動くプログラムを作成することになります。&br;
サーバでプログラムを動かすための仕組みとしては、

-CGI
--Common Gateway Interface(サーバーが、クライアントからのリクエストを受けたバイナリ、もしくは一行目にインタプリタの場所を指定してあるスクリプト言語のソースを実行し、その出力結果をクライアントに返すシステムのこと)の略なので、正確には言語の名前ではない。喩えば HTTPD(Apache) という「シェル」がリファラなんぞのリクエストヘッダを環境変数に追加してシェルスクリプトを実行している、と解釈できる。
--Perl、Python、Rubyなどが一般的で、C,C++等をコンパイルしたバイナリも存在する。拡張子はcgi(サーバの設定如何で変更可)。
--なぜスクリプト言語が主流かと言うと、コンパイルの手間がなく、保守性が高いため。また、どうしても"ユーザー<->サーバー"の双方向の"textでの"やり取りが多いために、文字列処理に特化しているPerlや、Perlから派生した言語が多い。
--一般的にPHPに比べて遅いとされるが、それはサーバーがシステムに投げてる手間がかかるため。例えばApacheの場合、mod_perlなどを使って、ApacheのmoduleとしてPerlなどを動かせば(つまりCGIでないようにすれば)PHPよりもはるかに高速で、使うメモリも少なくて済む。

-PHP
--普通PHPというと、サーバーのmoduleとして動かしているものを指すので、厳密にはPHPはCGIではない。(PHPをCGIとして動かすこともできる。)
--一般的にCGIよりも高速で動作するが、それは前述のためであり、PHPの言語としてのスピードは言うほど速くない。
--サーバーの設定によっては、使える関数が制限されていることもある。
--CGIと違いHTMLに埋め込むため、どこまでがコードなのか判定しづらい。読みやすく感じるのはおそらくPerlの難読性との対比のため。
--手軽さから、サーバーサイドプログラムとしては人気が高い。

-サーブレット/JSP
--Javaで記述。JSPではPHPのようにHTMLにコードを埋め込むカタチで記述できる。
--個人のページではあまり使用されているのを見ないが、企業では良く使われる。
--低価格なレンタルサーバーでは利用できないことが多かったが、Google App Engineというサービスで利用できるようになったため若干敷居が低くなった。

-ASP.NET
--.NET言語(主にC#)で記述。Windows系サーバーほぼ限定。拡張子はaspx
--Microsoftのページなどで見れる。それなりに個人利用もあるようだが、やはり企業での使用が中心

-WebObjects
--超マイナーなJava サーブレットの一種だけれど、数百万もしたものが、Mac OS X にはランセンスタダ同然で付いてくる。
--比較的Cocoa の体系に近い(もともとObjective-Cだった)ぞ。iTunesStore や AppleStore はこれ。企業で(ry
--ちなみにMac OS X にはPerl、Python、Ruby、Module版PHPが最初から、10.5からはRuby on Rails までインスコされてるから、Apache を設定すればすぐ使える。

などがあります。おススメはPerl、Python、Rubyなどを用いたCGIやPHPです。&br;当然、他にHTMLの知識も必要になります。まあざつとこんな感じで。

***WEBページを作りたい (HTML、CSS、JavaScript)[#he0e59ae]
// Web用のページ作った方がいいな多分。。。
最近流行りのページ構成はMVC的発想があるのでグラマ的にもおいしい所は充分にあると思う。てかHTML造ったのはNEXTSTEP使いのイギリス人グラマですよ。URL・HTTP・HTML・世界初のブラウザ、全部彼が原型を造ったてんだから、グラマだってんならこういう偉業を成し遂げたいと思わなく・・・ないかね?

// あくまで言語の説明に絞るため勝手にコメントしました。
//-URI
//--リソース識別子、とでも呼んでやりたい。今はURL(場所)、URN(名前)と役割分担してる。
//--世の中には色んな情報があるわけだけれど、これの場所を文字列で表現するという発想が元。
//--残念だけれど、横のつながりがない。ダウンロードしてきた画像を仕舞う時をイメージして欲しい。Aのフォルダにすべきか、Bのフォルダにすべきか、どこに分けるか悩む時がある。こんな時はどうしたらいいのだろう? 両方に入れるべきか、Cのフォルダに入れてA・Bにはリンクを貼る、まあ解決の仕方がないわけではない。後者の発想は、とりあえず簡潔で絶対的な名前(C)を作りそれから意味を表す名前(A、B)を作ることを表したつもり。
//--Javaなんかでjava.langみたいな表現が有るけれど、階層表記の特性はIDLにゆずるとして、ともかく、URI的発想がいろんな所でいきてる。
//--これは人間がカテゴリ化した情報を、どのように呼出し、どのように管理し、そしてどのように作るべきかの問いかけでもある。バージョン管理もいざ作ろうとすると悩むからね。

-HTML
--CSS(後述)みたいにいろいろ規格がある。そこにXHTMLを含めてやってもいい。
--XML的性格を追求したのがXHTMLだったけど、今後はHTMLという方針に戻りそうな気配。
--HTMLとXMLの違いは、HTML5のfooterやheaderを追加しようという話をみればよくわかる。
--恆に下部に存在するfooterといった役割は、XMLからすれば本来デザインで決めるべきだが、HTML5ではfooterというタグ自体が画面の下部に存在することを表している。
--つまり「俺は見出しだ」「僕は段落だ」「私は題名です」ということを宣言させておいて、ブラウザはその内容をよく解析することでページを表示する。
--XMLというよりは、「ラテン語(SGML)の子供のフランス語」みたいに、Web のためのHTMLを目指し始めてる稀ガス。
--XMLはプログラムではシリアライズ(永続化)手段としてよく使われます。その触りとしてやってみるのもよかろう。

-JavaScript
--CGIだとかはサーバに実行させるプログラムだが、これはそうではない。ブラウザ(クライアント)に実行させるプログラム。
--JavaScript のコードをCGIで動的にサーバから返答させて実行する荒技もある。すぐ環境が準備できる点で便利。
--クライアントサイドという点では Javaアプレット や Adobe Flash(スクリプトはJavaScript風) という技術もある。
--CGIやPHP、そしてDB(Data base)との連携が極めて多い。ただ、ブラウザにより実装が異なる欠点が有る。
--最近では、DBにSQL文を生成して投げる時さまざまな手法があるけれども、JavaScriptに投げたり投げられたりする。
--サーバでやるべきか、クライアントに処理させるべきか。良く判断してプログラムを組むべし。

-CSS
--デザインを分離するための方針。Design, Logic, Database, これの分離といった所。MVC に近い。
--CSS, CSS2, CSS3 といろいろあつて、IE以外は CSS2に結構対応できてる。CSS3 はまだ議論されてる。
--レガシーな CSS よりも CSS2 を今は重視すべきです。CSS3 は徐々に先行的対応が始まってます。
--CSS3の先行対応は、IEの組版(ruby, 縱書)、SafariのCSSアニメやCSSフォントや文字影、Firefox・Safariなどのborder-radiusなどです。
--Logic は JavaScript や CGIなど。Database は DB Server、HTMLのテキストもリソースなのでここに入れるといい。
--MVCのCはさしづめWeb ServerやBrowser。Databaseはサーバ以外にクライアント(JavaScript参照)が追加された。
--デザインはサーバから受け取るだけではなく、JavaScriptで動的に変更できる。コンテンツも同樣である。
--したがって Design, Logic, Database はサーバとクライアントの両方に存在することになる。適当に使い分けよ。

-jQuery
--正確にはプログラミング言語ではなく、フリーのJavaScriptライブラリである。
--ブラウザに依存せず、DOM操作、CSS操作、エフェクト、アニメーションなどが可能。
--Ajaxの記述方法も簡易になった。
--おそらく慣れ次第ではJavaScriptよりもかなり速い速度で記述が可能

*** Flashを作りたい(ActionScript) [#uff1e9d3]
Flashアニメや本格的なFlashゲームを作りたい場合、&br;
ActionScript2.0、またはActionScript3.0をオススメします。&br;
AS2であればフリーのツール「ParaFla!」や「Suzuka」がありますし、&br;
AS3であれば公式で開発環境を無料でDLできるので入りやすいです。

最新版では、デスクトップアプリも作れるようになりました。&br;
Adobe Flash の体験版を入れると、謹製のプレイヤーがついてきますよ。

学生、教員はFlex Builder 3 Professionalが無料で入手可能です(09/12/2現在)。&br;
プログラマ向けのツールで、Eclipseベースに独自拡張が施されています。&br;
詳しくは[[こちら:http://www.adobe.com/jp/education/hed/vanguards/]]。

*** とにかくいろいろやりたい [#r5296ba0]
とりあえず、

-コンパイラ系(C/C++、Java、C#など)から一つ
-スクリプト系(Perl、Python、Rubyなど)から一つ
-サーバサイドWeb系(CGI、PHP、JSP、ASP.NETなど)から一つ
-クライアントサイドWeb系(HTML、CSS、JavaScript、ActionScript)から一つ

といった感じで身につけていくのはどうでしょうか。コンパイラ系とスクリプト系はどちらからでもかまいません。~
また、関数型言語(Lisp、Ocaml、Haskellなど)の世界に足を突っ込んでみるのも楽しいかもしれません。~
さらにPrologなどの論理型言語と呼ばれるものもあります。

*** Python [#idfc8477]
Pythonは、オブジェクト指向のプログラミング言語です。
初心者でも分かりやすいのですが、とても奥深い言語です。
習得が容易でありながら、アプリケーション作成、システム管理、ウェブプログラミングなど色々な事が出来ます。
C++やJavaと連携したCPython、Jythonなどもあるのでプログラマの方でも満足できると思います。
他には、IronPythonと言う.NET Framework上で動作するPythonまで出てます。
将来性に優れたPythonを始めても損はしないはずです。これを期にPythonを始めてはいかがでしょうか。

*** Mac っす(Objective-C) [#rbd505fa]
Carbon はやめたまへ。血をみるよ。サポート打切りの噂も絶えない。フツーのアプリなら Cocoa になさい。Xcode (Project Builder)を入れるといいよ。Mac OS なひとは今から何か作るのは無謀でないか。Xcodeでのアプリケーションは次のどれかとなる筈です。

-Objective-C(Cocoa API)
-Objective-C++
-C++
-Java(Cocoa API)
-Python(Cocoa API)
-Ruby(Cocoa API)
-AppleScript
-C(Carbon API)
-JavaScript

以外におもうかも知れないけど、C++があります。これは 低レベル系の開発で使うだけのようです(註:SSE は Intel が ObjC に未対応なため、C++ だけらしい)。

Objective-C++はC++にObjective-Cの拡張部分をつなげたもので、Safari は Objective-C++で組まれているそうです。ちなみに Safari の WebCore.framework やらのソースコードは公開されてますヨン。

Python や Java、Ruby は Objective-C の Cocoa API が使えます。先述の WebObjects ではWO5より Java化され、PythonやRubyはグルーとしてもですがPython CocoaやRubyCocoaとして一般のアプリケーションも作れます。それからAppleはJavaScriptも力を入れて居て、Widget なんかはコレ。

AppleScriptは知らないとわからないけれど、AppleScriptは(コンパイルして)保存した物を独立したアプリケーションとして使用できます(実体はOSレベルで実行されるアプリケーションコマンドの塊?で、gccされたのとは違うよ)。QuickTime などの基幹機能は AppleScript を遣ってムービー変換ができたりする優れもの。Mac OS の昔はこれを日本語で書けたけれど今は知らない。UNIX コマンドの呼出し(及びシェルからのAppleScriptの呼出し)などの拡張が Mac OS X から増えてます。AppleScript はプログラムで遣う配列やらの概念と簡単な英文法を知っていればすぐ理解できるはずです。昔は、明らかに影響を受けたと思しき、 HyperTalk という物もあったのだけれど、それはまた別の話(AppleTalk、漢字Talk とそういう名前が多かった)。

他にも「Quartz Composer」で簡易スクリーンセーバ(本格的なのはXcodeで作る)ができたり。「WebObjects Builder」でのWebObjects開発は、WebObjects Builderのコードが古いために 10.5 からはできません。Audio Unit、Metadata Importer(Spotlight)、Quick Look Generator、Preference Panel(システム環境設定書類)など小物用のテンプレもXcodeには揃ってます。

上にも述べたけど、Web サーバ系の開発も可能です。また UNIX(カーネルである Darwin は BSD系で 10.5からはUNIXになりました)として使用することもできるので、シェルで遊ぶこともできましょう。Objective-Cが今いちマイナーな言語ですから、言語の紹介を得るのがむつかしいのですが、それなりにドキュメントは揃ってるようです。

*** iPhone アプリってどうなのさ(Objective-C/Objctive-C++) [#dfb8f070]
流行ってるみたいだね。SDK のダウンロードも結構多いとか。Mac OS X と同じ体系になるけど、微妙に違うので別項として扱うよ。

iPhone SDK の開発言語は Objective-C の模様。理解レベルは「Mac OS X アプリケーション開発に必要な知識(ここ重要)」と「iPhone 用に拡張された API 及び iPhone のハードとしての擧動」を知る必要があります。ですから、Mac OS X アプリケーション(Objective-C、Cocoa API)に就ても参照してみて下さい。基本的にはMac OS X アプリケーションを作る際に必要な知識が大きな比重を占め、iPhoneのみの理解はごくごくわづかな比重となるかと思います。言語理解とCocoaの理解は並行して進めるとよいでせう。

面白いのができたら App Store に発表するべし。SDKとドキュメントはアップルのサイトにある。http://developer.apple.com/iphone/

*** 最適化したいです。C? アセンブリ? 機械? [#d63ace84]
昨今のコンパイラは優秀で、かなりのレベルで最適化をして下さる縁の下の力持ちであるけれど、コンパイラはバイナリを最適化しているに過ぎない。等差数列の和や等比数列の和を求めるのに、ひとつづつ計算して合算するような無駄な作業の最適化まではできず、高速化するには「公式」を使って記述してやる必要がある。

こういう最適化は、最初に「アルゴリズム」の改良によってなされるけど、実装を変えることで最適化をすることがある。C++ や Objective-C のコードを C で書くとか、Ruby の拡張ライブラリのように、速度面の改良は実装で解決できることがある。

特に Motorola の AltiVec、Intel の Streaming SIMD Extensions(SSE)なんてのは最適化を CPU というハードへ投げるもの。ソフトで改良するよりもハードに合わせた方が圧倒的に早いのは、あたりまえのことだけど、忘れがち。

メモリ管理でもその事は云えるようで、高頻度で参照するメモリは、一定の領域を参照する方が早くなるように設計されている。戸棚を開けたら閉めずにおくイメージ、次に使うと想定されるメモリはキャッシュされるので、ヒープ領域を考慮する。

最近は Multi-thread(マルチスレッド)という遣り方もある。iTunes は MP3 Encoder に lame を使用してるみたいだけれど、Multi-thread も使用する。iTunes で変換を始めるとスレッドが10くらい増えるけど、もし lame で単純に変換するだけだったら、スレッドは増えない。その速度差は結構あるみたいで、どうも三倍は違うらしい。

ところが Multi-thread へ対応するには、かなり面倒な問題もある。CPU 命令だとか、C での実装、メモリ管理だとかは、環境依存だけれど、Multi-thread はメモリの参照の仕方をよく考えないといけないから。並列して計算した結果が確実に取得できる迄は、それを必要とする限り先に進むわけにはいかないし、そういった情報が確認できないといけない。だから、敬遠しがち。

それから OS でみると、Mac OS X の場合はハードを制限するために、ハードに纏るソフトの開発は比較的容易だけれど、他の OS だと少し面倒かもしれない。そういった''苦労に見合うだけの最適化''が重要で、そして最適化には、CPU の処理はどうなってるか、言語実装はどうなってるか、という知識が不可欠になる。だからプログラミングをやる過程で自然と身に付く。

また OpenCL のような、計算機の数を増やすぜ的な発想とか、Grid COMPUTING のように、連?して計算するヨってのもある。しかしながら、Multi-thread と同じ問題を抱えているのが難点で、こういうのは計算が分割できて且つ計算量が多い場合に有効だよ。

ところで分散処理って GC で mark する(mark, sweep)とかしないとか、そういう問題に近い気がするのですが、どのメモリが参照されてるかというのを複雑なコードから確実に認識するには、それなりのリスク(確実な処理のため)を伴う物が多いので、誰か解決して下さい。

***Mac OS X と Apple(魔改造とは云わないで) [#af7aede3]
最適化してくと多分 API に詳しくなれます。Apple の手が入ることで、Mac らしさが Mac OS X にはあるわけですが、それがまた知らない人にはわかりづらいということもあるわけで、そこは Windows らしさや UNIX らしさが難解になることと同じです。だから Mac で何か作る時は、Apple がどんな改造を施してるのか考慮しないと、通常の UNIX 的発想が通じないことはよくありまする。

さて Cocoa には NSZone 型というヒープ領域(ゾーン領域)を表す物があって、喩えば malloc_zone_malloc という函数が malloc.h に宣言されてる。これは Kernel の実装に拘る函数らしく、malloc はデフォルトのヒープ領域からメモリ確保してるとか。AltiVec、SSE は、vecLib.framework、Accelerate.framework などを使えば C で使用できる。これはある程度の高速化を望むなら使用するといいけれど、更なる最適化はアセンブラでなす必要がある。

そういえばMulti-thread の問題を解決するよって Grand Central Dispatch(GCD)を出したけど、よくわかんねえ。GCD は OPEN SOURCE なため、FreeBSD に移植された? らしいけれど、言語拡張はどうなるんだ・・・?

分散処理といえば、Xgrid を使えば、分散処理ができるかもしれないけれど、よくわからない。Xcode では distcc を使って分散ビルドできる。QuickTime API による動画変換は、Final Cut Studio や Logic Studio の qmaster やらで分散エンコードができる。これら分散処理の問題点は、処理が分割できることは明らかなので、従ってネットワーク上でのリソース参照にあって、Apple Qmaster は仮想ディスクをマウントすることで解決してるらしい。Xsan でリソース共有もやってるから、Apple は此の手の事にかなり積極的な気がする。

*** プログラミングを楽しみたい [#r545f2bc]
プログラミングを楽しみたい人やプログラミング自体を勉強したいという方は、~
余計なことをあまり考えなくていい[[Python>プログラミング言語/Python]]や[[Ruby>プログラミング言語/Ruby]]といったスクリプト系がいいと思います。~
どちらも、WebのCGIプログラムからGUI、ゲームなどなど色々なものが作れますから、~
実用的にも覚えておいて損はないと思います。

*** スーパープログラマになりたい [#m07e1930]
-スーパープログラマと人々に呼んでもらうためには、「どの言語を使うか」より「何を作るか」の方が重要です。&br;
最近では、DHHという人がそれまで海外ではあまり普及していなかったRubyでRuby On Railsというソフトウェアを作り、一躍時の人となりました。&br;
Ruby On Rails以降、海外でRubyの書籍は一気に10倍以上売れるようになったそうです。&br;
頑張って超格好良いソフトを作ろう!&br;

*** OSたんをつくりたい(アセンブリ) [#efacf64b]
-初心者にはまったくお勧めできない。 プログラマなら一度は憧れるOS開発。ネットワークやCPUなどの物理レベルの知識を一通り身に付けた後に挑戦し、CUIのOSを作ると言うのが趣味レベルでの流れ。
-アセンブリ!これさえあれば怖いものなし! --> Linuxのソースコードでもダウンロードしてお勉強しなさい。(Cです。) 
--> その前に本を読んでOSの基礎知識を固めなさい(日本語です。)
-->「30日でできる! OS自作入門」が日本語書籍で筆者がお勧めする書籍。それなりに簡単。

*** 世を統べる真理を実装したい(人生、宇宙、すべての答えを求める) [#se8e18a6]
-そんなアレゲなことを望むあなたにはLispをおすすめします。&br;
Lispは歴史が古く、パンチカードでコンピュータが動いていた1950年に生まれました。&br;
人工知能の開発に使われたりするなどいろいろぶっ飛んだ言語です。一見すると括弧だらけで使い辛そうですが、学んだが最後あなたはきっとLispの持つ魔力に吸い寄せられるでしょう。現代に残る謎の言語です。
-Lispは元々一つでしたが、拡張が進み、ある一定の共通性を持ったプログラミング言語の総称になっています。なので厳密に言えば複数のLisp言語があります。これをLisp方言と言います。&br;
方言と言われるように関数が方言によりちょいちょい変わったりするのでどれか一つの方言をマスターしてから、他の方言に手を出さないと混乱します。
-- 代表的なLisp方言
--- CommonLisp
--- Scheme
--- EmacsLisp
--- Clojure
-CommonLispはLispの再統一を目指した言語でLispの事実上の標準方言です。ですが、何が何だかわからない人はまず手始めにLisp方言の中でも教育向けと言われているSchemeをマスターしましょう。

*** 彼女を作りたい [#idfc8478]
-親から受け継いだ日本語…Priceless

*** 世界を作り変えたい [#qdea6875]
-VIP言語とあなたの頭

*** 働きたい [#idfc8479]
-親から受け継いだ日本語…Priceless
-TOEIC750点くらいあると捗ります