「Haskell」を含む日記 RSS

はてなキーワード: Haskellとは

2021-09-25

オブジェクト指向はすでに粒度時代にあっていない」を読んで

記事

@kis (id:nowokay) さんの以下の記事についてです。

https://nowokay.hatenablog.com/entry/2021/09/25/042831

ブコメにもあるようにちょっと内容が雑というかわかりにくいせいで賛否両論になってしまっていて、もしかしたら近いうちにアンサー記事が出るかもしれませんが、自分自身理解を助けるためにも言わんとしていることを推測しつつ、自分認識もまとめておこうと思い書くことにしました。明らかに誤読してそうな箇所があれば、指摘してください。

前提

まずは前提を書いておかないと論点がぼやけると思うのでいちおう。

自分バックグラウンドは以下:

その他の前提:


本文およびブコメを読んで思ったこ

2000年代に入って関数型プログラミングが脚光を浴び始めたのは、コンピュータ資源が潤沢になりパフォーマンスをそれほど気にしなくってよくなったことが大きな理由ではないか、という認識があります

関数型プログラミング言語の内部実装を読んだことがないので推測ですが、データを不変にするということはその都度メモリ領域を新たに割り当てることになり、そのオーバーヘッドプログラムパフォーマンスに影響を与えるので、パフォーマンス要件がをシビア場合、どうしてもメモリ割り当てや計算効率を考えるとミュータブルにせざるをえないと思います。が、ウェブアプリケーションに限っていえば、データベースアクセスネットワークアクセスレイテンシが大きいので、そうした相対的に細かいオーバーヘッド無視しても(大抵の場合は)問題にならなくなった、というのが「時代」の流れなんだという認識です。

いっぽうで別の観点もあって、REST API や FaaS が一般化して、関数単位で処理を分割し、アプリケーション外部に配置することが当たり前になってきた現状があり、マイクロサービスのようにアプリケーション自体モジュールの一単位として考えると、アプリケーション内部のモジュール同士でも関数ベースでやりとりする形になっても不自然ではないと考えられます

記事にもありますが、RPC派生実装?)として生まれJava の CORBA や MicrosoftDCOM みたいな振る舞い付きのオブジェクトコンポーネント)を共有しようという世界観は廃れ、REST API のような単一の振る舞い(エンドポイント)とそれにひもづく JSON のようなデータ構造のみを受け渡すやり方が一般的になったアプリケーション通信の潮流と、計算資源が潤沢になって再度脚光を浴びた関数型プログラミングが、レイヤーの違いを飛び越えてひとつになろうとしているのではないか、と。

まり、元記事に書かれている「時代に合ってない」というのは、「データ構造と振る舞いが一体となったオブジェクト」のような「なにか」は、そうした背景があるために、どこにも存在する必要がなくなってきているのではないか、と解釈しました。

なので、以下のコメントちょっと論点がずれてると思いました。

はあ?「再利用する方法としてはWeb APIが主流」って、その中身をオブジェクト指向設計することは、全く矛盾しません。 部品化の単位は、慣習や柵などで大きく変わりますオブジェクト指向とはほぼ無関係です。

https://b.hatena.ne.jp/entry/4708813645995359202/comment/suikyojin

なんでサービスとして外とやり取りする話とサービスの内部設計の話をごっちゃにしてんだ。なんか理解度が怪しくない

https://b.hatena.ne.jp/entry/4708813645995359202/comment/ssssschang

しかに、アプリケーション単位アプリケーション内部のモジュール単位とでその表現形式を合わせる必要はないんですが、元記事の言わんとしていることはこの一文に端的に表れていると思います

ソフトウェア記述をまとめるという視点では主にステートレス関数を分類できれば充分で、データと振る舞いをまとめたオブジェクトというのは大きすぎる、システムを分割して管理やすくするという視点ではオブジェクトというのはライフサイクルリソース管理視点が足りず小さすぎる、ということで、オブジェクト指向粒度でのソフトウェア管理は出番がなくなっているのではないか、と思います

個人的にわからなかったのは以下の部分です。

オブジェクト指向でなぜつくるのか」という本がありますが、「え、いまどきオブジェクト指向でつくらなくない?」っていつも思います。内容的には、もうほとんどはオブジェクト指向関係ないソフトウェア工学の紹介になっていますね。

当該書籍は読んだので後半はまぁわかるんですが、前半は「え、いまでもオブジェクト指向でつくるのが主流じゃないの?」って思ってしまますオブジェクト指向定義が「データ構造と振る舞いが一体となったオブジェクトの集まりとしてソフトウェア組織化すること」なのであれば)。

おわりに

Joe Armstrong が "Why OO Sucks" を書いたのが2000年とのことなのですが、そろそろこうした議論収束に向かってほしいと個人的には思います(とっくに収束していると感じている方もいらっしゃるでしょうけど)。

https://gist.github.com/posaunehm/4087971

2021-08-11

