動的言語用のIDE-どこまで入手できますか?


56

動的言語が提供すべき開発の速度が、IDEが静的な同等物で提供する補完やその他の資産の欠如によって著しく損なわれるのは、イライラすることです。

入力するだけではありません-生産性が向上し、エディターに統合されていないドキュメントを常に参照することなく、APIを閲覧することで得られる楽しさです。

これまでのところ、IDEと動的言語のすべての組み合わせ-公平であるとは言えませんが、-を試しました。

  • バギー
  • スロー
  • 無知/熱狂的(これまでに可能なすべての完了を示す)
  • または単にEclipse + Javaほど完全ではありません。

動的コード分析は簡単な作業ではないことを認識しています。しかし、不思議に思わずにはいられません- このコードは非常にわかりにくいのでしょうか?

だから私の質問は:

特定のIDE(またはオールインワンセットアップ)が動的言語の完全に優れたサポートを達成したことがありますか、それとも「未解決」の問題ですか?


30
+1私が試したすべてのPHP IDEは、Visual Studio + C#/ C ++と比較してひどいものでした。
マテイZábský

5
包括的な質問については定かではありませんが、JetBrains IDEを調べてみてください。彼らのアプローチは「すでに素晴らしいIDEがあります。$ LANGUAGEで動作するようにしましょう」です。あなたが試したものの問題は、代わりに次のアプローチを取っているかもしれません:「$ LANGUAGEにはIDEがありません。誰かがIDEを作るべきです」。
ミリムース

2
確かにIDEAは、特にJavaやプロジェクト関連のタスクを処理するのに非常に優れていることがわかりました。しかし、JavaScriptに関しては、名前空間またはそれに含まれるオブジェクトで定義された「メソッド」を認識していないようです。
vemv

IntelliJ IDEA、またはJetBrainsの言語固有のIDEのいずれか。
シルバナール

1
@FrustratedWithFormsDesigner Komodoを使用しました。それは私が見た他のどのRoR IDEよりもはるかに優れたオートコンプリートです... そうは言っても、何もないよりはましです
アールズ

回答:


21

Smalltalk(非常に動的な言語)には常に優れたIDEがあり、自動リファクタリング、SUnit(すべての* Unitフレームワークの祖父母)、「誰がこのメッセージを送信しますか?」、「誰がこのメソッドを実装しますか?」などが開拓されました。確かに、IDEは、ごく最近まで、静的に型付けされた言語の言語をはるかに超えるレベルまで、動的言語を実際にサポートできます。

S. Lottは、「動的言語は静的言語と同じ種類のコード補完を持つことはできません。それは本質的に不可能です。」

理論的、絶対主義的な意味での「本質的に不可能」?承知しました。実用的な意味で?あんまり。動的言語の型を、静的(k-CFARoelTyper)、実行時(PIC)、およびプログラマーの最近の履歴を使用するなどの方法(「プログラム履歴がコード補完を改善する方法」など)を推測する多くの方法があります。

確かにPharoとSqueakのコミュニティは、コード補完ツールに非常に満足しています


3
私から+1。最近はJavaの世界で働いていますが、私が知っている他の言語と比べて、Smalltalkでどれだけ生産性が上がっているかを今でも思い出します。イメージにIDEとコードを統合し、コードが常に「生きている」こと(Smalltalkerは私の言う意味を知っているでしょう)は、単に比類のないものです。PharoとSeasideが、多くの人が「has-been言語」と考えるものに新しい命を吹き込み、EclipseがIDEであるのと同様に、Smalltalkをいじくりまわします。Smalltalkの優れた命名規則は、予測的なコード補完に役立ちます。
アモスM.カーペンター

16

IDEで知っていることのほとんどすべては、動的言語であるSmalltakで最初に開発されました。他のすべてはただそれらをコピーしています。明らかに、これらの機能はすべて動的言語で可能です。

今日、動的言語は静的言語の背後にあります。しかし、なぜ?

