私のアドバイス:
bash
(およびそのilk)は汎用プログラミング言語ではありません。洗練されたスクリプトを実行することは可能ですがbash
、一般的なプログラミングを学ぶのに最適な方法ではありません。これは、主に他のプログラムの実行、データファイルとディレクトリの処理、およびそれらへの入出力のマーシャリングを中心に展開するシステム管理タスクを達成する最も自然な方法です。bash
ハンマーの場合、実際に釘のように見える問題のためにそれを予約します。andのbash
非常に小さなサブセットを学習すれば、自明ではないことを学ぶのはかなり簡単になります(文字列操作はこれらの「小さな」言語の同様の操作の構文に大きく影響されているため)。sed
awk
bash
- Linuxでの汎用プログラミングでは、熱烈な議論がたくさん聞かれます。2つの最も優れた候補は、PerlとPythonです。これらは両方とも汎用の非常に高レベルのスクリプト言語であり、システム上の任意のユーザー空間プロセスがアクセスできるほぼすべての操作を実行するのに十分な低レベル機能を公開し、事前に作成されたモジュールとライブラリの膨大なコレクションを使用できます。
私はあなたがCの入門テキストを読み、実行しているいくつかの時間を費やすことをお勧めしますstrace
し、ltrace
のようないくつかの簡単なユーティリティのコマンドでコマンドをls
し、mkdir
そして/bin/echo
私がお勧めしたいなど(実際には、これらの日ltrace -S
の代わりに、strace
両方のコマンドからとへの出力にはなく進出オプションltrace
によって拡張された出力は-S
非常に教育的です)。
Cは、LinuxカーネルとGNU libcが記述されている主要なプログラミング言語です。(小さな部品は組み立て中です)。Linux(または他のUNIX系)システム上のほとんどすべてのプログラムは、Cライブラリ(libc)にリンクされています。主要なPerlおよびPythonインタプリタ(および他のほとんどのスクリプト言語)もCで記述されています。これらのプログラム(カーネル、共通システムライブラリ、さまざまなスクリプト言語インタプリタ)はすべてCプログラマーによって記述され、その設計と機能は強く影響を受けます基礎となる実装によって。したがって、これらのいずれかをより深く理解するには、最終的にCを理解する必要があります。このレベルのプログラミングを理解するために、C ++やJavaについて何も知る必要はありません。(あなたのキャリアパッチに応じて、それぞれが興味深く必要な場合がありますが、
したがって、これまでのところ私の前提に同意する場合は、PerlとPythonの間の選択に要約しました。
ここから本当の炎戦争が始まります。
私のアドバイスは、最初にPython(2.x)に集中することです。Pythonの構文は比較的単純で一貫しています。Python 構文の基礎を数時間で習得できます。これは、これまでに出くわす構文の大部分です。基本的な構文のしわになっている機能(リスト内包表記、ジェネレータ式、デコレータ)はほんのわずかです。したがって、Pythonを学習する際のほとんどの努力は、広範な標準ライブラリを学習し、それらを使用する「最良の」方法を見つけることに専念します(そして、プログラムを堅牢にするために処理する価値のある特定の例外セットを特定する)そして、最も重要なことは、基礎となる概念を学習することです。
Pythonの広範なライブラリと比較的単純な構文には、2つの明らかな欠点があると思います。
最初に、Pythonで非常に高いレベルで物事を行う方法を学ぶと、退屈になるために低いレベルで作業する必要があると思うかもしれません。私が働いている場所は標準です。私は自分の作品をPythonでプロトタイプ化しましたが、Perlの場合よりもはるかに迅速かつ確実に動作させることができます。それから、同僚のためにそれをPerlに移植する必要があることを恐れています。(Pythonを使用する何年も前に、私はPerlがかなり得意でした---それは単純な親しみの問題ではありません)。
もう1つの欠点は、Pythonで特定のタスクを実行するための最高レベルの方法を見つけることが困難な場合があることです。たとえば、Webページを取得するには、最初に低レベルソケットで実行してみてください...これは動作します。ただし、urllib
and / or urllib2
モジュールに含まれているコードをすでに複製している可能性があります。2.7.1の時点で標準ライブラリにこれらの両方が含まれているという事実は、私の主張を意味します。可能であれば、Pythonのメンテナーは古いモジュールとAPIを透過的に拡張しました。ただし、Pythonが2つまたは3つのモジュールを保持し、何らかの理由で透過的な拡張が不可能なケースが多数あります。(別の例としては、コマンドラインオプションを解析するためのオプションを見ることができる:argparse
、optparse
、およびgetopt
。getopt
(最も古い)を使用してプログラムを作成しても、ほとんど害はありません。少数のオプションと厳格な呼び出し規則(たとえば、少数の人々によってのみ使用される)を備えた非常に単純なユーティリティの場合、sys.argv
自分の上を歩くことに本質的に問題はありません。ただし、通常はドキュメントを注意深く読み、使用可能な新しいまたはより高いレベルの機能を説明する古いまたはより低いレベルのモジュールの下部にあるリンクをたどる価値があります。
私のアドバイスは、あなたがより深い概念に焦点を合わせ、構文や言語固有の問題に多くの時間と労力を費やす必要がないという私の意見に基づいています。スレッドに対してサブプロセスを使用するタイミング、またはPythonに含まれるマルチプロセッシング機能を使用するタイミングを理解することは、言語とは関係なく、言語に関係なくプログラミングの習熟度とは関係ありません。(スレッド化とマルチプロセッシングとの比較によってTwistedのイベント駆動型モデルについての議論を理解できる時点で、おそらくPythonをマスターし、あらゆる言語でプログラミングする準備ができているでしょう)。
Perlの反論は簡単で実用的です。特にPerlのスキルを必要とする仕事は他にもたくさんあります。Perlは強力な言語であり、非常に広範なライブラリを備えています。(ほとんどのLinuxシステムで配布されるPerlのコアは、標準のPythonライブラリよりも狭い範囲の機能をカバーしています;ディストリビューションまたはCPANを介してかなりの数の追加パッケージをインストールすることを想定しています---包括的なPerlアーカイブネットワーク)。(対照的に、個別に取得しなければならないPythonモジュールとパッケージは少数です... PyPIから入手できます--- Python Package Index)。
したがって、Perlを学習すれば、短期的にはジョブ、特にsysadminジョブを見つけるための準備が整います。しかし、Perlの構文は...まあ...ある愛好家の言葉では... "病理学的に折!的!" Perlは非常に簡潔にすることができ、そのコードにはかなりの句読点が含まれています。それが好きな人は、それが「簡単」であり、完全に理にかなっていると無限に議論します。そして、与えられたコードの断片が正確にどのように解釈されたかについての混乱に満ちたフォーラムでそうする無限の機会があります。ドキュメントで使用されている構文と言語、および公開フォーラムでそれをサポートしている人は、それらを学習するためにかなりの努力を費やすことができる程度に微妙です。
さて、この先行する解説は主観的で偏っていることを理解してください。Perlを試してみると、直感的で快適な構文であることがわかります。もしそうなら、あなたへのより多くの力。しかし、個人的には、Perlの特異性に対する私の理解は非常に急速に低下することがわかりました。私が保持している基本的なことですが、数行以上のコードのためにそれに戻らなければならないときはいつもそれが苦労であることがわかります。
Java、LispとScheme、TCL、Scalaなど、勉強する他の言語がたくさんあります。ただし、実用性とシンプルさの最適なバランスを提供するものから始めることをお勧めします。