Go towards a Word-Progress

   ~言霊とプログラム言語の共進化!?

11月/09

13

限界を打ち破るはScalaかGoogleのGoか (「Scala入門」に勝手流追記その2)

Scala入門 勝手流追記 その2。元記事が大上段なので、こちらも大上段に。

Scalaで実サービスをリリースしている著者らのJavaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは~前編(codezine誌)

今回は、codezine、1位と2位の記事がScalaとGoであること(11/12時点)にちなんで両者を比較しつつ、元記事に一点だけ突っ込む。

ランキング

[追記@昼間]
以下、熱が下がった直後の明け方に書いたんで、いろいろ記載が粗いので、前提条件・抜け落ち等を補充。
◇プログラミング言語比較の前提はTiobeのランキングのような検索エンジンベースのランキング。
 当然、書籍ベースのランキングや「魂」のランキングは十分に加味されていない・・・のはさておき、そもそも検索エンジンという仕組みへの信頼性が落ちている(少なくとも不況下の幻滅期にある)と思われるので、プログラミング言語の流行り廃りの議論に、こうしたランキングが良いかは、不明(といっても、Tiobeランキングのどの位置にGoがやってくるのか、皆興味あるだろうが)
◇Tiobeベースで話を進めているのに、メジャー言語にPHPが抜けていた。
 これはScala v.s. Goということでミドルから下を主に考えていたから。少なくとも、Goベースのwebサーバは遠からず出てくるだろうし、その上でPHPが動くだろう事も明らかなので、PHPの文字を補っておいた。そもそもこのサイトもWordPress。いや速度面はさておき、良く出来ている。
◇そして、何より、議論のベースに静的片付け言語万歳。C系構文は永遠に不滅です、って言うのがあった(Goはいうまでもなく、ScalaもけっこうC系言語)。
 これは、
  「真のバカでも使えるものを設計しようとして人々がよくやるミスは、
   真のバカのバカさ加減を過小評価することだ」
     --Douglas Adams
 (出典 Diomisid Spinellis著 『コード・リーディング』, p65)
 という警句を、コンパイル時に真にバカなミスをしまくっている自分なりに重く受け入れているから。システム系言語はバカの壁に大いに配慮してほしい。ともあれ、Goみたいのがでてくると、下のレイヤの本を読もうという気になる。Goはひょっとしたら泡沫言語になるのかもしれないけれど、少なくとも、Cに近いレイヤに刺激を与える貢献は達成するのでは。
