nFact

n!

ScalaMatsuri 2019に参加してきました

f:id:noko_k:20190628095247j:plain 6/27(木)~29(土)の3日間、日本最大級のScalaカンファレンス Scala Matsuri 2019が開催されました。
私は28,29日のカンファレンスDAY/アンカンファレンスDAYに参加してきましたので、その感想などの記事です。

参加したセッション

  • Scala 3って、私にはどんな影響があるの?
  • 決済サービスで Akka Cluster 使ってみた
  • コードから理解するPlayframeworkの脆弱性
  • Scala Driven Management
  • プロジェクトで引き回す型をEffにするメリット
  • こんなに違う!<-ScalaとKotlin->
  • Scala における関数型並行処理入門
  • ピュアなドメインを支える技術
  • 実践 Clean Architecture
  • ハウツー・テストproper{t,l}y
  • Phil Bagwell Award Kenji's Pull Request tutorial
  • AWS EKSとAkkaを使ってEvent Sourcingを作るにはどうしたらよいか

感想

6/28 カンファレンスDAY

カンファレンスDAYは一応業務扱いでの参加だったので、ちゃんと起きました(適当)

Scala 3って、私にはどんな影響があるの?

このセッションは同時通訳レシーバーをもらい忘れてしまったので、
内容は半分入ったかどうか、という感じでした(すみません)。

Scala 3(Dotty)の新機能紹介とマイグレーションについて。
発表があった新機能は、どれも便利そうに感じました。
個人的にはUnion Typeとかが便利そうだなーと思います。 また、implicit周りについてはいくつかのキーワード等の追加でシンプルになるみたいです。 マイグレーションについては、今までSBT側で頑張ってクロスビルドをしていますが、
これからは新しい中間表現であるTASTyが導入され、Scala 2.x系と3系のクロスビルドはTASTyのレイヤーで頑張るみたいです。

プロジェクトで引き回す型をEffにするメリット

FutureFuture[Try[E]]Future[Either[L, R]] それぞれプロジェクト内で引き回す型にする際はメリデメあるけれども Eff[R, A] は(少し難しい代わりに)それらのデメリットをだいたい解決出来て良いよ、という話で、わかりやすく説明して頂けたので内容が割とスッと入ってきました。

Scalaにおける関数型並行処理入門

slides.com

並行処理とはそもそもどういうものか?の説明と、コンテキストスイッチのオーバーヘッドについて説明しつつ、
Monix Taskなどの話に発展していくセッションでした。
私には難しいセッションでしたが、今後調べるキーワードとしていくつか持ち帰ることが出来たので、良かったなと思います。

6/29 アンカンファレンスDAY

(6/28にちゃんと起きたということで?)6/29はしっかりと寝坊をしてしまったので、午後遅めの時間からの参加となりました。 お昼の時間とか、休憩的な時間の取り方が微妙な感じになってしまい、時間の使い方がもったいない感じになってしまいました(3つしか出れなかった)ので、次はちゃんと起きたいという気持ち。

その他の感想

ノベルティ

今回は暑かったので扇子やうちわなど仰ぐ系のものがあって良かったです。

ビズリーチさんの型安全扇子 f:id:noko_k:20190628105502j:plain

null消しゴムとかが前にありましたが、今年もユニークですねぇ~

WiFi

CyberAgentさんからフリーWiFiが提供されていました。快適そのもので、とても素晴らしかった!と思います。
DataDogのダッシュボードを公開していたのも面白かったですね。

LT?をやっていたみたいで、聞きたかった。。

同時通訳

ScalaMatsuriには同時通訳がありました。
Scalaのテクニカルかつディープな話でも日本語で聞けるので、理解しやすかったと思います。

おわりに

今回のScala Matsuriも、楽しく情報をインプット出来たなと感じています。
私自身、業務でも趣味でもしばらくScalaを書かなくなってしまったので、今回のScala Matsuriはとても良い刺激になりました。
ありがとうございました。!

自作JVM言語Karaffeについて

nokoです。2014年ぐらいから趣味でKaraffe(カラフェと読みます)という自作のJVM言語を開発しています。

この記事は、Karaffeの開発のきっかけみたいなところを書きます。 細かい実装についてはほとんど触れないのでまた別の機会に。

Karaffeとは

Karaffeは、オブジェクト指向(クラスベース)の静的型付けなプログラミング言語です。
Javaバイトコード(classファイル)を生成するので、Java VMで実行することができます。

実行用のコマンドを持っていないので、生成されたclassファイルをそのままjavaコマンドで実行します。 現在コード生成部に手を入れていて、CIも落ちてる状態なので、少し前のバージョンを使わないとHello Worldすら出来ないと思います。

Karaffe開発のきっかけ

(おそらく)全てはぱらつり氏のこのツイートから始まりました。

