2017-07-15、これは私がPythonを学習する最初の日です。
まず、Python は現在非常に人気のある開発言語であり、その創設者は Guido Van Rossum です。現状を見る限り、Python言語の人気は高まり続けており、C#を抜き第4位にランクインしました。 Python は優雅さ、シンプルさ、明快さを提唱しており、広く使用されている優れた言語です。
1. Python はインタープリタ言語であり、実行中に解釈が変更されます。
まず、コンパイラについて説明します。コンパイラは、ソースプログラムのすべてのステートメントをマシン語にコンパイルし、バイナリファイルに保存します。コンパイルされたバイナリファイルに基づいて、マシンは直接ファイルを実行します。 。インタプリタは異なります。プログラムを実行するとき、インタプリタはそれをコンピュータに実行させるために逐次機械語に解釈します。したがって、明らかに、実行速度はコンパイルされたファイルほど速くありません。これは、コンピュータが私たちが作成したコードを直接認識して実行することができず、コンピュータ言語 (つまり、バイナリ ファイル) しか認識できないためでもあります。
コンパイル済み VS 解釈済み
コンパイル済み
利点: コンパイラーには、コードを最適化するためのプリコンパイル プロセスがあります。コンパイルは一度だけ行われ、実行時に再度コンパイルする必要がないため、コンパイル言語の実行効率は非常に高くなります。ロケールを指定せずに直接実行できます。
欠点: コンパイラーがプログラムをコンパイルした後、コードが変更された場合は、再コンパイルする必要があります。コンパイル時には、対応するオペレーティング環境に応じてマシンコードが生成されます。異なるオペレーティング システム間で移植する場合、実行するオペレーティング システムの環境に応じて異なる実行可能ファイルにコンパイルする必要があります。
インタープリター型:
利点: プラットフォーム互換性が高く、インタープリター (仮想マシン) がインストールされていれば、どの環境でも実行できます。動的に解釈されるため、プログラム自体は非常に柔軟であり、コードを変更する際に心配する必要はなく、すぐにデプロイでき、プログラムの更新にはシャットダウンのメンテナンスが必要ありません。
欠点: コードを実行するたびに、動的解釈のプロセスを伴う必要があります。パフォーマンスはコンパイル言語ほど良くありません。
なぜ他の言語ではなくPythonなのか?
C および Python、Java、C# など
C 言語: コードはコンパイルされてマシンコードが取得され、マシンコードはプロセッサー上で直接実行されます
その他の言語:コードはバイトコードを取得するためにコンパイルされます。仮想マシンはバイトコードを実行してマシンコードに変換し、プロセッサ上で実行します
Python と C Python は C
から開発された言語です。使用目的: Python には完全なクラス ライブラリがあります実装する場合、同じ関数を Python では 10 行のコードで解決できますが、C では 100 行以上が必要になる場合があります。
速度について: C と比較すると、Python の実行速度は明らかに遅くなります。
Python と Java、C# など
使用: Linux オリジナルの Python、他の言語では利用できません; 上記の言語は非常に豊富なクラス ライブラリをサポートしています
速度について: Python は速度において若干劣る可能性があります
したがって、 Python と他の言語の間に本質的な違いはありません。その他の違いは、特定の分野に優れている、才能が豊富である、先入観がある、ということです。
Pythonの種類
Cpython
Pythonの正式版はC言語で実装されており、最も広く使われているCPython実装はソースファイル(pyファイル)をバイトコードファイル(pycファイル)に変換します。 ) ) を作成し、Python 仮想マシン上で実行します。
Jyhton
Python の Java 実装である Jython は、Python コードを Java バイトコードに動的にコンパイルし、JVM 上で実行します。
IronPython
Python の C# 実装である IronPython は、Python コードを C# バイトコードにコンパイルし、CLR 上で実行します。 (Jython に似ています)
PyPy (特殊)
Python によって実装された Python は、Python のバイトコードをマシンコードに再コンパイルします。
RubyPython、Brython...
1. 低級言語と高級言語
元のコンピュータープログラムは 0 と 1 のシーケンスで表され、プログラマーは機械語命令を翻訳せずに直接使用し、紙テープに穴を開けることで結果を実行できました。 。その後、記憶を容易にするため、0と1の並びで表される機械語命令はすべてニーモニック記号となり、機械語命令と1対1に対応するものがアセンブリ命令となり、アセンブリ言語が誕生しました。機械語命令とアセンブリ命令はどちらも機械指向であり、総称して低水準言語と呼ばれます。アセンブリ言語は特定のマシンの機械語命令のニーモニックであるため、マシン (特定の CPU アーキテクチャ) から独立させることはできません。ただし、アセンブリ言語は実行する前に機械語に変換する必要があるため、あるマシンで実行されるアセンブリ言語を別のマシンで実行される機械語に変換する方法もあり、それがクロスアセンブリ技術です。
高級言語は、人間の論理的思考の観点から開始されるコンピューター言語であり、実行する前に、特定のマシン上でターゲット コードにコンパイルする必要があります。レベル言語ステートメントを完了するには、多くの場合、複数のマシン命令が必要です。高級言語のマシンに依存しない性質は、異なるマシンに対して異なるオブジェクト コード (またはマシン命令) を生成するコンパイラーによって実現されます。具体的に言えば、高級言語はどの程度までコンパイルされるべきでしょうか? これは、コンパイル技術に関係します。これは、直接実行可能なターゲット コードにコンパイルすることも、中間表現にコンパイルして、さまざまなマシンで取得することもできます。システムを実行するには、通常、インタプリタや仮想マシンのサポートなどのサポート環境が必要です。Java プログラムはバイトコードにコンパイルされ、さまざまなプラットフォーム上の仮想マシンによって実行されます。したがって、高級言語がマシンに依存しないということは、高級言語のプログラム自体は異なるマシンやプラットフォーム上でも変化せず、コンパイラによってコンパイルされるターゲットコードは異なるマシンに適応することを意味します。この意味で、一部のアセンブラはクロスアセンブリを通じて異なるマシン間の移植性を実現できますが、このアプローチによって得られる移植性は高級言語に比べて利便性や実用性がはるかに劣ります。
2. コンパイルと解釈
コンパイルはソースプログラムを実行可能なターゲットコードに変換することですが、解釈はソースプログラムの翻訳と実行を一度に完了することであり、生成は行いません。保存可能なオブジェクトコード。これは見た目に過ぎませんが、この 2 つの最大の違いは、プログラムの実行時の制御はインタープリタにあり、コンパイルと実行の場合は実行時の制御はユーザー プログラムにあることです。 。
インタプリタは優れた動的特性と移植性を備えています。たとえば、インタプリタを解釈して実行するときに、変数の型を動的に変更したり、プログラムを変更したり、適切なデバッグ診断情報をプログラムに挿入したりできます。インタプリタは別のシステムに移植できます。の場合、プログラムはインタプリタを移植したシステム上でそのまま実行できます。同時に、インタプリタには、ユーザープログラムにスペースを割り当てる必要があるだけでなく、インタプリタ自体も貴重なシステムリソースを占有するため、実行効率が低く、占有スペースが大きいなどの大きな欠点もあります。
コンパイラはソース プログラムの各ステートメントを機械語にコンパイルし、バイナリ ファイルとして保存します。この方法では、コンピューターは実行時にプログラムを機械語で直接実行できますが、これはインタープリターのみで非常に高速です。プログラムを実行する際、コンピュータは逐一機械語に解釈して実行するため、コンパイルされたプログラムほど実行速度は速くありません
コンパイル型とインタープリタ型 まずコンパイル型を見てみましょう。実際、これはアセンブリ言語と同じです。ソース コードを変換し、対応する実行可能コードを生成するための翻訳を担当するプログラムもあります。より専門的に言えば、このプロセスをコンパイルと呼び、コンパイルを担当するプログラムを当然コンパイラと呼びます。作成したプログラム コードがソース ファイルに含まれている場合、通常はコンパイル直後に実行可能ファイルが生成され、それを直接実行できます。しかし、より複雑なプロジェクトの場合は、管理を容易にするために、通常、コードをさまざまなソース ファイルに分散し、異なるモジュールとして編成します。このとき、各ファイルをコンパイルすると、前述の実行ファイルではなく、オブジェクトファイル(Object file)が生成されます。一般に、ソース ファイルのコンパイルはターゲット ファイルに対応します。これらのターゲット ファイルの内容は基本的に実行可能コードですが、プロジェクト全体の一部にすぎないため、まだ直接実行することはできません。すべてのソース ファイルがコンパイルされたら、最終的にこれらの半完成のターゲット ファイルを実行可能ファイルに「パッケージ化」できます。このプロセスには実行可能コードが含まれていると思われるため、この作業は別のプログラムによって完了します。 , そのため、リンクとも呼ばれ、リンクを担当するプログラムは...リンカーと呼ばれます。リンカにはターゲット ファイルをリンクするだけでなく、アイコン ファイルやサウンド ファイルなどのさまざまなリソースも含まれる場合があります。また、リンカはターゲット ファイル間の冗長な重複コードの削除なども担当するため、非常に面倒です。 。リンクが完了すると、通常は必要な実行可能ファイルを取得できます。
上記ではコンパイル言語の特徴を簡単に紹介しましたが、次にインタープリター言語について見てみましょう。ああ、文字通り「コンパイル」と「解釈」はどちらも「翻訳」を意味しますが、違いは翻訳のタイミングにあります。たとえば、外国の本を読む予定で、その外国語がわからない場合は、翻訳者を見つけて、その本全体を最初から最後まで翻訳するのに十分な時間を与えてから、その本を母国語に翻訳することができます。または、すぐにこの翻訳者に読書を手伝ってもらい、一文ずつ翻訳してもらうこともできます。特定の章に戻りたい場合は、翻訳してもらいます。またあなたのために。
2 つのメソッド。前者は、先ほど説明したコンパイル型に相当します。すべてのコードを一度に機械語に変換し、それを実行可能ファイルに書き込みます。後者は、説明したインタープリタ型に相当します。 : プログラム実行時 先ほどはソースプログラムしかなく、実行プログラムはなく、ソースプログラムの特定の命令を実行するたびに、ソースコードを変換するインタプリタと呼ばれるシェルプログラムが存在していました。つまり、常に解釈、実行、解釈、実行を繰り返しています。したがって、解釈されたプログラムは、解釈されたプログラムと切り離すことができません。たとえば、初期の BASIC は古典的なインタープリター言語であり、BASIC プログラムを実行するには、BASIC 環境に入る必要があり、その後、プログラムのソース ファイルをロードして実行できます。インタプリタ型プログラムでは、プログラムは必ずソースコードの形で現れるため、対応するインタプリタがあれば移植はほとんど問題ありません。コンパイルされたプログラムのソース コードを移植することもできますが、前提条件として、異なるシステム用に個別にコンパイルする必要があります。複雑なプロジェクトの場合、これは確かに時間のかかる作業であり、いくつかの詳細がまだ必要になる可能性が非常に高くなります。コードを修正しました。さらに、インタープリターされたプログラムはコンパイル手順を保存し、編集後すぐに実行できるため、コンパイル...リンク...コンパイルに長時間かかる必要がありません。リンクプロセスに小さな変更を加えるたびに実行されます。ただし、すべてに長所と短所があります。解釈されたプログラムは実行プロセスにコンパイル処理を組み込むため、速度が数百倍も遅くなるのは当然のことです。
コンパイル型とインタープリター型には、どちらにも長所と短所があります。前者は、同じ条件下でプログラムの実行速度が速く、システム要件が低いため、C/C++、Pascal/Object Pascal (Delphi) などのオペレーティング システム、大規模アプリケーション、データベース システムなどを開発するときに使用されます。 、VB およびその他の基本プログラムはすべてコンパイル済み言語と見なされますが、一部の Web スクリプト、サーバー スクリプト、および高速要件がなく、異なるシステム プラットフォーム間の互換性に関する特定の要件があるプログラムなどは、通常、 Java、JavaScript、VBScript、Perl、Python などのインタープリタ言語。
しかし、コンパイル言語とインタプリタ言語にはそれぞれ長所と短所があり、互いに対立するため、多くの新興言語はその 2 つを妥協する傾向があります。たとえば、Java 言語はインタプリタ言語の特性に近いものです。言語では、実行前に事前にプログラムされており、プリコンパイル後、生成されたコードはマシン コードと Java ソース コードの間の中間コードとなり、実行時に JVM (Java の仮想マシン プラットフォーム) によって解釈され実行されます。 、通訳とみなすことができます)。ソース コードの高度な抽象化と移植性の特性を維持するだけでなく、ソース コードのプリコンパイル作業のほとんどが完了しているため、「純粋に解釈された」プログラムよりもはるかに高速に実行されます。 VB6 (または以前のバージョン) や C# などの言語の場合、表面上は .exe 実行可能プログラム ファイルが生成されますが、VB6 のコンパイル後に実際に生成されるものも中間コードですが、コンパイラーはその前に段落を挿入します。外部インタプリタのコードを自動的に呼び出します (インタプリタは、ユーザーが作成したプログラムから独立しており、システムの DLL ファイルに保存されています。VB6 でコンパイルされたすべての実行可能プログラムはこれを使用する必要があります)。実際の実行プログラム本体を解釈します。 C# (およびその他の .net 言語コンパイラ) は .net ターゲット コードを生成し、実際には .net 解釈システム (JVM と同様、仮想マシン プラットフォームでもあります) によって実行されます。もちろん、.net ターゲット コードはすでにかなり「低レベル」であり、機械語に近いため、依然としてコンパイル済み言語とみなされ、その移植性は Java が主張するほど強力ではありません。 .net は「一度エンコードすればどこでもコンパイルできる」です。あはは、もちろんこれらは本題から外れます。つまり、設計テクノロジとハードウェアの継続的な開発に伴い、コンパイルされたメソッドとインタプリタされたメソッドの境界はますます曖昧になってきています。動的言語と静的言語 通常、動的言語と静的言語と呼ばれるものは、動的型言語と静的型言語を指します。
(1) 動的型付け言語: 動的型付け言語とは、実行時にデータ型チェックを行う言語を指します。つまり、動的型付け言語でプログラミングする場合、変数のデータ型を指定する必要はありません。 、言語は、初めて変数にデータ型を割り当てるときに、そのデータ型を内部的に記録します。 Python と Ruby は代表的な動的型付け言語であり、VBScript などの他のさまざまなスクリプト言語も多かれ少なかれ動的型付け言語です。
(2) 静的型言語: 静的型言語は、動的型言語の逆です。そのデータ型はコンパイル中にチェックされます。つまり、プログラムを作成するときにすべての変数のデータ型を宣言する必要があります (C/)。 C++ 静的型付け言語の代表的なもので、他の静的型付け言語には C# や JAVA などがあります。
強い型定義言語と弱い型定義言語
(1)強い型定義言語:データ型の定義を強制する言語。つまり、変数に特定のデータ型が割り当てられると、キャストされない限り、常にそのデータ型になります。たとえば、整数変数 a を定義した場合、プログラムは a を文字列型として扱うことはできません。強く型指定された定義言語は、タイプセーフな言語です。
(2) 弱い型定義言語: データ型を無視できる言語。これは、変数にさまざまなデータ型の値を割り当てることができる、厳密に型指定された定義言語の逆です。
強く型付けされた定義言語は、弱く型付けされた定義言語よりもわずかに遅い場合がありますが、強く型付けされた定義言語によってもたらされる厳密性により、多くのエラーを効果的に回避できます。さらに、「この言語が動的言語であるかどうか」と「この言語がタイプセーフであるかどうか」の間にはまったく関連性がありません。 例: Python は動的言語、強く型指定された定義言語 (タイプセーフ言語)、VBScript は動的言語、弱く型指定された定義言語 (タイプアンセーフ言語) です。 (タイプセーフ言語) 言語)。
上記の紹介を通じて、Python は動的に解釈される強い型定義言語であると結論付けることができます。では、これらの遺伝子によって可能になった Python の長所と短所は何でしょうか?読み続けてみましょう。
Pythonのメリットとデメリット
まずはメリットから見ていきましょう
Pythonの位置付けは「エレガント」「明確」「シンプル」なので、Pythonプログラムは常にシンプルで、理解しやすいため、初心者向けの Python の学習は簡単に始めることができるだけでなく、将来的には非常に複雑なプログラムを作成することもできます。
Python には非常に強力なサードパーティ ライブラリがあり、コンピュータを介して機能を実装したい場合は、Python 公式ライブラリを直接ダウンロードしてサポートします。開発は以前の開発サイクルに基づいて実行されるため、開発サイクルが大幅に短縮され、車輪の再発明が回避されます。
高級言語————Python言語でプログラムを書くとき、プログラムが使用するメモリの管理方法などの低レベルの詳細について考える必要はありません
移植性— - オープンソースの性質により、Python は多くのプラットフォームに移植されています (さまざまなプラットフォームで動作できるようにするための変更が加えられています)。システム依存の機能の使用を慎重に避ければ、すべての Python プログラムは、市場のほぼすべてのシステム プラットフォーム上で変更を加えることなく実行できます
スケーラビリティ————コードの重要な部分を実行する必要がある場合は、より高速な場合、または特定のアルゴリズムを非公開にしたい場合は、プログラムの一部を C または C++ で作成し、Python プログラムで使用できます。
埋め込み可能性—Python を C/C++ プログラムに埋め込んで、プログラム ユーザーにスクリプト機能を提供できます。
欠点を見ると:
速度が遅い、Python の実行速度は確かに C 言語よりもはるかに遅く、JAVA よりも遅いため、これが多くのいわゆる専門家が軽視する理由です。 Python を使用していますが、実際には、ここで言及されている実行速度の遅さは、ほとんどの場合、ユーザーが直接認識することはできません。たとえば、C でプログラムを実行するには 0.01 秒かかります。 Python でプログラムを実行するのにかかる時間は 0.01 秒です。つまり、C 言語は Python の 10 倍高速です。これは非常に大げさですが、時間の最小単位であるため、肉眼で直接認識することはできません。普通の人が知覚できるのは約 0.15 ~ 0.4 秒です (笑)。実際、ほとんどの場合、Python はプログラムの速度要件を完全に満たすことができますが、非常に高速な要件が必要な検索エンジンを作成する場合は、もちろん C を使用して実装することをお勧めします。
PYTHON はインタープリター型言語であり、ソース コードはテキスト形式で保存されるため、コードを暗号化することはできません。ただし、プロジェクトでソース コードが暗号化される必要がある場合、これは欠点ではないと思います。暗号化されている場合、そもそもそれを実装するために Python を使用すべきではありません。
スレッドが複数の CPU を利用できないという問題は、Python の最も批判されている欠点の 1 つです。GIL (グローバル インタープリター ロック) は、スレッドを 1 つだけにするコンピューター プログラミング言語インタープリターによって使用されるツールです。はいつでも実行されており、Python のスレッドはオペレーティング システムのネイティブ スレッドです。 Linux では pthread、Windows では Win スレッドです。スレッドの実行はオペレーティング システムによって完全にスケジュールされます。 Python インタープリター プロセスには、メイン スレッドと複数のユーザー プログラム実行スレッドがあります。マルチコア CPU プラットフォームであっても、GIL の存在によりマルチスレッドの並列実行は禁止されています。この問題の妥協的な解決策については、後のスレッドとプロセスの章で詳しく説明します。
もちろん、Python には他にもいくつかの小さな欠点がありますが、ここでは書きません。私が言いたいのは、完璧な言語はなく、得意なことも苦手なこともあるということです。ある言語の欠点と別の言語の利点を比較してください。言語は単なるツールであり、中学校で幾何学を学んだときと同じように、必要な場合もあります。定規を使用するのと同じように、適切な機能を発揮するために対応するツールを使用するのが正しい選択です。以前に多くの人から、Shell と Python はどちらが優れているのかと尋ねられました。私は、Shell はスクリプト言語ですが、Python は単なるスクリプト言語ではありません。Python でできることはすべてできるので、Python を学ぶ必要はないと言う人もいます。 、B は、あなたが十分に優れている限り、シェルを使用してテトリスのようなゲームを作成できると述べました。これを表現できる唯一の方法は、SB があなたを彼と同じレベルに引き上げるということです。 、そして十分な経験を使って教えてください。
以上がPython の概要とスタートガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。