ビルドツールが、基礎となるプログラミング言語とは異なるスクリプト言語を使用するのはなぜですか?


23

私は最近、ほとんどの言語のメインビルドツール/システムが基礎となるプログラミング言語自体とは異なる言語を使用していることに気付いたときに、Nodejsプロジェクトのビルドツールを使用しています。

たとえば、makeはCまたはC ++を使用してスクリプトを記述せず、ant(またはMaven)はスクリプトの言語としてJavaを使用しません。

Rubyのような新しい言語は、rakeのようなビルドツールに同じ言語を使用します。しかし、なぜこれが常に当てはまらないのですか?基礎となる言語とは異なる言語を使用するビルドツールを持つことの利点は何ですか?


14
たぶん、汎用言語は、ツールの専門家の使用には十分ではないでしょうか?たとえば、Cでmakeファイルを書きたくありません!DSLの方が良い場合もあります。
アンドレスF.

13
別の角度から見てください:makeを使用してアプリケーションソフトウェアを作成してみませんか?
-whatsisname

4
この記事は、主に著者がLispをすばらしいと信じているものについてですが、AntがJavaの代わりにXMLを使用する理由に関するいくつかの関連情報を持っています。
8ビットツリー

6
Cプログラムの作成を自動化するプログラムをCで作成したい場合、make(Cで実装されている)再度作成するだけでは終わりませんか?
ブランディン

6
@ joshin4colours make C 記述されています。ただし、makeが使用する言語は、必要に応じてシェルを呼び出す宣言型言語です。

回答:


36

何を行うためにどのプログラミング言語を使用するかの選択は、そのプロジェクトに関連する他のタスクではなく、その目標の特定の機能に依存する必要があります。

ビルドツールは非常に具体的な作業を行い、メインプロジェクトで使用する言語に関係なく、ビルドツールはそれ自体がソフトウェアです。

メインプロジェクトとそのビルドツールを結び付けようとすることは、非常に悪い決断になる可能性があります。ビルドツールに必要なのは、主にファイルとIOの高速管理を備えた、単純なルールの高速プロセスです。

rubyのような言語がビルドツールを実装するために自分自身を使用する場合、すべてが同じ言語で記述されていると想定される必要性よりも、その言語の機能に関連しています。


18

CやJavaなどの言語をスクリプト言語として使用するビルドツールを作成することは不可能ではありません。ただし、ビルドツールには、より宣言的なスクリプト言語を使用することによるメリットがあります。Cでmakefile(またはbuild.xmlなど)を作成する苦痛と定型句を想像してください。

ビルドツールは、DSLの使用から恩恵を受けます。DSLは、Cが特に良い選択ではないタスクです。Cはビルドツールには一般的すぎて、エラーが発生しやすい低レベルの詳細にあまりにも関心があります。たとえば、ビルドツールでの明示的なメモリ管理を気にする必要はありません。Cのような構文を使用している場合でも、スクリプトツールでガベージコレクションを使用している可能性があります。その時点で、単に専用のDSLを使用しないのはなぜですか。

RubyはCやJavaよりも高レベルで宣言型の言語であるため、これにRubyを使用できることは理にかなっています。参照:Gradle、sbt。


13
Imagine the pain and boilerplate of writing a makefile (or build.xml, or whatever) in C.宣言的なXMLスクリプトで、自明でない条件付きロジック(ご存じのように、標準の命令型のもの)を表現しようとする苦痛と混乱を想像してください。ああ、待って、想像する必要はありません。あなたはおそらくそれに対処しなければならなかった、そしてそれはおそらく混乱と半分でしたね?重大な問題はすぐに宣言性の限界に突き当たることになり、ビルドツールを必要としないほど単純ではないため、ビルドは宣言的なスクリプト言語にとって最悪の選択肢の1つです。
メイソンウィーラー