昔一瞬「Haskell」って流行ったよな

何だったのあれ

2021-08-08

プログラミング言語関数型言語ってOOPを含めた命令言語に劣る理由

Scala や Elm と Lisp やら HaskellOCamlSML関数型のプログラミング言語勉強したけど、これらが命令言語に劣る理由解説しよう。

解釈自由関数言語アセンブリレベル最適化ができない

これは、SQL も同じ問題を持っているが、関数言語は「こういうふうに動いてね」という解釈インタープリターやコンパイラが「推測する」必要があるのだ。つまり、書いているときパフォーマンスプログラマー想像できない。

ハイパフォーマンスを出す関数言語コンパイラを作れば良いじゃん?

それが、現実的に厳しいのだよ。マジでコンパイラ関連は金にならない領域になってきたので、関数言語のための独自コンパイラを作る持続可能組織が無い。確かにLLVM を使えば x64arm といった最新のアーキテクチャ対応できるかもしれないけど、フロントエンドレベルすら応対が辛い。よって、関数言語C言語にてチューリング完全な同等なコードだと「いくら最速に書いても」遅いのである

人間は「命令するほうが楽」なので、関数言語は負けます

例えば if と書いたら、関数言語は else が必須ですが、命令言語は else 無しでも動いちゃうのですね。文系の連中が数学的な背景を加味して要件定義できると思うか?違うだろ。毎回、上に else のことについて聞いたら、プログラマー生産性は下がるだろ。関数言語は、上が文系だとますますだが、分岐もきっちりとおさえる必要があるから生産性命令言語に劣るよ。

2021-07-31

Scala や Elm と Lisp やら HaskellOCamlSML関数型の勉強したけど、

結局は RubyJavaScript といった似非関数言語レベルですらついていける人間の方が少なくて、もはや Python なんていう関数型もOOP馬鹿にしたような言語大学側が積極的にプッシュするという、過去プログラマーの偉大な苦労が荼毘に付されそうな今、一体何のために俺たちは戦ってきたのだろうね。本当は、PHPVB で良かったんじゃねーの?


僕は Ruby と Rust ちゃん

2021-07-19

Haskell 言語の作者の演算子順位の付け方の実装方法は良くない

優先順位を 1 とか絶対的な数値、業界用語で言うところのマジックナンバーにしたのは、設計ミスだと思うのだ。相対的表記にすべきだったのだ。

anond:20210124191254

拝啓、偉大なる数学者よ。ハスケル挫折した同士で伺いたいことがある。

Haskell関数のうち do ~ action既存C言語副作用の原因となる in out圏論というものラップすることで、対応しているのだと思うのですが、如何でしょうか?

anond:20210718234819

∞と∞を不等号で比較することはできないんだ。

それは事実。∞/∞ は定義されてないよ。知ってるよ。でもさ、数式的にわかっているときに発散具合で、関数自体比較できるのじゃないの?

④の式を計算機で処理することはできないというあなたの説に反論する為に、WolframAlphaに④の式を計算させるリンクを張ったのだけれども、意図を全く理解してないようだな。

そりゃ、そうだろ。WolframAlpha が数式を表記できなかった誰も使わねえ。アホか。俺は電卓までは否定しないよ。違うってば。オレっちは「制限のあるメモリ(=有限)上では ∞ は定数としか扱えない」から、「数学=計算機科学」ではない、と言いたいの。「反例の反例」で書いたけど、遅延評価のような手法を使うと数学問題プログラミングで解けるよ。なんなら、虚数分数でも HaskellRuby を使うとプログラミング上は解けるよ。それは言語製作者がパフォーマンスを落として実現しているだけで、メモリプロセッサでは直接演算してないのよ。まさかだけど「物理学小数分数を同じものとして扱ってはいけない」ことを知らないとかじゃないよね?

2021-07-18

anond:20210718161719

数学という学問は「反例があったら、仮説を否定できる」という学問なんだよな?だったら、数学的な問題計算機で処理できなければ「計算機科学=数学」を否定できるのだろ?なら、今からやってやる。

f(x) = x ^ 2, g(x) = 2 ^ x とする.

② x に無限に大きくなるときf(x) とg(x) は共に無限に発散するが、

数学的には lim が「x →∞」のときf(x)〈 g(x) と言える。

④ なぜならば lim が「x →∞」のとき、(x^2)/(2 ^ x) は 0 に収束するからだ。

これは数学的には合っているだろ?歴史的にはカントールがこの難題をクリアしてくれたのだろ?俺は大学数学科じゃないか不勉強なのは認める。ただ、上記の主張は数学的には合っているはずだ。

じゃあ、計算機無限比較するとどうなるか?これから書くことは、IEEE 754 といった現実世界プロセッサで語るぞ。


③' 計算機では lim が「x →∞」のときf(x) 〈 g(x) と言えない。

