みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

なぜ「C言語」にOOPが実装されなかったの?

1972年に開発された「C言語」(C++ではない)には「オブジェクト指向」というのがないのですが、なぜ「C言語」に「オブジェクト指向」というのが実装されなかったのですか?

「オブジェクト指向プログラミング」は1960年代後半に登場していたのですが、後発の「C言語」には「ポインタ」はあっても「オブジェクト指向」というのがありません。なぜ「オブジェクト指向」は実装されなかったのでしょうか?

当時コンピュータの性能が低かったため実装が難しかったことと、まだ当時オブジェクト指向自体が無名だった為、「C言語」の開発者自体も知らなかったということもあるのでしょうか?

投稿日時 - 2019-07-12 20:13:59

QNo.9634716

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

まだ5Mの8086すら出てない頃なので、コンパクトでアセンブラと親和性がある高速で汎用な言語が求められていたからではないでしょか?
まだまだ3Dの画像処理ライブラリーなど必要とされず、暗号化ですら重くてままならない時代だったと記憶してます。

投稿日時 - 2019-07-13 14:54:39

ANo.6

ちなみにC言語が作られた時期にあったOOP言語はSmulaとSmalltalkくらいしかないです(SimulaはOOP言語として作られたわけじゃありませんが)。
またPascalがOOP言語と思われている方もいらっしゃいますがPascalはOOP言語ではないです(よく知られているPascal処理系の多くがOOP言語として拡張されたObject Pascal処理系ということもあるんでしょうけど)。

投稿日時 - 2019-07-13 14:50:40

ANo.5

C言語は元々UNIX OSを作るために開発された言語で、OSを作る上でオブジェクト指向を必要としていなかったから、オブジェクト指向のための特別な機能が実装されなかったのです。

C言語を元にアプリケーション開発に適した言語としてC++が開発され、アプリケーション作成にはオブジェクト指向が便利なので取り入れられました。

投稿日時 - 2019-07-13 00:30:02

ANo.4

OOPは指向であり 概念です
アセンブラでもOPP で 組むことはできますし
JAVAで組んでいるから 必ずしも OPP ではありません


消されちゃったので
手形として残しておいた
https://plaza.rakuten.co.jp/anaheim86/diary/201904090001/


笑い話です オブジェクト指向をちゃんと理解してれば笑えます

オチの解説
https://plaza.rakuten.co.jp/anaheim86/diary/201904090001/
笑い話の落ちを解説するのはなんだが 解説を付けてみました

投稿日時 - 2019-07-13 00:19:01

ANo.3

C言語は高級なアセンブラとして出てきたもの…だと思います。

アセンブラではレジスタ番号やメモリ領域を直接アドレスで管理し、変数はメモリアドレスを直接指定して(つまりすべてグローバル変数)使ったりしました。
またループや条件判断も、すべて単純な比較命令とジャンプ命令を組み合わせて各種アルゴリズムを実装していたわけです。

そこにforやwhileのような構造化命令、ローカル変数と言った考え方を導入しつつ、ポインタやビット操作と言ったアセンブラ的な操作も可能な言語、それがC言語です。

CPUスピードも遅くメモリも非常に小さかった当時、コンパイル後のオブジェクトがとても小さく、実行速度も非常に速いC言語はとても重宝されました。
アセンブリ言語の置き換えですから、オブジェクト指向なんて考え方自体ありません。
また、メモリ領域に直接アクセスできるので、ちょっとしたプログラムミスですぐ暴走したりハングアップするものが作れてしまうのもC言語ならでは。
アセンブラに次いで最も低級な言語だと思います。

確かにオブジェクト指向の考え方が組み込まれた言語は同世代にPascal言語などありましたが、実行オブジェクトも大きく実行速度は遅く、単純作業をガーーッッと回すような環境には向いていなかったと考えられます。
でも例えば、実行時に確保している配列インデックス外にアクセスしようとしたらエラーになったり、どんな想定外エラーが起きようともきちんとプログラムが止まってOSに制御が戻ってくるなど、研究目的のプログラミングではその方が実にありがたいわけです。

ですがメモリもストレージも大量に使えるようになり、C言語の体系でもオブジェクト指向に書ける様になれば、別の言語を一から習得し直すことも無く便利だよね、と、C言語を拡張したものがC++言語になります。
それにより例えば、単純なメモリ上の配列の代わりに、オブジェクトの持つフィールドと、それを操作するメソッド呼び出しにすることで、インデックス外エラーを検出するような予防的プログラミングも自然な形で書くこともできます。
…そんなことを実際にどれだけの人がやっているかは疑問ですが(汗

一番はじめのC言語コンパイラは、分岐やループ構造を単純なマクロ置き換え的な作業でアセンブリ言語に展開するようなものだったでしょう。
そこにオブジェクト指向なんて高級な概念は入れようが無かったんだと思います。

投稿日時 - 2019-07-12 23:57:24

ANo.2

Cだって、オブジェクト指向のプログラムはいくらでも作れますが・・・

そんなのはプログラムの作り手次第でどうにでもなる話です。

投稿日時 - 2019-07-12 21:08:00

ANo.1

必要なかったからです。
元々はUNIX上で動くユーティリティーを作成するために作られたものですし。

またC言語はOOP言語ではありませんが、
オブジェクト指向プログラミングができないわけではありません(C言語に限りませんけど)。

投稿日時 - 2019-07-12 20:48:20

あなたにオススメの質問