7
@MasonWheeler既存のビルドツールが私を苦しめた場合があります、はい。低レベルのCのような命令型言語を使用しても、それらのどれも助けられませんでした。Rubyのようなものはおそらく理想的だと思います。必要に応じて宣言的で命令的です。Cは私にこのタスクの悪夢を与えてくれます。私にとって、システムの構築は(ほとんど)宣言的なDSLの良いユースケースです:あなたは、ほとんどの場合それを行う方法ではなく、をすべきを気にします。
アンドレスF.

2
けっこうだ。私は、Cが「Xが間違った質問をしている答えであるなら」テクノロジーの1つであり、完全に正直であると常に考えていました。XMLの「スクリプト」で作業するのは、私が1つに飛び込む必要があるたびに悪夢でした。DSL機能を備えた高レベルの命令型言語が理想的であることに同意します。
メイソンウィーラー

@AndresF .: makeファイルのようなものには、さまざまなアプローチが必要です。目的の出力状態は宣言的に指定されますが、その状態を達成するために必要なアクションは命令的に指定されます。
supercat

1
@MasonWheelerそれは、XML自体よりも、構成言語を設計した人々の問題だと思います。そのような言語の作者によるよくある間違いは、何かがXMLにあるからといって、それが自動的に人間が読めるようになると仮定することです。(この間違いは、私が慣れているよりも何度もしました。とても魅力的です。)適切に設計された無駄のない構成言語は、他の形式と同様にXMLでも同様に機能します。
biziclop

12

実世界の例を挙げましょう。

約15年前、私はCで書かれた大規模システムをUnixからWindowsに移植する作業をしました。これは約300万行のコードでした。スケールのアイデアを得るために、Unixシステム(RS6000)の一部でコンパイルするのに24時間以上かかりました。Windowsは約4時間でシステムをコンパイルできました。

(独自のインタープリター言語で200万行のコードもありましたが、ファイル処理用に設計されていないため、ビルドシステムには使用しないことにしました。また、言語を実装するCコードをコンパイルするビルドシステムが必要でした)

ビルドシステムがシェルスクリプトとメイクファイルの組み合わせで記述されていたとき、これらはWindowsに移植可能ではなかったため、独自のビルドシステムを記述することにしました。

Cを使用することもできましたが、Pythonを使用することにしました。いくつかの理由がありました。(同時にPythonのソースコード管理システムも書き直しました。これはビルドシステムと非常に統合されていたため、チェックインモジュールのオブジェクトファイルは開発者が共有できます。)

  • ほとんどのコードは、ファイルの命名規則に基づいて作成されたいくつかの簡単なルール(すべてのプラットフォーム、Windows、VMS、および6バージョンのUnixで数千行のPythonのみ)で構築できます。

  • RegExが異なるプラットフォーム上のCシステム間であまり標準ではなかったとき、PythonはRegExを組み込みました。

  • いくつかのモジュールにはカスタムビルドステップが必要で、Pythonではクラスファイルを動的にロードできました。フォルダー内に魔法の名前のpythonファイルがあることに基づいて、カスタムクラスを使用してモジュール(lib)を構築することを許可しました。 これがpythonを使用する大きな理由でした。

  • Javaを検討しましたが、その時点ではすべてのプラットフォームで出荷されていませんでした。

(ソースコード管理システムのUIでは、すべてのプラットフォームで移植可能なWebブラウザーを使用しました。これは、インターネットに接続できるようになる6か月前でした。X25でブラウザーをダウンロードする必要がありました。)


いくつかの大がかりなシステムで作業したことがあるので、開発の規模を把握できると感じることがあります。それから私はこのような物語を読みます。シーシュ。
dmckee

@immibisこれは15年前にやるべきことでした。さらに、この慣行は実際に主要なUnixベンダー(特にSGIとDEC、しかしIBMも)によって支持され、奨励されました。
oakad