④' なぜならば lim が「x →∞」のときf(x) と g(x) は +∞ という二進法上の値となり「等値」となるか、「比較できない」ものになる。

⑤' 以上から、「数学=計算機科学」ではないと言える。

反例の反例が来るだろうから、こっちも否定しとくぞ。たとえば、Haskell のような遅延評価をする言語では ⑤ の「(x^2)/(2 ^ x) は 0 に収束する」という記述可能ではある。ただ、それはアルゴリズム的に Haskell記述できるからであって、メモリ上やプロセッサ上では扱えているわけではない。よって、この「反例の反例」は否定できる。


俺の言っていることは、おかしいか

anond:20210718161714

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%83%89%E3%83%BB%E3%83%AD%E3%83%BC%E3%83%AC%E3%83%B3%E3%83%84

Wikipedia引用すると、

計算結果の検証のため同一のデータを初期値として複数回シミュレーションを行うべきを、

ここまではよくわかる。それで物理学数学的なカオス理論を押す連中が間違っていると思うのが、

二度目の入力の際に手間を惜しみ、初期値の僅かな違いは最終的な計算結果に与える影響もまた小さいだろうと考えて、小数のある桁以降の入力を省いたところ、

ここ。ここが諸悪の根源だ。まず計算科学の連中が大学に入って最初に引っかかるミス大御所がひっかっている。たとえば、0.4 - 0.3 は計算科学では 0.1 じゃない。それは十進法から二進法に変換するという計算機の特性理解してない人がやるミスだ。嘘だと思ったら、0.4 - 0.3 == 0.1 と C なり Ruby なり Python なり Java なり Haskell なりでやってくれ。ちなみに JavaScript なら 0.4 - 0.3 === 0.1、Lisp族の Clojure は (== (- 0.4 0.3) 0.1)、PHPちょっと自信がないので省かせてもらう...。浮動演算ユニットがついているプロセッサIEEE 754 の類をサポートしているなら「偽」となるはずだ。ここでは「桁あふれ」「丸め誤差」なんかは説明しないが、計算機で小数を扱うのは注意が必要ってことだ。閑話休題、つまり計算機で数学物理学実数のように小数点を扱うなら 3.0 と 3.1と 3.14 は別物として扱う必要があって、カオス理論創始者であるローレンツは「有史に残る」ミスを犯した。

結果が大きく異なった。

これは金融界隈のエンジニアたちにとっては、コンピュータが現れてから悪夢のような形で襲っていて、ゴースト・イン・ザ・シェルの題材にすらなっている「既知の未知」という類のエラーだ。はっきりいうと、大御所にこんなことを言うことは憚れるが、エンジニアだと3年目以降だとしないミスMITエリートがやっているという、なんというか「そりゃ、そうなるだろ」的なミスをしでかした結果なんだよ。例えば、古典物理学だと有効数字ひとつ下の数値は切り上げて四捨五入するというのは教科書的には正しい。だがね、計算科学だと小数点の扱いは事故の元なんだよ。具体例を出すと「Ruby円周率を100回掛け合わせる、Ππ(パイパイ、n=100)みたいなことをする。

puts [3.0, 3.1, 3.14].map{|i| 100.times.reduce(i) {|j, k| j *= k + 1}}
# 2.7997864633183236e+158
# 2.893112678762268e+158
# 2.930443164939848e+158

もう一度、特に高校物理をやった人は考えてほしい。数値を切り捨てしないだけで、これだけの差が生じるのだ。そりゃ、ローレンツ大先生も驚くわな。現実世界では起きないような気がするのはなぜか?、と思うじゃん。そこで、わたしはこう思うわけですよ、

計算機は実数を正しく扱えない」

とね。だからこそ、

計算機を正しく扱わないことで生じる偏見差別

というもの科学する学問があって良いのじゃないかと。つまり

それこそが【計算科学】というもの

なのではないかと。


異論は認める

2021-05-21

個人的Python についての不満

良い言語だと思うが、不満がある。

Perl比較して、


Ruby比較して、


Java比較して、


PHP比較して、

  • 後発のくせに、なんであの時に負けたのだろうねー。
  • OOP としては、流石に Python の方が良いと思う。

JavaScript と比較して、

  • カオス具合は、五十歩百歩ですね。
  • 文法的には、JS のが好き。
  • OOP としては、JS の方が優れていると思う。

Haskell比較して、


R と比較して、


C と比較して、

  • まぁ、比較ができんね。どうせ Python も中身は C だし。
  • どーせ C が最後には勝つんだよ。


という愚痴がある。他人の書いたものを読む分には良い言語だと思うよ。

追記。または、コメント欄への返事。

今日日型ヒント書くし、タプルは複数の値を返すけどクラスを作るほどではない関数を書く局面でよく使う

型ヒントはコンパイル時のエラーにならないじゃん。だったら、いらなくね?タプルは複数の値を返すときに使うのね。Go みたいだね。または Ruby の Struct みたいな。

