kなんとかの日記 このページをアンテナに追加

2009-11-13

グーグル、C/C++に代わる新言語「Go」をOSSで公開

| 23:33 |  グーグル、C/C++に代わる新言語「Go」をOSSで公開を含むブックマーク

Google が新しい言語を発表。Noop涙目。

Goはグーグルの社員7人が「20%の自由時間」を利用して開発した。設計・実装を行っているのが分散OSPlan 9」の創案者であるロブ・パイク氏や、Unix、Cの生みの親、ケン・トンプソン氏、Google ChromeV8エンジンを開発したロバート・グリースナー氏など錚々(そうそう)たるメンバーで、こうした点でも注目を集めそうだ。

グーグル、C/C++に代わる新言語「Go」をOSSで公開 − @IT

言語仕様も興味深いけど、開発者の顔ぶれがすごい。彼らは今Googleにいたのか。大学の教授にでもなっているんだと思ってた。

 Goは軽量な型システムを備えた静的型付け言語という。型の暗黙変換はない。近年、静的型付け言語で記述が冗長になりがちなことなどから、動的型付け言語の人気が高まっているが、それは多くの静的型付けの実装が悪かったからだ、とパイク氏は指摘する。

まったくだ。「静的言語である」ことと「簡潔で使いやすい」ことは両立することに気づいてないやつが多すぎる。静的であることを、使いにくさの言い訳にするな。

 Goには“インターフェイス”と名付けられた仕組みがあり、パイク氏自身は「おそらくGoの中で、もっとも斬新なアイデア」だとしている。Goのインターフェイスは、C++でいえば、純粋仮想関数に似ているという。データメンバがなく、すべての関数が仮想関数であるようなクラスだ。Goでは、あるインターフェイスが定義するメソッドをすべて実装した型は、そのインターフェイスを実装しているものと見なされる。こうして個々のメソッドという実装をクラスという概念でまとめるよりも、より柔軟な型とメソッドの対応付けが可能になるのだという。

これはJavainterfaceのように実装の共有はしないのか、それともRubyのmoduleのように実装の共有も可能なのか。『もっとも斬新なアイデア』というからには、後者じゃないと困る。

 Goで注目すべきなのは、並列処理を念頭に設計されていることだ。Goではmutexやロックといった機構のほかに、抽象度の高い“ゴールーチン”(Goroutines)や“チャンネル”(Channels)といった仕組みを備えている。

それもいいんだけど、数量型とかDecimalのサポートとかはないんだろうなあ。なんかニュースを見る限りは、お金を扱うようなアプリケーション向けの機能は特になさそう。「0.05」を10進数で扱ってくれる言語ってやっぱりCOBOLぐらいなんだろうか。


・・・


FAQをちら見した。


例外がない言語かよ。まじっすか。萎えるなあ。

あのいあのい 2009/11/14 02:09 以下の記事を元にしたただのネタですよ... たぶんね。
http://okwave.jp/qa5419623.html

あのいあのい 2009/11/14 02:13 すみません。見当違いでしたね。削除願います。

PerlerPerler 2009/11/14 05:10 > 自分がろくに知らん言語をよくもまあ批判できるもんだわ。

いや、全く。本日のおまえが言うなブログ記事ですね!
Perlのこと知らないでとばっちりで例外機構もないとか間違えたこと書かれてホントいい迷惑です。

undefundef 2009/11/14 19:19 > Perler
例外処理が出来るのと、例外処理機構が在るってのは別。

Perlのことを知らないでとばっちりで例外機構があるとか間違えたこと書かれてホントいい迷惑です。

PerlerPerler 2009/11/15 22:09 > undef

http://d.hatena.ne.jp/perlcodesample/20091120/1246679588

PerlerPerler 2009/11/15 22:33 > undef
evalは立派な例外処理機構ですがなにをもって例外処理機構ではないと
おっしゃってるのでしょうか?
C++やJavaに習ってtry〜catchじゃないと気にくわないってだけですか?

kwatchkwatch 2009/11/16 07:15 > evalは立派な例外処理機構です

え〜、eval はあくまで動的にコードを実行する機能であって、例外処理機構じゃないよ。
例えるなら、
・Javaのinterfaceは多重継承のかわりにつかえるかもしれないけど、多重継承ではない
・Javaの匿名クラスはクロージャ代わりに使えるかもしれないけど、やっぱりクロージャではない
・Rubyの「func(:arg=>value)」はキーワード引数のかわりに使えるかもしれないけど、本物のキーワード引数じゃない

