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

2009-11-13

PHPとJavaScriptはスクリプト言語の範疇に入らないかもしれないんだってさ

| 23:33 |  PHPとJavaScriptはスクリプト言語の範疇に入らないかもしれないんだってさ - kなんとかの日記 を含むブックマーク

(追記: 2009-11-16: 引用元のブログは「SH2の日記」のコメント欄からであり、SH2氏とは別の方のコメントです。)


さすがはJava屋さん。スクリプト言語をバカにする態度は堂々としたものだ。

JavaBlack

>PHPなどのスクリプト言語もいつでもかけるようにしとけよってね

それは全く逆でしょ.PHPプログラマの方が,JavaPerlなどの汎用言語を使えるようになっておかないとだめ.PHP「しか」書けない人は,本物のプログラマーじゃない.

そもそもPHPJavaScriptについては,スクリプト言語の範疇に含めるべきか否かという問題さえある.

http://d.hatena.ne.jp/sh2/20091106#c1257524055

つうかさ、この人こそJavaしか書けないプログラマ―なんじゃね?自分がろくに知らん言語をよくもまあ批判できるもんだわ。

あのいあのい 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 おれおまえきらい。
これからずっと読んでいくね
おまえのこと

2009-02-21

TraceMonkey とか V8 とか SquirrelFish とか、速さも大事だけどさ…

| 01:55 |  TraceMonkey とか V8 とか SquirrelFish とか、速さも大事だけどさ… - kなんとかの日記 を含むブックマーク

Mozilla が開発中の次世代 JS エンジンについてのプレゼン資料 (via オレンジニュース)。たいへんよくまとまっている。書いた人グッジョブです。


TraceMonkey に限らず、Google ChromeV8 とか Safari (WebKit) の SquirrelFish とか、なんか JavaScript 用の VM が盛り上がってるんですけど、速さばっかりが話題になっていて、メモリ消費量はあんまり話題になってないっすね。

たしかに、Web ブラウザアプリケーションプラットフォームとしてだけでなく、ゲームのプラットフォームにもなるだろうから、JavaScript のパフォーマンスが大事なのはその通りなんですけど、もっとメモリ消費量を減らすことも頑張って欲しいんですけど、無理ですかね。

Safari仮想メモリ 4 GB 弱、実メモリ 1.5 GB 弱使ってたりとかすると、ほんとゲンナリする。実際にはかなりの部分は rendering engine が消費してるんだろうけど、Tracing とか使うと JS エンジンも結構な量を消費しそうで、いやだ。


あと、動的言語で『最終速度は C や Java に匹敵する処理速度』(スライド 6 枚目) を追求するのって、なんか努力する方向が間違っているように思うのはワシだけだろうか。そんなことするくらいなら、動的言語より使いやすい静的言語を作るとか、動的言語なんだけど部分的に型指定できるようにするとか、そういうアプローチのほうが自然で無理がないと思う (JavaScript2.0 が ECMAScript 4 ベースでなくなったのは残念だ)。まあいったん広まってしまった言語はおいそれと言語仕様を変更できないから仕方ないだろうけど。

ささだささだ 2009/02/21 12:04 添削するのは誰がいいですかね.

rubikitchrubikitch 2009/02/21 13:41 英語ですがJay Fields氏のブログはどうでしょうか?
http://blog.jayfields.com/2008/06/developer-testing-and-importance-of.html などテストについて鋭い洞察があります。

ku-ma-meku-ma-me 2009/02/21 21:50 Ruby 自体のテストコードを添削してほしいです><

c-yanc-yan 2009/02/22 21:37 > 動的言語なんだけど部分的に型指定できるようにするとか、そういうアプローチのほうが自然で無理がないと思う
全く持って同感です. Common Lisp という成功例があるのに、なんでなのでしょうね.