投稿

7月, 2020の投稿を表示しています

Kotlinの"きほん"の"き"

KotlinはJetBrains社が開発した汎用プログラミング言語です. 基本的にはJVMで動く言語ですが,JavaScriptへのトランスパイルやネイティブコンパイルもサポートしています. Javaとの違い KotlinはJVM上で動くためJavaと比較します. まず,第一に違うことはnull安全性です.Kotlinはnull許容型があり,nullを入れれる型と入れれない型を明確に区別しています.最近の言語の流行りですね,すごく使いやすいです.null非許容の型にnullを入れるとコンパイルエラーになりますし,null許容型をnullチェック無しで使うとコンパイルエラーになります.安心です. 次のKotlinの違いは演算子のオーバーロードです.Javaでは演算子のオーバーロードは提供されていませんが,Kotlinでは提供されています.そして,面白いことにJavaのメソッドも条件を満たせばKotlinから演算子として使えます.例えば equals メソッドとかは == 演算子として使えます.ちなみにJavaの == はKotlinでは === です. Javaにもあるような機能なので微妙ですが,古いJavaをお使いの方であればKotlinの型推論は便利だと思います(ダイヤモンド演算子じゃないです).Kotlinは変数宣言の際 val と var を使い変数を宣言します.基本的には val を一番良く使います.そして,この2つは型を明示的に指定しない場合は自動的に型推論をしてくれます.便利です. まだまだ,いろいろ違いはありますが,長くなりそうなのでここで一旦切ります. 環境 Kotlinの環境は同じくJetBrains社が開発しているIntelliJ IDEAが最強に相性が良いです. AndroidはAndroid StudioがIntelliJ IDEAをベースにしているのでAndroid Studioでも同等の機能が使えます. 関数 Javaは全てのメソッドが何らかのクラスに属している必要がありました.しかし,Kotlinはその制約がありません.そしてmain関数もクラス内ではなく外に書きます. とりあえず,Hello, Worldから始めます. fun main ( ) { println ( "Hell

[C++] 並行・並列処理に関連する標準ライブラリまとめ

C++は並行・並列処理を行うにあたってスレッドの管理や排他制御などの機能が標準ライブラリとして提供されています。 本記事ではそれらのライブラリをまとめて紹介します。並行・並列処理による未定義動作で1日無駄につぶす人が減るように願っています。 並行・並列処理とは まず、並行処理と並列処理の違いについて軽く説明します。 並行処理は複数の処理が同時に実行可能であることで、実際に同時に実行されているかは関係ありません。例えばスレッドを2つ立ち上げるプログラムがあった場合は並行処理となります。というか最低でも並行処理といえます。 では、並列処理はどういうことかというと、実際に同時に動きます。最近のCPUであれば2コア以上実行コアが存在すると思いますが、並列処理はこのコアを同時に使い複数のスレッドやプロセスが同時に動作することを言います。 つまり、並列処理は確実に並行処理ですが、並行処理は並列処理といえません。 並列処理になるかどうかは環境(CPUやOS)などに依存するため、本記事では並行処理に関して考えます。 並行処理と未定義 並行処理でよくある未定義動作はデータ競合(data race)です。データ競合は次のような条件を満たすをおきます(単純のためいろいろ端折ってあります)。 複数のスレッドが同時にアクセス 最低でも一つが書き込み 最低でも一つはアトミック操作でない アトミック操作は不可分な操作で変数へのアクセスを分割しないで行います。CPUによっては専用の命令が存在します。 この条件はかなり満たしやすいです。ちょっとでも気を抜くと未定義の世界に足を踏み入れてしまうので、気を付けてください 競合状態(race condition) データ競合と似た概念に競合状態というものがあります。データ競合と競合状態はレイヤーの違う話ですが、同じような文脈で語られることが多いので混同しやすいようです。 競合状態は操作が不可分であるものが実際には分割されてしまうときに起きます。 例えば、金銭の授受を行うアプリケーションを考えます。下のコードが例ですが、このプログラムはifで支払い能力があることを確認して授受を行います。この支払能力の確認と渡す側(from) から値を引くことは分割するとまずいことになります。 なので、いくらfromやto, amountがデータ競合を起こさないようにしてあっ