はてなキーワード: オブジェクト指向言語とは
●JAVA J2EEやらJ2SEやら色々あって良く分からない。 オブジェクト指向言語ということだけは知っている。 クラスしかりの設計や、型の変換/比較が面倒くさいので続ける気が起きない。 ●Perl ちょっと書き方間違っただけですぐに「Internal Server Error」になるので飽きる。 perlの案件があるんだけど…と聞かれると「いやー作れるんですけど、しばらく触ってないから」とか言って逃げる。 ●Ruby 使ってるやつの大半はナルシスト。「はぁ、Rubyのコードふつくしい…」とか言ってるのを見ると虫酸が走る。 言語作者もPHPをすぐdisるので嫌い。案件少ないくせに調子乗ってるグループに属する。 ●C言語 LSIC試食版で遊んでみるも、黒いコンソール画面に文字が出るだけなので飽きる。 ガリガリ書ける人は天才に見える。 ●Javascript 変数名の頭に$をつけてよくエラー起こしてしまう言語。 「OFFにしてるブラウザも多いっすよ?」を武器に戦うもAJAXブームに押され仕方なく書いてる。 ●Python PHPより歴史が古いのに、なぜか新参者という扱いになっている。
こちらはいちいち実例を挙げてるのに対し、お前はイメージでしか語ってないから全然話が進まないんだよ
お前も実例出して言え
たとえばこれなら、オブジェクト指向言語でオブジェクト指向プログラミングして偽である、有名なプロジェクト名を挙げながら発言しろってこと
発言の仕方自体も指摘しなきゃ駄目とは、はぁ。
大学教育について話題になっているようですので、私が卒業した、大阪大学基礎工学部情報科学科について書いてみたいと思います。
大阪大学基礎工学部情報科学科は、昭和45年に最初に国立大学に設立された情報工学関連学科のうちの一つで、コンピュータサイエンスの分野では日本で最も古い歴史を持っている学科、ということになります。
情報科学科の特徴は、そのプログラミング実習の充実ぶりです。入学すると、まずPascalというプログラミング言語で構造化プログラミングを勉強することになります。次にアセンブリ言語であるCASLを勉強し、Pascalとアセンブリ言語を応用してC言語を勉強します。またその後、スクリプト言語であるPerl、関数型言語のML、オブジェクト指向言語としてJavaを学習します。
また、言語だけではなく、コンピュータサイエンスの基本であるアルゴリズムやデータ構造についても幅広く学ぶことができます。
全ての実習は課題が出され、実際にコードを書かなければいけません。例えばC言語の授業の最終的な課題は、「shのようなシェルプログラムを作成すること」でした。最終的には、「Pascal風の言語をCASLに変換するコンパイラを作成する」という課題に取り組むことになります。
大阪大学は全体的に単位の取得が厳しいことで知られていますが、情報科学科も例外ではありません。もしプログラミングをあまりしたことがないのであれば、遅くまで実習室にこもることになると思います。だけど、それは情報工学の世界で生きていくためには必要な知識なのです。
実習で勉強する言語は、Javaを除くとあまり現在使われている主流の言語とは言えないのですが、様々な言語を学ぶのは「プログラミング言語はそれぞれに違いがあり、それぞれに適した用途がある」ことを理解することに繋がります。また大学を卒業してから、新しい言語を学ぶ必要が出てきたとき、それに対応する能力を磨くことができます。
日本の大学で、ここまで実戦的なコンピュータに関する教育を行っている場所はあまりないのではないか、と思います。コンピュータがどのように動いているのか、内部原理までしっかり教えてくれます。卒業生の進路は、研究者というよりは、エンジニアとして開発の現場で働くことが多いようです。
大阪大学の入試問題は、東大や京大と違って特殊な問題はそれほど出ません。努力でなんとかなるレベルだと思います。
情報工学は新しい分野なので、大学院で研究するために必要な知識は他の分野ほど多くありません。このため情報工学科では、3年生の夏に大学院の試験を受けて合格すれば、学部を卒業しなくても4年目から大学院に進むことができます。この仕組みを活用すれば、5年で大学院を卒業できます。実際、学部生の1/4くらいはこの仕組みを活用しています。
もちろん、ここに書いたのは情報科学科の全てではありません。ネットにも他に情報がありますし、もし興味があったら、大学のオープンキャンパスに行ってみるのもよいと思います。
コンピュータの世界は変化が激しくて、エンジニアとして生きていくのはとても大変ですが、それでもいい、プログラマとして将来何かを作りたいんだという人であれば、ここはそのための力を与えてくれるはずです。進学先として検討してもらえたら幸いです。
オブジェクト指向言語としてどうとか、実行速度がどうとか、実行環境に依存しないかどうかとか、
そういったことは置いておくとして、初心者がこれからプログラミングを始めて、単なるプログラミングのお勉強にとどまらず、
何か他人とは違うことをしたいという場合には、迷わずオススメしたい言語がある。それはなんだろうか?
ってもう答えは出ている。JavaScript。タイトル見れば分かるじゃんww
なぜJavaScriptが偉大かというと、他の誰もJavaScriptをまともに出来る人なんていないからwwwww
はてな社員のあの人とかあの人みたいなのは別にして、普通にIT業界とか見ていたら分かるんだけれども、
なかなかJavaScriptがまともに出来る人というのが見あたらない。というか、いないんじゃねとツッコミたくなる。
だから、JavaScriptをキッチリね、キッチリが大事ではあるけれども、キッチリお勉強したらば、それはもう他人と大きな差がつくこと間違いない。
これだけAjaxとか言われているわけだから、もう重要な言語であることには間違いないけれども、キッチリできる人がいないので、
キッチリ出来れば、一部の企業からは重宝される。もちろん、一通りの言語は出来ないといけないに決まっているだろう馬鹿、と
言いたくなるような人もいるかもしれないが、とりあえず、JavaScriptマスターしますたと言うだけでかなり魅力的な人材。
とにかく常識的に考えて、JavaScriptくらい、重要でありながら優れた人材がいない言語は無いし、これは勉強するしか無いわけJK。
よくJavaScripterが「JavaScript第5版」について話すのを聞いていると、全部把握していないような人が山のようにいるわけJK。
だからもう基本のところできっちり把握していなくて、こんなもの調べれば分かるんだから覚えなくて良いと開きなおっちゃってる有り様だから、
これはもうどうしようもないと言わざるをえない。みんなJavaScriptを真剣にやっていない。それだけでなく、真剣にやっているとおぼしき
人までもが、ぜんぜん理解が足りていなかったりするからもうどうしようもない。こういう状況だからこそ、まじめにJavaScriptを
やればきっと良い結果がでるのではないかなということを言っているのでおじゃる。繰り返すように、JavaScriptは重要な言語であるし、
いまはそんな人少なくなっていると思うが、言語としておもしろみのないものでは決してない。JavaScriptやるだけで、オブジェクト指向の
いろんなことのさわりだけでもつかめてしまう。というか、俺はデザインパターンまで勉強できてしまった。というと、自慢に聞こえてしまうが、
そうではなくて友人連中もみな勉強した。とにかく、簡単なのだから、できてしまうのである。JavaScriptは確かにブラウザごとの差など
ややこしい部分があったりするが、べつにそんなことは大したことはなくて、実際に、覚える量は大したものではないと思う。
情報がまとまっていないから覚えるのが大変であるかのように錯覚しているだけで、リファレンスをみんなで構築し、仲間うちで利用
するようにしたら、とても効率よく学習できることをここに助言しておく。とそんなことはどうでもよくて、とにかく量としては多くないと。
要するに、JavaScriptは多くなくて簡単だし重要だし強力だしお勉強になるしお仕事になるので勉強したらよい。
それなのにいまだにマトモに勉強していないような人が多いのはどういう了見なのだろうか?これは真剣に知りたい。
トップの人がマトモに勉強していないと、その中で本を書いたりした人がクソな本を出して、それの悪影響を受けるということになる。
これではなかなかマトモな勉強しようにも出来ないという感じになるのではないか。いや実際には、大半の本はクソだと分かるから、
最初から相手にしない感じで良いと思うし、それよりはネットからの情報をもとに先ほども触れたようにリファレンスを社内で構築する。
それで良いのであるから、本など大した問題ではないのだが、それをやっている人がいかに少ないかという現状を嘆いているということである。
つまり、トップの人がマトモに勉強していないと、本もろくな本がないということになるから、けっきょくなかなかスゴイJavaScripterが現れない
という事態がずっと続いているのではないかという気がする。それに拍車をかけているのは、古い作法をいまだに固持しているプログラマが
おおくて、新しいJavaScriptの知識や作法を学ぶための方法が個人の学習意欲と学習工夫にゆだねられているという点にあると思う。
おもうに、ネットなんか便利だけれども、受け身になってしまいやすいから、能動的に情報をどうこうしようという気力のある人が少ないような
感じがしている。だから、なかなかマトモに常に新しいことに取り組むような人が現れなくて、たまにそういう人が現れただけで注目される
という滑稽なことになっている。別にそんなの凄くないよというような人がもてはやされたり、すごくないJavaScript記事がもてはやされたり。
なんかPerlのblessっぽい。
JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)
というよりperlのnewっぽい。なぜか。
classでクラスを定義してnewでインスタンスを生成する言語を「一般的オブジェクト指向言語」とすると、
つまり、javascriptでnewを(直接)使わず、class(のようなもの)を作ればperlっぽくなる。
オブジェクトを作る。オブジェクトを作るには3つの動作が必要である。
通常は言語仕様でこれらを行う"new"という命令が用意されている。しかし、必ずしも必要な物ではない。perlでは言語仕様としてはnewが用意されていない。new関数が存在するのはコーディング規約に従っているからに過ぎない。代わりにblessが用意されている。なぜこのようになっているのか。理由はいたって簡単だ。perlのオブジェクトの実態はリファレンスだ。初期化を行うコンストラクタはどの道定義せねばならない。だから必要なのはリファレンスとパッケージを結びつけるおまじないblessだけだ。コンストラクタで好きなリファレンスを用意し、好きなように初期化してblessすればよい。コンストラクタの名前はコーディング規約でnewと決めた。一方javascriptはnewを用意した。{}でオブジェクトは作れるし、どの道コンストラクタは作る必要があるのに。
オブジェクトとクラスを結びつける。しかし、javascriptはクラスを持たないので必要はない。代わりに必要なのは、継承元との結びつき、プロトタイプチェーンの構築だ。
既存のクラスの性質や振る舞いを流用する。default状態を与える。一般的オブジェクト指向言語ではクラス定義時に継承元となるクラスを指定する。javascriptではクラスの代わりにオブジェクトを指定する。
クラスとはオブジェクトの性質・振る舞いの定義だ。しかし、ダック・タイピングではオブジェクトの性質や振る舞いはオブジェクトの持つメンバにより決まるため、そのような環境ではオブジェクトに初期値と継承関係を与えるのが主な仕事となる。
コンストラクタはオブジェクトの初期化を行う。javascriptではクラスがないため継承とコンストラクタによりオブジェクトが初期化される。
var object = function(o) { var F = function() {}; F.prototype = o.prototype; return new F; };JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)
個人的には
var object = function(o) { var F = function() {}; F.prototype = o; return new F; };
で良いんじゃね?って思う。
更に、コレでは初期化しないから
var object = function(o, n) { var F = function() {}; F.prototype = o; f = new F; if (n) for (var i in n) f[i] = n[i]; return f; };
みたいな。
さらにせっかくだからメソッドにして
var object = function(o, n) { var F = function() {}; F.prototype = o; f = new F; if (not f.inherit) f.inherit = function(n) {object(this, n)}; if (n) for (var i in n) f[i] = n[i]; return f; };
とか。
一応プログラマ(というよりはソフトウェア開発者)として仕事してるんだけど、俺はギークにはなれないなとつくづく思う。
ぶっちゃけプログラミングとかコンピュータ・アーキテクチャ、ネットワークプロトコルみたいなものに興味が無いんだよね。
俺にとってプログラミングは、その背景にある数学的モデルをマテリアライズあるいはマネタイズするためのツールでしかない。
○○ハックとか、どの言語が有利だとか、凝ったコーディングテクニックだとかデータ構造の細かな工夫なんかには全然興味が無いんだ。
ぶっちゃけそこそこ習得能力はある方じゃないかと思う。コーディング始めてまだ1年経ってないけどオブジェクト指向(C++)でバリバリ書ける。
JavaやC#みたいにガベージコレクタがあって抽象度の高いオブジェクト指向言語なら(たぶん)少し慣れればかなり書けるだろう。
でも興味無いんだよね。だからコンピュータ大好き少年のようにどんどん新しいことを覚えて勝手にのめり込んでいくようなことができない。
勉強しなきゃなとは思うから本とか読むけど、あくまで義務感でやってるだけ。
プログラミングそのものには興味が無いから、作るシステムの目的がつまらなかったらやる気が無くなる。
それから、LINUXとかにも興味が無いので、なかなか使いこなせなくて困ることがある。
ギークにはなれない。どうやって生きていくのがいいかなあと思う。
私はいまではオブジェクト指向言語は普通に読み書きできますが、関数とかポインタとか理解してC言語が普通に書けるようになるまで1、2年くらい、クラスとかオブジェクトとか理解してオブジェクト指向言語わかるようになったのはさらに2,3年かかった。
ここまでくるのに勉強し続けてきたし、メジャーな言語は大体読めるようになった今でも常に勉強し続けてないと知らないことはまだまだある。新しい概念も次々出てくる。
簡単に学べる圧倒的抜け道なんてないよ。みんなわかんないことは勉強して、すこしづつ理解するんだよ。
正直、こんなのプログラミングがある程度好きじゃないとやってられないよ。でも、プログラミングしてて面白みが感じられるなら、勉強して成長していく過程を楽しめるなら、今わからないことも時間はかかるかもしれないけどきっとわかるようになる。
だけど、それらが苦痛でしかないのならあなたはプログラマに向いてないかもしれないよ。設計とか、仕様書書きとか、顧客との折衝とか、ソフトウェア開発周辺にはプログラム書く以外の仕事も色々あるから、そういう方面に逃げるのも手だよ。
そういうのはバッドノウハウとは言わないの?
関数ポインタをバッドノウハウとは言わないでしょ。C言語自体がバッドノウハウの結果だと言うなら、当たりだけど:)
手続き関数という抽象はまことに一般的な存在で(数学では汎関数というのもある)、それをC言語で直接的に表現したのが関数ポインタ。 関数的なものを オブジェクト指向言語でオブジェクトとして実装するほうがバッドノウハウだと思う。 少なくとも私は JavaのComparableインタフェースよりも C言語の heapsort/mergesort/qsort の関数引数 int (*compar)(const void *, const void *) のほうがシンプルで どちらかといえば本質をよりよく表していると思う。 なぜ関数的なものを表現するのに オブジェクトとかinterfaceとか継承とか「余計な概念」を導入する?それこそバッドノウハウでしょ。 まあでもC言語にはクロージャが無いから、関数的なものも扱いづらいことこの上ないが、Cにクロージャが無いこと自体はバッドノウハウとは言わないでしょー。
逆も然りで、オブジェクトを表現するために 関数を使ってれば そればバッドノウハウだけど、オブジェクトは関数ほど一般的な概念ではないと思う(オブジェクトなんか無くても別にいい、かも?)。
関数ポインタはバッドノウハウどころか、手続き的な抽象を使いたいところで多用しますぜ。超重要。 そして関数型プログラミング言語の存在意義みたいなもん。
C++やオブジェクト指向言語だと 継承と仮想関数を使うけど、同じようなケースで C言語では関数ポインタを使うんすよ。
先にもかいたけど、ソートの比較関数とか、スレッドの開始とか、コールバックとか。
で、変数ポインタと関数ポインタの曖昧性(?) の件は、 私は重箱の隅をつつき過ぎたが…
要するに、 (例えば) x86の機械語に対応するデータを生成して、その先頭アドレスを関数ポインタにぶち込んで実行するという手法。
1. は、もう使われてない。 2. みたいな利点はある。3.4.みたいな例があるために現在では扱いづらいかも? 5. みたいな使い方がしたければ…悪い事は言わない、evalがあるRubyPythonLispSchemeあたりを使っとけ。 って感じっす
# またトラバ先を間違えた。
C/C++にいくつか思うこと (ちなみに、プログラマ始めたのはCができた頃でC++よりも私のプログラマ歴の方が長い)
Cはポインタ というか、ポインタを使いこなすことで、チューニングしていく言語だから ポインタ使いたくない=チューニングしたくない
って人は他の高級言語で良いと思う。ただ、動画などの処理をC/C++又はアセンブラ以外で書く人というのは、あまり聞かないので
速度が必要=C/C++って事かと思う。
昔、全くチューニングしていない、CとJavaを比べて同じ速度だからJavaでもOKというレポートを読んだことがあるのだが、あれは酷かった。
Cはチューニングしたときに、もっとも伸びしろが大きく、必要な場合アセンブラと並記できることで、ほぼアセンブラという領域まで
チューニングできるところが魅力。その際、ポインタは無くてはならない。知っておくべき技術。
繰り返しになるけどチューニングしない人には意味がない言語と言われればその通り。
また、ポインタだけではなく、レジスタについても知っておくとCでの伸びシロが大きくなる。
そして、少なくともアセンブラレベルでのPUSH,POP,CALLは覚えておいた方がよい。
関数コールをすると、レジスタ類の待避がアセンブラレベルでは走り、その上、スタックに引数や返値を積んでジャンプするという
ものすごく遠大な処理がアセンブラレベルでは走っているが、Cレベルでは1行の関数コールに見える。
という事を理解しておくと、C++でのインライン関数の重要性や、再帰関数が実行時にはかなり重い理由が頭の中に浮かんでくる。
こういう言い方をすると、最近はCPUが早いから大丈夫とか言う人が多いが、じゃぁWindows Vistaは売れましたか?と聞きたい。
少なくともチューニングが必要な事もある。必要ないこともある。という事で選択すれば良いと思う。
たかだか、数行のスクリプトでチューニング不要ならそりゃ、Perlつかうさ
参考までに書いておくと、個人的感覚ではC++はオブジェクト指向言語ではない。
アセンブラにまで行き着く C言語を大規模開発する時に最低限必要となる抽象化をするための言語
そのために、まともにOOPで設計するとC++では重くなる事が多い。いかに、崩せるかがキモ。
またC++使いか?エセC++使いか?の見分け方は
constを正しく使えるか?参照を正しく使えるか? vtableの説明ができるか?
という質問に正しく答えられるか?で見分けると結構見分けがつくと思っている。
404 Blog Not Found:coders.each{|you| you.get(this) if you.langs[0] != 'ruby' } # - 書評 - 初めてのRuby
1章 ようこそ、Rubyのある生活へ
1.1 Rubyの特徴
1.1.1 オブジェクト指向言語
1.1.2 より良いPerl
ある研究によれば、生産性はそれぞれのプログラマでそれぞれ違う。
でも、あるプログラマに着目すれば、
そのプログラマが時間あたりに書けるコードの行数は、プログラミング言語によらず決まっている、
たとえば一年に50,000行なのだそうだ。
行数が決まっていたら、
どの言語で一番多くのことを達成できる?
そう、Rubyだよね。
例えば C のプログラムより 50 倍遅くなったとして、実行時間はどのくらい変わるだろうか?
もし C のプログラムが 0.01 秒で終わる としたら、
Ruby 版は 0.5 秒。あなたのプログラムは 0.49 秒速くす るために C で書く価値があるのか?
プログラムは開発の時間よりも保守の時間のほうがかかるというのはもはや常識だけども、
Ruby で書いてあれば例えば、
そういう点でも Ruby は非常にいい。
だいたい、スピードに対してごちゃごちゃ言うなら C じゃなくアセンブラで書けばいい。
それをなんで C で書いてるのかって言えば、
それはもちろん「コードがわかりやすい」とか、「早く書ける」って のが理由だろう。
そして、Ruby は C よりわかりやすいし速く書ける。
404 Blog Not Found:「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い
実行速度より実装速度(前編) - Object Station
じゃ、OOはなんだろう。おおきいおっp
僕もだいすきおきいおっp
話を元に戻そう。OOはオブジェクト指向、object-orientedだよ。オブジェクト指向言語を扱った事がないなら、まずはオブジェクト指向について馴れる所からかも知れない。