- 締切済み
なぜ「C言語」にOOPが実装されなかったの?
1972年に開発された「C言語」(C++ではない)には「オブジェクト指向」というのがないのですが、なぜ「C言語」に「オブジェクト指向」というのが実装されなかったのですか? 「オブジェクト指向プログラミング」は1960年代後半に登場していたのですが、後発の「C言語」には「ポインタ」はあっても「オブジェクト指向」というのがありません。なぜ「オブジェクト指向」は実装されなかったのでしょうか? 当時コンピュータの性能が低かったため実装が難しかったことと、まだ当時オブジェクト指向自体が無名だった為、「C言語」の開発者自体も知らなかったということもあるのでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- chachaboxx
- ベストアンサー率23% (412/1777)
まだ5Mの8086すら出てない頃なので、コンパクトでアセンブラと親和性がある高速で汎用な言語が求められていたからではないでしょか? まだまだ3Dの画像処理ライブラリーなど必要とされず、暗号化ですら重くてままならない時代だったと記憶してます。
- wormhole
- ベストアンサー率28% (1626/5665)
ちなみにC言語が作られた時期にあったOOP言語はSmulaとSmalltalkくらいしかないです(SimulaはOOP言語として作られたわけじゃありませんが)。 またPascalがOOP言語と思われている方もいらっしゃいますがPascalはOOP言語ではないです(よく知られているPascal処理系の多くがOOP言語として拡張されたObject Pascal処理系ということもあるんでしょうけど)。
- t_ohta
- ベストアンサー率38% (5238/13705)
C言語は元々UNIX OSを作るために開発された言語で、OSを作る上でオブジェクト指向を必要としていなかったから、オブジェクト指向のための特別な機能が実装されなかったのです。 C言語を元にアプリケーション開発に適した言語としてC++が開発され、アプリケーション作成にはオブジェクト指向が便利なので取り入れられました。
- hahaha8635
- ベストアンサー率22% (800/3610)
OOPは指向であり 概念です アセンブラでもOPP で 組むことはできますし JAVAで組んでいるから 必ずしも OPP ではありません 消されちゃったので 手形として残しておいた https://plaza.rakuten.co.jp/anaheim86/diary/201904090001/ ↑ 笑い話です オブジェクト指向をちゃんと理解してれば笑えます オチの解説 https://plaza.rakuten.co.jp/anaheim86/diary/201904090001/ 笑い話の落ちを解説するのはなんだが 解説を付けてみました
- asciiz
- ベストアンサー率70% (6803/9674)
C言語は高級なアセンブラとして出てきたもの…だと思います。 アセンブラではレジスタ番号やメモリ領域を直接アドレスで管理し、変数はメモリアドレスを直接指定して(つまりすべてグローバル変数)使ったりしました。 またループや条件判断も、すべて単純な比較命令とジャンプ命令を組み合わせて各種アルゴリズムを実装していたわけです。 そこにforやwhileのような構造化命令、ローカル変数と言った考え方を導入しつつ、ポインタやビット操作と言ったアセンブラ的な操作も可能な言語、それがC言語です。 CPUスピードも遅くメモリも非常に小さかった当時、コンパイル後のオブジェクトがとても小さく、実行速度も非常に速いC言語はとても重宝されました。 アセンブリ言語の置き換えですから、オブジェクト指向なんて考え方自体ありません。 また、メモリ領域に直接アクセスできるので、ちょっとしたプログラムミスですぐ暴走したりハングアップするものが作れてしまうのもC言語ならでは。 アセンブラに次いで最も低級な言語だと思います。 確かにオブジェクト指向の考え方が組み込まれた言語は同世代にPascal言語などありましたが、実行オブジェクトも大きく実行速度は遅く、単純作業をガーーッッと回すような環境には向いていなかったと考えられます。 でも例えば、実行時に確保している配列インデックス外にアクセスしようとしたらエラーになったり、どんな想定外エラーが起きようともきちんとプログラムが止まってOSに制御が戻ってくるなど、研究目的のプログラミングではその方が実にありがたいわけです。 ですがメモリもストレージも大量に使えるようになり、C言語の体系でもオブジェクト指向に書ける様になれば、別の言語を一から習得し直すことも無く便利だよね、と、C言語を拡張したものがC++言語になります。 それにより例えば、単純なメモリ上の配列の代わりに、オブジェクトの持つフィールドと、それを操作するメソッド呼び出しにすることで、インデックス外エラーを検出するような予防的プログラミングも自然な形で書くこともできます。 …そんなことを実際にどれだけの人がやっているかは疑問ですが(汗 一番はじめのC言語コンパイラは、分岐やループ構造を単純なマクロ置き換え的な作業でアセンブリ言語に展開するようなものだったでしょう。 そこにオブジェクト指向なんて高級な概念は入れようが無かったんだと思います。
Cだって、オブジェクト指向のプログラムはいくらでも作れますが・・・ そんなのはプログラムの作り手次第でどうにでもなる話です。
- wormhole
- ベストアンサー率28% (1626/5665)
必要なかったからです。 元々はUNIX上で動くユーティリティーを作成するために作られたものですし。 またC言語はOOP言語ではありませんが、 オブジェクト指向プログラミングができないわけではありません(C言語に限りませんけど)。