More Related Content Similar to 第1回java実習(helloworld)2011 Similar to 第1回java実習(helloworld)2011 (20) 第1回java実習(helloworld)20111. Java とは プログラミング言語 Java は、 1990 年代前半にサン・マイクロシステムズでジェームズ・ゴスリンなどの人々に よって開発された。 一口に Java といっても、その実行環境や用途によっていくつかに分類される。 1. Java サーブレット : サーバとクライアント PC 間でデータ通信しながら動く。つまりネットワークを介して動く。 世の中の多くのシステムはこの形式。 2. Java アプリケーション : 通称 Java アプリ。 PC や携帯電話内で単独で動く Java プログラム。ネットワークは必須ではない。 携帯電話等でのゲームは Java アプリで作成されてることが多い。 3. Java アプレット : PC 上や携帯電話等の端末内で単独、かつ、 WEB ブラウザ上で動く Java プログラム。 WEB サイトや WEB ページを作る際に良く使われる。 4. JavaScript : Java 言語とは無関係。 HTML 内に記述するスクリプト言語。 2. Java の特徴 (2)Java の実行環境は、 Java 実行環境 (Java Runtime Environment; JRE) と呼ばれる。基本的な開発環境は、 Java 開発キット (Java Development Kit; JDK) と呼ばれる。 (3)Java はクラスベースのオブジェクト指向プログラミング言語である。 (4)Java のプログラムは複数のクラスから構成され、プログラムの実行は、各クラスが実体化したオブジェクト群が相互に メッセージをやりとりしながら行われる。 (5)Java では、継承については実装の単一継承を採用している。ただし 1 つのクラス(オブジェクト)は複数のインタフェースを実装できる。 (6)Java では簡潔なメモリモデルを採用しており、プログラマがメモリ ( 主記憶装置 ) を管理する負担を軽減する。あらゆるオブジェクトはメモリ内のヒープという領域に割り当てられる。メモリ管理は、 Java 仮想マシンに統合されたガベージコレクションの機能によって行われる。 従来のオブジェクト指向プログラミング言語である C++ では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、 C++ プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。 Java ではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。 (7)Java の文法は、 C および C++ から多くを引き継いでいる。 また、 C/C++ には存在する低水準領域を操作できるポインタという機構は排除されていると言われているが、 Java の開発者も言っているように、 C/C++ のポインタモデルとは異なるが Java にもポインタモデルが存在する。たとえば、クラスインスタンスと配列はポインタを使用している。 (8)Java ではプラットフォーム非依存を目標の一つとし、プラットフォームに依存しないアプリケーションソフトウェアの開発と配備を行うことができる。従来のプログラミング言語の多くはプラットフォーム (CPU) に依存したネイティブなコードにコンパイルすることを前提として設計されていたが、 Java はこうした言語と異なり、中間言語(バイトコード)にコンパイルされ、 Java 仮想マシンで実行されるよう設計された。 4. オブジェクト指向プログラミング言語(1) ■ Lisp( リスプ。 1958 年 ) MIT にいたジョン・マッカーシー( 1927- )によって開発。 LISP は FORTRAN に次ぐ 2 番目に古い高級言語であり、 現在でも広く使われている。 Lisp はこの時点ではオブジェクト指向言語ではないが、その表現力と柔軟性によって、人工知能のコミュニティで 人気を持つようになり、多くの言語に影響を与えている。ジョン・マッカーシーは、マービン・ミンスキーとともに人工 知能の父と呼ばれている。現在、スタンフォード大学の教授。 ■ LOGO (ロゴ。 1960 年代後半) シーモア・パパート( 1928- )によって開発。児童向け教育用として作成されたプログラミング言語。豊富なグラフィック 関連のコマンドが特徴で、画面に出てくるタートル(亀)に簡単な動きの命令を与えて、その軌跡を図形として描いたり、 さらに色を塗ったりして楽しむ事が簡単に出来る。 シーモア・パパートは南アフリカ出身のアメリカの数学者、計算機科学者、発達心理学者。アメリカに移住してマサチュ ーセッツ工科大学( MIT )で Media Lab の創設に関わっている。 ■ Simula( シミュラ、 1960 年代中期) ノルウェーのクリステン・ニガード (1926 年 -2002 年 ) とオルヨハン・ダール (1931 年 -2002) が設計 / 実装した。主に 北欧圏で使われて、広く普及することはなかったが、その後、後続言語に与えた影響は大変大きい。 Simula はクラスや継承、動的束縛の機能をもち、オブジェクト指向プログラミングの基本概念はすべてここで発案 されている。 ■ Smalltalk: (スモルトーク。 1970 年代) XEROX のパロアルト研究所 (PARC) で 1970 年代に約 10 年かけ整備されました。主な開発者は Alan Kay( アラン・ケイ ) 、 Dan Ingalls 、 Adele Goldberg, 、 Ted Kaehler 、 Scott Wallace 等。 豊富で整備されたクラスライブラリは、特にオブジェクト指向プログラミングの手本とされ、デザインパターンの宝庫と 称されるまで洗練されたものになっており、後世の多くのオブジェクト指向プログラミング言語に直接的、間接的に 多大な影響を与えている。 「オブジェクト指向」という言葉は、 1970 年代にアラン・ケイが Smalltalk の概念として使い出したので、 Smalltalk が世界 最初のオブジェクト指向言語となるが、実質的には Simula にその原型が現れています。 Smalltalk は、 Simula の他、 Lisp 、 LOGO の影響を受けている。 5. その他のオブジェクト指向プログラミング言語(2) ■ Flavors( フレーバーズ。 1979 年 ) MIT の D. ワインレブ、 D. ムーンらが設計した Lisp マシン上のシステム記述言語であり、 Lisp に基づいた最初の オブジェクト指向言語でもある。オブジェクト指向言語を指すだけでなく、ウインドウシステム、ネットワークも含めた完全 なオブジェクト指向で作られたソフトウェアシステムの総称を指す。 その特徴は flavor (フレーバー)と呼ばれるプログラムモジュールにある。 flavor は Simula や Smalltalk でいう『クラス』に相当する。 これを多重継承させる機構やメソッドを組み合わせて使う メソッド結合などの機構によって、様々な事象を定義できるようになっている。 flavor とは風味のことであり、いろんな風味のアイスクリームを混ぜ合わせる、というところから命名された。 MIT で作られ、後に Symbolics 社で New flavors となり進化していく。 ■ CLOS( クロス。 1990 年頃 ) Common Lisp Object System. の略。 Common Lisp にオブジェクト指向プログラミングのための追加した機能で、 Flavors と LOOPS 等の影響を強く受けている。 ■ C++ (シープラスプラス。 1983 年) AT&T ベル研究所で B. ストロウストゥルプによって開発されたオブジェクト指向言語。その原形は、 1980 年に発表 された『クラスを持った C 』であり、その名のとおり C 言語の機能拡張版と言える仕様となっている。 B. ストロウストゥルプは「 The Programming Language C++ 」の序章に、この言語仕様の目的を ①よりよい C 。 ②オブジェクト指向プログラミングが可能であること。 ③抽象クラスを実現する。 と記している。 それまでにオブジェクトとメッセージで表現していたオブジェクト指向のモデルとはやや異なっており、カプセル化、 継承、多相性という概念が適用されている。 C++ は C のコンパイラでもあるので、普通に C として利用することも可能。このため、これがプログラマの自由度を 高くしており、自由度が高いということはプログラマにとってはかえって難しく感じさせる要因になっている。 6. (メモ:ビャーネ・ストロヴストルップ) ○ ビャーネ・ストロヴストルップ( Bjarne Stroustrup, 1950 年 - ) デンマーク生まれのコンピュータサイエンテスト。 1975 年、オーフス大学で計算機科学と数学の修士号を取得。 卒業後イギリスに渡り、 1979 年にケンブリッジ大学で計算機科学の博士号を取得。その後家族とともにアメリカ 合衆国ニュージャージー州に渡り、 AT&T ベル研究所に大規模プログラミング研究部部長として勤務。 1983 年に C 言語を拡張し、オブジェクト指向プログラミングを可能にした C++ を開発した。 2002 年に AT&T ベル研究所を退所し、現在はテキサス州テキサス A&M 大学の計算機科学教授を務めている。 2004 年、全米技術アカデミーの会員に選出される。 主な著作: 『プログラミング言語 C++ 第 3 版』 翻訳 : 長尾高弘 『 C++ の設計と進化』 (The Design and Evolution of C++) 翻訳 : 岩谷宏 ○ マービン・ミンスキー( Marvin Minsky, 1927 年 - ) アメリカ合衆国のコンピュータ科学者であり、認知科学者。 MIT 人工知能研究所の設立者の 1 人。 初期の人工知能研究を行い、 AI や哲学に関する著書でも知られ、「人工知能の父」と呼ばれる。 現在ダートマス会議として知られる、“ The Dartmouth Summer Research Project on Artificial Intelligence (1956)” の発起人の一人。ニューヨーク市生まれ。 1950 年にハーバード大学を卒業後、プリンストン大学で数学の博士号 (1954 年 ) 。現在は MIT の電子工学および情報工学の教授。 主な著書 『パーセプトロン』 (with Papert S. Perceptron, Cambridge, MA: MIT Press., 1969 年 ) 『心の社会』 (The Society of Mind, Simon and Schuster, 1987 年 ) The Emotion Machine [1], Simon and Schuster, 2006 年 8. 5.オブジェクト指向(2) (3) 「オブジェクト指向」と「オブジェクト指向プログラミング」 この2つの間には非常に大きなギャップがあります。 オブジェクト指向プログラミングとは、オブジェクト指向を実現するためのプログラミングの方法です。 オブジェクト指向という概念を、コンピュータで実現するのはいろんな課題があります。これはプログラミング 言語の限界でもあり、「フォン・ノイマン型」と言われる現在のコンピュータの原理仕組の限界ともいえます。 「 The C++ Programming Language 」の著者ビャーネ・ストロヴストルップ( Bjarne Stroustrup, 1950- )は、 この書の中で、オブジェクト指向の実現に関して、 C++ の言語仕様上どうしても実際の複雑になる、出来ない 点がある、とあちこちで嘆きのコメントが散らばっています。 もっと画期的なコンピュータが登場しないと、考えるコンピュータ、ロボット等、真のオブジェクト指向は実現 しないのかもしれません。 (4)オブジェクト指向プログラミングとオブジェクト指向で無いプログラミング どちらがいいか、という話ではまったくありません。 オブジェクト指向の利点として、拡張性、再利用性、情報隠蔽などが言われますが、これは「オブジェクト指向」 でなくても実現可能です。 C 言語でも Fortran 言語でも可能です。プログラミングするにあたって、「物」を中心に 考えるか、「処理』を中心に考えるか、というのが大きな違いです。 10. 6.「もの」を認識する(2) E F A A これは、「 A 」の上部先端部分を消したものです。 何の予備知識が無いと、「 A] だとは思わない人も居るでしょうが、 事前にアルファベットだと知らされていれば、ほとんどの人は 「 A 」だというでしょう。 その場合、欠落してる部分を、無意識のうちに補って「 A 」だと 認識しています。 「 E 」と「 F 」は、図形的には以外は良く似ています。 「 E 」と「 F 」は、下部の横棒のある無しが大きな相違です。 その横棒ある無しの違いを認識して判断します。 13. 8.フレーム理論(マービン・ミンスキー)(2) 壁 床 テーブル 壁 ホワイトボード? 概ね、下記のような「物」から成り立ってると思う人が多いと思います。ここには遠近感があり、「物」の影に隠れて いるものすら、無意識のなかで補っています。 単に直線だけで成り立った図形だと見ると、想像力を含まらせるといろんなことが想定されます。 15. 10.メッセージ (Message) とふるまい (Behavior) 社長 部長 部長 課長 「売上倍増!」 「売上倍増!」 「売上倍増!」 同じメッセージでも、受け手によって振る舞いが異なる。(重要)=>ポリモーフィズム(多様性)と呼ぶ 部下 自分の部下にまかそう もっと頑張る ! どうせ出来ないので、特に何もしない・・・ ! Message Message Message Behavior 「売上 50% 増!」 Message 少しは頑張るか・・・ Object/Class) Object/Class) Object/Class) Object/Class) 16. 11. Hello Worl d Hello World プログラムを作成して動かしてみる。 1.編集ソフト pcpad を起動して、上のファイルを作成する。 2.ファイル名は HelloWorld.java とする。(しないといけない。クラス名とファイル名が同じにする) 3.保存する。 4.コンパイルする。(エラーが出たらファイルを修正する。) 5.実行する。 public class HelloWorld { public static void main(String[ ] args) { System.out.println("Hello Java World"); } } クラス名 メインメソッド名 17. 11. Hello World (2) - コンパイルと実行の仕方 - 今回の実習では Jcpad という開発ツールを使います。 一般には eclisp という開発ツールを使うことが多い。 ① 保存 ② コンパイル 実行 ③ コンパイル結果が表示される。 HelloWorld.java HelloWorld.class コンパイル 18. 11.再び、 Hello World(1) 先のプログラムは、オブジェクト指向の「オ」の字も無いプログラムなので、オブジェクト指向っぽく 書き直して みました。 NewHello クラスと Student クラスの2つ作成し、 NewHello クラスから Student クラスに Hi というメッセージを送ると、 Student クラスが、コメントを返す、と言うプログラムです。 public class NewHello{ public static void main( String [] args ) { Student suzuki = new Student(); Student yoshida = new Student(); suzuki.Hi(1); yoshida.Hi(2); } } class Student { String comment1 = " ハロー!!! "; String comment2 = " こんにちわ! "; public void Hi(int i){ if(i==1){ System.out.println(comment1); } else if(i==2){ System.out.println(comment2); } } } NewHello クラス Student クラス オブジェクト suzuki オブジェクト yoshida Hi new new 19. 11.再び、 Hello World(2) - コンストラクタ - JAVA で重要な基本要素であるコンストラクタを追加してみます。 ( 紙面の都合で yoshida さんは省略します。) public class NewHello2{ public static void main( String [] args ) { Student suzuki = new Student(); suzuki.Hi(1); } } class Student { String comment1; String comment2; Student(){ System.out.println("Student が生成されました "); comment1 = " ハロー !!!"; comment2 = " こんにちは! "; } public void Hi(int i){ if(i==1){ System.out.println(comment1); } else if(i==2){ System.out.println(comment2); } } } コンストラクタ ・オブジェクトが生成された時に行う処理を記述する。 ・コンストラクタ名はクラス名と同じでなくてはならない ・ public も戻り値もつけない。 この時 (new )にコンストラクタ が実行される。 コンストラクタを利用して 文字列を代入する。