キミはundef氏の『例外処理が出来るのと、例外処理機構が在るってのは別。』という言葉をもっと噛み締めるといいと思うよ。

PerlerPerler 2009/11/16 11:08 > kwatch
> え〜、eval はあくまで動的にコードを実行する機能

kwatchさんがおっしゃっている「コードを動的に実行する」というのは
eval EXPR
です。
私が言っているのは
eval BLOCK
です。
全く意味は違います。
マニュアル読んでれば「eval はあくまで動的にコードを実行する機能」なんてとんでもなことはいわないはずです。

知らないことをさも知ってるような振りして語ってるのはよく分かりましたから、さっさと訂正してPerlのことを語るのをやめて頂けませんか?

rubyistrubyist 2009/11/16 11:41 http://web.sfc.keio.ac.jp/~hattori/prog-theory/main_c10_s2.html

ランタイムエラーを検出して例外処理をする為の機能を言語が備えてるんだから例外処理機構を備えていると言えると思うよ。
備えてなきゃランタイムエラーの時点で処理を中断か、例外処理が起こりえる条件をあらかじめ想定して例外処理(not 例外処理機構)を事前にしなきゃいけなくなるからね。

undefさんやkwatchさんの言う例外処理機構ってのがいったいどんなものなんなのか僕も分かりません。
是非解説をお願いします m( _ _ )m

kwatchkwatch 2009/11/17 02:15 perlerさん:

> 全く意味は違います。

え、一緒じゃないの?どちらもコードを動的に実行する点では同じで、単に引数が文字列かクロージャかの違いだけでしょ?
ワシ、勘違いしてたのかな。

 ## これって、
 eval { print "in closure\n"; };

 ## これと一緒だよね? 違う?
 my $block = sub { print "in closure\n"; };
 eval &$block;

> マニュアル読んでれば「eval はあくまで動的にコードを実行する機能」なんてとんでもなことはいわないはずです。

http://perldoc.perl.org/functions/eval.html だと

In the second form, the code within the BLOCK is parsed only once--at
the same time the code surrounding the eval itself was parsed--and
*executed* within the context of the current Perl program. This form is
typically used to trap exceptions more efficiently than the first (see
below), while also providing the benefit of checking the code within
BLOCK at compile time.

ってあるから、動的にコードを実行する機能であってると思うけど?

ところで、これって理解できました?
> ・Javaのinterfaceは多重継承のかわりにつかえるかもしれないけど、多重継承ではない
> ・Javaの匿名クラスはクロージャ代わりに使えるかもしれないけど、やっぱりクロージャではない
> ・Rubyの「func(:arg=>value)」はキーワード引数のかわりに使えるかもしれないけど、本物のキーワード引数じゃない

これらの例えが理解できれば、「例外処理ができる」ことと「例外処理機構を備えている」ことは別物だとわかると思うんですけど、どうでしょうか。

kwatchkwatch 2009/11/17 02:33 rubyistさん:

> ランタイムエラーを検出して例外処理をする為の機能を言語が備えてるんだから例外処理機構を備えていると言えると思うよ。

それは「signal trapができるから例外処理機能を備えていると言える」「setjump/longjumpがあるから例外処理を備えていると言える」と同じようなもんだと思うよ。
あるいはrubyの「func(arg:123) 」をキーワード引数と言い張るようなもの。
いちいち if ($@) ... と書かないといけない (書かない場合は見捨てられる) ようなのを例外処理機構と言えるのか疑問。せめてスタックは自動的に遡って欲しいよね。
#毎回 if ($@) と書くのは、毎回関数の戻り値を調べるのと似てるよね。


Wikipediaを見ると、Schemeの例が載ってた。

http://ja.wikipedia.org/wiki/%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86
> Scheme では言語レベルでの例外処理を持たないが、これは継続が
> 存在するため例外をライブラリレベルで実現できるからである
>(標準仕様であるSRFI-34で定義されている)。

Schemeでも例外処理はできるけど、『言語レベルでの例外処理を持たない』とある。Perlも同じことじゃないでしょうか (たとえError.pmを使ったとしても)。

kwatchkwatch 2009/11/17 02:41 まつもとさん曰く:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/64
> * rubyには例外処理がある
> perlでは例外処理はevalを用いて間接的に実装する.

別の人:

