JavaRush /Java Blog /Random-JA /プログラミング言語のレベル
Marat Sadykov
レベル 41

プログラミング言語のレベル

Random-JA グループに公開済み

導入

さまざまなプログラミング言語とは何ですか? そこにはどのようなコンセプトが込められているのでしょうか?彼らはどのようにして発展したのでしょうか?この記事では、マシンコード (低レベル、コンピューターハードウェアに近い) から Java や C# などの言語 (高レベル) まで、いわゆるレベルに基づいてプログラミング言語の種類を見ていきます。プログラムのテキスト リストが 0 と 1 のセットに変換される過程で受ける変換が少ないほど、レベルは低くなります。
プログラミング言語のレベル - 1
次に次のことを見ていきます。
  1. 低水準言語(マシンコードとアセンブリ)
  2. 中級レベル (C、Fortran…)
  3. 高レベル (C++、Java、Python、Ruby、JavaScript...)
このレベルは、実装を実装するために将来のプログラムのリストをどの程度詳細に記述する必要があるかも特徴付けます。人間にとってこのプロセスはどれほど単純なのでしょうか? 言語のレベルは、その言語の能力を示す明確な指標であると考えるべきではありません。プログラミング言語は、ある分野では効果的ですが、他の分野ではあまり役に立たないツールです。建具屋も大工も木材を扱います。1つ目は主なツールであるノミのセット、2つ目は斧です。しかし、大工は彫刻が施されたキャビネットをよりエレガントにしますし、大工はより早く家を建てます。それぞれが他の仕事を行うことができますが、効率は大幅に低下します。コンピュータ内のさまざまなデータは、0 と 1 のセットで表されます。その処理のための制御コマンドは、必要な情報の場所と変更方法を決定する命令を含む同じデータです。

機械語(最下位レベル)

ソフトウェア領域からハードウェア領域まで少し訪問する必要があります。簡略化した形で見てみましょう。 プロセッサはコンピュータの主要な「頭脳」です。それがインストールされているマザーボードには、バス (通信用のデータ チャネル) を介して他のデバイスと対話するために使用されるコントローラーが含まれています。
プログラミング言語のレベル - 2
高速で動作するものもあります (赤い矢印): プロセッサーはメモリからコマンドを引き出してデータを操作します。ビデオ カードは、特に 3D ゲームでは、モニター画面上に画像を構築するために大量のテクスチャ、形状、ピクセル座標、その他のオブジェクトを消費します。 。(情報交換の速度に制限があるため) それほど高い指標を必要としないものもあります。図では、さまざまな内部および外部デバイスが緑色の矢印で接続されています。

プロセッサの内部世界

すべてのプロセッサ コマンドはメモリから取得され、バイナリ形式で実行されます。命令の形式、数、サブセットは、そのアーキテクチャによって異なります。それらのほとんどは互いに相容れず、異なるイデオロギーに従っています。また、コマンドのタイプは、プロセッサが動作するモード (8/16/32... ビット深度) とデータ ソース (メモリ、レジスタ、スタック...) に大きく依存します。同じアクションを異なる命令で表すことができます。プロセッサには、2 つのオペランドを加算する命令 (ADD X,Y) と、指定されたオペランドに 1 つを加算する命令 (INC X) があります。オペランドへのトリプルの追加は、ADD X,3 として実行するか、INC X を 3 回呼び出すことによって実行できます。また、プロセッサが異なる場合、速度やメモリ フットプリントの点でこれらの方法のどれが最適であるかを予測することは不可能です。便宜上、バイナリ情報は 16 進数形式で書き込まれます。身近なプログラム(Javaと文法が似ているC言語)の一部を考えてみましょう。
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
プロセッサに対する一連の命令の形式で同じアクションを実装するコード: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... これは、Intel プロセッサ用の低レベル プログラミング言語が実際にどのように見えるかです。引数を指定してメソッドを呼び出し、1 ずつ増分した結果を返すフラグメント。これは機械語 (コード) であり、変換せずにプロセッサに直接転送されて実行されます。 長所:
  • 私たちは状況を完全に把握しており、プロセッサーとコンピューター ハードウェアを最大限に活用できる可能性を持っています。
  • コードを整理して最適化するためのすべてのオプションを利用できます。
