1 of 44

Pythonと相互運用可能な�静的型付けプログラミング言語Erg

1

芝山駿介

PyCon JP 2024

Day 2

2 of 44

スライドは以下からダウンロードできます

2

English

日本語

The slides can be downloaded below:

3 of 44

目次

3

  • はじめに
  • Pythonの利点・弱点
  • 新言語Erg
  • 型チェッカーPylyzer
  • 今後の開発計画

4 of 44

自己紹介

4

名前: 芝山駿介 Shunsuke Shibayama

所属: 早稲田大学先進理工学研究科M1

専攻: 理論物理学

趣味: プログラミング

GitHub: mtshiba

Twitter(X): @s_sbym

5 of 44

自己紹介

5

  • 2023年度未踏IT人材発掘・育成事業

スーパークリエータ認定*

  • Language Server Protocol (LSP)

についてのWeb書籍を公開中

6 of 44

Pythonの隆盛

6

Pythonは2024年現在最もホットな言語

7 of 44

Pythonの利点

7

豊富なライブラリ

“Battery Included”

標準ライブラリだけでも一通りのことができるうえ、

どんな目的にも合うライブラリがあるといっても過言ではない

8 of 44

Pythonの利点

8

高い連携性

C APIやCythonなどを使ってC/C++でハイパフォーマンスな

ライブラリを書くこともできる

NumPyなど多くの数値計算ライブラリはC APIを用いており

高速な計算が簡単に行える

9 of 44

But…

9

10 of 44

Pythonの3つの弱点

10

動的型付け

歪な仕様

環境構築難度

11 of 44

Pythonの弱点

11

動的型付け

動的言語自体の是非はここでは述べないが、

静的型付け言語に比べ以下の部分で不利であることは概ね事実:

  • 静的解析によるバグの早期発見能力
  • Language Serverが提供できる言語サービス

12 of 44

12

歪な仕様

Pythonは初心者にもわかりやすい

平易な文法と謳われているが、

それは極めて表面的な部分だけである

→ Pythonの設計は場当たり的

オブジェクトの参照や変数のスコープ

に非直感的な部分[1]があり、

バグの温床となっている

Pythonの弱点

13 of 44

13

歪な仕様

Pythonの型設計は不健全である

(e.g., Liskovの置換原則に

違反している)

また最近のPythonは型指定(もどき)

ができるようになったが、

後付けゆえの見苦しさがある

Pythonの弱点

14 of 44

14

開発環境の構築が難しい

Pythonは公式の提供する開発ツールが比較的貧弱であったため、

サードパーティの開発ツールが乱立している

仮想環境: venv, pyenv, pyenv-virtualenv, pipenv, Anaconda

フォーマッタ: black, autopep8, yapf, autoflake

パッケージマネージャ: pip, poetry, pipenv, Anaconda

Linter: flake8, pylint, Prospector, ruff

→ 有名所だけでも320パターン以上の中から選定する必要がある

他人のコードを動かす場合…

Pythonの弱点

15 of 44

では、解決策はあるか?

15

16 of 44

Pythonの弱点を克服した新言語を作る

16

17 of 44

ErgProgramming Language

17

18 of 44

新言語のコンセプト

18

PythonのAPIを直接呼び出せる

Pythonの資産が流用できれば

新言語を導入しやすくなる

このような既存言語の資産を流用できる

言語はScalaやTypeScriptなどがある

19 of 44

新言語のコンセプト

19

高度な静的型システム

静的型付けは実行効率のみのためにあらず

型システムはコードの堅牢性を高めてくれる

新言語は依存型と呼ばれる高度な型を持つ

例えば配列の境界チェックなどを

コンパイル時にも検査できる

20 of 44

新言語のコンセプト

20

型推論機能を持つ

変数や関数の型を指定せずとも

コンパイラが自動で推論してくれる

動的型付けのようなシンプルな記述で

ありながら検査はしっかりと静的に

行われている

21 of 44

新言語のコンセプト

21

開発ツールの統合

フォーマッタ、Linter、

パッケージマネージャなどを

すべてコマンドひとつに統合

このようなアプローチは

Go言語などが採用

環境構築が容易になり、

高い再現性も保証される

22 of 44

開発ツール

22

Language Server

RustのLanguage Serverである

rust-analyzerを参考に

エラーのハイライト、補完、rename

など基本的機能はもちろん、

文脈を考慮した補完など高度な機能も

実装

23 of 44

開発ツール

23

パッケージマネージャ

Erg自身を用いて実装

現在実装されている機能の例:

  • init: パッケージを初期化(設定ファイルの生成等)
  • build: 依存関係を解決・パッケージをビルド
  • install: アプリケーションパッケージを擬似実行ファイル

にしてbinディレクトリに配置

  • publish: 後述するレジストリにパッケージを登録する

24 of 44

開発ツール

24

レジストリサイト

追加されたパッケージの詳細を

閲覧できるサイト

25 of 44

Demo

25

26 of 44

とはいえ…

26

27 of 44

こう思う人がいるかも…

27

  • 新しい言語を学ぶのは大変
  • やっぱりPythonが好き

そのような方には…

28 of 44

28

29 of 44

29

Ergの型チェッカー+Language Serverを流用した

Pythonの型チェッカー+Language Server

Erg AST(抽象構文木)をPython ASTに変換して検査する

Rustで実装されているので実行速度もなかなか速い

Pylyzerとは

30 of 44

Pylyzerの売り

30

Powerful Static Type Checking

強力な型システムに基づく静的解析

他の型チェッカーでは型がつかないコードでもかなり解析できる

31 of 44

Pylyzerの売り

31

Friendly Error Reporting

Pyrightやmypyなど他の型チェッカーよりも

エラー報告が見やすい

mypy

& Pyright →

32 of 44

Pylyzerの売り

32

Friendly Error Reporting

Pyrightやmypyなど他の型チェッカーよりも

エラー報告が見やすい

Pylyzer →

33 of 44

Pylyzerの売り

33

Language Server Included

Language Serverも付属

Erg Language Serverが

実装している発展的な

機能を利用可能

34 of 44

今後の開発予定

34

  • 未実装機能の実装
    • ジェネリクス
    • pyiファイルのサポート
  • PEP準拠対応
    • エラーメッセージの改善
  • パフォーマンスの改善

And so on…

35 of 44

We need your support!

35

  • Erg/PylyzerはGitHub上でオープンソースとして公開
  • まだ生まれたばかりの新しいプロジェクトなので

ぜひstar/supportを!

Erg

Pylyzer

36 of 44

36

Presenter

芝山駿介

発表日

2024 / 9/ 28

37 of 44

想定される疑問

37

Q: Pythonの上位互換言語を作る?

A:

No

先述したようにPythonの文法には根本的問題があるため、

必ずしも文法の互換性には拘らない

APIについても、exec関数など静的解析を阻害するものは原則排除する

これらの使用は現在ではバッドプラクティスとされているため

排除してもそこまで問題はない

38 of 44

想定される疑問

38

Q: PythonのAPIをどのように型付けするのか?

A:

組み込みAPIは手作業

ユーザースクリプトについては、型定義用のファイルを用意する

e.g.,

Pythonコード

型定義ファイル

39 of 44

想定される疑問

39

Q: PythonのAPIをどのように型付けするのか?

A:

組み込みAPIは手作業

40 of 44

想定される疑問

40

Q: Pythonにも型指定の文法はあるが?

A:

型推論できるかが重要

いちいち型指定しなくてはならないのなら、

他の静的型付け言語を使ったほうが良い

さらに

* 型指定しても速度が向上する訳では無い

* 型が間違っていても実行自体はできてしまう

などの問題がある

41 of 44

想定される疑問

41

Q: Ergの型推論は完全か?

A:

恐らくNo

現時点では再帰関数の型推論が上手くいっておらず、これを完全に解決する のは難しいと思われる

また、依存型の型推論は一般に決定不能

しかし完全性にはそれほど強くこだわっていない

なぜなら、完全に型推論が可能な言語でも型指定を行うとエラー表示が

具体的になってわかりやすくなるといったメリットがあり、型指定自体

悪いものではない

ただなるべくシンプルに書けるようにしたい

42 of 44

想定される疑問

42

Q: 移行が大変で人気が出ないのでは?

A:

Pythonのような人気言語となることはそもそも目的ではない

またPythonを打倒する意図もない

あくまでPythonが占めるべきではなかったニッチを奪回する言語

そしてそのようなニッチで苦しむ人々は技術力があり、新言語の

学習もそれほど苦にしないと思われる

(また、これからスキルの低いプログラマはAIの登場によって

ある程度淘汰されていくと考えられる)

43 of 44

想定される疑問

43

Q: Pythonの些細なミスは

所謂AIによる修正で十分になっていくのでは?

A:

現在のLLMの課題: 複雑な計算などを正確にエミュレートできない

計算部は専用ソフトウェアに移譲させ、専用ソフトウェアの出力を

フィードバックしてコードを改善させるなどのアイデアがある [1]

すると正確な静的解析を出すソフトウェアは不要になるどころか

より重要になっていく!

[1] https://github.com/biobootloader/wolverine

44 of 44

想定される疑問

44

Q: Juliaではだめなのか?

A:

Juliaは動的型付け言語

静的型システムがほしいのはパフォーマンスのためだけではない

*「コンパイルが通れば、正しく動く」の快適さ