(この記事はIEEE Computer誌、1998年3月号に掲載)
概要
PerlやTclのようなスクリプト言語は、CやJavaTMのようなシステムプログラミング言語とは非常に異なるプログラミングスタイルを表しています。スクリプト言語はアプリケーションを「接着」するために設計されており、システムプログラミング言語よりも高いレベルのプログラミングと迅速なアプリケーション開発を実現するために型なしのアプローチを使用します。コンピュータの速度の向上とアプリケーションのミックスの変化により、スクリプト言語は将来のアプリケーションにとってますます重要になっています。
キーワード: コンポーネントフレームワーク、オブジェクト指向プログラミング、スクリプト、強い型付け、システムプログラミング。
スクリプト言語はシステムプログラミング言語とは異なるタスクのために設計されており、これが言語の根本的な違いをもたらします。システムプログラミング言語は、メモリのワードのような最も原始的なコンピュータ要素からデータ構造とアルゴリズムをゼロから構築するために設計されています。対照的に、スクリプト言語は接着のために設計されており、強力なコンポーネントのセットの存在を前提とし、主にコンポーネントを接続するために意図されています。システムプログラミング言語は複雑さを管理するために強い型付けがされていますが、スクリプト言語はコンポーネント間の接続を簡素化し、迅速なアプリケーション開発を提供するために型なしです。
スクリプト言語とシステムプログラミング言語は補完的であり、1960年代以降の主要なコンピューティングプラットフォームのほとんどは両方の種類の言語を提供しています。言語は通常、コンポーネントフレームワークで一緒に使用され、コンポーネントはシステムプログラミング言語で作成され、スクリプト言語で接着されます。しかし、最近のいくつかのトレンド、例えばより速いマシン、より良いスクリプト言語、グラフィカルユーザーインターフェースとコンポーネントアーキテクチャの重要性の増加、インターネットの成長などが、スクリプト言語の適用性を大幅に高めています。これらのトレンドは今後10年間続き、ますます多くの新しいアプリケーションが完全にスクリプト言語で書かれ、システムプログラミング言語は主にコンポーネントの作成に使用されるようになります。
1950年代後半までに、Lisp、Fortran、Algolのような高レベル言語が登場し始めました。これらの言語では、ステートメントはもはやマシン命令に正確に対応しておらず、コンパイラがソースプログラムの各ステートメントを一連のバイナリ命令に変換します。時間が経つにつれて、Algolから進化したシステムプログラミング言語の一連が登場し、PL/1、Pascal、C、C++、Javaなどの言語が含まれます。システムプログラミング言語はアセンブリ言語よりも効率が悪いですが、アプリケーションをはるかに迅速に開発することができます。その結果、大規模なアプリケーションの開発においてアセンブリ言語をほぼ完全に置き換えました。
システムプログラミング言語はアセンブリ言語と2つの点で異なります: より高いレベルであり、強い型付けがされています。「高レベル」という用語は、多くの詳細が自動的に処理されることを意味し、プログラマが同じ作業を行うために少ないコードを書くことができることを意味します。例えば:
whileやifのような単純なキーワードを制御構造に使用できます; コンパイラは制御構造を実装するための詳細な命令を生成します。
アセンブリ言語とシステムプログラミング言語の2番目の違いは型付けです。私は「型付け」という用語を、情報の意味が使用前にどの程度指定されているかを指すために使用します。強い型付けの言語では、プログラマは各情報がどのように使用されるかを宣言し、言語は情報が他の方法で使用されるのを防ぎます。弱い型付けの言語では、情報がどのように使用されるかに関するa prioriの制限はありません: 情報の意味は、使用方法によってのみ決定され、初期の約束によっては決定されません。1
現代のコンピュータは基本的に型なしです: メモリ内の任意のワードは、整数、浮動小数点数、ポインタ、命令など、任意の種類の値を保持できます。値の意味は使用方法によって決定されます: プログラムカウンタがメモリのワードを指している場合、それは命令として扱われます; 整数加算命令によって参照される場合、それは整数として扱われます; など。同じワードが異なる方法で異なる時に使用されることがあります。
要約すると、システムプログラミング言語は、アセンブリ言語と同じタスク、すなわちゼロからアプリケーションを作成するために設計されています。 システムプログラミング言語は、アセンブリ言語よりも高いレベルであり、はるかに強い型付けがされています。 これにより、アプリケーションをより迅速に作成し、わずかなパフォーマンスの損失でより簡単に管理できます。 アセンブリ言語といくつかのシステムプログラミング言語のグラフィカルな比較については、図 1を参照してください。

