最近、HabréにScalaコミュニティの現状について誤った考えを与える記事が掲載されました。 読者はScalaエコシステムの停滞と衰退の誤った印象を持っています。 この記事では、これを修正し、最近リリースされた新製品と将来の変更についてお話します。
2016年5月、ニューヨークで開催されたScala Daysカンファレンスで、Martin OderskyはScala言語の現在と未来を説明するプレゼンテーションを行いました。
Scala 2.12
2016年11月、Scalaコンパイラバージョン2.12の新しいバージョンがリリースされました。このバージョンでは、デフォルトのメソッドを使用して特性がJavaインターフェースに直接コンパイルされます。 また、JRE 8でのScalaコードのパフォーマンス向上にも貢献しました。
Scala 2.13
scalacコンパイラの新しいリリースは、標準ライブラリをリファクタリングする予定です。 コレクションには特に注意が払われ、標準ライブラリはおそらくコンパクトカーネルと、カーネルに分類されないすべてのものを含むプラットフォームに分割されます。 まるでスカラクの発達が停滞しているようです。 おそらく、パルプ自体が新しいScalaコンパイラ用に開発されており、Dottyが基になっている依存型の理論に敬意を表してバプテスマを受けているため、おそらくこれは部分的に正しいでしょう。
スカラドッティ
新しいコンパイラの開発は、Martin Oderskyが率いるEPFLチームによって数年間継続されています。 彼に加えて、Khabrovchan Dmitry Petrashko別名darkdimiusを含む別の5人がチームのコアに含まれています。 言語の新しいバージョンの主なものは、ScalaのニーズのためにMartin Oderskyによって開発されたDependent Object Types Calculusです。
その本質がこのビデオで説明されている新しいコンパイラー構造により、コンパイル速度はすでにscalacの2倍です。 そして、これは、開発者がコンパイラーの最適化さえ開始していないという事実を考慮しています。 そのため、Scalaブレーキのコンパイルの不便さに関して現時点ですでに古くなっているすべての神話は完全に暴かれます。
Dottyでは、型システムが更新され、言語の未使用の機能が削除されます。 多くのことが大幅に簡素化されます。 しかし、これらはすべて抽象的な言葉です。 簡単な例に移りましょう。
まず、不要なものとして削除されたものを見てみましょう。
- 手続き構文
- DelayedInitを持つクラス
- 反射ベースのマクロ
- 早期特性の初期化
- 存在タイプ
- ジェネリック型の射影
- XML埋め込みコード
代わりに、合計で新しい機能と改善された機能が追加されました。
- 現在、変数タイプではなく、交差タイプが追加されています
val a : A & B
- さて、どちらかの問題ではなく、ユニオン型があります。 変数には、タイプAまたはタイプBのいずれかを格納できます。これにより、ボイラープレートの束がなくなります。
val a : A | B
- ラムダ式のタプルが最終的に修正されました。
// val numbersAndLetters = List((1,"A"), (2,"B")) numbersAndLetters.map { case (number, letter) => ... } // numbersAndLetters.map((number, letter) => ...)
- 特性では、パラメーターを宣言できます
trait WithParameter(name:String) { ... }
- 等価演算子==および不等式!=タイプセーフになりました
- 型パラメーターに名前を割り当てることができるようになりました。 部分的なパラメーター化が可能になりました。
trait Map[type Key, type Value] Map[Key = Int]
現在の形式では、 このテストプロジェクトで dotcコンパイラをテストできます。 将来的には、言語に新しい機能を追加することが約束されています。
- 暗黙的な機能タイプ
type CtxS = implicit Context => S def f(x:T):CtxS = { ... implicitly[Context] ... } f(e) //Context argument is passed implicitly
- 通常の機能に加えて、純度を保証する効果が現れます
A => B (can be impure) A -> B (pure)
- 通常のタイプはデフォルトでnullにできません。 Javaコードの値は常にオプションです。
T? = T | Null val stream: PrintStream? = System.out.printStream
- マジックナンバー22はScala開発者を怖がらせません。 Tuple22 / Function22 / Product22は歴史になります
type (S, T, U) = (S, (T, (U, Unit)))
- 新しいレコードのデータ型。 名前付きのtyuplaのようなもの。 サンプルコードはありません。 これは、提示された最も神秘的な概念です。
また、DastyはTastyシステムを設計しました。Tastyシステムは、Scala 2で問題があったコンパイラの各バージョンのライブラリを再コンパイルできないようにします。
Dottyリンカー
Dottyクラウンのクラウンは、Dmitry Petrashkoが開発したリンカーです。 これは、実際に使用されるタイプ専用のコードをコンパイルできるオプティマイザーです。 これにより、コードの量を大幅に削減し、生産性を向上させることができます。 リンカの助けを借りて、接続されたライブラリのパフォーマンスも大幅に改善されます。 このビデオで、 この奇跡のオプティマイザーについて詳しく知ることができます。
Scalaメタ
古いマクロの代わりに、便利な新しいScala MetaマクロがEugene Burmakoによって開発されています。 これまでのところ、Scala 2.11とアノテーションのみでリリースされており、メソッドはリリースされていません。 しかし、以前のバージョンよりもはるかに便利であることがわかったと言えます。 現在、マクロ宣言とその実装は分離されておらず、構文ツリーでの作業は単純に素晴らしいです。 Scala.metaはソースツリーでも動作しますが、古いscala.reflectに基づいたマクロのような既に少し変換されたものでは動作しません。
これらの詳細については、このチュートリアルをご覧ください 。
Scala js
Scala.jsは、 Scalaコードを高性能Javascriptコードにコンパイルします。 ScalatagsおよびScalaCSSとともに、本格的なWebフロントエンド開発が可能です。 大きな利点は、クライアントとサーバー間でエンティティを共有し、明示的なHTTP API定義の代わりにリモートプロシージャコールを使用できることです。 過去数年間で、 Udashのような反応性バインダーを使用して、実稼働の生産フレームワークでよくデバッグされ、使用されてきました 。 多くの開発者がScala.jsを使用するのは、動的で「奇妙な」JSに悩まされたくないからです。 公式ドキュメントで使用されている例を挙げます。
javascript> ["10", "10", "10", "10"].map(parseInt) [10, NaN, 2, 3] // What??? scala> List("10", "10", "10", "10").map(parseInt) List(10, 10, 10, 10) // That's it
Scalaネイティブ
LLVMに基づくネイティブバイナリコンパイラであるScala Nativeが最近リリースされました。 これにより、Scalaで即座に実行されるコードを記述し、低レベルのデータ構造を使用できます。
マクロイドとロボスカラ
ScalaはJavaコードにコンパイルされるため、この言語をAndroidの開発に使用することができます。 これを行うために、使いやすいAndroid APIを提供する特別なMacroid ライブラリがあります。 RoboScalaを使用してiOSでScalaコードをコンパイルすることも可能です-RoboVMのラッパー
Scalafx
デスクトップソフトウェアを開発するために、有名なJavaFXのラッパーであるScalaFXライブラリがあります。
おわりに
この記事は非常に厄介であることが判明しましたが、さまざまなプラットフォーム用のさまざまなScalaコンパイルツールへのリンクの良いリストとして、また将来の開発と機能に関する情報源として役立ちます。 この記事で紹介するすべてのツールとコンパイラは、積極的に開発、改善、使用されています。 そのため、Scalaエコシステムの停滞や低下について話す必要はありません。