リスト内包表記書かせるのやめてもらえません?

あれ嫌いな人おるのか。俺も好きじゃないが。純粋Haskell と同じ文法だったら良かったのにね。

三項演算子について

アレはキモいね。素直に ?! で良いと思う。というか、Python英語圏の人も納得はできないだろ、っていう文法が多くないか

インデントブロックなのて可読性が上がる

というのは同意する。ただ、書くときにそうは思わない。例えば、with 構文は Ruby の方がブロックを抜けたらクローズするという方針のが良いと思う。

互換性を断ち切って増田にも認めてもらえる仕様Python 4が待望される。

それ Python 2 から 3 になったときに既にやったじゃん。そして大成功したじゃん。ニャンニャン

2021-05-09

ワイ「今日Haskell学んだるで!とうとう副作用の章やな!」

Haskellでは対話プログラムを、「ある状態世界」を引数に取り「別の状態世界」を結果として返す、純粋関数とみなします。

(プログラミングHaskell 10.2 解決策より)

ワイ「??????????」

2021-04-24

anond:20210424113759

おれ、最初basicで、次にアセンブラで、それからCをやったけど、他の高級言語アセンブラもやらないでいきなりCやらさる学生って大変すぎるだろっておもってた。

クイックソートとか初めて見たのがCのコードで当時理解するのがめっちゃ大変だった記憶があるけど、のちにHaskellrubyコードをみたらすごいシンプルで、初学者の頃見てたら理解するの楽勝だったのにって思ったわ。

2021-03-10

Rustまったくわからん

普段、おまえは何の努力もしてないのではないか

凡人以下ながら新しいネタとか技術とか数学アルゴリズムは引き出しを増やすように心がけてるんだけどね

食い扶持になる可能性もあるし

しかし、未だにRustがうまく使えないというか、学習コストが高すぎる気がするんだがどうしたもんかな…

国が公開してるとあるExcelファイルを読み込んで、それを望まれCSVJSONに加工する、

という仕様は同じにして色々な言語で書いて比較しようと思っているのだけど、

PHPNode.jsPythonGo自分には問題なく書けてる

多分、C++やCも、流石に何か便利なものにvcpkgやconanとか使って依存するだろうけど書けると思う

しかし、Rustは難しいなあ

Excelファイルパースするサンプルコードも難しいというか、長くね?と思ってしまうんだけど

これに慣れる日は来るんだろうか…

Go学習コストが低いと思うから、とりあえず動作するコードを書くのは問題ないんだよなあ

C#とかDとかNimとかErlangとかKotlinとかDartとかもやろうかなあ

でも、少なくとも後ろ2つはほとんどJavaみたいなもんだろうか

考えてみれば、自分Haskellが駄目なので、Rust駄目は関係があるんだろうか

Lisp方言みたいなのが多すぎてよくわからん

2021-01-24

数学科代数系出身だけど、Haskell圏論との繋がりが未だにわからない

Haskell圏論を結びつける主張には前々からずっと疑問を感じている。

およそ、その主張の根拠は「圏論概念であるモナドを借りてきたからだ」というのだが、その言葉意味を突っ込んで追求した人はいないのだろうか。

数学科として、ある程度圏論を学んだ身として疑問に思ってしまうのが、

まり総合的に、「Haskell圏論を用いることで副作用や参照透過性などのプログラミング言語課題解決したのだ」というよくある主張が、全然ピンと来ない。

この辺突っ込んでちゃん解説している専門書はないのだろうか?

第一、第二、第三の疑問いずれに対しても、満足のいく回答は得られず、ただ「モナド圏論由来の概念だ」というだけだ。

もしかして何か、圏論という一般にはよく理解されていない概念言葉を良いように使って、なんだか深淵で素晴らしいもの聞こえるよう、同業者適当にだまくらかしているんじゃないのか?とすら思えてしまう。

2020-11-21

ソースコード品質を保つために真に効果的な手段は3つしか無い

  1. バージョン管理システムを使う
  2. 静的型付け言語およびlintを使う
  3. テスト駆動開発をする

どんなに優れたツール設計思想などがあっても、使う奴がダメだと全く無意味。弊社もWebアプリを作ってて、RESTだのFluxアーキテクチャだのいろいろ導入を試みたが、ほとんど無駄に終わった。

どんなクソ組織でも効果があると確信持って言えるのは上の3つだけ。1つ目は初歩的すぎると思われるかも知れないが、筆者の想定するダメ組織ダメプログラマというのは、このレベルの連中を含む。

とにかく最低限の品質保証強制する仕組み以外は無意味

静的型付け言語サーバーサイドならJavaC#フロントエンドならTypeScript)を使わせれば、少なくともコンパイル時に分かるエラー修正させられる。

というか、ダメプログラマに動的型付けの言語は触らせてはいけない。必ずそのプロジェクト半年後には保守できなくなる。

