2

コードを書くときは、常にユニットの小さな断片を書き、頻繁にコンパイルします。これにより、すべてが正しく実行されていることを確認できますが、非常に時間がかかります。コーディングと実行を同時に並行して行うことをサポートできるプログラミング言語はありますか? つまり、キーを押して有効なコードが表示されるとすぐに、編集の効果が実行中のプログラムに組み込まれます。

4

7 に答える 7

4

キーを押して有効なコードになるとすぐに、編集の効果が実行中のプログラムに組み込まれますか?

上で述べたように、多くの言語がインタラクティブな読み取り/編集/評価/印刷ループを提供していますが、それ以上のものを求めています。1980 年代のSymbolics Lisp マシンは、あなたが説明したような機能を提供していました。実行中のシステムを更新するには、1 つのキーを押す必要がありました。コール スタック上の以前のバージョンの古いアクティベーションに影響を与えることなく、関数を置き換えることさえできます。

1970 年代と 1980 年代はインタラクティブな開発環境の黄金時代でしたが、それ以降、この分野は衰退しました。今日では、Visual Studio は高度にインタラクティブなプログラミング環境であると考えられていますが、動的ではありません。

この種の動的な体験を再現するのに今日最も近いのはSqueak Smalltalkだと思います。これは、Xerox PARC で (同じ人々によって) 構築された Smalltalk-80 環境に非常に密接に基づいた洗練された IDE を備えています。

于 2010-04-19T06:32:54.097 に答える
3

LISP、Scheme、Haskell、Perl、Python、Ruby、Maple、Mathematica、MATLAB など。ほとんどのインタープリター言語でこれを行うことができます。コードは、入力が完了するとすぐに解釈されて実行されます。

実際、コマンド シェルでさえカウントされます。

ウィキペディアからの引用: コマンド ライン インタープリター:

ほとんどのユーザーは、シェルを対話型のコマンド インタープリターと考えていますが、実際には、各ステートメントがコマンドを実行するプログラミング言語です。コマンド実行のインタラクティブな側面とプログラミングの側面の両方を満たさなければならないため、設計だけでなく歴史によって形作られた奇妙な言語です。

– ブライアン・カーニハン & ロブ・パイク


ビデオ デモについては、Conway's Game of Life in APL をご覧ください。

于 2010-04-19T05:32:32.180 に答える
3

あなたが探しているものは、活発なシステム、漸進的なシステム、または自立したシステム (S³) と呼ばれることもあります。

これは実際にはプログラミング言語の特性ではなく、開発環境の特性です。それがプログラミング言語に関係している唯一のこと、いくつかのプログラミング言語コミュニティは活発さのアイデアそのものに激しく反対しているため、それらのコミュニティは活発なツールを作成しない傾向がある一方で、他のコミュニティは活発なシステムのない生活を想像できないということです彼らはそれらを生み出す傾向があります。

たとえば、ほとんどすべての Smalltalk 環境と多くの Lisp 環境は活気がありますが、活発な C または C++ 環境は 1 つもありません。以前は、IBM Visual Age for Java と呼ばれる活発な Java 環境がありました (これは実際には IBM の Smalltalk 部門によって Smalltalk で作成され、IBM Visual for Smalltalk に基づいているため、それほど驚くことではありません)。 Visual Age for Java Micro Edition (おそらく現在の名前である Eclipse の方がよく知られています) として、活気を失いました。

「コーディングと並行実行」についてお尋ねします。まあ、活発なシステムでは、それらは「横に並んでいる」ことさえありません。実際には 1 つの同じものです。コーディングと実行の区別はなく、IDE とアプリケーションの区別も、コンパイルの区別もありません。時間と実行時間。

Smalltalk でよくソフトウェアを開発する方法は、単に必要なものを書き留めて実行するというものです。

aCalculator ← Calculator new.
aCalculator compute: '1 + 1'.

(ところで:「実行する」とは、画面上の任意のテキスト領域にコードの小さなスニペットを書き込み、それを強調表示して「実行」をクリックすることを意味します。)

