web-dev-qa-db-ja.com

一部のプログラマーがC、Python、C ++を異なる方法で分類するのはなぜですか? -レベルについて

私はpythonの入門コースを受講しており、講師はpythonは高水準言語であり、CおよびC++は低水準言語であると述べています。それは混乱を招くだけです。 C、C++、Python、Javaなどはすべて高級言語だと思いました。

私はC、C++などのStackoverflowで質問を読んでいましたが、それらはすべてそれらの言語を高レベルとして参照しているようです。一部のプログラマーはこれらの用語を同じ意味で使用しているようです。

16
atheistlearner

高レベルと低レベルは相対的な用語であるため、使用法は時間とともに変化しました。 70年代、UNIXは、オペレーティングシステムが主に高水準言語Cで記述できることを示したため波を巻きました。当時、Cはアセンブラーとは対照的に高水準と見なされていました。

現在、Cは低レベル言語と見なされています。これは、言語も標準ライブラリも、ベクター、辞書、イテレータなどのパンとバターのデータ構造を提供しないためです。これらの構造はすべてCプログラムで作成できますが、最終的には自分で作成することになります。 Python、Javaなどは、Cに比べて高レベルです。これらの標準データ構造の多くは、言語に組み込まれているか、標準ライブラリの一部であるためです。これらをすぐに使えるようにすると、より抽象的なレベルでのプログラミングが容易になります。

Cは第2の意味で低レベルです。コンピューターのハードウェアを直接操作できるようにします(少なくともOSで可能な限り直接)。 Python、Javaなどの最も一般的な実装は、VMで実行されるため、ハードウェアから少なくとも1ステップ削除されています。 Pythonからハードウェアを操作する場合は、Python VMに拡張機能を書き込む必要があります。通常はCまたはC++で記述します。

C++は奇妙なケースです。標準ライブラリの一部として大量のNiceデータ構造を提供しますが、ハードウェアの低レベル操作も可能です。

31

これを、低水準言語から高水準言語に至るまで、スライディングスケールの観点から考えてください。言語がLOWからHIGHにスケールアップすると、その言語はコンピューターとの特定のインターフェースからますます抽象化を提供します。

低レベル言語は、コンピューターを明示的に指示するように記述されています-マシンコードとアセンブリコードを考えてください。

高水準言語は、重要な詳細(特にメモリの割り当てとメモリの解放)を抽象化しようとします。アイデアは、プログラミングへのより「自然な」インターフェースを提供し、うまくいけばプログラマーが設計と生産に集中できるようにすることです。

最近では、Cは低レベル言語と見なされています。それはまだマシンコードとアセンブリコードからいくつかの重要な抽象化を持っているので、技術的にはこれらよりも「高い」。ただし、それでもダイレクトメモリアドレス指定は提供され、ガベージコレクションは提供されません。したがって、これらはプログラマーが設計しなければならない詳細です。

これをPython、RubyまたはHaskellなどの他の言語と比較すると、インターフェイスがはるかに不明瞭になります。これらの言語には、コンピュータコマンドの大部分を抽象化するコードの大きなライブラリがあります。 Python=の変数に関数のローカルスコープを離れるとき、またはそれを削除するとき?おそらく正しくありませんか?これは、高水準言語では、 !彼らはあなたのためにメモリの割り当て/解放の世話をします。

高水準言語には機能の利点があります。彼らは私たちが自由に(そして安全に)設計および開発することを可能にします。

低レベル言語には、ほとんどの場合、速度の利点があります。 HIGHレベルのコードを解釈するにはコストがかかります。さらに、「コンピュータスパイク」で何かを書くのはちょっとクールです。

お役に立てれば

8
Nick Burns

高レベルと低レベルは白黒のものではなく、継続的なスケールです。これらの用語は、プログラミング言語がハードウェアにどれだけ近いかを表すために使用されます。レベルが高いほど、ハードウェアを抽象化します。

最低レベルは、明らかに、バイナリマシンコードです。これは、OSがロードしてCPUに供給する正確な表現です。アセンブリは、その上に構築される最初の抽象化レベルです。バイナリコードの代わりに、バイナリマシン命令を表す人間が読める記号コードをニーモニックで記述します。これは、UNIXより前のシステムプログラミングで使用されていたものです。

Cは抽象化チェーンの次のステップであり、フロー制御構成に共通パターンをバンドルし、プラットフォーム固有の構文にマシン固有の命令を抽象化します。この最後の抽象化は、UNIXを革新的かつ非常に成功させた主要な要因の1つでした。つまり、大きな変更を加えることなく、どのプラットフォームでも同じコードをコンパイルできるということです。

C++は、抽象化の別のレイヤーを追加します。これは、クラス(OOP構文に渡されるvtableとコンテキストを抽出)、newdelete(メモリ割り当てと変数をバンドルする)を追加します単一の構成への初期化)、コンパイル時の型チェック、テンプレート(タイプセーフなコンパイル時のメタプログラミング)、および名前空間、関数、演算子のオーバーロードなどのコンパイル時の構文の便利さ。

Pythonは、ハードウェアからさらに大きな一歩を踏み出しました。 C++でも、プログラマーはメモリ割り当てを完全に制御でき、RAMを直接操作できます。 Pythonはメモリ管理を処理します。さらに、コードをすべてネイティブのマシン命令にコンパイルする代わりに、仮想マシンに対して実行します。これにより、パフォーマンスが低下する場合があります(高額ですが、通常は心配する必要はありません)が、実行時に関数やクラスを操作したり、実行時に任意のオブジェクトの名前を取得したりするなど、C++で扱いにくく、Cで耐え難いほどのきちんとしたことも可能になります時間、実行時の名前によるクラスのインスタンス化、モンキーパッチなど。

したがって、人々が言語を「高レベル」と「低レベル」の言語に分けるとき、彼らはどこかに任意の線を引きます、そしてその線は常に同じではありません。 1970年には、境界はアセンブリとCの間でした(決定的な要因であるプラットフォーム固有の機械命令を抽象化すること)。 1987年には、CとC++の間のどこかにあった可能性があります。今日、それはC++とJava(決定的な要素として自動メモリ管理を使用)の間にあるかもしれません)。

簡単に言えば、高水準性はスライディングスケールであり、3つの言語でC <C++ <Pythonであると述べています。

5
tdammers

「低水準」言語と「高水準」言語の境界は時々変化します。
例えば:
UNIXの時代には、Cは高級言語でした。
今日のCは、Pythonのような今日の高水準言語が持っているようなマッピングタイプ(辞書)、イテレータなどのような構造を持っていません。したがって、行がシフトし、 Cは低レベルのグループに分類されました。

低水準言語:
これらの言語は、マシンが実行できるものに「近い」(最低レベルはアセンブリコードです)。
これらの言語を使用する場合、プログラマーはメモリー管理などの最低レベルのものについて考える必要があります。その意味では、ハードウェアに近いので、直接操作する必要があります。

高級言語:
これらの言語は、メモリなどを管理するため、ハードウェアから離れます。これらの言語を操作する場合、メモリは(明らかに)要素ですが、ハードウェアを直接操作することはありません。代わりに、言語がそれを管理し、より低いハードウェアインターフェースから(おそらくより高い)離れます。

3
pradyunsg