3 スクリプト言語
Perl[9]、Python[4]、Rexx[6]、Tcl[8]、Visual Basic、Unixシェルのようなスクリプト言語は、システムプログラミング言語とは非常に異なるプログラミングスタイルを表しています。 スクリプト言語は、他の言語で書かれた有用なコンポーネントのコレクションが既に存在することを前提としています。 スクリプト言語は、ゼロからアプリケーションを書くためのものではなく、主にコンポーネントをプラグインするために意図されています。 例えば、TclやVisual Basicは、画面上のユーザーインターフェイスコントロールのコレクションを配置するために使用でき、Unixシェルスクリプトはフィルタプログラムをパイプラインに組み立てるために使用されます。 スクリプト言語は、コンポーネントの機能を拡張するために使用されることがよくありますが、複雑なアルゴリズムやデータ構造にはめったに使用されません; これらのような機能は通常、コンポーネントによって提供されます。 スクリプト言語は、グルー言語またはシステム統合言語と呼ばれることがあります。
コンポーネントを接続するタスクを簡素化するために、スクリプト言語は型なしである傾向があります: すべてのものが同じように見え、振る舞うため、互換性があります。 例えば、TclやVisual Basicでは、変数はある瞬間に文字列を保持し、次の瞬間に整数を保持することができます。 コードとデータはしばしば互換性があり、プログラムが別のプログラムを書き、その場で実行することができます。 スクリプト言語はしばしば文字列指向であり、これは多くの異なるものに対して一貫した表現を提供します。
select | grep scripting | wc
selectプログラムは、現在ディスプレイ上で選択されているテキストを読み取り、それを出力に印刷します; grepプログラムは入力を読み取り、「スクリプト」を含む行を出力に印刷します; wcプログラムは入力上の行数を数えます。 これらのプログラムのそれぞれは、異なるタスクを実行するために他の多くの状況で使用できます。button .b -text Hello! -font {Times 16} -command {puts hello}
このコマンドは、16ポイントのTimesフォントでテキスト文字列を表示し、ユーザーがコントロールをクリックしたときに短いメッセージを印刷する新しいボタンコントロールを作成します。 これは、単一のステートメントで6つの異なる種類のものを混ぜています: コマンド名(button)、ボタンコントロール(.b)、プロパティ名(-text、-font、-command)、単純な文字列(Hello!とhello)、フォント名(Times 16)で、書体名(Times)とポイントサイズ(16)を含み、Tclスクリプト(puts hello)。 Tclはこれらのすべてを文字列で一様に表現します。 この例では、プロパティは任意の順序で指定でき、指定されていないプロパティにはデフォルト値が与えられます; 例では20以上のプロパティが指定されていませんでした。
CFont *fontPtr = new CFont();
このコードの多くは、強い型付けの結果です。 ボタンのフォントを設定するためには、その
fontPtr->CreateFont(16, 0, 0,0,700, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE, "Times New Roman");
buttonPtr->SetFont(fontPtr);
SetFontメソッドを呼び出す必要がありますが、このメソッドにはCFontオブジェクトへのポインタを渡す必要があります。 これにより、新しいオブジェクトを宣言して初期化する必要があります。 CFontオブジェクトを初期化するためには、そのCreateFontメソッドを呼び出す必要がありますが、CreateFontには14の異なる引数を指定する必要がある厳格なインターフェースがあります。 Tclでは、フォントの本質的な特性(書体Times、サイズ16ポイント)は、宣言や変換なしで即座に使用できます。 さらに、Tclはボタンの動作をボタンを作成するコマンドに直接含めることができますが、C++やJavaではそれを別に宣言されたメソッドに配置する必要があります。xyzのような非整数文字列である場合、エラーが発生します。 違いは、スクリプト言語は値が使用される最後の瞬間にエラーチェックを行うことです。 強い型付けは、コンパイル時にエラーを検出できるようにし、実行時のチェックのコストを回避します。 しかし、この効率のために支払う代償は、情報の使用方法に対する制限です: これにより、より多くのコードと柔軟性の低いプログラムが生じます。
上記の特徴により、スクリプト言語は接着指向のアプリケーションの非常に迅速な開発を可能にします。 表 1は、この主張を裏付ける逸話的な証拠を提供します。 これは、システムプログラミング言語で実装され、その後スクリプト言語で再実装された、またはその逆のいくつかのアプリケーションを説明しています。

