# 17. Languages ________________________________________ ## 1. Languages Overview ________________________________________ ### 1.1. 重要な違い Memory safety |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- 制御文スコープ |有り |有り |- |*1 |有り 変数名衝突時に警告 |有り |有り |- |- |- 継承周りが変 |- |- |有り |- |- 三項演算子が変。使用禁止 |- |- |有り |- |- 連想配列専用文法 |- |- |有り |- |- 配列形式でプロパティにアクセス|- |- |有り |有り |- thisの挙動が特殊 |- |- |- |有り |- イテレータとしてのfor |有り |有り |有り |*2 |- - *1 letの場合は認識 *2 for of 配列に関して - 配列はint添え字のみ許容、別途連想配列向けの型あり :C#, Ruby, python - 配列はint添え字のみ許容、連想配列はないがObjectに対して[]アクセスが可能:js - 配列と連想配列が混在可能:PHP ________________________________________ ### 1.2. Languages details Memory safety |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Memory safety *1 |y |y |y |y |- Garbage collection |y |y |y |y |- Type safety |y |y |y |y |- - Type strength(outline) |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Static type system |y |y |- |- |y Static checking for downcast |y |y |- |- |- Boolean only for condition |y |y |- |- |- Value safety for implicit cast|y |y |- |- |- Null safety for default |8.0 |- |- |- |- - Type strength(number type) |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Int keeping for division |y |y |- |- |y Int keeping for overflow |y |y |- |- |y Throw exception for overflow |y |y |- |- |- オーバーフロー時にfloat化 |- |- |y |- |- オーバーフロー時に無限or最大値|- |- |- |y |- Implicit numeric to string |- |- |y |y |- Implicit string to numeric |- |- |y |y |- - Statement style |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- if, switch, while, for, try |y |y |y |y |y switch fall through |- |y |y |y |y Checked exception |- |y |- |- |- semi colon |y |y |y |- |y Block scope |y |y |- |let |y Checking function signature |y |y |- |- |y Yield |y |- |y |y |- "use strict" |- |- |- |y |- - Oop style |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- foreach |a in b |a : b |b as a |a of b |- All in a namespace |y |y |- |- |- All in a class |y |y |- |- |- All is object |*2 |*2 |- |y |- All member is property |- |- |- |y |- Dynamic member adding |- |- |y |y |- Assoc key equals property |- |- |- |y |- Refrection or variable var |y |y |y |*3 |- - Boxing style |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Auto boxing & unboxing |y |y |- |- |- Primitive equals wapper class |y |- |- |- |- - Variable & literal style |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Variable declaration |int x |int x |$x |var x |int x 10 literal |1.23d |1.23d |1.23 |1.23 |1.23d exponent literal |1.2e3 |1.2e3 |1.2e3 |1.2e3 |1.2e3 16 literal |0xff |0xff |0xff |0xff |0xff 2 literal |- |0b10 |0b10 |0b10 |0b10 Char literal |'a' |'a' |- |- |'a' Simple string literal |"str" |"str" |'str' |'str' |"str" String Interpolation |$"{x}" |- |"{$x}" |`${x}` |- Here document |@"str" |- |<<v |k:v |- window, document, location |- |- |- |y |- - Function object |C#6 |Java |PHP7 |ES2015 |C++ ------------------------------|-------|-------|-------|-------|------- Function into variable |y |*4 |*5 |y |y Nameless function(lambda) |y |*4 |*6 |y |- Closure & capture |y |*4 |y |y |- this for nameless function |y |*4 |y |*7 |- - *1 Memory safety 1. Buffer overflow 2. Null pointer derefeference 3. Use after free 4. Use of uninitialized memory 5. Illegal free *2 Object interface via auto boxing. *3 Bracket property calling. *4 Nameless class *5 Variable function *6 function($x, $y) use(&$outerVar) { ... } *7 => is yes, other syntax is context. ________________________________________ ## 2. the Point of Language ________________________________________ ### 2.1. C# 要点 1. コンパイラはRoslyn推奨 - vs2015以降デフォルト - unity 2018.3よりデフォルト(.NET 4.x Equivalent以降で有効) 2. fwはfw4.5.2~ or Core2~推奨 - vs2015以降デフォルト - unity 2018.3よりデフォルト 3. ライブラリ開発はStandard2.0推奨。次点でfw。Coreはダメ C# versions - https://ufcpp.net/study/csharp/ap_ver2.html - https://ufcpp.net/study/csharp/ap_ver3.html - https://ufcpp.net/study/csharp/ap_ver4.html - https://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_01/aspnetmvc3_01_01.html - https://ufcpp.net/study/csharp/ap_ver5.html - https://ufcpp.net/study/csharp/ap_ver6.html - https://ufcpp.net/study/csharp/cheatsheet/ap_ver7/ - https://ufcpp.net/study/csharp/cheatsheet/ap_ver7_1/ - https://ufcpp.net/study/csharp/cheatsheet/ap_ver7_2/ - https://ufcpp.net/study/csharp/cheatsheet/ap_ver7_3/ - https://ufcpp.net/study/csharp/cheatsheet/ap_ver8/ - インターフェースのデフォルト実装 - クラスで再実装しないとinterfaceにアップキャストしたときのみ呼べる - クラスで再実装すると通常のoverrideと同じように挙動する - https://docs.unity3d.com/ja/2020.3/Manual/CSharpCompiler.html - https://ufcpp.net/study/csharp/cheatsheet/ap_ver9/ - https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-version-history ```text 特別な理由がない限り、非推奨な文法 - C#2.0:匿名メソッド - C#2.0:partial - C#6.0:using static - C#7.0:refローカル変数 - C#7.2:条件演算子ref - C#7.3:ref再代入 - C#9.0:関数ポインター - C#10.0:暗黙的なglobal using - C#11.0以降(Unity側のサポートが遅れそう) ``` UnityとC# https://docs.unity3d.com/ja/2021.3/Manual/CSharpCompiler.html Unity |C# ---------|----- ~2020 |8.0(fw4.6相当)。ただし一部機能は使えない 2021~2023|9.0(fw4.6相当)。ただし一部機能は使えない - #### Linq SQL like 1. Where, GroupBy, Select, SelectMany, OrderBy, OrderByDescending, ThenBy, ThenByDescending 2. Join 3. Union, UnionBy, Except, ExceptBy, Intersect, IntersectBy 4. Count, LongCount, Max, MaxBy, Min, MinBy, Sum, Average 5. Concat, Distinct, DistinctBy 6. All, Any ```text 和集合A.Union(B) :AまたはB 差集合A.Except(B):Aの内、Bに含まれていないもの 対称差      :Unionされた内容の内、共通部分以外の事 ※ SelectManyは、Selectされた各要素自体が配列の時にSelect結果全体を1つの配列にまとめる(1段階展開する)処理もするSelect ※ Linqでは2つ以上の列のOrderByがそのままではできないため、OrderByとThenByの2段階として対応している ※ ExistsがListで既に定義されていたので、拡張メソッド名はAnyが採用された ``` Contains, Compare 1. Contains, SequenceEqual Convert, Generate 1. AsEnumerable, Cast, ToArray, ToDictionary, ToHashSet, ToList, ToLookup 2. Reverse 3. Range, Repeat Pickup, Filtering 1. First, FirstOrDefault, Last, LastOrDefault 2. ElementAt, ElementAtOrDefault 3. Skip, SkipLast, SkipWhile, Take, TakeLast, TakeWhile 4. OfType Others 1. Aggregate 2. Chunk 3. Prepend, Append 4. GroupJoin 5. Empty, DefaultIfEmpty 6. Single, SingleOrDefault 7. TryGetNonEnumeratedCount 8. Zip #### .NET Standard2.0 - http client - fw1.1~ System.Net.HttpWebRequest - fw1.1~ System.Net.WebClient - fw4.5~ System.Net.Http.HttpClient - async model - fw1.1~ thread pool (System.Threading.ThreadPool) - fw2.0~ APM - fw2.0~ EAP (System.ComponentModel.BackgroundWorker) - fw4.0~ TAP (System.Threading.Tasks.Task) - fw4.5~ TAP async/await - System.Data - System.Data.Common.DbConnection - ADO.NET wrapper library - [deprecated] fw1.0 ~ ADO.NET DataSet - fw3.5 ~ System.Linq #### Alter .NET (.Net framework / External library / 3rd party) - .Net Framework - desktop form - fw1.0~ System.Windows.Forms - fw3.0~ WPF - fw4.6.2~ UWP - [deprecated] fw3.5sp~ ADO.NET Entity Framework ※4.1以降は外部化 - ASP.NET wrapper library (aspx = System.Web.UI) - [deprecated] fw1.0~ ASP.NET1.0 (Web form (aspx)) - [deprecated] fw2.0~ ASP.NET2.0 (Web form CodeFile (aspx)) - [deprecated] fw2.0sp~ ASP.NET2.0 (Web form CodeBehind (aspx)) - [deprecated] fw2.0~ ASP.NET Ajax Extensions (Web form 拡張ライブラリ。fw3.5から標準に同梱) - [deprecated] fw3.5sp1~ ASP.NET3.5 (ASP.NET MVC 1 (aspx)) - [deprecated] fw4.0~ ASP.NET4.0 (ASP.NET MVC 2 (aspx)) - [deprecated] fw4.0~ ASP.NET4.0 (ASP.NET MVC 3 (aspx/Razor)) - [deprecated] fw4.5~ ASP.NET4.5 - [deprecated] ASP.NET MVC 4 (aspx/Razor) - [deprecated] ASP.NET SignalR - fw4.x ASP.NET 4.x (ASP.NET MVC 5) - ※ 2015年以降は、.NET Coreが本流 - integrated api for inter-process comm. & network comm. - fw3.0~ WCF - testing - [deprecated] fw3.5~ MSTest base test template - external library - Entity Framework 4.1~6.x ※ EF6(2013.10)以降はOSS - async model - fw4.0~ Rx (System.Reactive) - 3rd party - orm - iBatisNet - Dapper #### .NET Core (.NET 2015~) ASP.NETに必要なライブラリを切り出してOSS化したもの - Core1.0~ Entity Framework Core - Core1.0~ xUnit base test template - Core1.0~ ASP.NET Core (razor template) - Core1.0~ ASP.NET SignalR Core - Core2.0~ ASP.NET Core Razor Pages - IoT - Core3.0~ System.Device.Gpio - Core3.0~ Iot.Device.Bindings #### コンストラクタの順 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/classes#static-constructors 1. 静的変数初期化子(上から順) - 別のクラスの初期化をしている場合はそのクラスの初期化へ 2. 静的コンストラクタ(全ての静的変数初期化子が完了後) 3. そのクラスの変数初期化子 4. 基本クラスの変数初期化子(その後も先祖をたどる) 5. 基本クラスのコンストラクタ 6. そのクラスのコンストラクタ ________________________________________ ### 2.2. Java 要点 Java5とC#2.0の違い https://ja.wikipedia.org/wiki/C_Sharp%E3%81%A8Java%E3%81%AE%E6%AF%94%E8%BC%83 - 組み込み型、プリミティブ型、ラッパーの扱いと挙動 - Java5:組み込み型=プリミティブ型=常に値型=ILで専用命令あり。ラッパーは別クラス - C#2.0:組み込み型≠プリミティブ型=常に値型=ILで専用命令あり。ラッパーはエイリアス - enumの挙動 - ジェネリックの挙動 - overrideのデフォルト挙動 - 無名クラスvs無名メソッド - 入れ子クラスのデフォルト挙動 - 名前空間の挙動 - Javaのみの機能 - 非static内部クラス - メソッド内のローカルクラス - interface内の入れ子クラス - チェック例外 - C#のみの機能 - struct - 多次元配列 - ref, out, 可変長引数 - delegate - 演算子オーバーロード - プロパティ、インデクサ - staticコンストラクタ - static class - unsafe - using(Java7でtry-resourcesとして実装) - プリプロセッサ Java versions - Java5 : C#2.0相当 - Java6 : 細かいライブラリ追加 - Java7 : ジェネリック右辺の省略記法、try-resources文、複数例外キャッチ etc. - Java8 : C#3.0相当+default method(trait/default interface method)。ラムダ式、Stream API(Linq)、Optional(null合体) - Java9 : private default method、Reactive Streams(Rx) - Java10 : https://openjdk.java.net/projects/jdk/10/ - Java11 : https://openjdk.java.net/projects/jdk/11/ Server side java 機能 |想定された役割 |補足 ---------------------|-----------------------------------|-------------------------------------------------------------------------------- Catalina & Servlet |Appサーバとフレームワークのコア部分|setAttributeで渡す値は、EJBでなくても良い JSP |テンプレートエンジン |PHPなどと同じように、理論上はこれ単品に直接リクエスト可能(JITされる) EL式 |JSP上の略記構文 |ー JavaBeans |プログラム作法 |pojo。それをドメインモデルとしたいかDBレコードとしたいかVMとしたいかは規定がない stateless session EJB|ゴミ |staticクラスがないのが悪い statefull session EJB|ゴミ |サーバークラッシュ時にロストする。つまり、キャッシュ以上の役割を持たせてはならない singleton EJB|ゴミ |サーバークラッシュ時にロストする。つまり、キャッシュ以上の役割を持たせてはならない entity EJB |ゴミ |JPAに置き換えられました ________________________________________ ### 2.3. PHPの継承の要点 全体像 ```text 1. 静的メンバも、派生とoverrideが考慮される 2. self::, parent::, static::は、インスタンスメソッドを呼び出せる *1 *1 関数は静的な情報だかららしい。Lowレベルな設計思想 なおインスタンスフィールドやインスタンスプロパティは不可能 ``` わかりやすい部分 ```text 1. $this->は、静的メンバを呼ぶことができる以外は、C#やJavaのthisと同じ 2. parent::は、静的メンバでも考慮されること以外は、C#やJavaのbase/superと同じ 3. parent::は、静的メンバの解決もするため、静的メンバからも呼び出せる ``` this->, self::, static::とコンテキスト解決 ```text 1. this->は、もっとも一般的なコンテキスト解決 2. static::は、直前のコンテキスト(=呼び出し元)を基準にする 3. self::は、これを利用したメンバのクラスからメンバを探す。(overideを無視する) ``` ________________________________________ ### 2.4. DartとC# 型システム概要 - Sound(健全な、と訳す) type system。C#やJava程度に強めの静的な型付け言語 - 殆どの型は静的に決まり、型の制約に違反する可能性がある暗黙のcastを許可しない - 静的に決めない変数は、明示的なキーワードが必要(dynamicなど) - var推論がある - dynamicがある - ジェネリックはC#と同じ静的チェック - 文字列比較はC#と同じ文字列値が同じなら==でtrue 基本型および文法に関わる型など一覧 - int(64bitなのでlong相当), double, String(UTF16), bool, List, Set, Map, Runes, Symbol, null - Object - Future, Stream(awaitable) - Iterable(for item in list) - Never(例外) - dynamic - void - null C#と異なる部分 - 型 - キーワードがあるわけではなく、クラスがあるのみ - int, doubleクラスがある - objectやstringはなく、Object, Stringクラスがある - 固定長配列の概念はなく、Listである - nullableとnullの扱い - nullableではない場合、どの型もnullを代入できない。元の型にするには??などが必要 - 未初期化var - dynamicに推論されてしまう - メソッド宣言 - オーバーロードがない。デフォルト引数はある - メソッドの記法(従来、弓矢)によってoverride時に出来ることが異なる - 従来(コンシューマ)メソッドは、引数はスーパータイプに変更できる - 弓矢(プロデューサ)メソッドは、戻り値をサブタイプに変更できる - asyncキーワードの位置が引数群の後 - ジェネリックは、共変性・反変性より緩い - 例えばサブタイプlistを直接代入できる - 変数修飾子など - readonlyの代わりにfinalキーワードがある - constキーワードでListを用意することが可能。全要素が固定される - アクセス修飾子はない。代わりに識別子を_で始めると、privateになる Flutterインストールメモ 1. Flutter SDK - Flutter SDKをダウンロード・解凍し、flutterフォルダをC:\Users\[ユーザ]辺りに配置 - 上記パス\binのパスを通す - flutter --version - flutter SDKフォルダはgit管理されてるので、gitで移動すればバージョンを変更可能 2. Android Studioをダウンロード・setupしインストール 3. Android StudioのTerminalをPowerShellに変更 - File > Settings > Tools > Terminal - C:\Windows\System32\WindowsPowerShell\v1.0 4. Android Studio Pluginのインストール - File > Settings > Plugin または 初期画面のPluginで、Dart(JetBrains)、Flutter(flutter.dev)をインストール 5. fvm使用する場合:chocolatey※とfvmのインストール - fvm補足 - fvmは常に管理者権限で操作が必要(Android Studioのターミナルから変更が行えない) - fvmは、1で用意したFlutter SDKフォルダのバッチを転用するため、パスが通っている必要がある - 管理者権限Powershell - choco install dart-sdk - 管理者権限Powershell再起動 - dart pub global activate fvm - Pathを通す:%USERPROFILE%\AppData\Local\Pub\Cache\bin - 管理者権限Powershell再起動 - fvm install 2.8.1 - fvm list 6. fvm flutter doctor - Android toolchainに問題がある場合、Android Studioを起動して以下 - File > Settings > Appearance & Behavior > System Settings > Android SDK > SDK Toolsタブ > Android SDK Command-line Tools(latest) - ! Some Android licenses not accepted.(あんたAndroidのライセンス読んでないでしょ?)と言われた場合、以下を実行 - fvm flutter doctor --android-licenses 7. 以降はAndroidプロジェクトフォルダ作った後の操作 - プロジェクトフォルダ直下に移動(管理者権限で行う必要あるため、Android StudioのTerminalではなく、PowerShellを起動して行う必要あり) - fvm use x.x.x ※ chocolateyのインストール(管理者権限Powershell) ```powershell Set-ExecutionPolicy Bypass -Scope Process -Force; ` [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; ` iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) ```