私はpythonの入門コースを受講しており、講師はpythonは高レベル言語であり、CおよびC ++は低レベル言語であると言っています。紛らわしいです。C、C ++、Python、Javaなどはすべて高レベル言語だと思いました。
私はC、C ++などのstackoverflowで質問を読んでいたが、それらはすべてそれらの言語を高レベルと呼んでいるようだ。一部のプログラマーはこれらの用語を同じ意味で使用しているようです。
私はpythonの入門コースを受講しており、講師はpythonは高レベル言語であり、CおよびC ++は低レベル言語であると言っています。紛らわしいです。C、C ++、Python、Javaなどはすべて高レベル言語だと思いました。
私はC、C ++などのstackoverflowで質問を読んでいたが、それらはすべてそれらの言語を高レベルと呼んでいるようだ。一部のプログラマーはこれらの用語を同じ意味で使用しているようです。
回答:
高レベルと低レベルは相対的な用語であるため、使用は時間とともに変化します。70年代、UNIXは、オペレーティングシステムを主に高レベル言語で記述できることを示したため、波を起こしました。
言語も標準ライブラリもベクター、辞書、イテレーターなどのパンとバターのデータ構造を提供していないため、現在Cは低レベル言語と見なされています。これらの構造はすべてCプログラムに含めることができますが、最終的には自分で作成することになります。Python、Javaなどは、Cに比べて高レベルです。これらの標準データ構造の多くは、言語に組み込まれているか、標準ライブラリの一部であるためです。これらをそのまま使用すると、より抽象的なレベルでのプログラミングが容易になります。
Cは、第2の意味で低レベルです。これにより、コンピューターのハードウェアを直接操作できます(少なくともOSで可能な限り直接操作できます)。Python、Javaなどの最も一般的な実装は、VMで実行されるため、ハードウェアから少なくとも1ステップは削除されます。Pythonからハードウェアを操作する場合、通常はCまたはC ++でPython VMの拡張機能を作成します。
C ++は奇妙なケースです。これは、標準ライブラリの一部として多くの素晴らしいデータ構造を提供しますが、ハードウェアの低レベルの操作も可能にします。
unsafePerformIO
)。IORef
型はありますが、reinterpret_cast
私が知っているものに相当するものはなく、ポインター演算に相当するものもありません。しかし、だからといって、メモリを持ち歩く人から安全であるというわけではありません。実用的な言語であるためには、Haskellは実際のオペレーティングシステムとライブラリとのインターフェースをとる必要があります。「外部関数インターフェース」があります。本当にそれを破壊したい場合は、FFIを使用してプリミティブなSubversion関数を作成するだけです。
これは、低レベルの言語から高レベルの言語まで、スライディングスケールの観点から考えてください。言語が低から高にスケールを上げると、言語はコンピューターとの特定のインターフェースからますます抽象化されます。
低レベル言語は、コンピューターを明示的に指示するために記述されています。マシンコードとアセンブリコードを考えてください。
高レベル言語は、重要な詳細(特にメモリの割り当てとメモリの解放)を抽象化しようとします。考え方は、プログラミングにより自然なインターフェイスを提供し、プログラマーが設計と生産に集中できるようにすることです。
最近では、Cは低レベル言語と見なされています。まだマシンコードとアセンブリコードからいくつかの重要な抽象化を持っているので、技術的にこれらよりも「高い」です。ただし、ダイレクトメモリアドレス指定は引き続き提供され、ガベージコレクションは提供されません。したがって、これらはプログラマーが設計しなければならない詳細です。
これをPython、Ruby、Haskellなどの他の言語と比較すると、はるかにわかりにくいインターフェイスがあります。これらの言語には、コンピューターコマンドのほとんどを抽象化する大規模なコードライブラリがあります。関数のローカルスコープを離れたり削除したりすると、Pythonの変数はどうなるのか疑問に思ったことはありませんか?おそらく正しくないのですか?そして、それは、高レベルの言語ではあなたがする必要がないからです!彼らはあなたのためにメモリの割り当て/解放の面倒を見ます。
高水準言語には、機能という利点があります。それらにより、私たちは自由に(そして安全に!)設計と開発ができます。
低レベル言語には、ほとんどの場合、速度という利点があります。高レベルのコードの解釈にはコストがかかります。さらに、「コンピュータースパイク」で何かを書くのはちょっとクールです。
お役に立てれば
高レベルと低レベルは、白黒のものではなく、継続的なスケールです。この用語は、プログラミング言語がハードウェアにどれだけ近いかを説明するために使用されます。レベルが高いほど、ハードウェアが抽象化されます。
明らかに、最低レベルはバイナリマシンコードです。これは、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です。
「低レベル」言語と「高レベル」言語の間の境界線は、時々変化します。
たとえば
、UNIXの時代には、Cは高級言語でした。
現在、Cには、Pythonのような今日の高レベル言語が持っているマッピングタイプ(辞書)、イテレータなどの構造がありません。そのため、ラインはシフトし、Cは低レベルグループに分類されました。
低レベル言語:
これらの言語は、マシンが実行できるものに「近い」ものです(最低レベルはアセンブリコードです!)。
これらの言語を使用する場合、プログラマはメモリ管理などの最低レベルのものを考慮する必要があります。その意味では、ハードウェアに近いため、直接作業する必要があります。
高レベル言語:
これらの言語は、メモリ自体を管理するため、ハードウェアからあなたを遠ざけます。これらの言語で作業する場合、メモリは(明らかに)要因ですが、ハードウェアを直接操作することはありません。代わりに、言語がそれを管理し、より低いハードウェアインターフェイスからユーザーを遠ざけます(おそらくより高い)。