開発環境編::各言語やフレームワークの解説について

軽くプログラム言語をまとめてみました。
プログラム言語やフレームワークや開発環境 説明
C(K&R) 古いタイプのCで手続型言語/構造化言語。2パスコンパイラで1pass目でプリプロセッサ起動、2pass目でコンパイルです。当時はデータ構造+アルゴリズム=プログラムと言われていました。今でもそんな感じですね。
構造化言語とは言っても、gotoはちゃんとした使い方をすれば有効です。適切な使い方ならばむやみに避けなくとも良いでしょうがコーディング規約に即しましょう。ANSI-Cと比べて関数宣言が結構あいまいです。
ANSI-C 標準化されたCで厳密であり、関数の構造文でローカル変数の宣言ができない。変数のスコープの概念がファイルか関数しかない。#defineマクロは同じく構造化アセンブラのMASMに比べると比較的に弱いですが、それでも強力です。注意すべき点はそれが関数なのか#defineマクロなのかの利用する人が判別しなくてもいいように関数っぽい#defineマクロを定義する場合は()で括ります。
アルゴリズムを憶えて実装する勉強をするには良い言語です。アルゴリズムの本は易しいのから難しい物や、特定のアルゴリズムの本とかがあるので本屋で見て、自分に合った物を選べば良いと思います。極端な例ですが自分の本棚には人が殺せる本の「The Art of Computer Programming」vol1-4」がありますが、各種専門分野は別の本が必要です。vol1の初版は1万でした。今は半額ですね。「コンピュータの構成と設計」は第三版と第五版の上下巻を持っていますが、kindle版で第五版の上下合体があったので買いました。gem本に比べたら安いですがもう少し安いと良いですね、本。本の良いところは体系的に学べる、インターネットは検索性と情報の新しさですね。たくさん出てくる検索結果を読み取るために現代プログラマには検索スキルも必要と思います。
コラム ここで、頭の体操。int aとint bの値をテンポラリを使わずに交換する方法。まずはラップアラウンドを考慮して、int a=10.b=100;a+=b;b=a-b;a-=b;です。xorだとint a=10,b=100;a^=b;b^=a;a^=b;ですね。現場では見通しが悪くなるので使うのはやめましょう。元々、x86にはxchg命令がありますし、RXファミリのCコンパイラのCC-RXではxchg()関数をXCHGに展開します。
コラム 8bitのPICではハードウエアスタックが8段しかないので再帰アルゴリズムは開かないときついです。RAMも小さいのでソフトスタックも難しいです。ウォッチドッグタイマとかもあるので、c言語では無く素直にアセンブラの方が良いかと思います。著者がDOS時代に作った常駐ソフトはSPの消費を抑えるためソフトスタックにBPを使っていた。ほぼoptasm1本でした。なので、8086系のcのlargeモデルとかhugeモデルとかはよく分からないです。8bitの8080にはCP/M、6809にはOS/9等のOSがあります。8086/8088系にはCP/M-86とかMS-DOS/PC-DOSがあります。色々言われる64KBのセグメントはCP/M-86で8080とのコンパチブルを狙った物ですし、MS-DOSのcomモデルもそれに似ていますし、当時はそこまでメモリが詰めるとは思われなかったので、セグメントはある意味有用でした(事実、80186命令や独自命令を使えるNECのV30には8080エミュレーションモードが搭載されていました。PC9801Fの8086をV30に換装するのが流行ってました。タイミングチャートは若干違うだけなので問題ありませんでした)。DOS-EXTENDERとかwin(初期のwinはDOSから起動する一種のDOS-EXTENDER)ではメモリ保護の為に十分に有効です。著者は過去にMS-DOS2.11コンパチのOSやメモリ管理ツールやDOS-EXTENDER等も作っていましたが忘れました^^;DOS-EXTENDERの実装にはスルヤント先生の80386の使い方が憶えやすかったです。80486の使い方もありますが、中身は殆ど一緒ですが、絶版ですね。こういった良本を電子書籍化してくれるとありがたいのですが。
C99 新しいタイプのC言語であり、変数のスコープの概念が拡張されて構造文の中でローカル変数が使えるなどの拡張がされている。実はまだまだC言語は開発されている。
C++ オブジェクト指向であるが、難解なC言語。ANSIに標準化されるまでもめにもめた。著者はリアルタイムだったので、テンプレートと例外処理、名前空間(namespace)、新形式のキャスト、ブール型の特にテンプレートとnamespaceが揉めた。 ベターCとして使う人もいますが、せっかくのテンプレートやnamespaseなんで、自分は使います。
namespaceのusingによる汚染問題ですが、どうしてもusing namespase std;を入れたくなりますが、std:count とか書いた方が無難です。自作の長いnamespace名や入れ子状のnamespaceの場合は、namespaceの別名定義の使用を検討しても良いでしょう。他にもNULLとnull_ptrは上手く使い分けましょう。同様に#defineとconstexprを使い分けましょう。typedefよりusingの方がテンプレートもつかえます。intは使うなってよく言われますが使い方次第ですね。std::int64_t a;にすれば、intのサイズに泣かされません。テンプレートは関数のオーバーロード以上に強力です。
確かにc++は難解な言語ですが、c#かjavaとcが組める人ならば普通に使う分にはそう難しくありません。現場ではcの標準ライブラリや極端な例だとc形式のキャストを禁止されているところもあります。さて日本にC++の全てを理解している人は何人居るでしょうか。自分は入ってないですがコンピュータ言語の権威、中田育男先生は入っているでしょうね。
Microsoft Visual C/C++ win3.1時代、スクリーンセーバを作ったときからvc++を使っていました。新しいバージョンのVC++はstrcpy_sとかしなくてはいけないのですが、プロジェクトによってはですが自分はVC++のstrcpy_sとかは使わないのでC4996を無効化してしまいます。VC++は独自拡張が多いのですが、それさえ避ければgccでもコンパイルできるものを作れます。
コラム ちなみにMASM等アセンブラも2-3パスですが、optasmは1パスアセンブラで、複雑なマクロの展開と出力objの最適化をします。無駄nopがほぼ無いです。しかも高速アセンブルです。自分は未だに使います。VC/C++は64bitもしくはユニバーサルアプリの場合、インラインアセンブラが使えません。なので、MASM64(ml64.exe)を使います。intel-x86も64bitになって、レジスタも追加&拡張されてRISCっぽくなっているけど(やっとレジスタ増えたのは大きい。MC680x0-CPUやARM-CPUのレジスタセットのきれいさと汎用性や多さは凄い)、スタックとか厳密だからそこはきちっとします。
コラム 自分の作った言語ではVC++6の#defineマクロとMASMのマクロを足しちゃいました。ちなみにその言語のプリプロセッサには嫌われ者のsetjmp/longjmp使ってます^^;
プログラムの場合はやりたいことと、その手段の2つが求められます。やりたいことが出来れば手段は問わないではメンテナンスフェーズで困りますのでSEの指示や他のPGと同じような組み方をしましょう(コーディング規約等)。
C++98/C++03/C++11/C++14/C++17/(次はC++20の予定) 拡張されていったC++。
Objectiv-C/C++ C++は揉めにもめたがそれに嫌気がさした人が作ったオブジェクト指向言語。当時のCPUは遅かったが非力なマシンでも動く(まあ、4bit-cpuのプログラムを組んだり、6502やpicのプログラムを組んだ自分からしたら非力ではない)。記号で判別して(この記号が分かりづらいと言ってobjectiv-c/c++は嫌われた)コンパイラへの負担を減らしてある。当時のスティーブンジョブズが作ったNeXT社が買い取りNeXTコンピュータのNeXTSTEP-OSで採用されて、その後ジョブズがApple社に戻ったときにNeXT社がApple社に買われた。NSというライブラリの文字列の頭にNeXTSTEPの面影が残る。ARCが入ったおかげで苦労しました。はい。正直これからこの言語を覚えるのは特殊用途以外、お勧め出来ません。iOS/iPadOS/macOSならばswift、本格的なオブジェクト指向を学びたいならC++ですね。JAVAかC#学んでC言語に行ってC++に行く方が無難ですね
Swift Objective-C/C++が古くなり、モダンな言語とは言いがたく、しかも取っつき辛かったので作られたオブジェクト指向言語。breakスルーがないタイピング数を少なくさせたJAVAやC#みたいな物。XCode環境下では、楽ちんな言語。swiftのswitchはbreakスルーがない代わりに(c言語等ではbreakスルーは適切に使用すれば便利ですがコーディング規約に反さない場合や使うにしてもコメントは書きましょう)非常に強力になっています。swiftのswitchの説明だけで相当な量の文章が必要なので割愛します。googleがkotlin firstを打ち出していますが、appleはswiftをもっと強く押し出しています。swiftuiとかですね。
swiftの製作者はappleのクリス・ラトラー氏。swiftを触ったことのある人はマルチスレッドや非同期通信を行うとコールバックの嵐になります。そのうちにコルーチンの実装をするとクリス氏は言っていますがまだですね。RxSwiftを使えばある程度ハッピーになれます(Rx=ReactiveXで、javaとかにも使えます)
XCode eclipsやandroidStudioやVS環境みたいな物。ちなみにiOS13/iPadOS13用のXCode11は、それ以下のバージョンの物はコンパイル出来ないので、XCode10をリネームして共存させた方うがいいでしょう。しかしXCode13は、画面分割がよりフレキシブルになって使いやすいけど、初めての人はびっくりするかもしれません。ちょっと古い話なんですが、GooglePlayはandroidOSのバージョン違いの同じ物を販売させてくれますが、app storeでは出来ませんでした。今回はどうなるか分かりませんが。第一、app store connectに名前が変わったのもつい最近ですよね。困ります。
コラム appleは固有のビジネスを認めない(例えばkindle for iOSではkindle本が買えないからsafarit等でamazonにアクセスするしかない。2重課金になってもいいならYouTube Premiumとかの入会はYouTubeアプリ内からも出来ますが、safariで入会したほうが安い)、将来appleと競合するアプリを認めない(そんなの判んない)、ごみは認めない(何がゴミかは教えてくれない)、悪意のあるアプリは認めない(あからさまにとか、プロジェクト全提出なのでappleではチェックするプログラムがある)、UIがとか...、とか、担当によって違うとか色々な理由でリジェクトされるんですが、あるバージョン番号で通ったのならばビルド番号を変えて申請するとうまくいくことが多いです。セキュリティー上、ある程度はやむを得ないのですし、生前のスティーブンジョブズがadobe(flash)とgoogle(野良アプリやgoogle play)に喧嘩売った演説したとか色々と逸話があります。今もapple社内でopen派とclose派が居ます。iPadOSのおかげでようやくストレージが使えるようになりましたが、まだまだアプリ側がついてきていないのが現状です。iOS/iPadOSデバイスの完全バックアップが出来るのは現状win/macのitunesかicloudだけです。
Java Javaはモダンなオブジェクト指向言語であり、JavaVMさえあればどの環境でも動く中間言語コンパイラで、動作はJavaVMが実行時コンパイルする(JIT)が、androidの新しいものだとインストール時にコンパイルされる(AOT、とは言ってもAOTとJITとインタープリタのハイブリッドが現状)。GCあり。デストラクタは無くファイナライザが用意されていますが、ファイナライザは呼び出されるタイミングがGCに任せられていますので変わりにはなりません。(C#のディストラクタも同じ。c#のデストラクタっぽい物はファイナライザ。c++だと、deleteでカウンタが0になるとデストラクタが呼び出される)。abstraut/interface等もあるのでjavaの最大の欠点と言われています。それと多重継承は出来ません。理由はダイアモンド継承で検索すれば出てきます。c/c++で言う定数定義のための#defineはfinal、残念ながら何度も論議に上がっているコルーチン無し(自分はスレッドも多用しますし、UnityC#ではコルーチンからコルーチンを呼んだりするので、出来たら付けてほしかったです。ですがコルーチンはスレッドの代わりではない。古い話で申し訳ないんですが、自分がVC++でゲームエンジンを作っているときDirectSound9を使うとスレッドはほぼ必須です)、匿名クラスあり、forearchの変わりの拡張for。androidの開発では新規はkotlinに奪われています。JAVA8からはラムダ式や関数オブジェクト、ArrayListやHashListでstrem()メソッドを持っています(これらJAVA8の拡張は現場によっては禁止されてます)。厳密なデストラクタが無いことと多重継承を出来ない事でオブジェクト志向原理論者からは欠陥言語とされている。イテレータは使っては行けない現場もあります(殆どがforやwhileか拡張forで実現できるから、と言うか拡張forは内部的にイテレータを使ってる。)。JAVA8からはDateやCalenderに代わりより簡単で安全な数個のjava.timeパッケージが加わっています(主な追加された原因はマルチスレッドでDataやCalenderを使うと書き換わることがあるため、java7でもJoda-timeライブラリ等がある)。自分から見たら、プログラム入門に適した言語だが、javaccやオンライン環境での開発は容易ですが、androidstudioでandroid版を作るのなら各種ウイジェットやレイアウト、アダプタとかを憶えないと行けないから純粋に言語を覚えるのには向かないと思います。多分、xcode環境下で開発していた人がandroidStudioを触ると、使い辛くてしょうが無いから。逆に、sndrodiStudio環境だった人がxcodeに写ると、凄く楽だから。言語は別として。kotlin/swiftとの違いは、ゲッターセッター、例えば enmayData class で private int life=0;にした場合、getLiteとかsetLifeとかしなくてはいけないこと。それと参照渡しの場合、nullを許容するからエラー処理はkotlin/swiftよりタイプ数が多くなる(kotilin/swiftはオプショナル型でnull/nilが指定可能だが普通に宣言すると使えない)、そして変数宣言の時にkotlin/swiftだとval num = 5で良いけどjavaだとint num = 5と明示的にしなくてはならない(Java10からは利用可能、もちろんkotlin/swiftでも型を明示的に指定も出来る)。swiftの非常に強力なswitchやkotlinにはそもそもswitchが無いです。あとはkotlinにはあるSmartCastとコルーチンがJava/swiftには無い事かな。
サーブレット&JSP JavaBeansで組んでました。EL式を使ってDAOパターンなのでDBMSアクセス用のJAVAは分けて。まだまだ現役でしょう。サーバサードプログラムがJAVAで組めるのが強いですね。
kotlin androidstdui3のデフォルトで、Javaとの相互運用が可能なうえに記述が簡素になる、一応用クライアント言語(jvmで動くのでサーバサイドも書けますが、今はandroid専用言語っぽいですね)。c言語のスーパーセットがc++だとするならば、javaのスーパーセットがkotlinです。よりセーフティーで簡素に書けますが、使いこなすにはラムダ式やクラスを理解していないとなかなか手ごわい奥の深い言語です。kotlinにはswitchがありませんが代わりにwhenを使えば非常に強力になります。数値や数値の範囲内以外にも型で分岐できます。定数(JAVAで言うfinal/swiftで言うlet)はval。文字列リラテルには便利なRawStringが追加されています。文字列テンプレートとともに便利です。セーフコール演算子、===演算子ありますが、三項演算子は無しでビット演算子は関数として提供されています(自分的は残念ですが慣れます)。関数の戻り値に2値や3値をとれます。それ以上はデータクラス(C++/C#のstructと似た感じ)を使うべきですが便利です。データクラスにはデータクラスをコピーするcopyメソッドや便利なcomopnentメソッドが使えます、高階関数、ラムダ式もつかえます。コンストラクタ、クラス自体がJavaとは違う考えで作られていますのが慣れます(コンパニオンオブジェクト等)。委譲プロパティという仕組みがとても便利です。swiftはbreakスルーをなくした代わりに非常に強力なswitchが使えるのと対照的ですね。kotlin ver 1.1でコルーチンの実装がされています。swiftユーザとkotlinユーザは仲がいいですね^^v
Scala Javaに似ていますがオブジェクト指向言語と関数型言語の特徴を統合したプログラミング言語。Javaでできなかったこともできます。
Pascal LL(1)でワンパスでコンパイルできる、非常に簡素な言語でBASIC以上にわかりやすいと自分は考えている。自分も自身でPascalコンパイラが書けた。
Turbo-Pascal 旧ボーランド社のアンダースヘルスバーグが開発した言語。当時の非力な16bitPCでも軽快に動くIDE(TASMで作られた)と、低価格で学習も容易な言語。
VB 正式名称VisualBasic。非常にモダンで強力なBASICで、古いBASICから脱却して構造化プログラミング言語で、一部オブジェクト指向も取り入られています。未だに現場では使われています。個人的にはJavaや後述するDelphiやC#に似ていると思います。
VBA 正式名称VisualBasic for applocation。MS-OfficeのマクロをVBでかける物で、非常に便利です。
Delphi アンダースヘルスバーグが開発した言語。一時期はVisualBasicと並ぶ入門者用言語ですが衰退していきましたがコアなファンは多くまた復活し様としています。
C# アンダースヘルスバーグが開発した言語。C#とDelphiが似ているのは作っている人が同じ人だから。C/C++よりJavaやDelphiに影響を受けたオブジェクト指向言語。非常に学習が楽で、JavaScript->C99->C#->JAVA->Swift->C++の順番で学ぶといいかもしれない。コルーチンが非常に便利です。C++のディストラクタっぽくかけますが。C#はファイナライザで解放はGCに委ねられます。.NET環境ではほぼc#一択です。
コラム 自分はプログラミングスピードが速いこと、各種アルゴリズムに精通している事、自分でもいろんな言語を作るくらい各種言語に精通していること、フロントエンドからバックエンドまで出来ることで、よくプロトタイプ版を作らされます。同じ物を何度も作ることもわりと好きなので、数種類の言語やフレームワークで作らされたりもします。プロトタイプ版を作ることでPMやSEの力になっていれば良いなと考えております。本も買いまくりです。今は電子書籍があるから良いのですが、それでも実本はありますし、学習のためなら結構本買います。純粋にプログラムが好きなんでしょうね。ライフワークは独自CPUに独自OSを載せることです。いつになるやら^^;
ECMAScript エクマスクリプトと呼ぶ。言語仕様だけ制定するから開発環境や使用環境は自分達で考えてねって感じ。代表的な物にjavascriptがあります。PG初心者にありがちな「javascriptとかってscriptでしょ、javaの簡単なバージョンじゃ無いの?」っていう人がいらっしゃって下に見られたりしますが、立派な言語で別物です。webやlinx系組込みやっている人にそれを言うと生暖かい目で見られます。javascriptやNode,js等もを含めてとにかく奥が深いです。
ActionScript 開発は無償でFlashDeveloperを使いブラウザベースのゲームまで作れます。自分もシューティングゲームを数日で作れました。ユーザーはAdobeFlashPlayerをインストールしたWebブラウザでゲームの実行が出来ますが、スマフォにはFlashPlayerが入れられません。ですのでAdobeAnimate CCWebGLや他のテクノロジーに移るでしょう。言語仕様はActionScript1.0はECMAScriptに似ていて同様のJavaScriptに似ていましたが、ActionScript2.0/3.0はJAVAに似ています。
JavaScript Javaと名称が似ているが、全く違うオブジェクト指向スクリプト言語で、非常に学習が容易。しかしながらJavaScriptの問題点として、型の認識が緩い、JavaScript固有の癖が強い、ブラウザによって見え方が違う、単体で全てを一から組むには時間がかかる、と言う事があり各種フレームワークやライブラリとともに使うのが一般的です。
jQuery.js パワフルなJavaScriptフレームワーク(ライブラリ)です。これが使える得ない環境ですと地獄を見ます。
Node.js Node.jsはどちらかというとサーバサイドのECMAscripts(JavaScript)の実行用フレームワーク(実行環境)。学習も非常に容易。クライアント環境もありますし強力な環境ですね。NodeにExpressやjQueryを入れて使う現場が多いです。PaypalやUber等でも使われています。
Electron.js HTML5+CSS+JavaScriptと言ったWeb系の言語でネイティブアプリを開発するフレームワークで、元々はAtom-Shellと言われていましたが、ATOMはもちろんSlackやVisualStudio CodeもElectronで開発されています。Node.jsを組み込むのでNode.jsの機能やnpmで色々なパッケージをインストールできます。
React.js Webサイト上のUIを構成する為のフレームワークです。ビューに特化したフレームワークです。ReactではJSXが使えて便利です。具体的にはJavaScriptとHTMLの同居ができますが、JSXはJavaScriptXMLなので、タグを必ず閉じなければなりません。例えば<br></br>とか<br />としなければなりませんReactは差分のみを描画するため描画スピードが速いですが、自分はそのせいではまったことがあります。
React Native+Expo React NativeはWebサイト上のUIを構成する為のフレームワークでiOS/androidのネイティブプログラムが書けます。今まではリリースへの敷居が高かったのですが、Expoのおかげで今までとは違う(kitolinやswift等)リリースの方法となり、ReactNative+Expoはweb系エンジニアがフロントエンドへ参入する良い機会になると思います。unityでも良いんですがクロスプラットフォームの選択肢としてweb系の方におすすめです。しかし、どんなにあがいてもNATIV(swift/kotlin)にはかなわないです。クロスプラットフォームでの開発効率で言ったらUnityC#が一番では無いでしょうか。ちなみに自分はUnityProにずっと入っています。収入制限が無いからです。18万を高いとみるか安いとみるかは人それぞれでしょう。
Angular Reactと比較されることが多いフレームワークですが、ビューに特化したReactやVueとは違いフルスタック(全部入り)のフレームワークです。実はjQueryliteも内蔵していますが、jQueryとも併用ができます。向き不向きがあるのがJavaScriptsのフレームワーク/ライブラリ群。なので何を使うかちゃんと選択してから仕事を始めます。
Vue.js JavaScriptのWebサイト上のUIを構成する為のビューに特化したJavaScriptフレームワークですがReactよりシンプルで、Vueは小規模開発に向いています。
altJS altJSとは、大規模アプリの制作には不向きの現状のjavascriptの欠点を極力無くして拡張するbabel等を用いたトランスコンパイル言語群で、ECMA20xx系、TypeScript、CoffeScript。Dart、Scala、Elm、kotlinまでもがjavascriptに変換できます。ReactNativeなら、ECMA20xxかTypeScriptでしょうか。
bash Shellといえばbash,DOS/WINプロンプト,PowerShellがあるが、bashスクリプト(拡張子.sh)は相当何でもできる。本格的に学ぶと本1冊は必要だが、grep等と簡単に連携できる、奥の深いスクリプト言語。
Python オブジェクト指向、命令型、手続き型、関数型などの形式でプログラムを書くことがでる。ディープラーニングなどの人工知能AIに最も使用されている言語で学習やコーディングが容易なので、AIの事だけを考えるだけで良い言語。CentOS7のyumコマンド等はpython2系で実装されており、CentOS7のLINKでPython2とされています。Python3系をインストールしてlinkを張ったらyumが使えなくなります(抜け道あり)おとなしくPython3のリンクを作りましょう。ちなみにCentOS8のデフォルトは3.6です。CentOS8のyumコマンドはdnfコマンドと同一です。
とにかく覚えやすい言語で関数はおろかクラスまで作れます。win/macだとanaconda環境での使用になるでしょうか。外部ライブラリがとても豊富なのでexcelデータからデータを参照して統計結果をファイルや画面に出すとかファイルに出力するとか、linux環境では簡単なツールを作ったりを本当に簡短に出来ますので重宝します。python2系とpython3系では使えるライブラリも変わることもありますので注意が必要です。
noSQL等のビッグデータの解析にももちろん向いています。
Pythonにはdivmod()が用意されていて割り算の商と余りを一度に求められます。x86アセンブラのdivみたいなものですね。
Ruby 日本で生まれた、オブジェクト指向スクリプト言語。学習が容易で、本当にあえて言うならばJava/swift/c#が似ている。
Ruby On Rails Rubyの全部入りのwebフレームワーク。Rails本体はRubyGemsとして公開されています。
PHP 誰もが非常に容易に学習できる、オブジェクト指向スクリプト言語。pdoでMySQL(MariaDB)にもアクセス可能。htmlファイルの中にもPHPは書けます。
CakePHP PHPのフレームワークで、PHPでの開発を容易にしてくれる。Ruby om Railsの影響を強く受けている。
phpMyAdmon PHPで実装されたMySQLの管理ツール。MySQL(MariaDB等も)のデータベースやテーブルの作成を行ったり、データの追加や参照などをSQL文を作成することなくブラウザから行うことができます。MySQL(MariaDB)のポートは3306、PostgreSQLのポートは5432でこのポートは開かないでpublicに開かない。localから何だろうけど、通常はMySQLWorkBench(SQLWorkBench/H)を使って、ユーザー権限でSSHログインして使う。SQLにクエリを出す。単純なSQL文なんて1日有れば覚えるし、実際に仕事でやれば一週間で覚えるし。MySQLのクエリのポケットリファレンスでも持ってればok。普通にteratermでユーザー権限でログインしてmysql -u [MySQLユーザ名] -pでSHOW DATABASES;とかのMySQL文打ち込めばok。
Go Go言語(正式名称はGo)は、モダンでGoコンパイラ自身をGoでかける、非常に強力な言語。C++が嫌いで作られたという逸話があり、言語仕様的には自分が思うにJavaScript/C#/Swiftに似ていて、学習が容易。しかしながらwhileが無い。forで書けと言う事。try-catchが無いのは設計思想の違いで、defer/panic/recoverで同じようなことができる。nil。関数が複数の戻り値をとれる、そして一番がゴルーチン。ゴ、で、コルーチンではありません。マルチスレッドです。Goと言えばDockerの90%以上がGoで作られているらしいです。
コラム DockerとはvmwareやvirtialBoxに似ていますが、AWSのEC2のECSでDockerコンテナを実行することが可能。ここ4-5年でDockerを使う仕事が多くなっていますが、virtualBoxやVMWareも健在です(それぞれ良いところがあります)。Dockerの強みは標準化団体があることで、Amazon,Google,Microsoft,VMWareも参加しています。AWSのサービスは多岐に渡るので軽く説明するとEC2がクラウドサーバ、S3がクラウドストレージ。Lambda(ラムダ)がサーバレス環境(と言うと語弊がありますので詳しくはFaaSで調べて下さい)、daynamoDBがnoSQLです。CentOS辺りだとnoSQLはlevelDB環境が多い感触。Nodeと親和性が良いのでそれも関係しているかもしれませんね。今や物理サーバを借りるリスクよりこういったクラウドで使用した分だけお金が取られるとかの方がリスクが少ないです。
openCV 画像解析ライブラリならこれ一択。初心者はopenCV for Unityを買ってopenCVでは何ができるのかとか触っていた方がいいです。もう10年ほど前にある会社のカメラに使いました。AR採寸プロジェクトの時もためらわずARkit+openCVがファーストチョイスでしたが、上司が全く違う業種のためopenCVの事を理解していただくことは不可能でしたが、部下に自分のライセンスのopenCV for Unityを使わせたところ、多少はまってはいましたが2-3週間で何とか輪郭抽出までできました。自分は全くコードを書いてませんでした。最悪一日あればなんとかなるとわかっていたので。それほど優秀です。まあその部下が優秀だったのもあると思います。専門学校で始めてプログラムを学び二十台半ばでc++の読み書きやx86のインテル表記を読むことができましたので。
photon/UNET/uMMORPG系 当時自分はUnityの新規ゲームのサーバ周りの研究を上司に指示されました。その頃のunity標準のネットワーク機能ですと4人まで、NATパンチスルー、peer2peerと言う縛りがあったので、上司が決めたのはphotonでした。多分Unity4系。photonは日本語ドキュメントもサーバもクライアントもソースコードが公開されてそろっていたので楽かなと思っていたのですが、どうしても日本語ドキュメントと挙動が違う。しょうが無いので英語ドキュメントを見てみたらドキュメント自体のバージョンが違いました。しかし今現在UNETもよく分からない状態ですし(今、UNETサーバ借りられるのかな?)、サーバをどこに置くかはさておき、MMORPGを一から実装するよりuMMORPG系でしょうね。UNETのラッパーライブラリーなのですがUnitPlus以上なら$40なので一からやるよりも速いと思います。他にも簡単なログイン、ロビー、ガチャ課金ならば、どこかのサーバのサービスでアセットがあったりしますので(Unityならばfor unityとか、UEならfor UnrealEngineとか)、検討は必要ですね。
NGUI/UGUI/EZGUI 自分が触ったことのあるUI系のアセットはこの3個です。EZGUIは置いておいて、ゲーム系の会社ではNGUIは殆どのプロジェクトで使われてましたね。今でも現役です。UGUIは癖が強いなぁって感じながら使ってます。
make まあ、原始的ながらまだまだ現役のプロジェクト管理ツールなのですがこれもある意味言語だったりします。当時、自分はあるゲームアプリのメンテナンスフェーズのプロジェクトに入っていました。(Unity+java/objectiv-c/ANSI-C)。時間が余っていたので上司に次は何をやればいいですかって聞いたら、makefileの書き方をまとめてくれと言われました。自分はmake自体をスクラッチで1から組んだことがあるので(アセンブラオンリーとC99オンリーの2回)、標準的な書き方の、暗黙のルールと明示的なルールとマクロの書き方と、簡単な書き方の2パターンを1日かけてドキュメント化しましたが、やっぱり簡単な書き方を使われていました。これは極端な例だとは思いますが、普通にオープンソースのmakefileを読めれば問題ないと思います。読んだり追加したり、一から書いたりしていればマクロのありがたさが分かります。
コラム コルーチンとマルチスレッドを比較すると、コルーチンは使いやすい、対してcとかのthreadはマルチコアの時代には確かにスループットが良くなりますが、スレッド間通信とか共有lockとかちゃんとマルチスレッドを理解しているPGでないと使いこなせません。デッドロックされたらジンバルロックの比じゃないです、まあ、適材適所といったところでしょうか。Win/macOSX/Linuxは基本的にRTOS(リアルタイムOS)ではありません。
コラム 仕事は営業が取ってきます。プログラム業界だと大体PM/SEクラスの技術営業が営業について行きます。ここは会社の方針なのでなんとも言えませんが、使うスタッフの給与の総支給額の2倍を見積もりに上げるのが普通です。自分も見積もり作らされましたがもうエクセルのシートで倍になるようになっていました。会社は営利団体ですから。初回だけディスカウントとかの判断は役員ですね。納期も少し幅を持たせます。特急の時にはPGスピードが速い人が呼ばれるので、単価は跳ね上がると発注先に言います。特殊スキルもです。受注会社としては規模が大きいところはそういう人を雇っていますが、ワンショットの仕事で特急とか特殊スキルを持っている人は月単価が高いので外部の人間をその期間だけ雇います。営業のサポートを技術営業がすると言うことです。営業の顔を潰さないため聞かれたことしか発注先とは話しません。会社に持ち帰ったら、営業、技術営業、お金を動かせる人が相談して見積もりを出します。何パターンも出したりもします。ここを削れば安く出来るとか。納期とか。そういう提案をします。なので営業は大変でとても重要です。発注先の会社データを帝国データバンクとか色々リサーチもしたりします。


あと、言語によってlinkやlinklistと呼ばれるので、注意が必要です。これは全くの別物です。あと、link(ショートカット)もありますよね。
まあ、アセンブラと古いBASICの説明はいらないでしょう。

以上です。

戻る