テスト強制的に書かせるし、テストのないクラスや、通らないテストあったらコミットできないようにする(それは容易にできる)。

番外編: ものすごくマイナー言語を使う

もう一つの方法は、そもそも優秀なエンジニアしか参加できないようにすること。たとえば、ScalaHaskellErlangCommon Lispなどで書かれていれば必然的にそれが分かるエンジニアしか開発できないし、こういう言語自主的学習しているエンジニアは優秀である可能性が高い。

2020-11-15

anond:20201115005207

Haskell ならできるよ。そしてそれが理想のかたち。

hogeset したい。hoge の型は Hogeから setHoge かな…

みたいな思考コンピュータ側に任せるべき。

2020-11-03

退職エントリー(非成功例)

はじめに

みなさんの退職エントリーを見ると、いい経歴なので、いい経歴な人なら書く気が起こるんだろうなーと思います

私はそういう輝かしい退職エントリーと比べると、あまり成功した退職エントリーとは言えないので、あまり書く気がありませんでしたが、一応は匿名で書こうと思います

どんな人?

んー、結構年を食ってる、単なるプログラマです。平社員ですし、コネとか何もありません。趣味もありません。読書音楽鑑賞ぐらい?

コミュニケーションがとても苦手です。もはや人に興味がないレベル。それを今までの経験で補ってる感じ。

技術がある?いや別に。ごく普通の、一般的技術しかありません。Haskellとか分からないな。。機械学習IoTとかもよく分からない。

なぜ辞めたのか?

細かくは言えませんが、自分で辞めたの半分、辞めさせられたの半分というところでしょうか。自分責任であることは確かです。

周りには一応、円満に辞めたことにしてありますし、特に争いがあるわけではありませんが、全部自己都合って言われると、どうかなとは思います。辞めないで居れれば、その方が良かったです。

まぁいろいろ重なって辞めることになりました。

それに、もともと評価が低かったので、辞めること自体簡単に行きました。

新型コロナ禍で転職できるのだろうかと思うので、人には勧められません。

どういう転職活動をしたのか?

まずはスーツを買いに行きました。着ていく服がない。。

後はもう年なので、基本的に雇われないだろうと思いました。

なので、派遣社員になるのだろうということで、いろいろ派遣会社を巡りました。

どこに行くのか?

これもちょっと言えませんが、ある意味特殊な行先になりました。私自身は、見たのが2度目ぐらいですかね。

昔の会社上司がそういう感じでした。

話には聞くのですが、自分がそうなるとは思いませんでした。

いい待遇になったの?

まぁ一応、、といいたいところですが、そこらへんはなんともいえません。

もともと評価は高くなかったので、これ以上、低くなりようがありません。その意味でも何とも言えません。

最後

匿名でさえも、輝かしい成功からすれば、成功したとは言えない場合、ズバズバは書けないですね。これ以上低下できないので。。成功例の退職エントリーがうらやましい。

2020-10-23

anond:20201022005749

継承必要だよ。継承がないと多態が表せないから。

馬鹿継承を扱わせると、仕事している感を醸し出すために継承活用せざるを得ない。だから継承はクソに見える。よって、増田の言いたいことはわかる。

しかし、冒頭で書いたとおり、多態を適切に扱うために継承必要なのだ。これ以上は書けない。これからクラスベースOOP は消えることないであろう。それを書くすべを私は持ち得ていないので、null が消えない事実を例にして語ろうと思う。

21世紀プログラミング言語チャレンジの1つはなにか、と言ったら「null 撲滅」であろう。関数型言語は null を排除することに努めたし、Swift 言語は Optional という null がはいっていないことを保証する仕組みを作ったり、Haskell圏論という数学概念で応対しようとし、Ruby 言語は &. という「null をスルーするメソッド」を開発した。でも、null は撲滅出来ないままである

そもそも null とは何か?C言語では、ポインタが指すとそこでお終いだし、Java だとヌルポ(例外)の要因だし、Ruby だと NilClass のインスタンスだし、SQL言語だと「3値論理」では未来のことを記述するためのものだし、言語によって null はバラバラである。つまり、null 自体には特に意味はないのだ。逆に null があると便利だと思わないかC言語ではポインタに死んでもらえるし、Java だとヌルポがあったら例外にできるし、Ruby だと nil があったらなにかの理由があるからだし、SQL言語だと未来のことは不明記述できるし。そうなのだ、null はプログラミング必要なのだ。null をちゃんと扱うのが難しいだけで、null 自体に罪はない。

これを継承、というか多態にあてはめてみよう。多態がないとどうなるか想像してくれ。とてもしんどいことになる。なぜなら...

(作者は眠たくなりました。続きが読みたかったら反応ください。)

2020-10-22

anond:20201022112142

すまん、わかりにくて。Haskell 挫折したのよね。

anond:20201022110139

「型」という言葉が、たとえばCoqのような形式証明や、よくあるHaskell純粋性などを解説する際に用いられるような