マイナス点:
  • プロセッサの機能に関する広範な知識を持ち、コードを実行するときに多数のハードウェア要素を考慮する必要があります。
  • 上記の例よりもわずかに複雑なプログラムを作成すると、コードの作成とデバッグにかかる​​時間が大幅に増加します。
  • プラットフォーム依存性: あるプロセッサ向けに作成されたプログラムは、通常、他のプロセッサでは機能しません。このプロセッサでは、他の動作モードではコード編集が必要になる可能性があります。
マシンコードはコンピューターの黎明期に広く使用されていましたが、コンピューターの開拓者の時代には他のプログラミング方法はありませんでした。現在、プロセッサの開発または低レベルのテストの際に、マイクロエレクトロニクス エンジニアによって時折使用されています。

アセンブリ言語 (低レベル)

コンピュータとは異なり、あなたや私は、デジタル形式よりもテキスト/意味論的な形式で情報をよりよく認識します。スマートフォンで 50 人の連絡先の名前を簡単に指定できますが、対応する電話番号を暗記することは不可能でしょう。プログラミングも同じです。次の 3 つの基本的な手順を実行して、型のはしごを上に進みます。
  • 1 つの記号命令を、対応するアクションを実行するデジタル プロセッサ命令のグループに関連付けてみましょう。
  • プロセッサ命令の引数を個別に強調してみましょう。
  • メモリ領域、変数、および個々のコマンドの場所に名前を付ける機能を紹介しましょう。
前のプログラムの断片を機械語 (中央) とアセンブリ言語 (右) で比較してみましょう。
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
ご覧のとおり、プログラムを作成するプロセスが簡素化されています。デジタル コマンド値の生成、遷移長の計算、セル間でのメモリ内のデータの分散、およびその他のプロセッサ機能に参考書を使用する必要はありません。一連の記号コマンドと実行ロジックに必要な引数から必要なアクションを記述し、変換プログラムがテキスト ファイルをプロセッサが理解できる 0 と 1 のセットに変換します。 長所:
  • コードの作成と変更のプロセスが簡素化されました。
  • すべてのハードウェア リソースの制御は維持されました。
  • プログラムを他のプラットフォームに移植するのは比較的簡単ですが、ハードウェアの互換性に応じて変更が必要になります。
マイナス点:
  • アセンブリ言語は低レベルのプログラミング言語です。コードの小さなセクションを作成することさえ困難です。さらに、機器の特定の動作も考慮する必要があります。
  • プラットフォーム依存。
最も人気のある Java デモの例:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
は次のようになります (NASM 構文、Windows API と kernel32.lib を使用)。
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
機械語と同様に、アセンブリ言語はエンジニアやシステム プログラマーによってよく使用されます。これは、タイムクリティカルな、またはさまざまな周辺デバイスのドライバーの実装機能にとって重要な、オペレーティング システム カーネルのハードウェアに依存する部分を作成するために使用されます。しかし、これを使用すると他のプラットフォームへのプログラムの移植性が大幅に低下するため、最近ではこれに頼ることが少なくなってきています。場合によっては、逆アセンブリ プロセスを使用することもあります。デジタル コードからプログラムのアセンブラ リストを作成し、小さなフラグメントを実行するためのロジックを解析します。まれに、元の高レベル コードが利用できない場合があります。ウイルスに対抗するためのウイルスの分析や、ソース コードの損失などです。アセンブリ言語は第 1/第 2 世代と考えられます(アセンブラの出現以前の疑似コードと記号コマンドとの違いについては個別に考慮しません)。デモ シーンでのアセンブラの使用を強調したいと思います。これは、芸術、数学、低レベル コーディングの融合であり、リソース制限のあるビデオ クリップを生成するプログラムの形で作成者の芸術的アイデアを具体化しています。多くの場合、プログラムとデータ ファイルの合計サイズは 256 バイトを超えてはなりません (4/64 キロバイト形式も一般的です)。以下は 4 KB プログラムの例です。

グループC/Fortran言語(中級/上級)