1
Unixはかつて「高価」を意味していたことを人々は忘れがちです。Windowsは安価であるため、デスクトップ/ワークステーション戦争で勝利しました。Linuxが後にサーバー戦争で勝利したのも同じ理由です。
スリーブマン

1
自分で書いたソフトウェアをコンピューターで実行したい場合は、柔軟性があり、カーネルのコンパイル方法など101のオプションがあります。ただし、顧客のコンピューターにインストールするソフトウェアを販売する場合は、顧客に柔軟性のないOSを実行しているので、自分のコンピューターで動作するのであれば、そのコンピューターでも動作することがわかります。Linuxをソフトウェアベンダーとして見たとき、それは大きな要因でした-サポートが高すぎるように見えました。Linuxは、サーバーがソフトウェアベンダーによって提供されるホストサーバーソフトウェア戦争で勝ちました。たとえば、ほとんどのWeb展開ソフトウェアです。
イアン

3
@slebetmanそれは公平です-Unixは以前の「戦争」で(LISPMや同様のマシンと比較して)安くなったことで勝ちました。それは絶対に恐ろしく、ひどく設計され、絶えずクラッシュしますが(LISPMよりもはるかに速く起動します!実際、多くの人はそれが無料だったのでそれを採用しました(Linuxよりもずっと前に多くの無料の突然変異がありました)。実際、私は昔のUNIXよりもMS-DOSを好む多くの昔ながらのLISPerに会いました。はい、それは恐ろしいです。
ルアン

3

この質問に対する簡単な答えは、これがビルドツールであるということです。いくつかのソースファイルから最終製品を構築する目的で、他のツールの使用を自動化するツール。製品自体と同じ言語でビルドスクリプトを記述している場合、言語固有のツールの領域に入りますが、これは同じようにビルドツールとは見なされません。

これは疑問を提起します-コンパイラーがmakeのようなツールから慣れ親しんだ種類のビルド自動化を提供しないのはなぜですか?答えは、単にmakeが存在するためです。Unixの「1つのことをして、それをうまくやる」という哲学は、これを提供することはコンパイラの責任ではないことを示唆しています*。そうは言っても、私は個人的に頭痛の種を抱えており、独自の引用符と引用符のない「ネイティブ」ビルドシステムを提供するコンパイラを試してみたいと思っています。

この方法で設計されたコンパイラの例については、C ++の置換を目的とした言語であるJon Blow(まだリリースされていない)Jaiを参照してください。コンパイラーの講演やデモへのリンクはここに集められています。この言語は、コンパイラ内で実行されるバイトコードにコンパイルされます。バイナリへのコンパイルは、バイトコードからアクセス可能な標準ライブラリが提供する関数です。その意図は、言語のネイティブ構文内でビルドの自動化とメタプログラミングの両方を可能にすることです。

* MicrosoftのVisual Studioを見ると、反対の哲学の例を見ることができます。:)


2

ビルドツールは何よりもまず、「gcc」、「ls」、「awk」、「git」のようなツールです。ツールに入力(ファイル名、パラメーターなど)を入力すると、それに応じていくつかの処理が行われます。

これらのツールはすべて、記述して理解するのに十分簡単な方法で入力を渡すことができます。ビルドツールの特定のケースでは、入力はレシピファイルであり、プロジェクトがソースファイルから完成品にどのように移行するかを記述するファイルです。

レシピが、使用するプロジェクトとコンパイラを含むフォルダーを渡すのと同じくらい簡単な場合、宣言的な「言語」で十分です。レシピがますます複雑になり、ロジックが増えると、宣言型言語で処理するのが面倒になり、より汎用的な言語が使用されます。

ビルドレシピの作成に使用される言語と製品コードの作成に使用される言語は、目的と要件が異なるだけであるため、関連性がないことは明らかです。ビルドツールが書かれている言語とビルドレシピが書かれているべき「言語」の間にも関係はありません。常に仕事に最適なツールを使用してください!

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