「周辺環境すべての情報を含むもの

という意味でしたら、「型を一致させる」という表現は、あながち間違っていません。まあしかし、そういう意味で用いていないことは常識的に明らかでしょう。

単に「型を一致させる」と言った場合、他のオブジェクトへの副作用例外処理などの話題を含みませんが、Liskovの置換原則は、それらも含めた置換可能性を要求します。

2020-05-21

初心者向け】プログラミング言語人気TOP20簡易解説

概要

プログラミング経験からプログラミング勉強してみたい、でもどのプログラミング言語をやればいいのかわからない」というような悩みを聞くことがあるので、https://redmonk.com/sogrady/2020/02/28/language-rankings-1-20/ に載っている人気の言語TOP 20について、未経験者が最初に学ぶのはどの言語が良いかという観点簡単解説してみます

対象読者はプログラミング経験者なので、なるべく難しい言葉を使わないようにしたつもりです。また、正確性よりもわかりやすさを重視しているので何かしら間違っているかもしれません。ご留意ください。


ランキング

1位 JavaScript

Webブラウザの上で動くプログラミング言語。元々ただの文書しかなかったインターネット世界に、グリグリ動くページを作りたいという欲求により生まれた。JavaScriptのおかげで今のWebページグリグリ動きまくりである

元々HTMLちょちょっといじる為だけのものだったが、どんどん進化を続けて今は一つの超人プログラミング言語である。今ではブラウザ上でなくても普通に動かせる(Node.jsという)ので様々な用途で使われている。

ブラウザ上で動くプログラミング言語基本的JavaScriptしかないので、JavaScriptはすべてのWebプログラマが学ぶ必要があると言っても過言ではない。

ちょっとしたプログラムを書いてすぐブラウザ上で動かせるので楽しい。そういう点ではプログラミング入門に適していると言えるかもしれない。


2位タイ Python

機械学習を始めとしたデータサイエンスの分野で激烈に人気のある言語理由としてはNumPyとかTensorFlowのようなライブラリが充実しているというのが大きく、資産がたくさんあるのでこれからも使われ続けるであろう。

Webも作れるが、日本ではWeb系の求人は少ない気がする。

言語としては、誰が書いても簡潔で読みやすコードになる傾向にあり、小さいプログラムを書くにはいい感じである米国ではプログラミング教育Pythonがよく使われているという話も聞くし、初心者プログラミングを始めるのにはいいのかもしれない。

将来AIデータサイエンスをやってみたいと思うのであればPythonから始めましょう。


2位タイ Java

ランキングでは常に一位に近い順位をつける言語Javaができた当時は色々と革新的だったらしく、組み込み業界からWebまで流行りまくっていた。今でもその名残か使っているところは多い。過去資産プログラマの数が多いのが一番の理由だと思う。AndroidアプリJavaで書く(もしくはKotlin)。

実行速度が速く、また下位互換性がしっかりしているので過去に書かれたコードが新しいマシン上でも動きやすいのが長所短所としては、歴史ある言語下位互換性を保っているため文法が古い感じがする。タイプ量も多くなるし、学習コストJavaScriptPHP, Ruby, Pythonあたりに比べると高い。

