nabeshinによる
2008年03月19日 15時10分の掲載
お仕事と鍛錬と部門より。
お仕事と鍛錬と部門より。
あるAnonymous Coward 曰く、
本家記事より。思考の幅を広げ、プログラミング自体に対する理解を深めるためにも他のプログラミング言語を学ぶことが大切だそうだ。新しい言語を学ぶことによりスキルを大きく伸ばせるとChris Diggins氏はブログで説いている。彼はC++やJavaの経歴を持つ人たちが次に学ぶ言語として、Rubyを挙げている。「ダイナミック言語の力量を試すことが出来、SmalltalkやPerl、そしてLispの概念を活用できる」からだそうだ。しかしどれか1つに絞るとすれば「どんなバックグランドをもつプログラマであろうと取っ付きやすい」Scalaが一番のお勧めとのこと。
このScalaを知らなかったのですが、使っている、使ったことのある方はいらっしゃいます? 新たにプログラミング言語を学ぶとしたら何を学びたいか、もしくはお薦めの言語などありましたらそれもぜひ。
この議論は賞味期限が過ぎたので、保存されている。
新たにコメントを書くことはできない。
あえて変なのを挙げてみる (スコア:3, 興味深い)
実用性はともかくとして、こういうのも知っておいて損はないかと。
Re:あえて変なのを挙げてみる (スコア:2, 興味深い)
じゃあ便乗して
親コメント
Re:あえて変なのを挙げてみる (スコア:2, 参考になる)
whitespace
すべて、[space][TAB][LF]で記述する言語。
http://compsoc.dur.ac.uk/whitespace/ [dur.ac.uk]
親コメント
面白そうですね (スコア:3, 参考になる)
http://www.thinkit.co.jp/free/article/0711/4/3/
Best regards, でぃーすけ
そもそものハナシですが (スコア:2, おもしろおかしい)
どちらか一方だけでもマスターできるかどうか怪しいのに
この上さらに新しい言語を学ぼうなんて大それた事は考えてもいませんでしたよ
私が無能なだけ?
Re:そもそものハナシですが (スコア:2, 興味深い)
他の言語もそう言ったスタンスで学ぶと、無理が出てくる。
そうでなくて、言語仕様や文法のみ、あるいはそれに加えてごく基本的なライブラリの使い方だけを学ぶ、というスタンスでも、「プログラミング自体に対する理解を深める」ことになら十分役立つと思うよ。
親コメント
Re:そもそものハナシですが (スコア:2, 興味深い)
そういう意味でも、毛色の違う言語を覚えるのはおすすめです。
親コメント
ハイブリッド型言語 (スコア:2, 参考になる)
普通に使っています。Scalaは
・処理系がJVM上で動作し、Javaのクラスに容易にアクセス可能
・クラス指向OOP(手続き型)と関数型のハイブリッド
・静的型付けでかつJavaの型システムとのギャップが少ないため、
Javaのクラスを継承してScalaのクラスを作成することが問題無く可能
などの特徴を持っているため、特にJavaプログラマが新たに学ぶ言語として
お勧めです。また、単にオブジェクト指向と関数型のハイブリッド型であるに
とどまらず、
・implicit conversionによるユーザ定義の自動型変換(Views)
・ユーザ定義可能なパターンマッチング(Extractor)
・structural typing
・path-dependent type
などの、他の言語にはあまり見られない面白い機能も持っているので、言語オタクの
方にもお勧めできる言語になっていると思います。
どんなプログラマでも・・・ (スコア:2, 参考になる)
まぁ、それはさておき、
「いろんな経験者が移行しやすい」事と「新たに学ぶのに適している」事は全く相関性がないと思うが如何か?
提案 (スコア:2, 興味深い)
あなたの予想に反して、このページが見えているでしょうか?
Pikeがいいです (スコア:2, 興味深い)
http://pike.ida.liu.se/ [ida.liu.se]
Cの知識でほとんどなんとかなるから(構文がほぼそのまま)。
クラスも使えるんで、Cの次にC++に行かずにPikeってのもありかも。
また、ちょっとアルゴリズムのテストってな時に良くて、
sscanf()、sprintf()やらsizeof()まであるので、後でCにもコピペしやすい。
Re:Pikeがいいです (スコア:2, 興味深い)
苦労してます。なんかいいオブジェクト・モジュールの書き方とか使い方の情報源ありませ
んかね。
# いや、すんげー量の英語ドキュメントちまちま見てはいるんですが、今一つリファレンス
# マニュアルの見方がわからない(- -;)
理解できてないためにいろいろ(?_?;)連発ですが、なんとなく書いてて安心しますね。
型指定を明示もできるあたりがいいのかな。
親コメント
とっつきやすいということなので、 (スコア:2, すばらしい洞察)
使用例 (スコア:1, 興味深い)
といっても、ほとんど一人で書かれているようですけど。
同じお題の、他の言語での解答例と見比べてみると、どんな言語かわかりやすいかもしれません。
いま俺に必要な言語は (スコア:1, すばらしい洞察)
日常会話というプログラムを組み立てるのも一苦労ですよ
Re:いま俺に必要な言語は (スコア:2, 参考になる)
しゃべりは必要最低限の方がよいこともあるらしい。
ダラダラ書いていると、どの言語もロクな結果にならないらしい。
親コメント
よさそうなの全部やれ (スコア:1)
って話題に触れる機会が多いのだけどなんなんだろう?
それはそうと、
やりたいことが明白なら
それにそって選べばいいでしょ?
思考の幅を広げるためなのに
とっつき易さとかどうでもいい要素でしょ。
知ってる概念(過去の遺産)が活用できたら勉強にならんし。
# #define begin {
# #define end }
# なんというPascal
Re:Lisp系言語でしょう (スコア:1)
親コメント
Re:Lisp系言語でしょう (スコア:3, おもしろおかしい)
> Webアプリ等をPrologで作るのって無理なんですかね?
君は技術者に対する質問の仕方を良く分かってるねw
親コメント
Re:Lisp系言語でしょう (スコア:2, 参考になる)
残念ながら私はまだ挑戦したことがないのですが、SWI-Prologなら簡単そうですね。
http://www.swi-prolog.org/packages/http.html [swi-prolog.org]
親コメント
Re:Lisp系言語でしょう (スコア:2, 興味深い)
あと、Lisp系の言語なら簡単にPrologを実装できるのでLispでPrologを作ってみるのも良いかも(ずいぶん昔の学生実験の課題でした)。
Best regards, でぃーすけ
親コメント
Re:メソッドに const がつけられない言語はクソ (スコア:1)
だとすると、そーいうのはScalaにはありません。
ただ、無くてもさほど支障は無いですが。
親コメント
Re:メソッドに const がつけられない言語はクソ (スコア:3, すばらしい洞察)
きっとそれでしょう。
そんな彼には haskell を薦めておきましょう。
constってわざわざ書かなくても、全部 const になるよ!
# 変数すら無いけどな!
親コメント
Re:パラダイム (スコア:2, 興味深い)
論理型は、「複数の変数の関係を記述する」「ルールの適用の順に実行」
という差が一応あるんだけど、工夫すれば相互に記述出来るので等価といってもいいかな。
一見、関数型は手続き型に見えるし、副作用を持つ関数型言語は、実際、手続き型言語と
ほぼ同じ。論理型でも、Prolog なんかは、backtrack以外は、ほとんど手続き型と言っても
良い。
一方で、OPS5系とかCommitted Choice言語、あるいは関数型言語でも、
実行の順序も外側の関数で実行出来るものから実行するなんてのがあって、
どんな順序で動くのか予測が難しいものは、手続き型からは遠い。
人が知らない言語、あるいは学ぶのが難しい言語を使いこなすというのは、快感ではあるんだが、
虚しくもある。(淋しいという感じ?)
親コメント
Re:最も最近覚えたプログラム言語=脳内基本構文 (スコア:1, 興味深い)
for「文」とかwhile「文」とかの文法を、です。
あ。(今は)文と式の違いを指摘したいわけではないので、
for「式」と呼ぶ言語であっても扱いは同じとします。
>ごりごりと書くもので。
それは(私の言い方でいえば)
繰り返しじゃなく、
繰り返しの中っていうか後に続く実行部分、です。
for (xxx) yyy
のyyyの部分ね。
今気にしてるのはそこじゃなく
for (xxx)
までの部分です。
>関数型言語だとか、Rubyではinjectとか使って自作
まあ結果的にはそうなんですが、
この繰り返しの自作の話は、
関数型言語限定の話題だと強く言い切る必要は無い話題だと
思うんです。
というのは、やってることは結局はコールバックだから。
手続き型大好きな人に簡単に説明するには
「Cのqsort関数を見てね」
というべきかな。
qsort関数を見て「これは手続き型言語のモノではない!」とか言う人はあまり見かけませんね。
>ごりごりと書く
最終的には書かないとならない処理は書かないとならないので、
その意味でいえばコードはちっとも短くならなかったりすること
もあるんですが、
そういう部分を「切り離せる」のは快適ですよ。
buf = []
for x in a
if x.hoge continue
if x.fuga buf += x.y
end
みたいなのは、
「1つの」ループの中に
色んな分岐やデータ収集が
ごちゃ混ぜなのが厳しいです。
これが
buf = a.where{|x| x.hoge}.where{|x| x.fuga}.select{|x| x.y}
(文法はRuby風ですが、
whereとかselectっていう語の選び方は、
RubyじゃなくあえてSQLにあわせてます)
なんて書けると、
「行を絞る部分」「列を絞る部分」(SQL風にいえばですが)
を「ばらばら」に扱えるんです。
扱うってのは、読んだり書いたり(修正したり)するときに、
切り離す単位が凄く判りやすいっていう意味。
メソッド+ブロックの単位で、
コードを気楽に切り貼りできます。
順番変えるとかもサクサクできるし、
変えたときにどう振る舞いが変わるかも「見ればわかるしょ」にかなり近い。
あと、ちょっと汚れた話。
上から目線の上流野郎どもが書いた仕様書には
気楽に「hogeなもののみ表示」とか「yカラムだけ表示」とか
日本語で書いてるわけだが、
上記のようにして、日本語とほぼ同じ粒度でコードが書けるようになると、
そういう場末SEじみた仕事も、
いくらかはラクになるんだ。
翻訳(ループへの展開)を人間にやらせるからバグが出るんだ。
言語にやらせろだ。
>手続き型言語では繰返しは覚えるもんでないでしょ?
>ごりごりと書くもので。
まあ仮に本当にそうだったとしても、私は「こんなに面倒ならば手続き型言語など要らぬ!」と涙するだけです。そして北斗もとい関数(ハイブリッド)言語に移行するだけ。
べつに「手続き型にこだわりたい」なんて全く思ってません(言ってもいません)。「BASICは」「Cは」「Rubyは」といっただけですし、それらに対して「こだわりたい」とも言ってない。
今はRubyですが、もっとラクなものを見つけたら乗り換えます。それだけ。
書くのが面倒だと自覚してしまった言語(特定言語なり方法論なり)に拘って「自滅」してしまいたくないので。
親コメント
Re:Ruby は後でよい、Lisp の方を (スコア:1)
Javaしか使っていませんが、OCamlとSacalaには興味があるんですよね。でも、いまだに手をつけていないのですが。
これはプログラミング言語ではなく仕様記述言語のことでしょうか。であれば、いくつか実用化されているようですが。たしかFelicaは本格的に仕様記述言語を導入したと、どこかで見た気がします。Felicaの場合はVDMをつかったとか。
私はフォーマルメソッドの専門家ではないので、VDMでの仕様記述でなにがどこまで生成されるかわかりませんが、組込系では徐々に導入されているようですね。
Webアプリとかは多分導入が難しいんだろうなぁ。
親コメント
Re:Lisp系言語でしょう (スコア:1)
既にJava,PHP,Perl等をやってきた方であれば、
・諸先輩方が言われてるように、関数型言語から新しい考え方を学べるのは楽しい。
・言語仕様がかなりコンパクト(その分、変と言われてるようだけど)なので、覚えるこ
と自体は楽。
・専用のシェルで評価実行しつつ、コンパイルして実行、他スクリプトやGUIやWebでも
実行できるので、試しやすいし、ほとんどのプラットフォームが抑えられているので間
口が広い。
・標準でかなり広範囲のモジュールが附属してて、CEANやjungerl等のライブラリサイ
トもあるので、それほど自分で拡張とか考えなくていい
・特性としては軽量プロセスの生成を基本とした、分散並列処理がすごく得意で、そっ
ち方面へのプログラミングのステップアップとしては最良だと思う。
・Ejabberd(Jabber)、Yaws(Web)、Erlyweb(RoRみたいなやつ)、Mnesia(分散DB)等
勉強がてらに触って楽しそうなものもでてきてる。
・最近「プログラミングErlang」という良本が出た!
逆に、
・最近はあまり流行ってない?
・国際化とか頭っからないらしい。日本語を扱えないことはないけど、不便。
という感じですが、Amazon EC2とかで何十台も計算機資源をつかってなんかし
たいなと夢を見ながら学んでます。
親コメント
Re:Ruby は後でよい、Lisp の方を (スコア:1)
AndroMDAとかはWebアプリも作れるはず。
参考:
http://codezine.jp/a/article.aspx?aid=132 [codezine.jp]
親コメント