この10年のプログラミング言語の変化
2023-01-12
@nishio: この10年の間にあったプログラミング言語の仕様変更で大きなものってなんですかねー 厳密に切らない方がいい
@nishio: あ、そうか、10年前からあったけど10年間の間に勢力を拡大したケースがあるからあんまり厳しく切らない方がいいのか(TypeScriptの登場が2012年、Rustの登場が2010年だった) 言語仕様の変化に限らなくてもいい
「プログラミング環境の変化」的な投稿もあってそれも面白い
async
nishio ES2017 async await
紅茶ポット(ディンブラ) async/await な構文が各種言語に入ってきた
@tanakahisateru: PHP に言及してる反応の中にネイティブ Fiber がまだ出てなかったので追加。PHP にかぎらないけど、シングルスレッド実行が普通の言語がのきなみ async キーワードを取り入れていった 10 年って感じはありますね nishio あれ、Python3.5(2015)のasyncの方がES2017のasyncより先なのか、意外
shibukawa
Node.jsに追加されたのは2013らしい
v8への提案が2015かな
nishio あー、なるほど、標準に入るまでのラグがあるのか
OCaml 5.0でランタイムがマルチコアに対応
2022-12-16: OCaml 5.0
@wat_aro: OCaml5の Effect handlers は大きいと思う ・機能としては例外機構を拡張して例外発生地点から処理を再開できるようにしたようなもの
・使い方としてはAsync/Awaitなどの並行処理、StateやIOなどの状態など多彩
・表現力はモナドに近いがEffectの方が組み合わせやすく周辺コードへの影響も小さい
@zehnpaard: ・これらの性質によりOCamlに限らず関数型プログラミング言語理論界隈ではかなり研究されていた ・OCaml 5.0でランタイムがマルチコアに対応したのに合わせて、並行処理的なグリーンスレッドの実装のために追加された
・OCamlでの実装は型システムが未完成なことが知られており、今後の研究が待たれる
@zehnpaard: OCamlでのeffect handlerの構文や使い方については公式リファレンスにもあるが、個人的にはocaml effects tutorialが一番勉強になった 脱オブジェクト指向
オブジェクトの破壊的更新を避けるプログラミングスタイル
@nakayoshix: Java(Java SE 14)とC#(C# 9)の両方にrecord型が入ったこと。 データ構造(record)とアルゴリズム(Class)の分離が当然のこととされ、「(旧来の)状態を持ったオブジェクトをメソッドを通じて変化させる」から「イミュータブルなデータを関数を通して変換していく」スタイルへの流れが当たり前となった。
@nakayoshix: @nishio OCaml(更に元を辿ればML)由来のF#には最初からrecord型があったのですが、Scalaにはcase classという形で、またPythonにもdataclassという形でrecord型と似たようなデータ型(データ構造)が入ったのは重要な変化だと思います。もちろんF#等の関数型言語には更に高度な代数データ型等もありますけどね。 @roshian: C#/JavaのRecordの前にScalaのcase class(とKotlinのdata class)があったような?Pythonにdataclass入ったのが3.7(2018)なのでその流れだとこっちの方か。 / “プログラミングの変化勉強会 - 西尾泰和のScrapbox” https://t.co/89sBjJ4zZI 継承離れ
@yoshiori: @nishio 新しく出来た言語には継承っていう概念無くなってるなぁって話、Rust とか @yoshiori: @nishio Go なんかはそもそもクラス無い(構造体使ってモドキは出来るけど)し継承なくなるとクラスの役割はインスタンス変数の保持と関数の名前空間的な役割になるよね的なところからステート持つのは限定的な場所になって殆どは不変のオブジェクトと関数的なアプローチになってきてるよね的な GUI開発がOOPから脱却
nishio: Reactのクラスコンポーネントから関数コンポーネントへの移行
GUIの部品作りに従来一般的であった「クラスを使うアプローチ」をやめ、状態を持たない「関数」を使うようになった
フック (hook) は React 16.8 で追加された新機能です。state などの React の機能を、クラスを書かずに使えるようになります。doc 2019: React 16.8 release
shibukawa JSがオブジェクト指向から関数型指向になってきて、データとプログラムを分けるようになって、状態を維持しながら、エディタで編集した結果をブラウザに送り込んで見た目をリアルタイムに変える、みたいなホットモジュールリプレースメントみたいなのが実用に、というのはプログラミング的なパラダイム変化を感じてる
Metaにいる一部の部隊がきっかけだろうけど、ウェブフロントエンド経由で関数型好きが増えたのは感じる
てふてふ ElmもあるしGUI開発がOOPからFPに移ってきた感じしますね
Reactiveなプログラミングスタイル
@ooharak: @nishio ストリームプロセッシングとかReactiveXとかはもっと昔からありましたでしょうか Javaとかだとわりとこの10年ぐらいなのかと @nishio: @ooharak 広い意味で「プログラムの構成の仕方のパターン」と捉えると、面白い出来事の一つではあるように思います! taichi ストリーム指向なプログラミングスタイルが組み込み以外でも受け入れられるようになったのも、この10年くらいかねぇ。
Rxとか、Nodeのgulpとか、JavaのStreamAPIとかああいうやつ。これに伴って、record型みたいな状態変更できないオブジェクトの必要性がみんなに認識された。
GoのGenerics
@koizuka: @nishio Goにgenericsが入ったみたいな話だろうか @ymotongpoo: @nishio Go自体が公開されてから14年経ってないので、そういう意味では言語仕様の大きな変更はたくさんあるかもしれません やっぱり型ほしい
@ajiyoshi: PHP7系(2015年〜)から色んなところに型を書けるようになったとか。 型システム自体はもちろんありふれた機能だけど、PHPのような言語ですら型制約をサポートするようになったというのは潮流のように思う。
@ajiyoshi: (特にWeb系で)00年代は「変数ではなく値に型がついている言語」の勃興期だったけど、10年代に入って「やっぱり型ほしいね」ってなってきてる感じはある。 @ajiyoshi: 個人的には「goにgenericsがついた」よりも「PHPに型アノテーションがついた」のほうがずっとデカい差分に思える。 @nishio: @ajiyoshi やはりJavaScriptに対して「型のあるAltJS」が生まれて普及したことも大きかったのかもしれないですね、ありがとうございます! @methane: @nishio @zetamatta 型ほしい、のところにTypeScriptが必要だと思います。 漸進的型付け
shibukawa 漸進的型付けブーム
@cubbit2: Ruby,Python,PHPとかの動的な言語が揃いも揃ってType HintingとかGradual Typingとか言い始めたことかなあ 半精度浮動小数点数
@cpp_akira: @nishio ごく最近ですが、C++23でfloat16_tとbfloat16_tが入りますね (GCC拡張の_Float16とかはちょっと前からある)。 これからほかの言語も対応していくことになるでしょうから、そこそこ影響範囲が大きいものかと思います
@nishio: @cpp_akira なるほど、機械学習などの関連で半精度のニーズが増えたということですかね。確かに面白い変化です!ありがとうございます! 型後置記法を人々が受け入れるようになった
@ryushi: @nishio 型を後置するのが主流になった。Javaでさえも var hoge = "aaa"; みたいに宣言できるようになった。 @ryushi: @nishio 型を後置してても、人々が読みづらいと感じなくなったので、コンパイラを作りやすくなった。 @nishio: @ryushi それは型引数を取るような複雑な型を扱いやすくなった的な意味です? @ryushi: @nishio そうです。複雑な型を推論するようなコンパイラの実装が相対的に簡単になりました。 Language Server Protocol (+ GitHub Copilot)
@yoshiori: @nishio 仕様じゃないんだけどプログラミングという行為に対してのLSPとかはだいぶ大きいと思うんだよね。(次の5年では copilot 的なのがくるのかな?) @nishio: @yoshiori IDEの進化は無視できない大きな流れだと思う @shoma: Language Server Protocol (2016)に一票 shibukawa Language Serverも10年以内かな
LSP was originally developed for Microsoft Visual Studio Code and is now an open standard. On 2016 June 27, Microsoft announced a collaboration with Red Hat and Codenvy to standardize the protocol's specification.
しろう GitHub copilotの話って出てたっけ。そもそもプログラミング言語書かなくなったりするかもだよなぁ、って思ったりしてる
パターンマッチ
@_ko1: @nishio Python とか Ruby にパターンマッチ入ったとかですかね(アイディアが新しいわけじゃないですが) @joker1007: @nishio RubyだとやっぱりJITコンパイルですかね。後はパターンマッチが導入されたのもモダンな言語機能が取り入れられた感じかな。 @imunolion: @nishio 構造的パターンマッチって,ninja pattern matchとかdragon pattern matchの話ですかね?確かにもはや死語になっちゃうくらい普及しましたねえ. nullの扱い
@masaichi: @nishio dartにnull safety, objective-cにnullabilityが入ったことはどうでしょうか @kagilinn: @masaichi @nishio C#も、#nullable enableでnull安全が(警告として、ではありますがC#は特定の種類の警告をエラーに出来るので実質)出来るようになったほか、色んな言語にnullabilityを明示する手段が追加されて来てますね。 @Fushihara: C# がnull安全になった。typescriptやkotlinみたいにalt言語でなく本体が対応するのは珍しいと思う shibukawa: Dart が2011 / null safety は一つのブーム?
パッケージシステム
tokoroten.icon言語とパッケージシステムの融和性が昔と比べてかなり上がった気がする
npmとかpypiのようなライブラリ管理システムが言語との結びつきが強くなった
taichi この10年で依存ライブラリの管理が標準で提供されるようになった感じあるかなぁ。
フォーマッタ
taichi この10年でLintやフォーマッタも言語標準で提供されるようになったと思う。
ymotongpoo gofmtが与えたインパクトはあると思う
ビジュアル言語
shibukawa Kismet, BluePrintでビジュアル言語は使う人はだいぶ増えた印象(ゲーム開発では)
Unity も公式で出すとかなんとかいってた記憶あるけどどうなったんだろ?
まあ、Godot は4でビジュアル言語なくなるし、そこまでメジャーではないか
tokoroten UEのblueprintとかの、ビジュアルパイプラインプログラミングかなー / houdiniとか
対話的実行の共有
tokoroten jupyterとかr studioとかの、対話型コンソールって2013年にはメジャーだっけ?もうちょっと後ろだったイメージがある
従来の対話型じゃなくて、それをWebに持ってきたうえで、ちゃんとデータが残せるようにしたやつ
>Project Jupyterは、2014年にFernandoPérezによってIPythonから分離された、数十の言語の実行環境をサポートしている。
swallow シェアはそれほど大きくないですがMathematica使ったWolframのノートブックは昔(91年リリースの2.0)からあったようです
PythonがFortranとかMathematicaがカバーしていた分野に広まるにつれて、各種環境が整備されていったってことですかね
2015年、 GitHubとJupyterプロジェクトは、GitHubプラットフォームでのJupyterノートブックファイル形式(.ipynbファイル)のネイティブレンダリングを発表
In 2015, about 200,000 Jupyter notebooks were available on GitHub. By 2018, about 2.5 million were available. In January 2021, nearly 10 million were available, including notebooks about the first observation of gravitational waves and about the 2019 discovery of a supermassive black hole.
Major cloud computing providers have adopted the Jupyter Notebook or derivative tools as a frontend interface for cloud users. Examples include Amazon SageMaker Notebooks, Google's Colaboratory, and Microsoft's Azure Notebook.
2017: Google Colaboratory
nishio 対話的実行を「個人がする行為」から「実行可能なドキュメント」「文芸的プログラミングで書かれたコード」に変えた
Javaのラムダ式、型推論
@kis: @nishio Javaだとラムダ式、型推論ですなー Java8が2013なので。
@kis: やはり、世の中的なインパクトも考えると2013年にJavaにラムダ式が入ったことかなー。 Java使ってない人にもビックリ感があったと思う。
余談
@nishio: @kis ところで最近きしださんは総理になってオブジェクト指向を撤廃しようとしてるように思ってましたが、何かきっかけになる出来事とかありました? @kis: @nishio きっかけは高齢化問題と、Software Designにオブジェクト指向記事を書いてほしいといわれたときに考えてみるとオブジェクト指向むしろ有害だなってなったやつですね。オブジェクト指向を学びなおそうという特集の一部なのに、「オブジェクト指向いらんわ」って書こうとしたw ymotongpoo Playgroundが一般的になった気がする
shibukawa ネイティブなデスクトップGUIというものが下火になってきて、Electronとかブラウザをラップしたアプリが増えてきて・・・というのもここ10年ぐらい?
tokoroten google docsのGASとかってどうだっけ?
nishio プログラムを書く人の範囲がだいぶ広がったよね
結構昔だったけど、火が付き始めたのはここ数年という印象
chatの普及で、投稿先ができたことが大きいんだろうなー
リモートワークでチャットの普及でGASに火がついたという印象
shibukawa GASはVBAの流れと思えばそこまで世界が変わったわけではないかもしれない
kumagi 10年前の今頃はスマホがようやく出回り出した頃で、i-mode向けのゲームがまだ出せば出すほど売れるみたいなフェーズだった
= Java
今となってはObjCとかKotlinとか個別に書くのが嫌だからフレームワークで一つ作ったら全プラットフォーム行けるとかwebに寄せるからwebviewだけあれば良いとかそういう世界
2013 iPhone 5S
golden_lucky この10年で宣言的な書き方がいろんな言語で一般化した気がする
@haxe: @nishio C++ なら constexpr やラムダ式ですかねぇ。コンパイル時計算が黒魔術から一般化された感じ。 @aokomoriuta: 領域特化言語(DSL)全盛期になったこと。特にTVMなど。ちょっと仕様変更とは違うかもですけど @yutkat: @nishio 言語仕様ではないですが、個人的にはLSP、Linter、フォーマッター、ビルドランナー等々開発ツールチェーンがだいたいの言語で出揃って、開発体験が非常に向上したところが一番大きいですね〜 コンテナ技術でテストもやりやすくなったし
kumagi ブラウザでのプログラミング環境はChromeやv8のおかげでハチャメチャに良くなった
shibukawa IE8までは開発者ツールがなくて、firebugを入れてデバッグみたいな昔話なら任せろ
shibukawa まあ、最初に組み込み開発者ツール入れてくれて世界を変えてくれたのはSafari ではある
最近のホットリロードとかよくやるわー、と思う
kumagi プログラミングでのここ10年でいうとLLVMの台頭なんかもここ10年ではなかろうか
gccがあった頃から質的な何かが変わったわけではないけど、ライセンスが緩くてコードが比較的モダンなLLVMはGAFAが専門部署作ってまで寄ってたかって改善したので世界規模では相当な電力削減になった
tokoroten WebAssembly
tokoroten ここ10年でいうと、量子コンピュータ(量子アニーラ)がレンタル可能になった
AWSのbraketとかで、量子コンピュータが時間貸しできるようになった
従来の制約問題の式を書くとそれをイジングモデルに変換してくれるPyQUBOとかが出てきた
https://gyazo.com/a117f52d254532e63ab28630c55d699b
tokoroten Cerebrasみたいな、キチガイマシンにちょっと期待している
tokoroten SSDが一般化して、m.2SSDも一般化して、IO速度は上がった気がするけど、これによって何か変化があったかと考えたけど、プログラミングパラダイムは変わってない気はするなー
nishio IOの高速化によって緩やかに「RDBMSできちんと設計すること」の必要性が下がってNoSQLブームになったのではないかな(雑)
「ランダムアクセスはシーケンシャルアクセスよりめっちゃ遅い」はハードウェアの物理構造由来の制約だったわけだし
takabow IOの高速化によって緩やかに「RDBMSでも大規模データなんとかなる」になって、NoSQL ブームが終わって RDBMS が復興した / どちらかというとこういうイメージ
2010年ころってNoSQLブームの頭(実際には 2008 年くらいか)だと思うんですが、そのころって特に海外とかグローバルなビジネスやってるところって、RDBMS だと性能足りなくて、よりシャーディンぐ運用の負担がすくないくて、スケーラビリティによせた NoSQL を「仕方なく」使い始めたとかだったと思うんですよ
スケーラビリティが欲しくて、他を諦めてでも使っていた、それが NoSQL
2010-12 年ぐらいに、SSD だの Fusion IO だの足回りの強化がはいって金はかかるけど、それらに換装すれば RDBMS でも性能なんとかなるみたいな話が出てきた
tokoroten それまでは垂直分散とか水平分散とかしていた / 垂直分散とか水平分散とかすると、ロックが取れなかったり、トランザクションが使えなかったりするので、だったらNoSQLでええやんってなる
nishio あーなるほど。もともとRDBMSはトランザクションがウリだったわけだが、インターネットによるアクセス増加で1台のサーバでRDBMSが提供できる能力を超えてしまい、複数台で分散するようになったのでトランザクションのメリットが弱まっていって「じゃあ捨ててしまってNoSQLにしようぜ」となったが、IO性能が上がったので盛り返してきたということか
takabow TBのメモリつんで、TBのディスク積んだ1物理マシンのRDBMSってのが現実的に使えるようになってきて、シャーディングの苦労ないし、これでええやん みたいになってる
Aurora の 96 core マシンでええやん みたいなね
ネットワークの太さ
kumagi Hadoopがもてはやされてた頃はネットワークは長らく1GbEが主流でHDDのシーケンシャルリードぐらいの速度しか出なかったのでストレージとコンピューティングをいかに近くでやってネットワークに流すデータを減らすかってのがまさにMapReduceだった
https://storage.googleapis.com/gweb-cloudblog-publish/images/1_Jupiter.1000062220000793.max-2000x2000.jpg
25GbEみたいなそこらを出回らない独自チップを経由して100GbEのNIC何枚指します?みたいな世界になってて
tokoroten コンピューティングサービスは変わったけど、「プログラミング言語」にまでその影響は出ている?
kumagi MapReduceがSQLになったぐらいの違いはあるけど言語の話は確かに少しズレてるかも
shibukawa あとは、タイムトラベルデバッグ
kumagi ML系のプログラミングパラダイム的な変化だと、スパコン的な激オモ計算はFORTRUNで職人が書くんじゃなくてnumpy経由で強いBLASを使えみたいな方向に倒れたよね
@mattn_jp: Vim が Vim script の10倍速い処理系 vim9script を実装しました。(誰も興味ない悲しい) @nakayoshix: async/awaitとrecord型でF#の話題が連続して出ているのは注目すべき重要なポイントですね。 async構文こそC#から始まってJavaScriptやPythonその他の言語まで今や当たり前のように入ってますが、F#のそれはより一般化されたcomputation式という枠組みの上で作られている(async式)のが最大の特徴です。
@nishio: @igrep 前者は他の言語のユーザには「できなかったの?」と言われそうですが、後者はすごいですね。こっちも先を進みすぎてて理解されにくそう… nishio
ES2015 アロー関数(に伴うthisの扱いの変化)
Python, 細かい話もあるけど
asyncio
行列乗算演算子
tokoroten.icon
言語を使いやすくする、発展させるという観点だと、演算子のオーバーライド
numpyの行列演算のオーバーライドによる利便性の向上
セイウチ演算子
async generator
構造的パターンマッチ
とかかな?
~~~
_3F_2 VSCode が現れた
hajimehoshi 2013 年って Go 1.1 とかの時代か
tokibito TypeScriptも2013年ぐらい
hajimehoshi TypeScript って 2012 年にはありませんでしたっけ / ギリギリあった
tokibito Pythonがすごい伸びてるけど
https://gyazo.com/e28b630f956ef9a9f2d0fc39a1ff59a5
https://gyazo.com/dca9bdb97590a85752bb37330b7c733c
shibukawa 2013だと、jsエンジン開発競争でスクリプト言語の中でのパフォーマンスが上がりまくってた時期かな
一方でflash が消え、silverlight も消え、java applet も消えて、、、
ガラケーも消えて
tokibito Dockerがでてきたのも10年前ぐらい?
hajimehoshi Wasm が出てきたのはいつですっけ
shibukawa wasmの前身のasm.JSが2013らしい
tokibito 言語的なのだと、Rustが使われた事例はかなり増えたように思います
Rustは結構歴史あるか
shibukawa あとは、Spectre/Meltdownは、言語ランタイムへ変更が加えられたり
tokibito 10年前は言語機能どうのこうので結構盛り上がってたけど、最近はコード生成だとかツール周りのほうが盛り上がってる
shibukawa JavaScript の仕様策定がコミュニティ管轄になったのは大きい流れかなあ
tokibito 組み込み機器向けの開発環境はリッチになったかも。MicroPythonとか
盆栽職人 インフラまでコードで書くことがかなり定着したのはここ10年ですかね
tokoroten IaC~
tokoroten 機械学習の民主化かなー
scikit-learnがAPIをそろえることで、学習コストを格段に下げた
それまではそれぞれのアルゴリズムごとに独自のAPIで学習コストが高すぎた
tokoroten.icon
aws lambdaのようなサーバレス
特定のプログラムで計算をしたいのであって、サーバを持ちたいわけではない。
サーバ内にステートやファイルをもたず、通信と計算だけを使うというユースケースがなんだかんだで多かった
shibukawa Google App Engineとか、Lambdaとか、Cloud Runとか、サーバーレスとかFaaSはだいぶ普及したなって思う。まあプログラミングのマインドセットがCGI同等と言えばそうなんだけど
tokoroten.icon
スマートコントラクトを言語だと捉えるかどうか
Raspberry piの初代がでたのが2013年
個人的には「PC」と呼ばれるものの、上と下のダイバーシティが上がったという認識はある。
GPGPUの一般化。特にtensorflowとnvidiaのセット
クラウドとIaCによるリリースコストの削減→DevOps
otoan52 あんまり出てなさそうなのだと、RustみたいなGCレスのモダン言語、カラムナー型DBの実用化、WindowsにLinuxが入った、プライバシー問題周り、scratchみたいなビジュアルプログラミングが教育に導入
n314 型チェックと関数化はゆるく関連ありそうだけどどうなんだろう。オブジェクトの状態を変更していく処理が細かい関数に分かれて型がないと更に辛くなったとか。
roshi Rustの所有権やライフタイムあたりは今後他の言語でも採用事例出てきそう(もう少し簡単な方式になって欲しいけど)。あとメジャーにはならなそう(失礼)だけど個人的にNixが気になってる。
xlc ノンブロッキングIOあってこそのasync/awaitなので、私的にはノンブロッキングIOが一番大きな変化かな。私は厳密性はどうでもいいので型はない方が書きやすい。
topiyama 組み込み屋としてはRustの登場とgcc -O3の普及かな。/何でもかんでもasync Taskの関数で書いてるC#コード見たときにGUIプログラミングもテキトーに作れるようになったんだなと感じる
nunulk 個人的に注目してたのは脱オブジェクト指向(というか脱単一パラダイム)。Clojure の protocol、Rust の trait みたいなのが現状は良いとされてるのかな
oinume 面白い。あとはweb界隈だとスキーマ駆動開発が主流になったことかなぁ。
havanap データフロー志向のなにがしはある気がする(stream, immutable, visual, tensor, ETL)