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


15

私はpythonの入門コースを受講しており、講師はpythonは高レベル言語であり、CおよびC ++は低レベル言語であると言っています。紛らわしいです。C、C ++、Python、Javaなどはすべて高レベル言語だと思いました。

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


1
多くのものと同様に、高レベルと低レベルは単純化です-理解には役立ちますが、単純化であることを忘れると誤解を招く可能性があります。他の人が言ったように、レベルは確かに相対的です。しかし、それは必ずしも線ではありません-抽象化できる方向は異なります(たとえば、異なるパラダイム)。マシンの抽象化からさらに進んでいるからといって、必ずしもアプリケーションに適切な抽象化に向かっているとは限りません。
Steve314

開始点でさえ異なる場合があります。たとえば、IMOラムダ計算は非常に低レベルの抽象化です-マシンで十分に抽象化されていますが、関数型言語が抽象化の構築を開始するための開始点として機能する非常に単純な抽象化です。いずれにせよ、ラムダ計算は、マシンコードよりも特定のアプリケーションにとって理想的な抽象化に近いものではないでしょう。
Steve314

回答:


31

高レベルと低レベルは相対的な用語であるため、使用は時間とともに変化します。70年代、UNIXは、オペレーティングシステムを主に高レベル言語で記述できることを示したため、波を起こしました。

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

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

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


3
C ++は、それほど奇妙なケースではありません、IMO-単純に混合レベルの言語です。取得する抽象化のレベルは、使用する機能によって異なります。
Steve314

1
@ Steve314:はい​​、いいえ:通常、抽象化には情報の隠蔽が伴います。つまり、言語またはライブラリはインターフェイスを提供するブラックボックスのようなものであり、誰もブラックボックスの中身を知りたくありません。C ++は高レベルの構造を提供しますが、プログラマがその表現にアクセスしてそれらを壊すことを妨げないため、この点で少し奇妙です。C ++は、さまざまな抽象化レイヤーを分離しない唯一の言語です(ただし、他の言語は知らないかもしれません)。
ジョルジオ

1
@Giorgio-C ++では実装の詳細を隠すことができます。たとえば、クラスのプライベート内部の一部にすることで、そのクラスのパブリックインターフェイスを介した唯一の公式な使用方法になります。もちろん、ルールを破って必要なだけメモリをスクランブルできますが、実際には、実際のアプリケーション開発をサポートする任意の言語でそれを行うことができます。
Steve314

@Giorgio-Haskellを例にとってみましょう。その場合の「安全でない」とは、参照的に透明ではないことを意味する傾向があります(などunsafePerformIO)。IORef型はありますが、reinterpret_cast私が知っているものに相当するものはなく、ポインター演算に相当するものもありません。しかし、だからといって、メモリを持ち歩く人から安全であるというわけではありません。実用的な言語であるためには、Haskellは実際のオペレーティングシステムとライブラリとのインターフェースをとる必要があります。「外部関数インターフェース」があります。本当にそれを破壊したい場合は、FFIを使用してプリミティブなSubversion関数を作成するだけです。
Steve314

@Giorgio-もちろん、メモリ内で破損させたい値を見つけるのに苦労するかもしれませんが、どれだけうまく隠しているかによって、同じことがC ++にも当てはまります。たとえば、PIMPLを使用する場合があります。次に、それが指すものを理解しているライブラリにオブジェクトコードとヘッダーのみを提供する場合、破壊者はそのオブジェクトコードをリバースエンジニアリングして、破壊する対象と方法を判断する必要があります。
Steve314

8

これは、低レベルの言語から高レベルの言語まで、スライディングスケールの観点から考えてください。言語が低から高にスケールを上げると、言語はコンピューターとの特定のインターフェースからますます抽象化されます。

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

高レベル言語は、重要な詳細(特にメモリの割り当てとメモリの解放)を抽象化しようとします。考え方は、プログラミングにより自然なインターフェイスを提供し、プログラマーが設計と生産に集中できるようにすることです。

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

これをPython、Ruby、Haskellなどの他の言語と比較すると、はるかにわかりにくいインターフェイスがあります。これらの言語には、コンピューターコマンドのほとんどを抽象化する大規模なコードライブラリがあります。関数のローカルスコープを離れたり削除したりすると、Pythonの変数はどうなるのか疑問に思ったことはありませんか?おそらく正しくないのですか?そして、それは、高レベルの言語ではあなたがする必要がないからです!彼らはあなたのためにメモリの割り当て/解放の面倒を見ます。

高水準言語には、機能という利点があります。それらにより、私たちは自由に(そして安全に!)設計と開発ができます。

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

お役に立てれば


5

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

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

Cは抽象化チェーンの次のステップであり、共通パターンをフロー制御構造にバンドルし、マシン固有の命令をプラットフォームに依存しない構文に抽象化します。つまり、大きな変更を加えることなく、同じコードをどのプラットフォームでもコンパイルできるということです。

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

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

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

簡単に言えば、高レベルはスライディングスケールであり、3つの言語については、C <C ++ <Pythonです。


高レベルと低レベルは1つのスケールではなく、2つの別々のスケールです。低レベルは、言語がマシンの動作にどれだけ関連しているかに関連し、高レベルは、抽象化を提供する能力に関連しています。C#はC99よりも高レベルの言語ですが、C標準で定義されている言語より低レベルです。たとえば、「int」ポインターを使用して配列2の「short」値を処理する時間はC#で定義されていますが、C99では定義されていません。
supercat

3

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

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

高レベル言語:
これらの言語は、メモリ自体を管理するため、ハードウェアからあなたを遠ざけます。これらの言語で作業する場合、メモリは(明らかに)要因ですが、ハードウェアを直接操作することはありません。代わりに、言語がそれを管理し、より低いハードウェアインターフェイスからユーザーを遠ざけます(おそらくより高い)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.