13

「ライブコーディングフレームワーク」を構築したいと考えています。

「ライブコーディングフレームワーク」の意味を説明する必要があります。そのために、ライブ コーディングと従来のコーディングを比較します。

一般的に言えば、従来のプログラミングでは、コードを記述し、場合によってはそれをコンパイルしてから、実行可能ファイルを起動するか、ある種のインタープリターでスクリプトを開きます。アプリケーションを変更する場合は、このプロセスを繰り返す必要があります。ライブ コーディング フレームワークにより、アプリケーションの実行中にコードを更新し、必要に応じて再読み込みできます。おそらく、コードを含むファイルが変更されるたびに、またはその他のアクションによって、この再読み込みが発生します。コードの変更は、実行中のアプリケーションに反映されます。プログラムを閉じて、再コンパイルして再起動する必要はありません。

この場合、アプリケーションは更新/描画ループを持つウィンドウ化されたアプリであり、ほとんどの場合、グラフィックスには OpenGL を使用し、サウンド処理にはオーディオ ライブラリ ( SuperCollider? ) を使用し、理想的にはネットワーク ライブラリを使用します。

もちろん、好みの言語はありますが、この種のアーキテクチャに適した言語があるかどうかは定かではありません。理想的には、Python、Lua、Ruby、またはその他の高レベル言語を使用します。ただ、最近友人から可能性としてClojureが提案されたので、私も検討中です。

この種のフレームワークにどの言語が適しているかだけでなく、一般的にどの言語機能がこのようなフレームワークを可能にするかを知りたい.

4

8 に答える 8

5

ZeroBrane Studio IDEの一部として、Lua にライブ コーディング機能を実装しました。コードに変更が加えられたときにアプリケーションをリロードすることで、説明したとおりに機能します。アプリケーションの完全なリロードを回避するために、実行時に値を変更するための可能な改善に取り組んでいます。これは純粋な Lua ベースのソリューションであり、VM を変更する必要はありません。

現在実装されているライブ コーディングのデモは、http: //notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-styleで確認できます。

使用/必要な言語機能に関して、私は以下に依存しています。

  1. 実行中のアプリケーションを中断/再開する機能 (これは debug.hook および error() 呼び出しに基づいています)、
  2. (変更されていない) アプリケーションとリモートで対話する機能 (これは、debug.hook に基づいて行われます。ホスト マシンから新しい要求が送信されているかどうかを検出するための select() サポートとの TCP 対話、およびコルーチンを使用して切り替えます)メイン アプリケーションとライブ コーディング モジュール)、および
  3. アプリケーションに新しいコードを挿入する機能 (このメカニズムもコルーチンを使用していますが、代替手段があると確信しています)。変更されたフラグメントだけを注入する可能性もありますが、それは関数のレベルである必要があり、この関数が他の関数に対してローカルである場合は、それも含める必要があります。
于 2012-06-07T18:12:06.907 に答える
4

Clojureには、ライブコーディング言語として必要と思われるほとんどすべてのものがあります。主なハイライト:

  • インタラクティブREPL-実行中のプログラムと直接対話できるようにします。「従来のプログラミング」をしているときでさえ、私はインタラクティブにコードを書き、後で好きなビットをソースファイルにコピーする傾向があります。Clojureは、このように機能するように設計されています。プログラム内のほとんどすべてが、実行時に検査、変更、および交換可能です。
  • 優れた同時実行性のサポート-のようなコードを使用して、並行するバックグラウンドタスクを簡単に開始できます(future (some-function))。さらに重要なことに、ClojureのSTMと高性能の不変データ構造の強調により、より微妙な同時実行性の側面が処理されます(たとえば、レンダリングの途中でライブデータ構造を更新するとどうなりますか??)
  • ライブラリの可用性-これはJVM言語であるため、Javaエコシステムから必要なすべてのオーディオ、ビジュアル、IO、または計算ツールを取り込むことができます。これらを1行か2行のClojureでラップするのは簡単なので、必要な機能への簡潔なインターフェースを得ることができます。
  • マクロ-Clojureは同像性言語であるため、Lisp機能を利用して、言語を拡張する強力なマクロを作成できます。ライブ環境で使用したい正確な構文を効果的に構築し、コンパイラーに、舞台裏で完全なコードを作成するという大変な作業をすべて任せることができます。
  • 動的型付け-これの利点はどちらの方法でも議論できますが、コードをすばやく簡潔に記述しようとすると、確かに大きな利点になります。
  • クールなプロジェクトがたくさんある活発なコミュニティ-Clojureコミュニティで同様のライブコーディング手法に興味を持っている人がたくさんいる可能性があります。