[再度追記
『コード・リーディング』を開いたついでに、監訳者であるMatz氏のにっきを見ると、Goについてのコメントが。やはり、Goには、尊敬するMatz氏も気になる変態言語(というか、大胆な言語)の側面あり。コメントでのやりとりにあるとおり、実装の継承(共有)まわり、プロトタイプ継承っぽいのでは・・・。「半人前の言語」あるいは「小学1年生(ただし神童)くらいの言語」だからこそ、Goと共にプログラミングを学ぶ価値はある。

<本文>

JRuby/Jythonなどスクリプト言語由来の言語と異なり、Javaと同様の静的コンパイル言語であるScalaは、Javaバーチャルマシンの主流言語の座をめぐり、本家Javaに挑む挑戦者に位置づけられる。

その試みが成就するのは、早くとも数年後であろうが、Javaの袋小路を打ち破る方向性をScalaは示したといえる。

Javaに対するScalaの利点は、以下の3つであろう。

  • 不変性(val)の上手な導入による容易な並列処理プログラミング ※メモリリーク等を防ぐガベージコレクションの仕組みあり
  • 簡潔な表記と型を含めたカスタマイズを可能とする言語内言語(DSL)構築能力 ※タイプセーフなスタイルを採用
  • スクリプトに近い簡潔な記述(関数型言語の型推論などに由来)

-----------

と書いたところで、これらの特性はただいま祭り中のグーグルの新プログラミング言語Goの特性とかぶることに気がつく。

C言語に対するGo言語の利点(私見)

  • ・goroutine等による容易な並列処理プログラミング ※メモリリーク等を防ぐガベージコレクションの仕組みあり
  • ・interface機能による言語拡張構能力(C++のtemplateに近いもの、か) ※タイプセーフなスタイルを採用

一方、ScalaとGoの明らかな相違点

  • ・Scalaの言語仕様は巨大。Goの言語仕様は現時点では小さい => コンパイル時間についてはGoの圧勝(実行速度は最適化されたJavaVM上のScalaが速い場合もあろう)

※JVMかネイティブかはさておく。小飼氏ではないが、ネイティブScalaの可能性だってある。

Goの方の利点は2つだけであるが、これはGoがCに近しい低レベルな言語であることによる。RubyがCで実装されたように、Goの上でGoと親和的なスクリプト言語が出てくるのも遠くないことと思われる。

そうなると、2010年代の新主流言語をめぐる争いの中で、注目株のひとつが、

Scala v.s. (Go+(新)スクリプト言語)

というものになる可能性がある(あくまで仮説)。

もしかすると、この2言語の争いは、C,Java,C++(かろうじてC#)といったメジャー言語に割ってはいる最後の新言語をめぐる争いとなるかもしれない

※それ以降(2020年以降?)にくる「新言語」は、もはやアルファベットと記号で表記するプログラミング言語でないのかもしれない。

※個人的には、(新)スクリプト言語の座は、clojureであってほしいと思っているのだが、、実際には、PHPやRuby、あるいはそれらの新種がその位置を占めるのかもしれない。

----------

この仮説はさておき、Goの登場は、本格的な並列処理対応を打ち出した新型の手続き型言語の登場ということで、並列処理対応といえば、関数型言語Erlang,Scala,Clojure・・・という流れを変えるきっかけになるのかもしれない。

これは、かつての総合格闘技をグレーシー一族が関節技・寝技で席巻していた中で、グレーシーを打撃で打ち破った猛者が出たことで、打撃系が一気に見直されたようなもの・・か?(少なくとも、関数型言語には、関節技的なマニアックさがあるのは事実 ^^)

とここで、気がつくのは、数ある関数型言語の中で、唯一Scalaだけが、手続き型プログラミングも普通にかけるハイブリット言語であることを打ち出していることだ。
(実際、codezine記事のパテントビューロ社も手続き型言語の経験者のみが集まり、Scalaで実システムを作り上げている)

すなわち、Goの登場により、新世代の並列処理もやはり手続き型プログラミング・スタイルが主流となったとしても、Scalaは十分生き残っていくポテンシャルがあるのだ。

※言語仕様は巨大だが、現時点でも実行速度は相当速い

再び述べるが、やはり、「現存の言語では最も美少女な Scala」(小飼弾言を日々Scalaを使っている身から一部修正。現時点のScalaは大人の女性ではなく女子高校生レベルの成長途上にある)なのだ。

Scalaと、センセーショナルにデビューしたGo[golangのMLは1日で1000人近い参加者という押すな押すな状態]との関係、今後が楽しみである。

ということで、私は、昼はScala、夜はGoをいじる毎日でいこうと思う(Goについてはgoroutineはさておいて、斬新と思われるinterfaceを押さえたい)。

さて、元Scaka入門記事に一点だけつっこみ

6ページ目「Arrayは直接にAnyをデータ要素として持つことはできないようです(注4)」

少しミスリーディングな記述である(Genericや型パラメータの解説前なので仕方ないが)。Scalaの利点は静的な型づけにある。故に、入門記事であっても型の話は慎重に書かなければならない。

ので、勝手に補充

例えば、mapをもちいたArrayでは、ANY型を持つことができる(持ってしまう)

val anyarr =
   Array.range(1,101).map { n => n match{
            case _ if (n%15 == 0) => " FizzBuzz "
            case _ if (n%3 == 0) =>"Fizz "
            case _ if (n%5 == 0) => "Buzz "
            case _ =>  n
      }
   }

※この例は、以前書いた関数型FizzBuzzのArray版
実行してみる :

scala> val anyarr =
Array.range(1,101).map { n => n match{
            case _ if (n%15 == 0) => " FizzBuzz "
            case _ if (n%3 == 0) =>"Fizz "
            case _ if (n%5 == 0) => "Buzz "
            case _ =>  n
      }
}
anyarr: Array[Any] = Array(1, 2, Fizz , 4, Buzz , Fizz , 7, 8, Fizz , Buzz , 11, Fizz , 13, 14,  FizzBuzz , 16, 17, Fizz
 , 19, Buzz , Fizz , 22, 23, Fizz , Buzz , 26, Fizz , 28, 29,  FizzBuzz , 31, 32, Fizz , 34, Buzz , Fizz , 37, 38, Fizz
, Buzz , 41, Fizz , 43, 44,  FizzBuzz , 46, 47, Fizz , 49, Buzz , Fizz , 52, 53, Fizz , Buzz , 56, Fizz , 58, 59,  FizzB
uzz , 61, 62, Fizz , 64, Bu...

ちなみに、タイプセーフなプログラミングができるScalaではAnyとなったArrayからIntやStringなど任意の型を抜き出すことができる。

scala> anyarr.filter(_.isInstanceOf [Int]).map (_.asInstanceOf[Int]) res51: Array[Int] = Array(1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46,  47, 49, 52, 53, 56, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 77, 79, 82, 83, 86, 88, 89, 91, 92, 94, 97, 98)
scala> anyarr.filter(_.isInstanceOf [String]).map (_.asInstanceOf[String]) res52: Array[String] = Array(Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fi zz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBu zz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz )

===========================

[追記] Scala以外の関数型言語が好きな方へ(というか、Scalaは関数型言語でないと思っている方へ)。

何を隠そう私は長門clojure萌えである。実際、Scalaのように全方位外交巨大仕様でなく、小さな言語仕様で手になじむ言語・萌える言語ならば、それで良いではないか。

いつの日か、長門clojureと日がな暮らす日が来ることをひそかに私も願っている。

なぜ、clojureが長門かはここを見てほしい・・・。ぁ、真面目にclojureを知りたい方は、RubyのMatz氏のエントリにヒントを得たこちらをどうぞ(はてぶ経由でいろいろな方が訪れてくれているっぽいので、あわてて追記)。

RSS Feed

2件のコメント for 限界を打ち破るはScalaかGoogleのGoか (「Scala入門」に勝手流追記その2)

Author comment by アルケー | 2009年11月13日 at 5:44 AM

あまり自身がないが、
http://bit.ly/3yT7G3
を読ませてもらいつつ思うに、
goのinterfaceはC++のtemplateというよりは、
ioやiokeのプロトタイプベースの継承に近いものかと思ってみたり。

[以下、引用]
Golang の独特な点っていうと、
インターフェースがダックタイピング的なところ
型の継承やめて、全部コンポジションと mix-in でやるところ
・・・Ericsson Language 略して Erlang、読みはアーラン
Go っていうと「PSP Go のことかと思った」とかさんざん言われるんで、もう公式に Golang でゴーランでいいんじゃね?とか思ったり。随所に Erlang 臭さを感じるし。

ごーらん、うまいっ!

プログラミング言語Goのライブラリ ①web/http周り with ベンチマーク紹介 - Weblog towards a Word-Progress | 2009年11月14日 at 1:35 AM

[...] ※別件だが、Scala使い(やや無理くりGoとScalaを比較した記事)としては、mina2を用いた実装に俄然興味がわいた。TwitterのScala Geekががんがんコードを公開してくれいてるし。 [...]

<<

>>

トップに戻る

  Copy Right © Team WordProgress. All Rights reserved.