コンピューター技術の機能の発展に伴い、アセンブラーでのコードの機能量と実装のタイミングは満足のいくものではなくなりました。プログラムの作成、テスト、保守にかかるコストは、その能力を上回る速さで増大しました。人間の論理に近い言語で記述できるツールを提供するには、機器の機能に関する知識という点でプログラマーの要件を軽減する必要がありました。プログラミング言語の種類の新しいレベルに移行します。さらに順次呼び出しを行ってさまざまなモジュールに分割する機能 (手続き型プログラミング パラダイム)、さまざまなタイプのデータを構築する機能などを提供します。さらに、これらの対策により、他のプラットフォームへのコードの移植性が向上し、より快適な編成が可能になりました。チームワーク。上記のすべてをサポートした最初の言語の 1 つは、前世紀の 50 年代に開発されたFortranでした。ループ、分岐、サブルーチンを使用した実行ロジックの説明をテキスト形式で作成し、配列を操作して実数、整数、複素数の形式でデータを表示できる機能は、エンジニアや科学者を喜ばせました。短期間のうちに、科学の「フレームワーク」とライブラリが作成されました。これはすべて、狭い科学環境ではあるものの、Fortran が今日でも関連性があり、開発が進められているという事実の結果でした。開発の荷物が非常に大きいため、IMSL ライブラリだけが1970年 (!) 以来積極的に開発されてきました。似たような関連ソフトウェアをたくさん覚えていますか? -昔の人? このレベルの言語開発のもう 1 つの分野はCです。Fortran が科学者のためのツールになった場合、C は、オペレーティング システムやドライバーなどのアプリケーション ソフトウェアを作成するプログラマーを支援するために作成されました。この言語を使用すると、メモリ割り当てを手動で制御でき、ハードウェア リソースに直接アクセスできます。C プログラマは低レベルのエンティティを制御する必要があるため、C は高度なアセンブリ言語であり、「中レベル」言語と呼ばれることが多いという意見が多くあります。アセンブラにデータ型指定、手続き型およびモジュール型プログラミングの要素を導入した C 言語は、依然としてシステム プログラミングの主要言語の 1 つであり、最近のマイクロエレクトロニクスの急速な発展によっても促進されています。あらゆる種類のガジェット、コントローラー、ネットワーク、その他のデバイスには、機器との対話を実装するためのドライバー、コラボレーション用のプロトコルの実装、およびその他の比較的低レベルのソフトウェアが必要です。上記のすべてが、今日の言語の需要に貢献しています。オブジェクト指向と関数の原則は、C 構文から多くの部分を取り入れて、C++、C#、Java の形でさらに開発されました
  • コード作成プロセスの簡素化: 型の導入、モジュールへの分割、プログラム リストの削減。
  • 機械コードから意味論的に記述されたスタイルで人間が判読可能なコマンドへの移行による、基礎となるアルゴリズムの透過的なロジック。
  • 携帯性。別のプラットフォームで実行するためにプログラム テキストを再コンパイルするだけで十分になりました (おそらくわずかな変更が加えられました)。
  • コンパイルされたプログラムの速度。
マイナス点:
  • 自動メモリ管理が欠如しており、継続的な監視が必要です。
  • オブジェクト指向および関数型プログラミングの概念が実装されていない。

高級言語の開発