あなたが面白いと思うかもしれないいくつかのリンク:

于 2011-11-01T09:20:47.190 に答える
2

これにはおそらく Smalltalk が最適です。他のものとは異なり、REPL だけでなく、ライブ コーディング用の IDE 全体があります。

于 2016-04-17T14:20:38.047 に答える
2

開発ボックスで「ライブコーディング」を行うのは良いことですが、デプロイされたサーバーと直接やり取りする方法は、「本物」にはるかに近づきます。これには、ネットワーク対応の REPLが必要です。

clojureはこれをソケット replの形でうまく提供します。これにより、デプロイされた tomcat サーバー (たとえば) で実行中のバージョンのコードにリモートでアタッチできます。次に、お気に入りのスワンク対応の開発ツールを接続して、ハックすることができます。

于 2011-10-26T10:02:40.420 に答える
1

PyDev の Python エディターのライブ コーディング機能に取り組んでいます。これは Bret Victor のInventing on Principle talkに触発されたもので、プログラムの状態表示とタートル グラフィックスを実装しました。Eclipse で Python コードを入力すると、両方とも更新されます。

このプロジェクトはGitHubでホストされており、デモ ビデオチュートリアルを投稿しました。

私が使用した Python の主な機能は、抽象構文ツリーと動的コード実行でした。ユーザーのコードを取得し、ツリーに解析してから、割り当てステートメント、ループの反復、および関数呼び出しを計測します。ツリーをインストルメントしたら、それを実行してレポートを表示するか、要求されたタートル グラフィックスを描画します。

他の回答で説明されているスワッピング機能を実装していません。代わりに、常にコードを実行して完了するか、タイムアウトします。ライブ コーディングは、ライブ アプリケーションをハッキングする方法としてではなく、テスト駆動型開発を強化するものとして考えています。ただし、ライブ アプリケーションの一部を交換することで何ができるようになるかについては、さらに考えます。

于 2012-09-07T04:38:34.320 に答える
1

google appengine の python には repot_api_shell.py があります。これは完全なライブ コーディング スイートではありません - swank-clojure を使用した emacs 上の clojure は、「ライブ コーディング」を日常の開発リズムに統合する限り、はるかに実際に使用されています - しかし、多くの人はこれが可能であることを認識していません。特定の python 環境で。

$ PYTHONPATH=. remote_api_shell.py -s dustin-getz.appspot.com
App Engine remote_api shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
The db, users, urlfetch, and memcache modules are imported.

dustin-getz> import models
dustin-getz> models.BlogPost(title='a modern take on automated testing', link='https://docs.google.com/document/pub?id=1DUxQogBg45rOTK4c5_SfEHiQcvL5c207Ivcy-gDNx2s', dont_publish_feed=False).put()

dustin-getz> items = models.BlogPost.all().filter('dont_publish_feed =', False).order('-published_date').fetch(100)

dustin-getz> len(items)
58

dustin-getz> for item in items[:5]: print item.title
a modern take on automated testing
Notes: Running a startup on haskell
the [un]necessity of superstar middle management in bigcos
"everything priced above its proper value"
stages of growth as a software engineer
于 2012-02-06T16:45:57.447 に答える