#Julia言語 リポジトリを覗くと、Juliaのコア開発者の側がabstract typeにフィールドを付けられるようにすることを提案し、議論の結果、そうしない方が良いことを説得されるという胸熱な展開があります↓

github.com/JuliaLang/juli…

Juliaの仕様に関するリポジトリでの議論は非常に面白いです。
#Julia言語 技術的に健全な議論の模範として、過去のJuliaのリポジトリは利用可能。

誰も実現したことがないプログラミング言語の基本仕様を「みんなで話し合って決めて行く」という困難なことに成功している稀有な例。

一人のスーパースターが仕様を決定する方が楽なのに全然そうなっていない。
#Julia言語 abstract typeにfieldsを付けるという提案が覆されたポイントは以下の2つの発言だと思います。

github.com/JuliaLang/juli…

github.com/JuliaLang/juli…
【プロパティはフィールドというよりメソッドに似ています】
#Julia言語 例えば2次元ベクトル空間の点を表す1つの方法は x, y という2つの数値を使うこと。

しかし、仮にその2つのフィールドを持つ型のみが、2次元ベクトル空間の点を表すための型だということにされてしまうと困る。

基底e₁=(1,0)とe₂=(0,1)を指定するには、e_iのiの情報があれば足りる。続く
#Julia言語 基底e₁=(1,0)とe₂=(0,1)を効率よく実装するには、そのどちらであるかを指定する情報のみをフィールドに持つ型で実装したいということがあるかもしれない。

型が持つフィールドはユーザー側には見せる必要がない実装の詳細なので、フィールドが継承されるという仕様は必ずしもよくない。
#Julia言語 の基本戦略は、型の違いでディスパッチすることによって計算を効率化することです。

だから、実装の詳細であるフィールドをabstract typeが保有できるようにし、そのsubtypesへの継承を強制すると、後で効率的な実装をひどく妨げる可能性があります。

私の理解は以上の通り。
#Julia言語 言葉の意味。型のフィールドとは、例えば

struct Foo{A,B}
a::A
b::B
end

におけるa,bのことです。型のフィールドの設定は計算時にメモリをどのようにどれだけ使うかに直結しているので、計算効率に大いに影響します。フィールドを実装の詳細扱いすることは無難。
#Julia言語 私の理解のまとめ

* Juliaにおける型のフィールド達は実装の詳細に関わる部分という扱いになる。型のフィールド達を概念の抽象化のために使うことは意図していない。

* 概念の抽象化はメソッドの側で行うべきである。

* 概念の抽象化と計算の効率化の両方を考慮することが大事。

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

30 Mar
#数楽 私の線形代数のノート(問題集の形式、多分まだ公開していない)から関連する部分のスクショを貼り付けます。

多項式のユークリッドの互助法(最大公約多項式を多項式係数一次結合で作れること)と有理函数の部分分数展開とLagrange(-Sylvester)補間公式は本質的に同じ話題。

1/8~4/8 ImageImageImageImage
#数楽 多項式のユークリッドの互助法(最大公約多項式を多項式係数一次結合で作れること)と有理函数の部分分数展開とLagrange(-Sylvester)補間公式は本質的に同じ話題であることの続き。

5/8~8/8 ImageImageImageImage
#数楽 例:互いに異なるα_1,…,α_n∈ℂについて、f(x)=(x-α_1)…(x-α_n)とおき、p(x)をn-1次以下の複素多項式とするとき、

p(x)/f(x)=a_1/(x-α_1)+…+a_n/(x-α_n) in ℂ(x)

を満たすa_i∈ℂ達は、両辺にf(x)をかけて、xにα_iを代入することを経由して、

a_i=p(α_i)/f'(α_i)

で求められる(一意的)。
Read 13 tweets
29 Mar
#超算数 高校の教科書でも説明が結構雑い。

「式」という用語はひどく曖昧で、

* 1/x と (x + 1 - x)/x と (x-1)/(x(x-1)) は「式」として等しいのか?

という問いにこの教科書の読者は答えることができないと思う。

検定329 数研 新編数学II p.17 Image
#超算数 最近の例の話題との関連では

* 1/x と (x + 1 - x)/x と (x-1)/(x(x-1)) は「式」として等しいのか?

だけではなく、

* 等しい「式」を函数とみなすときの定義域はいつも同じになるのか?

とも問いたい。

教科書の説明がひどく曖昧な問題は我々が指摘して来たことの1つ。
#超算数 数学的本質を捉えた高校生の答案には難癖をつけるが、中高の数学の教科書の説明が不明瞭な点について何も問題にしない。

さすがにそれはまずいと思います。

(下手をすれば教科書に書いてあることと違うことをやっているから減点すると言い出しかねないのではないか?)
Read 13 tweets
28 Mar
「立式」は「問題を解くために役に立つ式を作ること」という意味だと誤解する人が多いので、たとえ鉤括弧付きでも使用する場合には説明を付けた方がよいと思いました。

「立式」の意味は概ね「『式  答え 』形式の解答欄の式の項目に先生が暗黙のうちに要求している式を書くこと」です。続く
そして、暗黙のうちに先生が前提にしていることは、

* 場面や考え方を忠実に表現する式が決まっている。
* 問題文をそういう式に変換する「立式」が重要である。

です。これは極めて有害な考え方なので、「立式」を考えることが有害であることをはっきり毎回言って欲しいと思います。
算数教育界ではそもそも「式」の概念自体が非常識なので、学校関係者と算数の話をするときには相手が「式」という言葉を使っていても、非常識な意味で「式」という言葉を使っている可能性を疑う必要があります。

算数で子供達の多くが非常識な「式」概念を強制的に学ばされています。続く
Read 7 tweets
27 Mar
#Julia言語 配列に関するforループ3題

gist.github.com/genkuroki/94a4…

①整数の和

for x in A
@ inbounds for i in eachindex(A)

よりも

for i in eachindex(A)

が遅い。配列の要素に A[i] の形式でアクセスする場合には論理的なデバッグが終わった後に @ inbounds を付けると速くなる。
#Julia言語 配列に関するforループ3題

gist.github.com/genkuroki/94a4…

②Float64の和

@ simd for x in A
@ inbounds @ simd for i in eachindex(A)

は速いが後者から@ inbounds @ simdの片方を削除するとかなり遅くなる。
#Julia言語 配列に関するforループ3題

gist.github.com/genkuroki/94a4…

③配列にはメモリオーダーでアクセスした方が速い。

2次元配列 A[i, j] の話をforループで計算する場合には、

for j in axes(A, 2)

を外側に

for i in axes(A, 1)

を内側にするべきである。これを逆にするとかなり遅くなる。
Read 5 tweets
26 Mar
#Julia言語 の多重ディスパッチを強く支持している人達は、「多重ディスパッチのJuliaにはクラスベースのOOPの機能を追加するべきではない」「OOPのデザインパターンはOOPの欠陥を補完するものであり、多重ディスパッチではよりシンプルな方法で解決できる場合が多い」と主張しています。続く
#Julia言語 多重ディスパッチとは、x,y,zの型の組み合わせを変えたとき同名の函数f(x,y,z)で異なるメソッドを実行可能にする機能のことです。x,y,zは平等に扱われる。

f(x,y,z)におけるxおよびその型のみを特別扱いしてx.f(y,z)と書けるようにすれば、よく見るOOPのスタイルになる。

続く
#Julia言語 資料

C++の開発で知られるBjarne Stroustrupさんは、f(x,y,z)をx.f(x,y)と書くスタイルの採用は浅い考えに基く失敗で、多重メソッド(=多重ディスパッチ)の採用が良さそう、のように言っているように見えます。

discourse.julialang.org/t/is-julias-wa…

open-std.org/jtc1/sc22/wg21…
Read 41 tweets
26 Mar
#Julia v1.6.0の公式バイナリが

julialang.org/downloads/

からダウンロード可能になっていて盛り上がっていますね。

新機能を2つ紹介

② sum系の函数で「初期値」を指定できるようになった。空の和もエラーにならないようにできます。

sum(x^3 for x in 1:0; init=0)
→0

これ結構重要。
#Julia言語 v1.6.0

②マクロ版ではなく、函数版sprintfが

using Printf
Printf.format(Printf.format"%15.10f", π)

のように使えるようになりました。

これで実行時可変なフォーマットのprintfを容易に使えます。
#Julia言語 Julia言語では、コンパイル時に与えられたフォーマット専用のコードを生成する爆速のマクロ版printfがデフォルトで使えていました。C版のprintf函数より速い。

しかし、フォーマットが固定されるので不便な場合がたまにありました。v1.6.0以降は使い分ければよいということになります。
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!