Scalaの素晴らしい現在と明るい未来

画像






最近、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では、型システムが更新され、言語の未使用の機能が削除されます。 多くのことが大幅に簡素化されます。 しかし、これらはすべて抽象的な言葉です。 簡単な例に移りましょう。



まず、不要なものとして削除されたものを見てみましょう。





代わりに、合計で新しい機能と改善された機能が追加されました。





現在の形式では、 このテストプロジェクトで dotcコンパイラをテストできます。 将来的には、言語に新しい機能を追加することが約束されています。





また、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エコシステムの停滞や低下について話す必要はありません。



All Articles