http://d.hatena.ne.jp/hottolinkblog/20090923/1253709356
> ここで少し話が逸れますが、Perlでは例外処理機構がありません。
> といっても、完全にないわけではなく、evalを利用することで実現します。

世間的にはこういう認識だと思いますけど、いかがですか? > perler, rubyist

kwatchkwatch 2009/11/17 09:46 んー、ちょっと心配になったので、map のサンプルを貼ってみる。
まず、map { }, @arr の第1引数はクロージャのはず。

use strict;
use Data::Dumper;

my @arr1 = (1, 2, 3, 4);
my @arr2 = map { $_ * 2 } @arr1;
print Dumper(\@arr2); #=> $VAR1 = [2,4,6,8]

my @arr3 = (1, 2, 3, 4);
my $block = sub { $_ * 2 };
my @arr4 = map &$block, @arr3;
print Dumper(\@arr4); #=> $VAR1 = [2,4,6,8]

で、eval の第1引数もおんなじことだと思ってたんだけど。違うかな?

perlerperler 2009/11/17 10:43 try { ... throw ... } catch {...}

eval { ... die ... } if ($@) { ... }
とで、セマンティクス的な違いがあるようには見えないんだけど。

perlerperler 2009/11/17 10:44 あー、前の人の名前見ずにコメントしたけど、おいらと上の人は別人です。

文系から見て文系から見て 2009/11/19 17:08 他人を汚して自分を立てないと
自分で使用している言語の意義も唱えられない。
それが真のプログラマー。

kwatchkwatch 2009/11/21 09:47 perlerさん:
> try { ... throw ... } catch {...}
> と
> eval { ... die ... } if ($@) { ... }
> とで、セマンティクス的な違いがあるようには見えないんだけど。

んなわけねー。
try { ... }
catch(NameError ex) { ... }
catch(TypeError ex) { ... }
finally { ... }
と比べてみようよ。

・例外の種類を指定できない。catch(Exception ex) としか指定できないようなもの。言葉をかえれば、興味のある例外だけをcatchしてそれ以外は上位に伝播する仕組みがない。
・例外が発生してもしなくても終了処理を実行する仕組みがない。

こんくらいのことはすぐにわかると思うんだけど、それが分からないってことは、evalじゃない例外処理機構を備えた言語をperlerさんは使いこなしていないということでしょうね。try-catchとevalとで『違いがあるように見えない』んじゃ仕方ない。
#つうか、『catch {...}』みたいな書き方をしている時点で気づくべきでした(普通はそんな書き方しない)。

ところで、『例外処理が出来るのと、例外処理機構が在るってのは別。』という言葉は理解できました?これが理解できないなら話は噛み合ないままなので、理解できたかどうかを、YesかNoかで教えてください。

あと、これも理解できました?理解できたらYes、理解できなかればNoでお答え下さい。
> ・Javaのinterfaceは多重継承のかわりにつかえるかもしれないけど、多重継承ではない
> ・Javaの匿名クラスはクロージャ代わりに使えるかもしれないけど、やっぱりクロージャではない
> ・Rubyの「func(:arg=>value)」はキーワード引数のかわりに使えるかもしれないけど、本物のキーワード引数じゃない

kwatchkwatch 2009/11/21 09:48 文系からみてさん:
これが他人を汚しているように見えるんだったら、メガネが汚れているせいだと思うので、たまには拭いてあげてください。

kwatchkwatch 2009/11/21 10:05 ちょっと補足:

perlerさん
> セマンティクス的な違いがあるようには見えないんだけど。

今はセマンティクス的な違いがどうのこうのじゃなくて、Perlが例外処理機構を備えているかどうかの話ですよー。話をそらさないでー。
話の論点が分かってないひとは、もう一度下の言葉を読み直すといいよ。

> 例外処理が出来るのと、例外処理機構が在るってのは別。

> Schemeでも例外処理はできるけど、『言語レベルでの例外処理を持たない』とある。
> Perlも同じことじゃないでしょうか (たとえError.pmを使ったとしても)。

oskimuraoskimura 2010/06/18 19:26 >Schemeでも例外処理はできるけど、『言語レベルでの例外処理を持たない』とある。

R6RSでは例外が定義されています
http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-8.html#node_chap_7

名無し名無し 2016/03/22 20:20 おれおまえきらい。
これからずっと読んでいくね
おまえのこと

トラックバック - http://d.hatena.ne.jp/kwatch/20091113/1258122783