ソフトウェア作成の観点から、高級プログラミング言語はますますマシンコードから離れ始めており、手続き型プログラミング パラダイムに加えてさまざまなプログラミング パラダイムを実装しています。これらには、オブジェクト指向の原則の実装も含まれます。C++、Java、Python、JavaScript、Ruby... - このタイプの言語の範囲は、今日最も人気があり、需要があります。これらはさまざまなソフトウェアを実装する機会を提供しますが、それぞれの「専門性」を明確に決定することは不可能です。しかし、関連分野でのアプリケーションの人気は、それらを操作するためのライブラリ/フレームワーク (例: JavaScript - フロントエンド) によるものです 。この言語は、クライアント Web ブラウザーとユーザーおよびリモート サーバー間の対話用に設計されました。最も人気のあるライブラリは、Angular、React、VUE です。現在、Webサーバーやその他のサーバー(バックエンド)で比較的盛んに利用されており、特にNode.jsが人気です。 Ruby - バックエンド。スクリプト (サービス ファイル) の作成と Web サーバー上で使用されます。メインフレームワークはRuby On Railsです。 Python は(Web ドメインとは別に) 科学および工学のドメインです。これは標準的なコンピューティングおよび数学パッケージ (Mathematica、Octave、MatLab...) の代替品ですが、言語の通常のセマンティクスと多数のライブラリを備えています。機械学習システム、統計学、人工知能の分野に多くのファンを持つ。頻繁に使用されるライブラリには、django、numpy、pandas、tensorflow などがあります。 C++ – C 言語の普遍的で進化的な開発。低レベルのハードウェアと対話する機能を失うことなく、関数型およびオブジェクト指向のプログラミング機能を提供します。このため、ソフトウェア作成時の生産性と柔軟性が実現しますが、言語の仕様が複雑なため参入障壁が高く、プログラム実行時にリソースを独立して制御する必要があるなど、価格も相応に高くなります。オペレーティング システム モジュール (Windows、Symbian など)、ゲーム、エディタ (Adobe Photoshop、Autodesk Maya など)、データベース (MSSQL、Oracle など)、プレーヤー ( WinAmp...)など。最新のソフトウェアは複雑な製品であり、その開発には一度に複数のプログラミング言語が使用されており、それぞれのプログラミング言語の参加の程度を判断するのは非常に困難であることに注意してください。全体的な結果。

さらなる進歩

最近、別のタイプのプログラミング、関数型 (言語レベルのさらなる発展)が人気を集めています。これは、計算の別のタイプの抽象化です。これは、一連の関数を引数として受け取り、別の関数を返す関数です。変数の役割は同じ関数によって果たされます (私たちによく知られている変数は、Java の型宣言の前の Final に似た単なる定数式です)。関数自体はそのスコープ内で閉じられており、その操作の結果は渡された引数にのみ依存します。これから 2 つの注目すべき特性がわかります。
  • テストの場合、必要なのは関数の引数だけです (作業の結果は外部変数などに依存しません)。
  • 関数型スタイルのプログラムは奇跡的に同時実行対応です。連続した関数呼び出しは隣接するスレッドで発行でき (外部要因の影響を受けないため)、ロックを必要としません (つまり、同期の問題がありません)。マルチコア プロセッサが広く普及していることを考えると、このトピックに時間を費やす良い動機となります。
ただし、エントリのしきい値は OOP よりも高く、効果的なコードを作成するには、関数の形式で実行アルゴリズムを記述したプログラムを構築する必要があります。しかし、純粋な関数型スタイルの場合も、論理と圏論の基本を知っておくとよいでしょう。最も人気のあるのは、Haskell、Scala、F# です。しかし、心配する必要はありません。関数型プログラミングの要素は Java (および他の最新の第 3 世代言語にも) に登場しており、OOP と組み合わせることができます。JavaRush オンライン インターンシップでは、これらすべての詳細をさらに詳しく知ることができます。論理プログラミング (次のレベルの言語) の分野は、需要が低いため、まだ広く実用化されていません。プログラムを構築するには、離散数学、述語論理、制約ツール、およびその他の数学的論理分野の基礎に関する知識が必要です。最も人気のあるアクティブ言語は Prolog です。

結論

現在、最も一般的な言語は OOP です。Java は、その誕生以来、常に人気のある言語の上位 (通常は上位 3 位) に入ってきました。OOP に加えて、関数型プログラミングの要素も含まれており、さまざまなスタイルのプログラムを組み合わせることができます。Java のアプリケーションの範囲は非常に幅広く、ビジネス タスク、Web サーバー (バックエンド) の実装、Android アプリケーションを作成するための主要言語、クロスプラットフォームのプログラミング環境とワークプレイス (IDE/AWM)、モデリングなどがあります。 。Java の地位は、高品質で長寿命のコードと最も複雑なビジネス ロジックの実装を必要とする企業ソフトウェアの分野であるエンタープライズ分野で特に強力です。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION