プログラミング言語の特徴を比較してみた

Go

goroutineはグリーンスレッド。


Is Go’s goroutine a green thread?
Answer (1 of 3): Yes. The Golang run time handles scheduling and resource allocation for the goroutines internally. The run time may allocate multiple system threads to run internal processes on, but at no time are any of the goroutines tied to a specific system thread. You can do a little exper…

チャンネルはメッセージパッシングだから並行/並列処理させても安全。


GoのChannelを使いこなせるようになるための手引 – Qiita
Go使いたくなる理由の一つに、マルチスレッドプログラミング的なものを高速な言語で安全に実装したいというのがある。Goにおいてそれを支えるのが、自前で実装した軽量スレッドといえるgoルーチンと、mutexなどのロックの代わりに使えるChannelという概念だ。 …

goのGCは多言語のGCと比べてシンプル。

Go言語のGCについて - LINE ENGINEERING
この記事はLINE Engineering Blog「夏休みの自由研究 -Summer Homework-」の6日目の記事です。 こんにちは、LINE Ads Platformの開発をしている岡田(@ocadaruma)です。 今回、個人的に以前から気になっていたGo言語のGCについて、この機会に調べましたので紹介いた...

Go言語のGCについて – LINE ENGINEERING
Haruki Okada この記事はLINE Engineering Blog「夏休みの自由研究 -Summer Homework-」の6日目の記事です。 こんにちは、LINE Ads Platformの開発をしている岡田(@ocadaruma)です。 今回、個人的に以前から気になっていたGo言語のGCについて、この機会に調べましたので紹介いたします。 Go言語はGoogleによって開発されたシステムプログラミング言語で、Channelを利用した並行性のサポートやGCを備えていることが特徴です。 Googleをはじめとして多くの企業が使用しており、LINE社内にもGoで開発しているツールやサービスが多数あります。 素朴な感覚で言えば、Go言語では低レイテンシなアプリケーションを容易に開発できるいっぽう、GCは他のランタイムと比較してシンプルに見えます。 たとえば、Go 1.10の時点で、Go言語のGCはConcurrent Mark & Sweep(以下CMS)コレクタであり、JVMなどで一般的なコンパクションや世代別GCは行いません。 It is a concurrent mark and sweep that uses a write barrier. It is non-generational and non-compacting.

Elixirの特徴

goと同様、メッセージパッシングなので並行・並列処理させやすい。

ruby likeな書き心地。


Elixir の特徴 – Qiita
elixir-lang.org のトップページを翻訳しました. 翻訳の誤りなどあればご指摘お待ちしております. Elixir is a dynamic, functional language designed for building scalable and maintainable applications. Elixir はスケールしやすくメンテナンスしやすいアプリケーションを作るための動的な関数型言語です. Elixir leverages the Erlang VM, known for running low-latency, distributed and fault-tolerant systems, while also being successfully used in web development and the embedded software domain.

メッセージパッシングについて

ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
ゆとり向けErlang入門.メッセージパッシングに関する資料.

ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
Published on ゆとり向けErlang入門.メッセージパッシングに関する資料. 1. ゆとり向けErlang入門 (1): メッセージパッシングことはじめ 2010-03-02 id:sleepy_yoshi (SUHARA YOSHIHIKO) 2. なんぞこれ? * ゆとり向けErlang入門 – 今回はメッセージパッシングの解説 * 対象読者 – 基本的なErlang が 可能であること – ゆとりという自覚があること – 5分間の学習時間に耐える覚悟があること STOP! 上記に当てはまらない方は ここで読むのをおやめください 1 3. 10秒で学ぶ メッセージパッシング 2 4. Erlangではたくさんの プロセスが に く 3 5. 各プロセスは 自分のポストを持つ 4 6. プロセス間の通信は メッセージで われる プロセス間のメッセージ = 手紙 5 8.

Rustの特徴

https://slideship.com/users/@statiolake/presentations/2019/04/MbPVekdPSTQ2hqGtiP5BK5/

Rust Book 勉強会 (第16章)
こわくない並行処理

型システム。

並列処理。

runtimeが薄い。

所有権によるメモリ管理。これが特に特徴。そのためGCがない。

コンセプトは「CPUリソースなどを100%使い切ること」。ここがgoと違う。

go同様に例外処理を採用しない。

所有権の解説についてはこちらがわかりやすい。

通常はmallocなどでメモリ確保するヒープ領域では、ユーザーがメモリ確保・廃棄を操作する。rubyやgoなどではGCで処理するが、rustはまた違う。


Rustのメモリ管理って面白い – Qiita
Rust という言語に初めて触れてみて、これのメモリ管理戦略って面白いなと思ったのでちょっと書いてみます。まだ真剣に見始めて実質1日くらいなので大いに勘違している可能性もありますが、自分の理解のためにもまとめてみます。 なお、言語の成り立ちとか特徴とかはググると色々出てくると思いますが、個人的に乱暴にまとめてしまうと …

  • traitとgenerics(型)の組み合わせでmoduleを組み込める。