[注: 左矢印は割り当て (だと思います=)、上矢印はreturnです。オリジナルの Smalltalk システムではキーボード上にそれらがありましたが、最近のシステムでは通常、代わりに:=andを使用し^ます。また、空白はメッセージ送信 (Java では「ドット」) であり、ピリオド;はほとんどの言語で文を終了します ( )。メソッドへの引数は、括弧ではなく、コロンの後にメッセージ自体にインラインで渡されます。]

もちろん、Calculatorクラスがまだ存在しないため、これは機能しません。そのため、デバッガーがポップアップし (実行中とデバッグ中に区別がないと言いましたか?)、デバッガーが提供するオプションの 1 つは、そのクラスを作成することです。プログラムを再起動する必要はありません。実行し続けるだけです。メソッドが存在しないため、新しいエラーが発生します。compute:繰り返しになりますが、デバッガーはメソッドの作成を提案し、そこに直接コードを入力することができます: (デバッガーとエディターの間に違いはないと言いましたか?)

compute: aString
    ↑ 2.

システムはすでにメソッド名を入力しており、メソッド パラメーターに (ある程度) 適切な名前を選択しています。2 行目を入力するだけです。

(ところで: このワークフローになじみがあるように聞こえるかもしれません。Kent Beck は、彼の 2 つのテスト フレームワーク (SUnit と JUnit) のオブジェクト モデルと実行モデル、およびテスト駆動開発と Red-Green-まさにこのワークフローのリファクタリング サイクルです。)

プロセス中に、実行中のプログラムを停止または再起動したことはありません。システムが稼働している間、私たちは常にライブ システムのソース コードをシステム内から編集していました。実際、Smalltalk プログラムや Smalltalk システムを停止することはできません。Smalltalk システムをシャットダウンしたとしても、実際には、システムの状態全体 (すべてのクラス、すべてのオブジェクト、すべての変数、すべてのスレッド、すべてのウィンドウ、さらにはマウス ポインターの位置) をディスクにシリアライズするだけです。もう一度開始すると、中断したところに正確に戻ります。システムは決して停止せず、フリーズしただけです。(VMWare、Parallels、VirtualBox などに精通している場合は、VM のスナップショットを作成するようなものです。または、コンピューターを休止状態またはサスペンド状態にすることを考えてください。)

実際、今日 Squeak のバージョンをダウンロードすると、文字通り 30 年間実行されているオブジェクトが含まれている可能性があります。(これは、Smalltalk と他のシステムとのもう 1 つの違いです。Smalltalk は、ちょうど良いワインのように、オブジェクトは年をとるにつれて良くなると信じています。これは、たとえば PHP や Ruby on Rails とはまったく対照的です。すべての Web リクエスト)。

この活発な編集の最も有名な例の 1 つは、1979 年にスティーブ ジョブズ、ジェフ ラスキン、および Lisa チームの他のメンバーが Xerox PARC を訪れ、Smalltalk システムのデモを入手したときの重要な「Apple デモ」です。

bltデモの最高の部分の 1 つは、Steve Jobs が、私たちが使用しているスタイルのスクロールが気に入らないと言ったときでした。1 分もかからずに、Dan [Ingalls] が関連するメソッドを見つけ、(比較的大きな) 変更を行い、スクロールが連続するようになりました! これは訪問者、特にプログラマーに衝撃を与えました。これまで本当に強力なインクリメンタル システムを見たことがなかったからです。 ">Smalltalk の初期の歴史、Alan Kay、HOPL-II、©1993 ACM

ああ、そうです。Dan Ingalls は、システムを再起動したり、アプリケーションを一時停止したりすることなく、ライブ システム内から、ライブ システム内のビデオ ドライバーを書き直しました。60秒以内。(プログラミング言語とオペレーティング システムの間に区別がないことは言及しましたか?)

活気のある特性の最も良い説明の 1 つは、ビデオSelf;にあります。The Movie (Self は Smalltalk から派生したものです)。また、 Dan Ingalls (Smalltalk の最初の設計者の 1 人) によるLively Kernelも見てください。これは基本的に Smalltalk のアイデアを JavaScript に移植したもので、Web ページ内で実行されます。