正しく使えば強力な言語だが、日本のクソSEもどきは全員(自称JavaエンジニアであることがJavaが毛嫌いされる理由の一つになっている[要出典]。いわゆるGAFAJavaをかなりヘビーに使っているので要は玉石混交ということである

Androidアプリ作ってみたいというならJavaからはじめるのはアリ。


4位 PHP

Webページを作るためだけに生み出された言語プログラマの数が非常に多い。日本求人が一番多いのはJavaPHPであろう。

初心者でもとっつきやすく、すぐに動くプログラムを作れるので入門に使われることも多い。学習コストの低さはトップレベルであるしか基本的には古くてダメ言語とみなされており、PHPで作られたWebサービス脆弱性が多いという都市伝説もある。真実は闇の中である

近年のバージョンアップ比較的良い方向に向かっている(と個人的には思う)ので、選択肢としては意外と悪くないかもしれない。


5位 C#

Microsoftが生み出した言語で、.NETというプラットフォームを使ってWebサービスを、Unityというゲームエンジンを使ってゲームを作ることができる。

最近有名なのはUnityで、今やほとんどの3Dソーシャルゲーム(の一部分)はUnityで作られている。そう考えるとC#プログラマ結構いそうだし将来もある程度安泰かもしれない。もちろん.NETも広く使われている。

ただし.NETUnityも触らない人にとっては基本的に縁のない言語である

なんかゲーム作ってみたいかもなーと思う人はC#から始めてもいいんじゃないでしょうか。


6位 C++

C言語に色々な機能を足しまくってできた巨大な迷宮のような言語言語仕様は複雑怪奇だが実行速度は全プログラミング言語中でも最速レベルなので、パフォーマンス重要な開発において使われる。アプリサービスというよりは、それらを作るためのライブラリプラットフォームなどを作るときに使われることが多い。Web系の会社でいうとGoogleなどは主にC++を使っている。

基本的には初心者が触る必要はない。競技プログラミングを極めたいとかならC++からはじめてもいいかもしれない。


7位タイ Ruby

このランキングの中で唯一、日本人によって作られた言語。作者のまつもとさんは世界有名人である。ちなみに島根県出身、在住。

プログラミングを楽しくすることがモットーらしく、確かに書き味は良い。また作者が日本人なこともあってか日本情報が多く、情報収集という点ではとてもやりやすい。

Ruby on RailsというWebサービスを作るためのフレームワーク世界的に大ヒットしたため、必然的Ruby知名度も上昇した。少し前まで日本Webスタートアップは猫も杓子もRuby on Railsといった様相であった。今は少し落ち着いたようだが今も人気は根強く、Webプログラミングスクール等ではだいたいRuby on Railsを教えているとかいないとか。

Webに興味があるのならRubyから始めるのが一番無難選択肢と言える…のか?まあ悪くはないと思う。今でも需要は多い。スクールに行きたいのであれば黙ってスクールカリキュラムに従いRailsをやりましょう。


7位タイ CSS

これは他の言語とは毛色の違う言語である。というかCSSプログラミング言語と呼んでいいのだろうか?

CSSHTMLを装飾するためのものである。字に色をつけたり、背景を変えたり、レイアウトサイズを変えたりするのは基本的CSS役割である

すごく大雑把にいうと、HTMLで表示する内容(文章画像)を定義し、CSSでその見た目を整え、JavaScriptで動きをつける。というのがWebサービスの”見た目”を作るやり方である

なので、Webに興味があるのであればある程度はCSS知識必要である。が、これ単独で学ぶようなものではない。Webサービスを作る時についでに調べて少しずつ覚えていけば良い。


9位タイ TypeScript

TypeScript比較的新しい言語で、JavaScriptさら拡張したものであるMicrosoftによって開発されている。

プログラムにはデータの型(Type)というものがある。例えば「1」や「2」は数値型、「あいうえお」は文字列型といった具合である。大まかに言うと、この「型」に対して厳しい言語は型チェックによりバグの混入を防ぎやすいがプログラムを書くのが大変、というかコード量が多くなる。型が緩い言語サクサクかけるし短く書けるがバグを生みやすプログラマの力量が問われる。ランキングの中だとJavaScript, Python, PHP, Ruby, Perlあたりは緩く、Java, C++, C, Swift, Go, Kotlinあたりは厳しい。

そんな中、世で広く使われているJavaScriptの型チェックが緩すぎるのでもっとちゃんと型をつけたい、そんな要望を叶えるのがTypeScriptである基本的JavaScript理解している人間が使うべき上級者向け言語というのが現状なので、初心者が始めるには適していない。

ただしこの先主流になっていく可能性は大いにあるので、どこかのタイミングで勉強してみても損はしないと思う。


9位タイ C

C言語基本的OSを作るための言語であるOSというのはWindowsとかmacOSとかLinuxといったもので、マシンを動かすための基盤となるソフトウェアであるAndroidスマホにはAndroid(という名のOS), iPhoneにはiOSが載っている。コンピュータ基本的OSがあって初めて動かすことができ、OS提供する機能を使ってブラウザスマホアプリなどを動かせるのである

というわけで、初心者が学んで実用的なものではない。ただしC言語というのは世の中の様々なものの基盤になっており、他言語文法C言語から拝借しているものが多い。例えばC言語をある程度勉強していればJavaPHPなどはなんとなく雰囲気で書けてしまったりする。

そういうわけで、コンピュータサイエンスをこれからちゃんと学んでいきたいという人(大学生とか)はC言語から始めるのもいいと思う。ちなみに筆者は初めて書いた言語はCであるが、意味理解できるまでに2年かかった。才能がないとこうなるので注意。


11Swift

SwiftAppleによって作られたAppleのための言語であるiOSアプリiPhoneアプリと言い換えても良い)を作るためだけに存在している。

言語自体は他と比べて新しいため文法機能イケてる雰囲気があるので基本的はいいのだが、iOSアプリ以外で使っている人は多分世界で5人くらいしかいないと思う。なのでiOSアプリに興味がない人はやめておきましょう。iOSアプリを作りたいあなたは他に選択肢はない。Swiftをやりなさい。


12Objective-C

Swiftが生まれる前はiOSアプリを書くためにObjective-C必要だったため、多くの人がこの言語を使っていた。が、今はSwiftがあるので、古くからあるObjective-Cアプリメンテナンスする時以外に使う機会はない。名前すら覚える必要がないので存在を忘れてしまって構わないが、これだけ順位が高いということは多くの企業がいまだにObjective-Cで開発し続けているということであり、ニッチ需要はこれからも残るのかもしれない。


13位タイ Scala

