たとえば、プログラムで1つのフォルダーを選択して別の場所にコピーできるとしましょう。非常に基本的なレベルでは、アプリケーションは端末で実行できるコマンドを実行していますか、それとも内部OS APIを使用して移動しますか?
悪質な反応をanyしみません。私は好奇心が強いだけでなく、13歳の人が尋ねる質問として認識されることを完全に知っています。
たとえば、プログラムで1つのフォルダーを選択して別の場所にコピーできるとしましょう。非常に基本的なレベルでは、アプリケーションは端末で実行できるコマンドを実行していますか、それとも内部OS APIを使用して移動しますか?
悪質な反応をanyしみません。私は好奇心が強いだけでなく、13歳の人が尋ねる質問として認識されることを完全に知っています。
回答:
概念的には、常にOS APIを使用します-質問はどのような方法でのみです。基本的に3つのオプションがあります。
低レベルOS API(システムコール)を直接使用します。あなたの例では、タスクは非常に複雑です:フォルダー内のアイテムのリストを取得し、タイプ(フォルダー、ファイル...)を確認し、それぞれについてターゲットフォルダーに対応するアイテムを作成し、ファイルについてはソース、ターゲットファイルへの書き込みなど。タスクは非常に複雑であるため、何か間違いが発生しやすいため、ほとんどのアプリケーションはこれを回避します。
タスクを簡素化するライブラリ(API)を使用します。たとえば、Apple CocoaフレームワークはNSFileManager
、copyItemAtPath:toPath:error
低レベルのOS APIを使用してすべてのダーティな作業を行うメソッドをクラスに提供します。したがって、アプリケーションは低レベルのAPI自体を使用する必要はありませんが、システムに存在します。また、Appleは正常に動作することを確認する可能性があります。
外部プロセスを使用してタスクを実行します。この場合、外部プロセスは上記の2つの方法のいずれかを使用して作業を行います。アプリケーションは、そのようなプロセスを開始し、監視し、完了するまで待機する必要があります。そのようなプロセスはコマンドラインツールとして実行できる可能性が高いため、これはおそらくターミナルで実行できるコマンドになります。保証されていませんが、非常に可能です。
ほとんどのアプリケーションは、1よりも単純であり、3よりも安全で効率的であるため、オプション2を使用します。外部プロセスを実行するには、適切にセットアップする必要があります。たとえば、障害が発生した場合に正確に何が悪かったのかを把握することははるかに難しく、何をしているかを知ることは困難です(たとえば、進行状況を表示する)。ほとんどの場合、開発者がオプション2を選択する可能性が高いのはそのためですが、保証はありません。注目すべき例は、インストーラーなどのカスタマイズにシェルスクリプトを使用するアプリケーションです。
上級ユーザー向けメモ:dtrace
OS Xの機能を使用して、特定のアプリケーションが何をしているかを調べることができます。たとえば、生成されているプロセスをチェックして、使用しているツールを確認できます(を参照execsnoop
)。
答えは「それは異なりますが、通常は2番目です」ということです。実際、GUIプログラムが端末コマンドを実行している場合でも、APIを呼び出すことでそれらを実行します。
単にターミナルコマンドのリストであるプログラムは、シェルスクリプトと呼ばれます。このようなプログラムはMac OS Xで実行できますが、出力を表示するには、ターミナルウィンドウで実行するか、GUIを使用するプログラムを起動する必要があります。他のプログラムは、内部APIを介してコマンドラインプログラムを呼び出すことができます。
このサイトでは、開発に関するほとんどの質問はトピックから外れていますが、実際にトピックになっている例の1つは、Automatorの実行です。
Automatorで作成されたプログラムが呼び出すことができる内部コマンドのリスト内のオプションの1つは、シェルスクリプトまたはターミナルコマンドのリストを呼び出す機能です。ただし、これは内部APIで使用できる多くのオプションのほんの一部です。
/sbin/shutdown
破損したり削除されたりすると、アップルメニューの[シャットダウン]コマンドが機能しなくなるというレポートを読みました(自分のコンピューターで複製することを気にしません。ありがとうございました)。
Unixの背後にある素晴らしいアイデアの1つは、プログラムのアイデアを得た場合、最初にシェルスクリプトとして書くことです(基本的に一連のコマンドを呼び出します)。
次に、プログラムが有用であることが判明した場合、インターフェイスを改善し、ユーザーにテストしてもらい、最後にそれが価値があると確信したら、「本物の」プログラムを作成します。
もちろん、これはグラフィカルユーザーインターフェイスが引き継ぐ前のことなので、ここでの「プログラム」はそれ自体がCLIコマンドです。
特にシステム情報を表示する場合は、いくつかの最新のプログラムでこのアプローチがまだ見られます。フォルダー内のすべてのファイルを一覧表示するシンプルなアプリを構築したいですか?実行してls -al
、結果を解析し、テーブルを表示します。さまざまなパラメーターをお楽しみください。バージョン2.0の資料があります
端末コマンドを実行するプログラムのクラスの1つは(すべてがAPI呼び出しで始まる場合でも)、EclipseやXcodeなどの統合されたプログラム開発環境です。プログラム開発に必要なツールのコレクションは、IDEに含まれて維持されるために非常に大きいです。代わりに、makefile(スクリプトの一種)をビルドし、unix 'make'(または同等のもの)で実行して、コンパイル、リンク、ロード、およびデバッグプロセスをステップスルーします。Makeは、コマンドラインインターフェイスを使用して、コンパイラ、リンカーなどを順に実行します。これにより、IDEはプログラマーが選択したツールセットから比較的独立し、ツールの更新に影響されません。
アプリケーションは、CLIコマンドを実行して特定のタスクを実行できますが、実際に実行するタスクもあります。しかし、効率の問題により、プロのアプリケーション開発者はコマンドの実行を避け、コマンドが必要なタスクを実行するために使用するAPIを使用します。