この記事は、著者がHabréでの1回のディスカッションで受け取った印象の影響を受けて書かれたものであり、Wikipediaを主な目的とするオブジェクト指向プログラミングの歴史に関する無料ソースからの資料の小さな一連の翻訳に加えて、読んだ資料からの著者の完全に偏った結論を表しています。
どの言語が実際に世界で最初のOOP言語であるか、JavaとC#が純粋なOOP言語と呼ばれるかどうか、そして他の詳細を浸透することに興味があるなら、私はあなたを招待します...
まず、WikipediaからのOOPの歴史に関する翻訳:
これらの言葉の現代的な意味での「オブジェクト指向」および「指向」という用語は、1950年代後半から1960年代初期にMITに登場しました。 人工知能の専門家の間では、「オブジェクト」という用語は、プロパティ(属性)を持つ識別された要素(Lispアトム)を指す場合があります。 アラン・ケイは後にLispの内部構造を理解することが1966年の彼の思考に大きな影響を与えたと書いた。MITでのOOPの初期のもう1つの例は、1960–61年に
Ivan Sutherlandによって作成された
スケッチパッドでした 1963年に作成された技術報告書の用語集で、彼の
Sketchpadの論文に基づいて、サザーランドは「ウィザード」または「定義」に基づくクラスの概念で「オブジェクト」および「インスタンス」の概念を定義していますが、これらの用語はすべてオブジェクトのグラフィック表現に関連しています[要するに、
スケッチパッドはコピーが作成されたメインのイメージでした。 メインを変更すると、コピーも変更されます。 ご注意 トランス。]。
初期のMITバージョンのALGOL AED-0では、データ構造(Algol方言の「プレックス」)は、後にメッセージ、メソッド、またはメンバー関数と呼ばれるプロシージャに直接関連付けられていました。
正式な概念としてのオブジェクトは、離散イベントモデリングに焦点を当てたプログラミング言語であるSimula Iの最新バージョンである
Simula 67の1960年代のプログラミングに登場しました。 Simulaの著者は、オスロのノルウェーコンピュータセンターのOle Johan DahlとKristen Nygordです。 Simulaは、
SIMSCRIPTとCharles Hoarによって提案されたレコードクラスの概念の影響下で開発されました。 Simulaには、独自のプログラミングパラダイムの一部として、サブクラス、仮想メソッド、コルーチン、離散イベントモデリングだけでなく、クラスとインスタンス(またはオブジェクト)の概念が含まれていました。 この言語は自動ガベージコレクターを使用しました。これは、関数型言語Lisp用に以前に開発されました。 その後、Simulaは主に物理モデリングに使用されました。 Simulaのアイデアは、Smalltalk、Lispバリアント(
CLOS )、
Object Pascal 、
C ++などの後の言語に大きな影響を与えました。
Xerox PARCが Alan Kayと他の数人の科学者
によって発明した
Smalltalk言語は、実際にコンピューティングの基礎として「オブジェクト」と「メッセージ」の使用を強制しました。 Smalltalkの作成者はSimulaのアイデアに触発されましたが、Smalltalkは、Simulaのように静的にではなく、クラスを動的に作成および変更できる完全に動的なシステムとして設計されました。 SmalltalkとOOPは、その助けを借りて、1981年8月に
Byte 誌で幅広い聴衆に紹介されました。
1970年代、KayeのSmalltalkは、Lispコミュニティを使用して、
Lispマシンを使用する開発者に導入された言語にオブジェクト指向技術を導入するよう奨励しました
。さまざまなLisp拡張機能の実験により、最終的に
Common Lisp Object System (CLOS、最初の標準化されたオブジェクト指向言語、
ANSI Common Lispの一部 )が作成され、機能的プログラミングとオブジェクト指向プログラミングの両方が有機的に組み込まれ、
メタオブジェクトプロトコルを使用します 。 1980年には、メモリ内のオブジェクトを操作するためのハードウェアサポートを含むプロセッサアーキテクチャを設計する試みがいくつかありましたが、それらはすべて失敗しました。 例には、
Intel iAPX 432および
Linn Smart Rekursivが含まれます。
オブジェクト指向プログラミングは、Visual FoxPro 3.0、
C ++ 、Delphiなどのサポートプログラミング言語が広く利用可能になった1990年代初期および中期に支配的なプログラミング方法論に発展しました。 このシステムの優位性は、OOPテクニックに基づいたグラフィカルユーザーインターフェイスの人気の高まりによってサポートされていました。 動的なGUIライブラリとオブジェクト指向プログラミング言語の密接な関係の例は、動的メッセージのサポートを備えたSmalltalkに基づいた、オブジェクト指向のC拡張である
Objective-Cで記述された
Mac OS Xの Cocoaフレームワークを見るとわかります。 OOPツールキットは、
イベント指向プログラミングの人気に影響を与えています(ただし、この概念は1つのOOPに限定されません)。 GUIとの見かけのまたは実際の接続が、OOPをテクノロジーの最前線に導いたとさえ考える人もいました。
ETHZürichでは、
Nicklaus Wirthと同僚もデータ抽象化やモジュール式プログラミングなどのテーマを調査しましたが、これらのアプローチは60年代以前に広く使用されていました。 1978年に
リリースされた
Modula-2にはこれらのアプローチの両方が含まれており、その追従者である
Oberonは、Smalltalkアプローチとは異なり、C ++アプローチとはまったく異なる、オブジェクト指向、クラスなどに対して独自のアプローチを備えていました。
OOP機能は、
Ada 、
BASIC 、
Fortran 、
Pascalなど、当時の多くの言語に追加されました。 元々OOPをサポートするように設計されていなかった言語にそれらを追加すると、多くの場合、互換性とコードサポートの問題が発生しました。
その後、オブジェクト指向のアプローチと
Pythonや
Rubyなどの手続き型アプローチの両方をサポートする言語が登場し始めました。 おそらく、最も商業的に成功しているオブジェクト指向言語は、
Visual Basic.NET 、
C#、および
Javaです。
.NETと
Javaの両方がOOPの優位性を示しています。
現在、記事「オブジェクト指向プログラミングの開始方法」の一部の翻訳は、Ole-Johan DahlとKristen Nygordによって執筆されました。
「SIMULA I(1962-65)およびSimula 67(1967)は、最初の2つのオブジェクト指向プログラミング言語です。 Simula 67には、オブジェクト指向プログラミングの概念のほとんどが含まれていました:クラスとオブジェクト、サブクラス(継承)、仮想関数、安全なリンク、および共通のクラスヘッダー(プレフィックスブロック)で記述されたプログラム構造のコレクションをプログラムに追加できるメカニズムです。
Xerox PARCのAlan Kayは、SimulaをSmalltalk(1970年代の最初のバージョン)の開発プラットフォームとして使用し、ユーザーインターフェイスとインタラクティブな実行を統合してオブジェクト指向プログラミングを拡張しました。 BjörnStrausstruppは、C ++の開発を開始しました(1980年代)。CでSimulaの基本概念を導入しました。
さて、少し一般化と結論。
ご覧のとおり、最初のOOP言語はSimulaでした。 しかし、最初の「クリーン」なOOP言語はSmalltalkでした。 OOPはOOP言語と呼ばれることもあり、そのすべてのタイプはクラスによって透過的に表現されるか、クラスによって透過的に表現されます。 この意味で、Javaは、オートボクシングが導入されたバージョン5でのみ
純粋な OOP言語になりました。 C#は、正しく理解できれば、最初から純粋なOOP言語でした。 コメントでは、「しかし、C#にはオブジェクトでは表現できないアンマネージポインターがあります」、「一般的に、Smalltalkのみが純粋なOOP言語と考えることができます。極端な場合、RubyとCleanは低速を意味します。 intオブジェクトを表すために、あなたが考えたことを見てください!」
しばらく前に
、 奇妙な habrayuzerがコメントの1つで、OOPはAlan Kayによって発明された
、純粋なOOPには継承がない 、JavaとC#、「OOP」という用語の作者によると、OOPは言語ではなく、GoslingとLippertが... ...彼らが発明した言語は通常のオブジェクト指向であると完全に誤って信じているため、
問題 。
そのような巨大なナンセンスから、私のすべての眉がすぐに腫れ上がり、私は少し困惑し、議論のためにグーグルに乗り込んで、たくさんの事実を持ってそこから現れることを意図していました。 そのよう
な危険な誤解はまだ少数の読者によって共有されていることが判明しています。 したがって、私はこの問題に関する私の見解を述べたいと思います。
オブジェクト指向プログラミングは、プログラミングに対する科学的アプローチであるパラダイムであり、真空ではなく、大勢の科学者によって開発されました。 ケイのOOPへの貢献は非常に貴重ですが、OOPが彼の発明であると言うことは、彼と一緒にそして別々に働いた他の多くの科学者にとって完全に不公平です。 ケイはかつて
こう言いました 。「私はSimula IまたはSimula 67が継承を行うのが好きではありませんでした(NygaardとDahlはとてつもない思想家でありデザイナーだと思っていましたが)。 だから、私はそれをよりよく理解するまで、組み込み機能として継承を除外することに決めました。」ご存じのように、彼らはOOPの発明に対する独占権を主張しませんでした。
OOPには継承(およびその他の最新のもの)がなく、そこに持ち込んだ人がOOPの意味と本質を歪めたと言うことは、ロバチェフスキーの幾何学がユークリッドによって考案された幾何学を歪め、緊急に名前を変更する必要があると言っているような新生児の汚れた手があえて聖人に触れないように、バロメトリー「または「ハイパーボロメトリー」。 リーマンの幾何学は一般にサタンからのものであり、ガブリエレ・ヴェネツィアーノと彼の同僚が説明したものではないため、ボソン弦理論は大学で教えることができません。
同意しない場合は、コメントで議論を続けることをお勧めします。