上で書いたように、これは実際には言語ではなく環境の特徴です。したがって、ここでは例として Smalltalk を使用しましたが、どの言語でも活発なシステムを実装できます。多くの活発な環境が存在する言語として Lisp についてはすでに述べ、JavaScript の例を挙げました。APL および Forth システムも活発になる傾向があります。Factorは、活発なシステムの良い例です。最も極端な例は、C(!) 用の半活性システムを含む VxWorks リアルタイム オペレーティング システムである可能性があります。これは、別のフリギンのソジャーナ ローバーで偽のシステム リセットにつながる優先度逆転の問題を診断および修正するために使用されています。 ' 星!

于 2010-04-19T13:06:25.743 に答える
1

IDEなどの問題なので、必ずしも言語の問題ではないと思います。Cのようなコンパイル言語でさえ、それらのインタープリターを持っています。

あなたがそれがあなたを助けると思うなら、あなたはおそらくあなたがプログラミングしているもののための通訳を見つけることができます。

于 2010-04-19T05:37:10.203 に答える
1

Erlangを使用すると、実行中のプログラムを変更できます。基本的に、プログラムの実行が停止することなく、その場でメソッドを更新できます。

于 2010-04-19T06:15:08.180 に答える
0

さて、私は趣味の余暇プロジェクトでこのようなものに取り組んでいます。Eiffel という名前の静的型付きコンパイル言語を使用しています。

従来のコンパイラとの違いは、コンパイラがコマンド ライン プログラムではなくサーバーとして機能することです。解析されたすべてのデータをメモリに保持し、実際に増分コンパイルを実行します。オール イン メモリのインクリメンタル リンカと組み合わせることで、コンパイル/リンク/実行サイクルを 2 秒未満にすることができます。

しかし、Lisp や Smalltalk のような画像ベースの言語でしか解決できない問題がまだ残っています。コードは常に Adam&Eve から始まり、プログラム内の定義された状況に到達する必要があります。

しかし、本当に高速な実行可能言語が必要な場合は、これが最善の妥協案のようです。活気があるためには、既存のオブジェクト構造を何らかの方法で保存する必要があるため、多くのパフォーマンスが無駄になる必要があります。理論的には可能ですが、実装は非常に複雑です。

于 2010-08-13T10:54:48.330 に答える
-2

うーん、本当にこんなもの欲しいの?!

このようなシステムがC言語環境用にセットアップされていると想像してみてください。したがって、エディタは、キーを押すたびに「有効なコードにつながる」かどうかをチェックするように構成されています...どのように?エディターがコードの解析にコンパイラー/インタープリターと同じロジックを冗長に組み込んでいない限り、コンパイラーを呼び出す必要があります。(ファイルをディスクに保存するオーバーヘッドを無視して、コンパイラーがエディターのバッファーの内容を直接読み取ることができると想像してみましょう。)したがって、キーを押すたびにコードがコンパイルされます。変数またはキーワードの名前の入力を完了していないという理由だけで、99%の確率でエラーが発生する可能性があります。システムは、エラーがそれによるものなのか、「実際の」エラーによるものなのかをどのように知るのでしょうか。

また、実行中に編集をプログラムにどのように組み込みますか?プログラムが5スタックフレームの深さのポイントにあり、最初の関数に渡される変数の値を変更するとします。その最初の関数で実行を再開せずに、変更を魔法のように伝播する方法はありません。しかし、変更が伝播されない場合、それは本当にプログラムに組み込まれていましたか?もちろん、デバッガーを使用すると、実行中のプログラムの既存の変数を変更できますが、新しい変数の作成、関数呼び出し、制御構造など、スキームで実行できるすべてのことを実行することはできません。

ほとんどの解釈された言語にはRead-Evaluate-PrintLoop(REPL)があり、関数を定義してインタプリタの環境に格納できます。また、それらの関数を名前で呼び出すことも、以前に定義した関数がそれらを呼び出すように関数を再定義することもできます。その後、新しいバージョンを実行します。しかし、この場合でも、プロンプトがあるときはいつでもプログラムは実行されないため、解釈するために何か新しいものを与えることができます。

于 2010-04-19T06:11:46.550 に答える