要約すると、スクリプト言語はアプリケーションを接着するために設計されています。 それらは、アセンブリまたはシステムプログラミング言語よりも高いレベルのプログラミングを提供し、システムプログラミング言語よりもはるかに弱い型付けを提供し、インタープリタ開発環境を提供します。 スクリプト言語は、開発速度を向上させるために実行速度を犠牲にします。
4 異なるタスクに対する異なるツール
スクリプト言語はシステムプログラミング言語の代替ではありませんし、その逆もありません。 それぞれが異なるタスクセットに適しています。 接着とシステム統合のために、スクリプト言語を使用するとアプリケーションを5-10倍速く開発できます; システムプログラミング言語は、ピースを接続するために大量のボイラープレートと変換コードを必要としますが、これはスクリプト言語で直接行うことができます。 複雑なアルゴリズムとデータ構造の場合、システムプログラミング言語の強い型付けはプログラムを管理しやすくします。 実行速度が重要な場合、システムプログラミング言語は、実行時のチェックが少ないため、スクリプト言語よりも10-20倍速く実行できることがよくあります。
shやcshのようなシェルプログラムがスクリプトに使用されました。 1990年代のPCの世界では、CとC++がシステムプログラミングに使用され、Visual Basicがスクリプトに使用されました。 現在形成されつつあるインターネットの世界では、Javaがシステムプログラミングに使用され、JavaScript、Perl、Tclのような言語がスクリプトに使用されています。スクリプトとシステムプログラミングは共生的です。 一緒に使用されると、非常に強力なプログラミング環境を生み出します: システムプログラミング言語はエキサイティングなコンポーネントを作成するために使用され、その後スクリプト言語を使用して組み立てることができます。 例えば、Visual Basicの魅力の多くは、システムプログラマがCでActiveXコンポーネントを書き、あまり洗練されていないプログラマがVisual Basicアプリケーションでコンポーネントを使用できることです。 Unixでは、Cで書かれたアプリケーションを呼び出すシェルスクリプトを書くのは簡単です。 Tclの人気の理由の1つは、新しいコマンドを実装するCコードを書いて言語を拡張できることです。
グラフィカルユーザーインターフェース(GUI)は1980年代初頭に登場し、1980年代末までに広まりました; GUIは多くのプログラミングプロジェクトで総労力の半分以上を占めています。 GUIは基本的に接着アプリケーションです: 目標は新しい機能を作成することではなく、グラフィカルコントロールのコレクションとアプリケーションの内部機能の間に接続を作成することです。 システムプログラミング言語に基づくGUIのための迅速な開発環境を私は知りません。 環境がWindows、Macintosh Toolbox、またはUnix Motifであるかどうかにかかわらず、CやC++のような言語に基づくGUIツールキットは、学習が難しく、使用が不便で、生成される結果が柔軟性に欠けることが証明されています。 これらのシステムのいくつかは、画面レイアウトを設計するための非常に良いグラフィカルツールを持っており、基礎となる言語を隠しますが、デザイナーがコードを書く必要があるとすぐに、例えばインターフェース要素の動作を提供するために、物事は難しくなります。 最高の迅速な開発GUI環境はすべてスクリプト言語に基づいています: Visual Basic、HyperCard、Tcl/Tk。 したがって、GUIの重要性が増すにつれて、スクリプト言語の人気が高まっています。
インターネットの成長もスクリプト言語を人気にしました。 インターネットは接着ツールに過ぎません。 新しい計算やデータを作成することはなく、既存の多くのものを簡単にアクセスできるようにするだけです。 ほとんどのインターネットプログラミングタスクに最適な言語は、すべての接続されたコンポーネントが一緒に動作できるようにする言語、すなわちスクリプト言語です。 例えば、PerlはCGIスクリプトを書くために人気があり、JavaScriptはWebページでのスクリプトに人気があります。
スクリプト指向のアプリケーションの3番目の例は、ActiveX、OpenDoc、JavaBeansのようなコンポーネントフレームワークです。 システムプログラミング言語はコンポーネントの作成に適していますが、コンポーネントをアプリケーションに組み立てるタスクはスクリプトにより適しています。 コンポーネントを操作するための優れたスクリプト言語がなければ、コンポーネントフレームワークの多くの力が失われます。 これが、Visual Basicが便利なスクリプトツールを提供するPCでコンポーネントフレームワークが他のプラットフォーム(スクリプトがコンポーネントフレームワークに含まれていないUnix/CORBAなど)よりも成功している理由の一部を説明するかもしれません。
スクリプト言語の人気が高まっているもう一つの理由は、スクリプト技術の改善です。 TclやPerlのような現代のスクリプト言語は、JCLのような初期のスクリプト言語とは大きく異なります。 例えば、JCLは基本的な反復さえ提供しておらず、初期のUnixシェルは手続きをサポートしていませんでした。 スクリプト技術は今日でも比較的未熟です。 例えば、Visual Basicは本当にスクリプト言語ではありません; それはもともと単純なシステムプログラミング言語として実装され、その後スクリプトにより適するように変更されました。 将来のスクリプト言語は、今日利用可能なものよりもさらに良くなるでしょう。
スクリプト技術は、コンピュータハードウェアの速度の絶え間ない向上からも恩恵を受けています。 かつては、ある程度の複雑さを持つアプリケーションで許容できるパフォーマンスを得る唯一の方法は、システムプログラミング言語を使用することでした。 場合によっては、システムプログラミング言語でさえ効率的ではなく、アプリケーションをアセンブラで書かなければならないこともありました。 しかし、今日のマシンは1980年のマシンよりも100-500倍速く、18ヶ月ごとにパフォーマンスが倍増し続けています。 今日、多くのアプリケーションはインタープリタ言語で実装され、依然として優れたパフォーマンスを持っています; 例えば、Tclスクリプトは数千のオブジェクトを持つコレクションを操作し、依然として良好なインタラクティブ応答を提供できます。 コンピュータが速くなるにつれて、スクリプトはより大きなアプリケーションにとって魅力的になります。
スクリプト言語の使用が増えている最後の理由は、プログラマコミュニティの変化です。 20年前、ほとんどのプログラマは大規模なプロジェクトに取り組む洗練されたプログラマでした。 その時代のプログラマは、言語とそのプログラミング環境を習得するのに数ヶ月を費やすことを期待しており、システムプログラミング言語はそのようなプログラマのために設計されていました。 しかし、パーソナルコンピュータの登場以来、ますます多くのカジュアルプログラマがプログラマコミュニティに加わっています。 これらの人々にとって、プログラミングは彼らの主な仕事の機能ではありません; それは彼らの主な仕事を助けるために時折使用するツールです。 カジュアルプログラミングの例は、単純なデータベースクエリやスプレッドシートのマクロです。 カジュアルプログラマは、システムプログラミング言語を習得するのに数ヶ月を費やすことを望んでいませんが、スクリプト言語について数時間で十分なことを学び、有用なプログラムを書くことができることがよくあります。 スクリプト言語は、システムプログラミング言語よりも簡単な構文を持ち、オブジェクトやスレッドのような複雑な機能を省略しているため、学びやすいです。 例えば、Visual BasicとVisual C++を比較してください; 少数のカジュアルプログラマがVisual C++を使用しようとしますが、多くの人がVisual Basicで有用なアプリケーションを構築することができました。
今日でも、スクリプト言語で書かれたアプリケーションの数は、システムプログラミング言語で書かれたアプリケーションの数よりもはるかに多いです。 Unixシステムでは、Cプログラムよりも多くのシェルスクリプトがあり、Windowsでは、CまたはC++よりも多くのVisual Basicプログラマとアプリケーションがあります。 もちろん、最も大きく、最も広く使用されているアプリケーションのほとんどはシステムプログラミング言語で書かれているため、総コード行数やインストールされたコピー数に基づく比較は、依然としてシステムプログラミング言語を支持するかもしれません。 それにもかかわらず、スクリプト言語はすでにアプリケーション開発において主要な力であり、将来的にはその市場シェアが増加するでしょう。
オブジェクト指向プログラミングは実際にどれだけの利益をもたらしたのでしょうか? 残念ながら、この質問に決定的に答えるための十分な定量的データを見たことがありません。 私の意見では、オブジェクトはわずかな利益しか提供しません: 生産性の20-30%の改善かもしれませんが、2倍や10倍の改善ではありません。 C++は今や愛されると同じくらい嫌われているようであり、いくつかの言語の専門家はオブジェクト指向プログラミングに反対する声を上げ始めています[2]。 このセクションの残りでは、オブジェクトがスクリプトが行うような劇的な方法で生産性を向上させない理由を説明し、スクリプト言語でオブジェクト指向プログラミングの利益を達成できると主張します。
オブジェクト指向プログラミングが生産性の大幅な向上を提供しない理由は、それがプログラミングのレベルを上げたり、再利用を促進したりしないからです。 C++のようなオブジェクト指向言語では、プログラマは依然として詳細に記述し操作しなければならない小さな基本単位で作業します。 原則として、強力なライブラリパッケージを開発することができ、これらのライブラリが広く使用されれば、プログラミングのレベルを上げることができます。 しかし、そのようなライブラリはあまり存在していません。 ほとんどのオブジェクト指向言語の強い型付けは、再利用が難しい狭く定義されたパッケージを奨励します。 各パッケージは特定の型のオブジェクトを必要とし、2つのパッケージが一緒に動作するためには、パッケージが要求する型間を変換するコードを書かなければなりません。
gotoステートメントが過剰に使用されると観察される同じ絡み合いと脆弱性を引き起こします。 その結果、オブジェクト指向システムはしばしば複雑さと再利用の欠如に苦しみます。7 その他の言語
この記事は、すべてのプログラミング言語の完全な特徴付けを意図したものではありません。 プログラミング言語には、型付けの強さやプログラミングのレベル以外にも多くの属性があり、システムプログラミング言語やスクリプト言語としてきれいに特徴付けることができない多くの興味深い言語があります。 例えば、Lispファミリーの言語は、スクリプトとシステムプログラミングの間のどこかに位置し、それぞれの属性のいくつかを持っています。 Lispは、スクリプト言語で現在一般的な解釈と動的型付けの概念を先駆けており、スクリプトとシステムプログラミング言語の両方で使用されている自動ストレージ管理と統合開発環境も先駆けています。8 結論
スクリプト言語は、システムプログラミング言語とは異なるトレードオフを表しています。 それらは、システムプログラミング言語に比べて実行速度と型付けの強さを犠牲にしますが、プログラマの生産性とソフトウェアの再利用を大幅に向上させます。 このトレードオフは、コンピュータがプログラマに比べてますます速く安くなるにつれて、ますます意味を持ちます。 システムプログラミング言語は、データ構造とアルゴリズムの複雑さがあるコンポーネントを構築するのに適しており、スクリプト言語は、接続の複雑さがあるアプリケーションを接着するのに適しています。 接着タスクはますます普及しているため、スクリプトは次の世紀において今日よりもさらに重要なプログラミングパラダイムになるでしょう。
[2] S. Johnson, Objecting To Objects, Invited Talk, USENIX Technical Conference, San Francisco, CA, January 1994.
[3] C. Jones, "Programming Languages Table, Release 8.2", March 1996, http://www.spr.com/library/0langtbl.htm.
[4] M. Lutz, Programming Python, O'Reilly, ISBN 1-56592-197-6, 1996.
[5] Netscape Inc., "JavaScript in Navigator 3.0", http://home.netscape.com/eng/mozilla/3.0/handbook/javascript/atlas.html#taint_dg.
[6] R. O'Hara and D. Gomberg, Modern Programming Using REXX, Prentice Hall, ISBN 0-13-597329-5, 1988.
[7] J. Ousterhout, Additional Information for Scripting White Paper, http://www.ajubasolutions.com/people/john.ousterhout/scriptextra.html.
[8] J. Ousterhout, Tcl and the Tk Toolkit, Addison-Wesley, ISBN 0-201-63337-X, 1994.
[9] L. Wall, T. Christiansen, and R. Schwartz, Programming Perl, Second Edition, O'Reilly and Associates, ISBN 1-56592-149-6, 1996.
SunとJavaは、米国および他の国におけるSun Microsystems, Inc.の商標または登録商標です。
Tcl DeveloperXChange
最終更新日: 2000年8月8日
ここからコピーされました。 また、scripting.pdfも参照してください。