https://slideship.com/users/@statiolake/presentations/2019/02/6m8jUbdJWNx8hLqvS2kiqM/

Rust Book 勉強会 (第10章 #2)
トレイト (Traits)

公式の解説はこちら。

traitとgenericsは多相性の実現だが、公式にも書いてある通り、やはりこれは継承と同義といえる。

ちなみに多相性はポリモーフィズムのこと。

https://doc.rust-jp.rs/book/second-edition/ch17-01-what-is-oo.html#a型システムおよびコード共有としての継承

The Rust Programming Language
言語がオブジェクト指向と考えられるのになければならない機能について、プログラミングコミュニティ内での総意はありません。 RustはOOPを含めた多くのプログラミングパラダイムに影響を受けています; 例えば、 第13章で関数型プログラミングに由来する機能を探究しました。議論はあるかもしれませんが、 OOP言語は特定の一般的な特徴を共有しています。具体的には、オブジェクトやカプセル化、 継承などです。それらの個々の特徴が意味するものとRustがサポートしているかを見ましょう。 エーリヒ・ガンマ(Enoch Gamma)、リチャード・ヘルム(Richard Helm)、ラルフ・ジョンソン(Ralph Johnson)、 ジョン・ブリシディース(John Vlissides)(アディソン・ワズリー・プロ)により、 1994年に書かれた デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素という本は、 俗に 4人のギャングの本( 訳注: the Gang of Four book; GoFとよく略される)と呼ばれ、オブジェクト指向デザインパターンのカタログです。 そこでは、OOPは以下のように定義されています: オブジェクト指向プログラムは、オブジェクトで構成される。オブジェクトは、 データとそのデータを処理するプロシージャを梱包している。このプロシージャは、 典型的に メソッドまたは オペレーション と呼ばれる。 この定義を使用すれば、Rustはオブジェクト指向です: 構造体とenumにはデータがありますし、 impl ブロックが構造体とenumにメソッドを提供します。メソッドのある構造体とenumは、 オブジェクトとは呼ばれないものの、GoFのオブジェクト定義によると、同じ機能を提供します。 OOPとよく紐づけられる別の側面は、カプセル化の思想です。これは、オブジェクトの実装詳細は、 そのオブジェクトを使用するコードにはアクセスできないことを意味します。故に、 オブジェクトと相互作用する唯一の手段は、その公開APIを通してです; オブジェクトを使用するコードは、 オブジェクトの内部に到達して、データや振る舞いを直接変更できるべきではありません。 このために、プログラマはオブジェクトの内部をオブジェクトを使用するコードを変更する必要なく、 変更しリファクタリングできます。 カプセル化を制御する方法は、第7章で議論しました: pubキーワードを使用して、 自分のコードのどのモジュールや型、関数、メソッドを公開するか決められ、 既定ではそれ以外のものは全て非公開になります。例えば、 i32値のベクタを含むフィールドのある AveragedCollectionという構造体を定義できます。 この構造体はさらに、ベクタの値の平均を含むフィールドを持てます。つまり、平均は誰かが必要とする度に、

こんな感じでかけるので、moduleみたいな感じにできる。(classの継承だと1つの親継承になるが、traitは複数使える)

impl PrimitiveNum for T {}

modでも同じようにfunctionを詰め込める。

基本は型に紐づくfunctionはtraitで、型がないfunctionはmodが良さげ?

where句によるtrait境界は表現力増えるけど、使い分けが難しそうかも?
https://qiita.com/quasardtm/items/09952838a6ee9582db1d


【Rust】ジェネリクスの取説 – Qiita
※Rustのバージョンは1.33.0 (stable)を使用しています。 Rustは所有権やライフタイム関連で詰まることが多い印象がありますが、私は同じくらい「型の指定方法」、特に「ジェネリクスでの型指定やトレイト境界指定」周りで詰まることが多いと感じています。 …

traitについてはこちらの解説が具体例多い。

https://slideship.com/users/@statiolake/presentations/2019/02/6m8jUbdJWNx8hLqvS2kiqM/

Rust Book 勉強会 (第10章 #2)
トレイト (Traits)
なぜDiscordはGoからRustへ移行するのか - MISONLN41's Blog
DiscordがGoで書かれていたコンポーネントをRustに移行しているらしい。Windowsの低レイヤ層の一部で採用されるなど、近年どんどん注目を集めているRustだが、DiscordはなぜRustを選んだのか。その最大の特徴である「パフォーマンスを妨げる要素であるGCを排した上でメモリセーフな言語」であることにクロ...


なぜDiscordはGoからRustへ移行するのか – MISONLN41’s Blog
DiscordがGoで書かれていたほとんど コンポーネントをRustに移行しているらしい。 Windowsの低レイヤ層の一部で採用されるなど、近年どんどん注目を集めているRustだが、DiscordはなぜRustを選んだのか。その最大の特徴である「パフォーマンスを妨げる要素である …

コメント