Scala関数型言語と呼ばれる言語の一つ。Javaの親戚みたいなものなのでJavaとの連携が容易であり、上手く使えば性能も出るしコード量も少ないしバグも少なくて最高、な感じらしい。が、その分難易度が非常に高いので初心者が手を出すものでは絶対にない。どんなに早くても他に二つは言語を覚えてから勉強しましょう。Javaを覚えてからやるのがベター


13位タイ R

R言語データ解析用のプログラミング言語である

正直ほとんど書いたことがないのでよくわからないが、ビッグデータというワード流行りだした頃はデータ解析用途でかなり流行っていた。その後機械学習AIブームが来て、今でも現役で使われてはいるがPythonがどんどん勢力を拡大しているので少し目立たなくなってきた、というのが個人的な印象である。まあプログラミング初心者最初にやるようなものではないことだけは確かである


15位タイ Go

Go言語比較的新しいGoogle製のプログラミング言語で、Googleのように巨大なシステムでの使用目的に作られたものであるしかし実際には様々な企業が利用しており今一番勢いのある言語と言ってもかもしれない。

他のプログラミング言語の良い点や悪い点を参考に設計されており、実行速度の速さと生産性プログラムの書きやすさ、読みやすさ)を両立できるような言語になっている。ただし、機能を増やすのではなく本当に重要機能だけに絞るという思想があるようで、他の言語に慣れていると機能の少なさに不便を感じるかもしれない。

学習コストが低いという点では最初に学ぶ言語として適しているかもしれないが、GoだけでWebサービス等をサクッと作れるのかというと微妙なので、アウトプットを出しにくいというのはあるかもしれない。

二番目や三番目に学ぶ言語としてはオススメ


15位タイ Shell

シェルというのはテレビなんかでハッカー的な人間PCを開いて謎の黒い画面に白い文字を打ち込んだりするアレである説明としては正確ではないがまあ大体そんなもんである。何が言いたいかというと初心者最初に学ぶとかそういうものではない。しかし実際に開発の仕事をやるとシェル知識はあったほうがいいし、シェルに多少詳しくなるとPC上でテキスト操作をしたりファイルをいじったりというのが便利にできるようになる。ただし(通常は)極める必要はない。

Shellと言っても実際にはbash, csh, tcsh, zshなど色々あるのだがそれらをひとまとめにしてShellとなっているようだ。


17PowerShell

PowerShellは上のShellの親戚みたいなもので、ShellがMacLinuxで動くのに対しPowerShellWindowsで動く。そんだけである。あと正直あまり知らない。


18位 Perl

ランキングの中ではかなり昔からある言語で、サーバーと呼ばれるマシンには大体Perlが入っている。そのくらい市民権を得た超有名言語で、C言語C++で書くほどでもない小さなプログラムはとりあえずPerlで書く、というくらいには広く使われていた。インターネット初期はほとんどのWebサイトはPerlで書かれていたとかいないとか。PHPなどの登場はその後である

今でも広く使われてはいるが、RubyPythonPerlの後継的な位置付けであるため、初心者が新しくPerlを学ぶメリットというのはあまり思い浮かばない。何か特定目的があるのであればいいと思う。


19位 Kotlin

Kotlin簡単に言えばBetter JavaであるJavaをもうちょっといい感じに書きたいという気持ちで作られた言語で、Scalaと同じくJavaの親戚のようなものである

ランキングの中ではSwiftと並んでかなり新しい部類。AndroidアプリKotlinで書けるようになったことがきっかけで人気が爆発的に上昇、今ではWebの開発にも使われていたりする。

とは言えまだまだ新参者といった感じで、ドキュメントなどの情報も他の言語に比べると物足りないので初心者には厳しいかもしれない。

言語自体はとてもいい感じなので、もう少しコミュニティ成熟してくれば最初に学ぶ言語選択肢として有力になるかもしれない。


20Haskell

HaskellScalaと同じく関数型言語であるScalaJava的な書き方でも動くの対し、Haskellは「純粋関数型言語」と呼ばれ、ランキング中の他の言語とは一線を画した書き方になる。どう考えても初心者にはオススメしない。少なくとも他に二つは言語マスターしてからやりましょう。


総評

なんとなくWebに興味がありそうならJavaScriptRubyもしくはPHPAndroidアプリに興味があればJavaiPhoneアプリに興味があればSwiftAIデータ分析に興味があればPython3Dゲーム開発に興味があればC#。この辺りをやりましょう。

特に目的がないのであればフィーリングで選んで大丈夫ですが、やめておくべき言語というのはあるのでその辺だけ参考にしてもらえれば。

なお筆者はただのヘボプログラマであり、大好きな記事http://www.mwsoft.jp/column/program_top10.html) の現代版かつより初心者向けなものを書いてみたいと思ってこの記事を書きなぐった次第である。あまり真に受けないよーに。

ログイン ユーザー登録
ようこそ ゲスト さん