PHPは駄目な言語なのか? 255
ストーリー by tach
日曜討論 部門より
日曜討論 部門より
Ruby開発者のまつもとゆきひろさんの日記に「PHPがいかに駄目な言語か、という話」があり、たくさんのコメントが付いている。このエントリはもともとAttacking PHPというページに関して書かれたもので、その反論としてDefending PHPというページもある。Perl Hackerのdankogaiさんも、「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違いというエントリで、PHPの問題点に関して別の視点から言及している。PHPは本当に駄目な言語なんだろうか?
(つづく...)
Attacking PHPでは、PHPが駄目な理由を以下のように挙げている(まつもと氏の日記より引用)。
- いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
- hashやlistがobjectが区別できない
- オブジェクト指向機能が壊れている
- lambda(無名関数)がない。create_functionはlambdaじゃない
- short_open_tagsやらsafe_modeやらregister_globalsがonになってるかもしれない
- 一貫性のない名前(str_replace,strlen,parse_strとか)
- 引数の順番がわかりにくい(in_arrayとかstrposとか)
- strpos('abcd','a')は0を返すが、0は偽である
- PHPで書かれたたくさんのアプリがあるがどれもHTMLとロジックが分離されてない(本当?)
- 「PHPは初心者に学びやすい」と言われる。確かにそうかもしれないが、 おかげでどれだけのSQLインジェクションやらXSS脆弱性やら、 ひどいコードが放置されていることか
- グローバル。使うんじゃないってば。
PHPに関しては昔から賛否両論があるが、Webアプリを作成するには簡単でとっつきやすいからか、多くのサイトで利用されている。 その反面、PHPで書かれたアプリの中には、ソースが読みにくかったり、セキュリティのことを全く考えていなかったりというものも多い。 PHPは、その言語仕様だけでなく実行環境でも言及されており(magic_quote_gpc など)、簡単なように見えて実は複雑という側面もある。 PHPはやさしい言語なんだろうか。それとも…?
属人的部分の方が多いと思う (スコア:5, すばらしい洞察)
言語の特性というよりはやはり属人的な部分が多いのではないでしょうか.
まつもとさんもコメントで以下のように「初心者」を強調してまとめておられます.
>私が自分の主張として書いたことは
> * 初心者が安全なWebアプリを書くのは難しい
> * PHPはWebアプリ用の言語
> * 初心者が(外向きのアプリのために)PHPを使うのは望ましくない
> * 「PHPは初心者に優しい」は不適切な宣伝文句
私はPHPでコマンドラインツールをぱぱっと書いて使い捨てたりするので
(パイプの最終段でテキストをパースしてDBにぶち込むとか),
「PHPはWebアプリ用の言語」って言われるとそんなに特化してるかなぁ
と思ったりするのですが.
結局,最後の「『○○は初心者に優しい』は不適切」はすべての
{プログラミング|自然}言語に言えるということじゃないでしょうか.
って,そんな分かり切ったまとめ方するなと言われそうですが.
フレームの元になりがちな「◇◇の部分を◆◆に変えて」をやってみる.
-----------
* 初心者が安全なアプリを書くのは難しい
* C/C++はアプリ用の言語
* 初心者が(公開するアプリのために)C/C++を使うのは望ましくない
* 「C/C++は初心者に優しい」は不適切な宣伝文句
-----------
やっぱ,言語の問題というよりは,
「初心者って言葉は免罪符にならないよ」
っていうことだけなんじゃないですかね.
そこをわざわざPHPを持ち出して主張したところが
ヒートアップの原因のような気がします.
屍体メモ [windy.cx]
Re:属人的部分の方が多いと思う (スコア:2, 興味深い)
JavaなんてWebアプリになると初心者どころか中級者も微妙だし。
Rubyのところに書いてある
* シンプルな文法
* 普通のオブジェクト指向機能(クラス、メソッドコールなど)
* 特殊なオブジェクト指向機能(Mixin、特異メソッドなど)
* 演算子オーバーロード
* 例外処理機能
* イテレータとクロージャ
* ガーベージコレクタ
* ダイナミックローディング(アーキテクチャによる)
* 移植性が高い。多くのUNIX上で動くだけでなく、DOSやWindows、Mac、BeOSなどの上でも動く
が果たして初心者に理解できるかどうか。
オブジェクト指向をまず理解できるかどうかな初心者が、特殊なオブジェクト指向機能とかイテレータを覚えるとは思えない。
簡単に楽しくという割りに結局Rubyもそうとは言えないし。
楽しくは主観だからどうでもいいとして、簡単というからには万人に簡単と思われなければならないけど、そうでもない。
「Javaよりは簡単に、且つPHPよりセーフティにWebアプリが作れる」
という謳い文句なら納得だけどw
Re:属人的部分の方が多いと思う (スコア:2, すばらしい洞察)
Rubyが初心者向きだなんて、誰が言っているの?
ああ、もしかして、Rubyは初心者をキャッチアップできてないんだから、それができるようになってからPHPに文句を言えってこと?
Re:属人的部分の方が多いと思う (スコア:1, 興味深い)
matz日記 すべては初心者のために [rubyist.net]
別にオブジェクト指向を知らなくてもRubyは使えますし、そんなに最初の障壁が高いとは思えません。
言語を覚えるという観点では。
ただ、実際に何かを作るとなると障壁が高くなります。
ここでいう初心者はCUIで便利に使うという発想はあまりないでしょうから。
ここにPHPの功罪があって、多くの入門書ではphpinfo();をブラウザに表示させるというあたりからはじまっています。
最初からブラウザで見栄えのする画面を表示させるというのは初学者にとってインパクトがあるでしょう。
実際にWebアプリケーションを作成するまでの障壁が低いのです。
ここにいたって、Webアプリケーションを舐めるなという話に帰着するのではないかと思います。
#まぁこんな話はいまさらですけど
Re:属人的部分の方が多いと思う (スコア:1, すばらしい洞察)
ここまでよく状況を理解していて、ポイントをまとめていて、
それでもなおかつ自分がまとめに含めた「宣伝文句」がキモであることを見落とすと
おもしろおかしいコメントになってしまうにもかかわらず
真に受けた人がヒートアップする原因になることを身をもって示そうとするとは。
なんたる勇気!
# C/C++ が初心者に優しいという宣伝はあまり見たことがないよね~。
Re:属人的部分の方が多いと思う (スコア:2, 興味深い)
といったところでしょうか.
旅に出ます.(バグを)探さないで下さい.
Re:属人的部分の方が多いと思う (スコア:1)
20数年ぐらい前には言われていました. 確かにアセンブラに比べれば, ハードウェアのアーキテクチャを隠蔽し, アルゴリズムに注目したコードにしやすかったので当時のプログラマにとっては優しかったのです.
でもそれは数年後に初心者にプログラミングさせてみて, 幻想であることが分かりました. やつらは半端なバカじゃない. でも, 自身を振り返ってみると, やっぱり同じようなバカをやることがあるんですね.
で, 今日までのアプリケーション開発用言語の流れを見ると, 「良いものを作る」「簡単に作る」というよりも「悪いものを作らない(作れない)」を良しとする方向に来ているのだと思います. それでも, たまにハイスキルな人が前者の高生産性言語を使ってシステムを構築するのを見てクールだと思う初心者が自爆する例が後を断たないってことでしょう.
Re:属人的部分の方が多いと思う (スコア:1, 興味深い)
>{プログラミング|自然}言語に言えるということじゃないでしょうか.
初心者向けと言うフレーズだけが問題なんじゃなくて、それが「第三者に公開されるWebアプリを書くための言語」であることと組み合わさるから「やめてくれ」と言う話になるんですよ。ローカルで動かすだけのものならば「初心者に優しい」かつ「セキュリティが甘くなる」と言うものでも殆どの場合は特に問題は無い。
そうした特長・傾向を強く持つのがPHPだと言うのが今回の話であって、「Rubyだって初心者が書いたら」云々というのは的外れです。
あとPHP側からのコメントとして「ドキュメントが充実してる」と言うのがあって、それは確かにすばらしい特徴だと思うんだけど、そんなドキュメントが充実している言語でなぜ、必要最低限のセキュリティ条件を満たしてもいないものが量産されるのかはちょっと疑問。PHPだってフレームワークをちゃんと使えば十分セキュアなものが書けるんだから、そう言うところを最初からきちんと説明してあげるべきだと思うんだけど。
PHPで仕事をするときの注意 (スコア:5, 参考になる)
趣味でやっている人のことは、まあ、いいとして(踏み台にされる可能性はあるけど)、仕事でPHPを使うときの注意を書いておこう。
PHPに限らない話も多いけどね。PHPを採用するときって「期間」「人材」が理由になることが多いけれど、それらの問題を解決できるほどPHPは素晴らしいものではない、ということは知っておいてもいいんじゃないかと。百戦錬磨の腕利きたちがいるとき、期間を短くするためにPHPを使うのはいいでしょう。人材不足でPHPができる人しか揃わないときは、PHPしかないですよね。でもね、両方の場合はプロジェクトを断念する方が間違いないです。未熟なプログラマーでも素早くWebアプリケーションを十分な品質で作れる方法なんかないですから。
# まあ、それはそれとしても、PHPの言語仕様がいろいろトホホなのは確かだけど。
Re:PHPで仕事をするときの注意 (スコア:2, 参考になる)
> PHPは知らないのですが、
> 単なる関数分割をCompositePatternと呼ぶのですか?
ケント・ベックの Smalltalk ベストプラクティス・パターン [amazon.co.jp]でそのように紹介されています。
パターンと名前についているが GoF 本のようなデザインパターンではなく、
良いプログラミングスタイルについて書かれたもの。
... だと思います。自分も PHP は知らない。
ruby での例 [biglobe.ne.jp]
Defending PHPから抄訳してみた (スコア:5, 参考になる)
*****
> PHP is awesome
PHPすごい
> Need proof? Here it is, broken down by category:
証拠を示せ?カテゴリー別にどうぞ。
> *Language Features
* 言語としての特徴
> It's dynamically typed.
動的型付けになっている。
> All arrays are associative (hashes)
すべての配列は連想配列(ハッシュ)だ。
> It's object oriented with a reflection API.
オブジェクト指向で、リフレクションAPIを持っている。
> It uses different operators for numeric addition (+) and string concatenation (.)
数値の加算(+)と文字列の結合(.)に異なる演算子を割り当てている。
> It supports eval() and lambdas (somewhat)
eval()とlambda(的な機能)をサポートしている。
> Can execute system commands and read from local and remote files (all one-liners)
システムコマンドを実行し、ローカルファイルやリモートファイルを読むことができる。(すべて1行で書ける。)
> Supports coercing scalars into boolean decisions (means you can just do if($x) instead of if($x!=null && $x!=0 && $x!=false ... )
スカラーを論理判断に強制使用することができる。(つまり、
if($x!=null && $x!=0 && $x!=false ...
のかわりに
if($x)
と書ける)
> Usable in both web and command-line contexts
webコンテクストとコマンドラインコンテクストの両方で使える。
> *Built-in Functionality
*組み込み機能
> It comes with a vast array of built-in functions to do all sorts of common tasks. Here are a few off the top of my head:
広範囲の組み込み機能が提供されていて、あらゆる種類の一般的なタスクを行うために使用できる。思いついた例を示す。
> Base 64 encoding and decoding
- Base64エンコーディングとデコーディング
> URL encoding and decoding
- URLエンコーディングとデコーディング
> HTML character encoding, decoding and tag stripping
- HTML文字エンコーディング、デコーディングとタグの除去
> SAX style XML parsing
- SAXスタイルのXML解析
> REGULAR EXPRESSIONS
- 正規表現
> Array sorting, custom sorting
- 配列のソート、条件をカスタマイズしたソート
> md5 and sha1 hashing
- md5及びsha1ハッシング
> It can natively connect to the most popular Database engines around.
一般的なデータベースエンジンのほとんどにネイティブに接続可能。
> It comes prepackaged with graphics manipulation capabilities (GD)
グラフィック操作機能(GD)が同梱提供されている。
> *Community
*コミュニティー
> It has an active community open to new ideas and ready to help noobs and experts alike:
新たなアイディアにも開かれ、初心者にも熟達者にも役に立つ、以下のような活動的なコミュニティがある。
> mailing lists
- メーリングリスト
> IRC Channel: irc://irc.freenode.net
ツールとしてはともかく (スコア:4, すばらしい洞察)
私は嫌いじゃないけど (スコア:4, すばらしい洞察)
だから私がその言語を好きかどうかは現時点の機能の過不足よりも、製作者にポリシーを感じられるかにあります。
Javaは機能増加には慎重にして安定性重視、Rubyは開発者の気持ちよさ重視、C#はJava経験者の気持ちよさと進歩重視等々。
PHPは一貫性なんか気にしないでガンガン便利そうな機能を取り込むぜという姿勢が見えて嫌いではありません。
#考察じゃなくてすみません。結局ほめてない気がする。
なんか昔もあったような・・・ (スコア:3, すばらしい洞察)
旅に出ます.(バグを)探さないで下さい.
Re:なんか昔もあったような・・・ (スコア:3, 興味深い)
「FORTRANは、YYになって堕落した。XXの方が良かった」
みたいな話は尽きない訳でして。
計算機をさわる人々というものは、こういう議論を深める事で、
自分たちがどんなツールを使っているのか、
その利点と欠点は何なのか、みたいな事を
再認識し続けているのではないでしょうか。
// ま、こういう言い合いも楽しいモンすよ
Re:なんか昔もあったような・・・ (スコア:3, すばらしい洞察)
いくつもの言語を習得できるほどのキャパシティを持たない人や、プログラマの供給を切らしてほしくない産業界の一部において、「すべての言語は平等である → だから一種類の言語ができれば十分 → その言語は簡単であればあるほど良い」という捨て難い信仰があるのではないか、それがこの手の論争が繰り返される原因なのではないかと思います。
「Javaしかできない人にはJavaしかできない人の仕事がある」「VBしかできない人にはVBしかできない人の仕事がある」「PHPしか(ry」ってね。
……で、そんなカッコントウ医者みたいなプログラマが増えてどうなったかは見ての通り。
低セキュリティのPHPアプリがワームやボットの温床となっているのは、さながら、ヤブ医者が何でもかんでも抗生物質を出した結果、耐性菌が増加・拡散したのごとく。
Re:なんか昔もあったような・・・ (スコア:1, 参考になる)
バッチファイルみたいな扱いだけど。
ちなみにciscoのルータでもtcl使えますぜ。
Re:なんか昔もあったような・・・ (スコア:2, 参考になる)
EDAツール(特にASIC,FPGA周り)では設定ファイルがTclになってるのは良くあることです。
それは、開発環境の構成が実行ファイル+TclでのWindow環境となっているからでして
この原因は、EDAツールでは計算に速度の必要で、かつワークステーション上で実行する必要があるからだと思われます。
コンパイル(論理合成、配置配線...)は非常に重い作業で、その速度が直接業務効率に影響します。
それを改善するため、複数のPCで分散して計算したりワークステーション上で計算を行っているわけですが
当然の事ながらワークステーションはWindowsではないことが多いです。
このような使用用途で求められる言語仕様は
・多少汚くても良いのでとにかく速い言語
と
・手間をかけずに習得でき、GUIが得意でクロスプラットフォームなグルー言語
です。
ということで後者にTclを採用したのでしょう。
これぞ言語の適材適所ですね。
# 他にもEDA関連はWindows環境なのにデフォルトエディタがEmacsだったり
# Scheme使ってる節があったりする開発環境があってUnix系の色が強いです
能力のないプログラマに限って (スコア:3, すばらしい洞察)
周りのPHP屋 (スコア:3, 興味深い)
周りでいるのが「おまえ、そんなことも知らないで受託開発やってんのかい!?」という奴で、それがPHP屋に非常に多い。お手軽言語であるがゆえに、プログラミングの基本的な作法を知らずに飛び込んでくる連中が多い。
Javaは難しい言語とされています。最近思うのは、難しいとされている言語ほど能力が必要。したがって、その能力があるということは、必然的にプログラミングの基本的な作法も知っているはず。だから難しい言語のほうが、必然的に能力がある奴が集まってくるのではないか?という理屈です。
#私?その中でも最下層ですよ。日々精進です。
逆に、PHPでもその辺踏まえて仕事している奴もいます。ただ、その他大勢の影響で、踏まえている奴も「ダメな奴」とレッテル貼られないか怖いです。
-- gonta --
"May Macintosh be with you"
うーん (スコア:3, すばらしい洞察)
○PHPから入るのはやめとけ
間違えたら死刑
今回の騒動は (スコア:2, すばらしい洞察)
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:今回の騒動は (スコア:5, すばらしい洞察)
似たような文化の代表例がVBとHSP。
それぞれ言語として悪い分けでは無く(いや、もちろん良い所ばかりとはとても言えないけど)、良いプログラムを書くという文化がコミュニティに無い上に、他の言語を使ったことが無い人が多く視野が狭いのが問題ですね。
もちろん、それらの言語でも良いプログラマは良いプログラマであるというのは分かっていますけど。
# EoDを唱えるJavaももう少ししたら仲間入?
話がすり替わってない? (スコア:2, すばらしい洞察)
駄目な言語とした点に火種があるような気がします。
ある程度の機能を持っていて一応使えているんだから
駄目な言語とまで言う気はないなぁ。
#にしても言語に文句が言えるような贅沢な時代になったよね。
書店のコーナーを見ると (スコア:2, すばらしい洞察)
「○○を使いこなす500の技!」とか。「○○スーパーサンプル」とか。
そういう言語に携わる人達からは、コンピュータを愛する気持ちが感じられないのが残念です。目の前の問題をクリアさえ出来ればOKって人達の多い言語とは「なるべくかかわりあいたくない」って思っちゃいますね。
事態は際限なく悪化する。
今回の発言のポイントは、PHPがダメな言語かどうかは関係が無い所にある (スコア:2, 興味深い)
スポークスマンとしてのポジショントーク発言だと思われている。
以前HSPについても、攻撃的な発言をして、同じような騒動になった事がある。
もしかしたら、本当にその気は無いのかも知れないが、Rubyの開発者であるMatz氏の
発言は、どうしてもそうは受け取られない。
たとえば、ビル・ゲイツ氏がOSXの欠点を指摘すれば、それが純粋に個人的な印象を
述べただけでも、そうは受け取ってもらえないのは仕方が無い。
Matz氏は、その点は了解しているが、全く発言を改める気は無いらしいので、これか
らも定期的に発生するであろう。
いつものこと、いつものこと
Re:今回の発言のポイントは、PHPがダメな言語かどうかは関係が無い所にある (スコア:2, 参考になる)
#念のため確認。
指摘しっぱなしに見える(読める)のが問題なんだと俺は感じた。一言「じゃあこうすれば良くなるんじゃね?」があればよかったんだけどなあ。
基礎学力が違う (スコア:2, すばらしい洞察)
人で不足で理系以外を大量採用=>早く仕事=>はやりはちょうどPHP=>基礎はしらんがなんかつくれる
と若くて基礎知識がなくてPHPだけをやっている人は、プログラマ的に力量不足の人が多い確率は高いです。
しかしこれは彼らが不勉強だからというはずはなく、単に基礎がたりないからです。理系や専門学校でコンピュータをやってきた人と、それ以外の人(文系だけでなくいろいろある)では、ITに関する基礎知識に絶対的に差がある、それは当然のことで、双方がそれを認識しなければならないのです。
基礎知識がある人が、ない人をたたくのは、あまり頭がよく見える行為ではないです。知識がある人は、ない人と対面したとき、仕事をするとき、相手がどれくらい知識があるか、常識と思っていることを相手もしっているかどうか、常にチェックし、リスクマネジメントをしなければなりません。面倒くさくてもそれも仕事です。
基礎知識がない人は、数年かけるつもりで、自分のしらないことがたくさんあるということを常に意識して勉強をしつづけなければなりません。そして知識がある人と対面したとき、相手がどれほど知っていて、自分がわからない言語を使うかを理解し、分かるように出来れば効率的に説明してもらいつつスキルを肩越しにぬすむねばりと気合いが必要です。
すらどつの人は基礎知識がある人が圧倒的に多いと思います。かつIT業界で仕事をしているなら、相手がしっていて当然と思っていると、思わぬ罠にはまる可能性が高いことをすでに知っていると思います。基礎知識がない人は、常に未だ自分にはいっぱい知らないことがある!と思いながらお互いがんばりましょう
#ちょっとコソる
Why PHP is Not My Favorite Programming Language (スコア:2, 参考になる)
この一連の流れでだれかがどこかで持ち出すだろと思ってずっと見てたけど、
いっこうに出なくてちょっと意外。
てかもう俺もオールドタイプになっちまったということかな…
PHP自体が必ずしもダメではないかも知れないが (スコア:1, 興味深い)
経験上。
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:5, おもしろおかしい)
経験上。
$LANGには自分が嫌いな言語を入れてください。w
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:5, おもしろおかしい)
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:1)
おかげで ja_JP.UTF-8 環境に当たった時に苦労する事といったら……。
古いツールや自前ツールしか知らんので UTF8 対応していないのです。orz
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:3, おもしろおかしい)
あ、別スレッドで変更されてんのか、グローバル変数だし。
--- A Rubist
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:1, おもしろおかしい)
経験上。
#そういう人見たことないです。ごめんなさい。
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:2, おもしろおかしい)
経験上。
## whitespace を whitebase と空目したので
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:2, すばらしい洞察)
そこは「本物のプログラマ [genpaku.org]」を思い浮かべてニヤリとするところです。
# 四半世紀前の文章を知らなくてもしょうがないけどね。
Re:PHP自体が必ずしもダメではないかも知れないが (スコア:2, 参考になる)
書いた人が悪いと言うのもあるけど、言語的にそれで良しとされている部分での
トラブルが多い気がします。
動けば良しと言う感じの言語任せで、環境が変われば動かなくなるのが多いですね。
# 最近、バージョン差異で動かなくなったphpのメンテナンスを断られて困った人より
コンソールプログラムをPHPで書いてる奴 (スコア:1)
だってPHPで書かれたウェブアプリのためのDBにデータをバッチで投入したいときって,
そのウェブアプリから切り出してきたコード断片をつかって投入した方が
フィールド名の間違いとか起きなくていいかなと思うから.
屍体メモ [windy.cx]
なになに、結局・・・ (スコア:1)
「言語」と言わなければいい (スコア:1)
変数名に $ だの使わなければいけないやつは、それぞれの「プログラミング言語的拡張」だと思っている。
ただの設定ファイルにC言語的構文を入れてみたり、XML にしてみたり、、、も嫌い。
#と、書いているうちに、「XML構文で書くプログラム言語」とか無いだろうなと考えて寒気が。
Re:「言語」と言わなければいい (スコア:1)
旅に出ます.(バグを)探さないで下さい.
XML構文で書くプログラム言語 (スコア:1)
今日は、もう立ち直れない。
A toy obfuscated programming language ではあるが。
フレームのための言語論争開始 (スコア:1, すばらしい洞察)
新しいな (スコア:2, おもしろおかしい)
「ら抜き言葉」ならぬ「ろ抜き言葉」か。
Re:黒い言語でも白い言語でも生産性が高いのは良い(ry (スコア:1, すばらしい洞察)
Re:黒い言語でも白い言語でも生産性が高いのは良い(ry (スコア:2, おもしろおかしい)
Re:黒い言語でも白い言語でも生産性が高いのは良い(ry (スコア:1, おもしろおかしい)
Re:まとめる (スコア:1)
# cgi.rbで簡単Webアプリ,だとアレすぎますが
旅に出ます.(バグを)探さないで下さい.
Re:まとめる (スコア:1)
外部に公開するWebアプリを初心者にやらしちゃまずいけど、
インターナルな用途はたくさんあるし、
初心者がちょこっと作れる利点は小さくないと思います。