このツイートと、その場の雰囲気のノリと勢いでPaLTreeというOrganizationが作られました。 色んな人がいてワイワイと開発やら議論をしていました。(確認したらメンバーは9人も居ました。意外と多かった。。)

Karaffeの前身 = notepad-java

PaLTreeでは「メモ帳言語(notepad-lang)」という枠で様々な実装が出てきました。その中で、notepad-langをJavaで実装したのが私でした。(Javaの他にC#Rubyによる実装がありました)

メモ帳でも書けると言っても普段の環境と違いすぎてあんまりピンと来ないかもしれませんが、現代のプログラミングでは当たり前となっている機能がありません。 例えば、シンタックスハイライトや補完はもちろん、オートインデントも無いのでインデントをしようものならTabやSpaceを連打する必要があります。 なので、インデントやハイライトが無くとも読みやすく、補完なしで全部手打ちしても記述が可能である必要がありました。

その結果生まれたのが、インタプリタにより実行するシンプルな(?)手続き型言語でした。 メモ帳で記述することを前提に考えられていたのと、コンパイラインタプリタも開発したことが無い中での設計だったので、とても奇抜な仕様が爆誕したのは言うまでもありません。

他のメモ帳言語にも無い一番ユニークだった仕様は「{}や()を使っても入れ子になるとメモ帳だと読みにくいので、改行2つでブロックを構成する仕様」だったと思います。

このあたりを記した当時のドキュメントは、現在のnokok/Karaffeには入っていません。 動的言語/静的言語、静的型付け/静的型付け、インタプリタやら何やらを混同したような記述が多数あり、かつ実装もほぼ無く恥ずかしいのでここには載せません。

notepad-langから派生したり、触発されて開発されたプログラミング言語の中で、現在まで開発が続いているのはKaraffeのみです。 他にはLuryというプログラミング言語がありますが、現在開発が休止しているようです。

Karaffeの誕生

手続き型 -> 関数型言語っぽいものにするか? -> やっぱオブジェクト指向だな、という迷走試行錯誤を経て今の形になりました。 この試行錯誤の過程で、notepad-javaは早々にKaraffeという名前になりました。
Karaffeになった頃にはメモ帳の要素は薄まり、だんだん自分が作りたい言語に寄ってくるようになりました。

Karaffeロゴ
Karaffeロゴ
このKaraffeのロゴは、コーヒーがカラフェに貯まって揺らいでいる様子を表現しています。(本来カラフェにコーヒーは入れないような気もするのですが気にしないようにします)

Karaffeが目指しているもの

Karaffeは、Javaにはまだ存在しない現代的な文法や仕様を取り入れながら、よりシームレスなJavaとの相互運用性を実現することを第一に目指しています。

既存のJVM言語は(主語がでかい)、「JVM言語からJavaを使うこと」は考えていても、「JavaからそのJVM言語を使うこと」はあまり前提とされていない感じがしています。 真の 相互 運用性を考えたときに、「対象のライブラリがJava製なのか他のJVM言語製なのか」を考えなくても良いというのが理想像ではないかと考えています。 Karaffeが吐き出すクラスファイルやjarファイルが、(たとえKaraffeにしか無い言語仕様を使ったとしても)Karaffe製であることが言われないと分からないレベルにまで、様々な要素をJavaに寄せられたら良いなぁと思っています。

そもそもKaraffeのような個人開発の言語は、普及して一般の人にまで使ってもらえることは通常考えにくいと思っています。既存の言語を置き換える意図もありません。なので、あくまで自分だけが使う(普段使っている)Javaと組み合わせることを前提とした高度な相互運用性を持つ言語にしたいと思ったのもあります。

Karaffeはだいぶ後発の言語なので、Javaのモジュールシステムにネイティブで対応したいなぁとか色々ありますが、まずは相互運用性が第一で、他は二の次、三の次です。とりあえずはシンプルなオブジェクト指向言語にできればと思っています。

Karaffeの今

今のKaraffeは多分5回目ぐらいの書き直しをしたバージョンです。 「ぐらい」と言ったのは、それだけ何回も失敗して書き直しているために覚えてないからです。 今のバージョンになったのは2018年11月です。半年弱ですね(今回は歴史ごと飛ばして書き直しましたのでfirst commitです) first commit · nokok/Karaffe@0d62de1 · GitHub

夢はでかいのですが、コンパイラを開発できるレベルの知識もなければ実装力も全然ついてきてないので、書き直した実装の中でまともに動作するものを作り出せた試しがありません。 まだまだ絵に描いた餅状態なので、どうにかしていきたい感じですね。

初期のバージョンはJavaCCとか色々使ってましたが、今はレキサ/パーサーにANTLRv4を使用しています。
この記事はこのぐらいにしておきつつ、今後はKaraffeのことをもっと書いていきたいと思います。