最近まで、静的型付けは動的型付けよりも優れていると広く考えられていました。多くのコーダーは最近、その点で考えを変えました。動的に型付けされた言語用のIDEに焦点が当てられていませんでした。

IDEの機能は、動的に型付けされた言語ではあまり役に立たないと思います。JavaまたはObjective-Cで作業しているとき、IDEが言語での作業を支援するために必要であると感じていますが、動的言語でも同じではありません。

タスクの一部は、静的言語の方が簡単です。式のタイプを理解するのは簡単です。動的言語で同じことを行うには、プログラム全体を分析するか、実行時に型を記録する必要があります。IDEが型を中心に展開するものの多くは、効果があります。


2
Squeak and Pharoでは、RoelTyperは送信するメッセージを調べることで、何かのタイプを推測するのにかなり良い仕事をしています。それ以外の場合、Shives&Mightのk-CFAは、精度とコストをトレードオフできるという意味で、調整可能な型推論を提供します。
フランクシェラー

13
I think that the features for IDEs are less useful in dynamically typed languages-おかしい、私はまったく反対だと思います。非常に多くの動的言語では、変数を事前に宣言する必要がないため、変数のスペルミスは深刻な懸念事項です。この問題は、優れたIDEによって軽減されます。一方、残りの主要機能(構文の色分け、リファクタリングツール、デバッグ機能)は、すべての言語で同様に役立ちます。
BlueRaja-ダニーPflughoeft

2
@Winston:それでは、複数の人がいる非宣言型言語でプロジェクトをやったことはありません:)言語の大文字と小文字が区別されると、特に面倒です。個人的な経験からの例:「Work-Order」という単語は、1つの単語(「Workorder」)として綴られることがあるため、変数を作成するときに、何人workOrderかが書いたり、何人かが書いたりしworkorderます。これらはPythonの2つの別個の変数です> _ <
BlueRaja-Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft、それどころか、私はPythonで複数の人とプロジェクトをやりました。問題があると言うとき:存在しない変数を参照しているために実行して例外が発生する、データを間違った場所に保存するためコードが初期テストに失敗する、または検出されないエラーが発生してバグが発生する本番環境にコードをエスケープしますか?
ウィンストンイーバート

2
「多くのコーダーは、その点で最近になって心を変えました。」どうしてこれなの?
パブ

10

私はpythonでその問題に遭遇しました。私はエディターとしてvimを望んでいましたが、それはIDE環境を持たないことを意味しました。それで、私はvimプラグインで自分自身をロールバックしました。現在、私は実際に私が過去に使用したIDEよりも優れた開発環境を持っていると思います。

私のセットアップはgithubでホストされていますので、お好きなものを自由に見てください。プラグインの簡単な概要:

  • 病原体
  • pythonモード、ロープ、pyflakes、およびpydoc統合用
  • Pythonデバッガーのvimpdb
  • プロジェクト内のファイルのリストのプロジェクト
  • タグジャンプのタグリスト
  • タブ補完用のスーパータブ
  • スニペットのスニペット
  • コマンドプロンプト、bash、python、ipythonのいずれかの統合シェルのconqueterm

他にもいくつかありますが、より一般的なIDEが持っているすべての機能を備えています。コストはかかりませんでしたが、vimのすべての力を活用できました。スプリット、移動コマンド、レジスタ、ジャンプ、キーボードで開発環境全体を実行できること...


4

特定のIDE(または、オールインワンセットアップ)で動的言語の完全に優れたサポートを実現し、

あなたの評価を理解するのは難しい(「完全に優れている」?「無知/熱狂的」?)ことを考えると、どのIDEも暗黙の標準に一致するかどうかは疑わしい。

動的言語はJavaではないため、Eclipse + Javaと比較するのは簡単ではありません。

または、これはまだ「未解決」の問題ですか?

そうでもない。

おそらく解決できないでしょう。お客様の要件(「完了およびその他の資産の不足」)により、より正確なものにすることは困難です。

動的言語は、静的言語と同じ種類のコード補完を持つことはできません。本質的に不可能です。

一部のIDEは推測に優れています。たとえば、Eclipseには動的言語用のプラグインがあります。


3

Steve Yeggeによるこのプレゼンテーションは今でも関連があると思う。ナットシェルには半分まともなJavaスクリプトide(intelliJ IDEA)がありますが、動的言語は一般的に追いついています。これらのツール(または実際に言語)を作成するのが本質的に難しいからではなく、単に静的言語です最初にすべての注意。


実際、Yeggeのプレゼンテーションは私の質問の根本的な原因でした。ヒューリスティックやその他の説明されたテクニックがあれば、すべてのクールな実装はどこにありますか?IntelliJ:元の投稿に残したコメントを参照してください(間違っているかどうかを教えてください)
-vemv

2014 -最高の静的なIDEのためにまだ一致なし
デン

3

私は一日中javascript / phpとwebアプリケーションで作業しているrubyでプログラミングをしていますが、このために見つけた最高のIDEはAptanaです。これらの3つの言語すべて(およびpython)のコード補完があり、ローカル変数を取得します。さらに、htmlおよびcssで作業する場合、css / javascriptで使用するためにHTMLでidを取得し、関数を取得します。インラインジャバスクリプトを書くために素早く汚いことをしているときの名前(悪いことは知っていますが、概念実証に役立つこともあります)。組み込みのrakeタスクと、gitおよびコマンドラインコンソールのサポートが組み込まれています。立ち上がるのに少し時間がかかりましたが、一度コーディングするとIDEを離れることはほとんどなく、時間を大幅に節約できます。


私の経験から得たIDE内での動的に型付けされた言語開発について述べている答えに「完全に優れた経験」と答える理由。オペレーションが求めたものはどれですか?
ライアン

2

Pythonに対するWing IDEのサポートは非​​常に優れていることがわかりました。コード補完で優れた機能を発揮し、そのデバッガーはVisual Studioの非動的C#用と同じくらい強力です。

バグがなく、遅くも無知でもないことを証明できます。私は一度もEclipseを使用したことがないので、その点については無知ですが、より大きな問題は、動的言語用の完全で生産性を向上させるIDEを開発するための固有の障壁があるかと思います。PythonとWingでの私の経験を考えると、そうではないと言う傾向があります。しかし、それは確かにより困難です。


2

MicrosoftのVisual Studioは、多くのプログラマーが使用するIDEであり、IronRubyIronPython、およびF#をサポートしています。ほとんどの場合、RubyとPythonは動的プログラミング言語であると考えられますが、F#はそうではありません。

コメントへの応答として、F#はプログラミング言語です。

F#(F Sharpと発音)は、.NET Frameworkを対象としたマルチパラダイムプログラミング言語であり、関数型プログラミングと、命令型およびオブジェクト指向プログラミングの分野を網羅しています。これはMLのバリアントであり、OCaml実装とほぼ互換性があります。

「動的言語」を正確に定義するものの正確な定義はまだ議論の余地がありますが、JavaScriptは、たとえばC#よりも「動的」であることに同意するでしょう。ウィキペディアによると:

動的言語の定義は、コードとデータ、および普遍的ではないコンパイルとランタイムを区別しようとするため、あいまいです。仮想マシン、ジャストインタイムコンパイル、および一部のシステム上の多くのプログラミング言語がマシンコードを直接変更する機能により、区別が抽象化されます。一般に、言語が動的であるという主張は、言語の機能を明確に表明するものではなく、動的機能の使いやすさに関する主張です。

ここでワームの缶を開けたくありません。F#が動的言語ではなく関数型言語としてより正確に記述されていることを示唆する人もいますが、私はそれを例外としません。さまざまな.Net言語であると言っても過言ではないと思いますが、一般にF#はC#やVBよりも動的プログラミングに適していると考えられています。

あなたは見たいかもしれません:プログラミング言語を動的とみなすものは何ですか?


4
「F#[...]は動的言語です」とはどういう意味ですか、たとえばC#のように動的なのはどうですか?
アルセニムルゼンコ

1
第二に、私はF#を動的言語とは考えません。ちなみに、C#は(F#にすぐに使用できる同等物があるかどうかはわかりません)「動的」にdynamic組み込まれているかもしれません。しかし、どちらの場合も、どちらも通常動的に型付けされず、「動的言語」に関連する他のほとんどの機能(文化的なものは言うまでもありません)も欠落しています。

2

静的に型付けされた言語と動的に型付けされた言語の主な違いは、コンパイル時にシンボル参照が意味することをシステムが確実に認識できることです。

これにより、コンパイル時にコンパイラによって生成された情報から直接、優れたIDEを作成するために必要な情報を簡単に収集することができます(ほとんどの場合、単に「編集」時間に移動します)。

メソッドが「モノ」をとるだけであるというスタンドアロンのメソッドシグネチャがある場合、エディターはどのように送信するかを知ることができますか?モノの使い方を提案するのにどのように役立ちますか?

ここでもダックタイピングは役に立ちません。可能な限り最もインテリジェントなエディターでさえ、オブジェクトに.executeFooOp()メソッドがあるため、そのオブジェクトの「.executeBarOp」をコード補完できるため、それを伝えることはできません。 (ただし、残りのコードベースを精査し、いくつかのインテリジェントな推測を行うことができます)。

ただし、署名の「文字列」であることを知っている場合は、その文字列で呼び出す可能性のあるすべてのメソッドを知っており、ユーザーがメソッド呼び出しを入力しているときにその変数を提案することができますパラメータとしての文字列。必要に応じて、キャストできるサブクラスを提案することもできます。

動的に型付けされた言語では、一般的なコンパイラよりもはるかにインテリジェントなコードベース全体を完全にスキャンできない限り、情報は存在しません。


1
「静的に型付けされた言語と動的に型付けされた言語の主な違いは、コンパイル時にシンボル参照が意味することをシステムが確実に認識できることです。」–はい、しかしそうする必要はありません。IDEがコンパイル時ではなく実行時に機能する場合、コンパイル時にこの情報を知る必要はありません。実行時に、情報利用可能になります。そうでなければ、プログラムは実行できません。
ヨルグWミットタグ

1
IDEは実行時に機能しません。または、より正確には、一度に1つの可能なブランチでのみ実行できます。ランタイムは状況に応じて、特定のシンボルは1つのパスで1つのことを意味し、別のパスで別のことを意味する場合があります。テキスト補完を行うために「Another Pass」から情報を取得しますか?さらに言えば、まだ書かれていないモジュールにプラグインされるライブラリを書いているとしたらどうでしょう?
ビルK

@billk実際には、IDEは実行時に正常に機能します。テストファーストで作業する場合、ランタイムは期待するオブジェクトを知っています。しばらくの間、smalltalkを試してください。
ステファンエッガーモント

0

少なくともPHPの場合、多くのIDEは次のようなものを「理解」します

/** @var $foo ClassA **/

標準化された方法(この場合はphpDocumentor)で文書化すると、IDEはそれを最大限に活用します。


2
したがって、静的にコンパイルされた言語で入力する必要があるすべてのものを入力すると、静的に入力された言語でできる情報と同じ情報を見つけることができると言っています-本当ですが、余分なステップをスキップしないでください静的に型付けされた言語に行きますか?
ビルK

繰り返しますが、少なくともphpは単純な型に対していくつかの自動キャストを行うためです。また、動的言語を使用すると、型を指定する場所を決定できるためです。アジャイル開発では、「クラスを型またはインターフェイスとして使用しますか?」などの決定を延期したい場合があります。
ACNB

@ACNB:多数の「静的」言語でも、自動キャストと型推論が可能です。たとえば、C ++、C#など。
アラファンギオン

0

動的言語(実行時に型を解決する言語)のすべてのIDEから最適なものは... Visual Studio for Python

  • インテリセンスのいじめタイプ情報
  • ナビゲーション
  • デバッグ

試してみる価値があります。


VS for Pythonがどのような点で優れているのか、具体的に指摘していただけますか?
ヨルグWミットタグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.