IDE для динамічних мов - як далеко ви можете дістатися?


56

Мені страшно, як швидкість розвитку, яку мають запропонувати динамічні мови, значно погіршується через відсутність доповнень та інших активів, які б IDE надали вам у своїх статичних аналогах.

Йдеться не лише про те, щоб набрати менше - це підвищення продуктивності та звичайне задоволення, яке ви отримуєте, переглядаючи API, не постійно звертаючись до документації, яка не інтегрована з редактором.

На сьогоднішній день всі динамічні комбінації мови IDE + - що було б чесно, не так вже й багато - я спробував:

  • баггі
  • повільний
  • безглуздий / перенапружений (як це показує всі можливі завершення)
  • або просто не настільки повно, як, скажімо, Eclipse + Java.

Я усвідомлюю, що динамічний аналіз коду не є тривіальним завданням. Але не можна не задатися питанням - чи справді цей фрагмент коду так важко розібратися ?

Отже, моє запитання:

Чи досягли якісь конкретні IDE (або менш налаштування «все в одному») цілком чудову підтримку динамічної мови, чи це все ще є «невирішеною» проблемою?


30
+1 Кожен PHP IDE, який я спробував, був просто жахливим порівняно з Visual Studio + C # / C ++.
Matěj Zábský

5
Не впевнені у всеохоплюючому питанні, але ви, можливо, захочете поглянути на JEBrains IDE. Їхній підхід - «у нас вже є чудова IDE, давайте змусимо це працювати на $ LANGUAGE». Проблема з тими, кого ви намагалися, замість цього застосувала такий підхід: "$ LANGUAGE не має IDE, хтось повинен зробити такий".
мільйозу

2
Мені IDEA справді була чудовою, особливо для роботи з Java та завдань, що стосуються проектів. Але що стосується JavaScript, то він, схоже, не розпізнає 'методи', визначені в просторі імен або його об'єктах, що містяться.
vemv

IntelliJ IDEA або будь-який з IDE для мови JetBrains.
Сільванаар

1
@FrustratedWithFormsDesigner Я використовував Komodo. Він набагато краще автозаповнення, ніж будь-який інший ID RoR IDE, який я бачив ... але я бачив дуже мало IDE для Ruby, які навіть намагаються реалізувати автозаповнення. Це сказало, що краще, ніж нічого
граф

Відповіді:


21

У Smalltalk - дуже динамічної мови - завжди був чудовий IDE, в якому такі дрібниці, як автоматичний рефакторинг, SUnit (бабуся і дідусь із усіх * фреймворків), "хто надсилає це повідомлення?", "Хто реалізує цей метод?" тощо. Так, так, IDE дійсно можуть підтримувати динамічні мови до рівня, який до недавнього часу значно перевершував мови, які мають статичний тип.

С. Лотт говорить, що "Динамічні мови не можуть мати такий самий вид заповнення коду, що і статичні мови. По суті це неможливо".

"По суті неможливо" в теоретичному, абсолютистському розумінні? Звичайно. У практичному сенсі? Не зовсім. Існує багато способів зробити висновок про тип динамічних мов, статично ( k-CFA , RoelTyper ), час виконання ( PIC ) та інші методи, наприклад, використання новітньої історії програміста - "Як історія програми може покращити завершення коду" .

Звичайно, громади Фаро і Скрік дуже задоволені своїми інструментами для завершення коду .


3
+1 від мене. Незважаючи на те, що працюєте у світі Java в наші дні, я все ще нагадую про те, наскільки ви продуктивнішими у Smalltalk порівняно з будь-якою іншою мовою, яку я знаю. Інтеграція IDE та коду у ваш образ, маючи весь час "живий" код (Smalltalkers буде знати, що я маю на увазі), просто неперевершена. Коли Pharo і Seaside вводять нове життя у те, що багато хто вважає "мовою, що була", так добре, як Eclipse - як IDE, я все більше і більше повертаюся до спільної роботи з Smalltalk. Прекрасні умови іменування Smalltalk, безумовно, допомагають передбачати завершення коду.
Амос М. Карпентер

16

Майже все, що ви знаєте з IDE, було вперше розроблено в Smalltak, що є динамічною мовою. Все інше - просто їх копіювання. Очевидно, що всі ці функції можливі в динамічних мовах.

Сьогодні динамічні мови відстають від статичних мов. Але чому?

До недавнього часу досить загальновизнано, що статичне введення тексту перевершує динамічне введення тексту. З цього часу багато кодерів змінили свою думку. Зосередження уваги на IDE для динамічно набраних мов не було.

Я думаю, що функції для IDE менш корисні у динамічно набраних мовах. Під час роботи в Java або Objective-C я вважаю, що IDE необхідний, щоб допомогти мені працювати з мовою, але те ж саме не стосується динамічних мов.

Деякі частини завдання легше статичною мовою. Просте вияснення типу виразу. Для того, щоб зробити те ж саме в динамічній мові, потрібен або аналіз всієї програми, або ведення журналів типів під час виконання. Оскільки багато того, що IDE обертається навколо типів, це має ефект.


2
У Squeak and Pharo RoelTyper виконує досить добру роботу, роблячи щось подібне, переглядаючи, які повідомлення ви надсилаєте на нього. В іншому випадку k-CFA компанії Shivers & Might надає можливість налаштування типу вибору, в тому сенсі, що ви можете компенсувати витрати на точність.
Френк Ширар

13
I think that the features for IDEs are less useful in dynamically typed languages- Смішно, я думаю, саме навпаки. Оскільки так багато динамічних мов не вимагає, щоб ви заздалегідь оголошували змінні, неправильне написання змінної є серйозною проблемою ... проблема, яку усуває хороший IDE. Тим часом решта основних функцій - забарвлення синтаксису, інструменти рефакторингу, функції налагодження - однаково корисні для всіх мов.
BlueRaja - Danny Pflughoeft

2
@Winston: Тоді ви ніколи не робили проект на деклараційній мові з кількома людьми :) Особливо прикро, коли мова відрізняється від регістру. Приклад з особистого досвіду: Слово "Work-Order" іноді пишеться як одне слово ("Workorder"), тому при створенні змінної деякі люди пишуть, workOrderа деякі пишуть workorder. Це дві окремі змінні в Python> _ <
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft, навпаки, я робив проекти в Python з кількома людьми. Коли ви говорите, що у вас є проблема: ви запускаєте і отримуєте виняток, тому що ви посилаєтесь на змінну, яка не існує, ваш код проходить початкове тестування, оскільки ви зберігаєте свої дані в неправильному місці, або ви виявляєте непомічені помилки, що призводять до помилок код втече до виробництва?
Вінстон Еверт

2
"Багато кодерів останнім часом передумали з цього приводу". Чому це?
Паббі

10

Я зіткнувся з цією проблемою з python. Я хотів vim як свого редактора, але це означало, що у мене не буде середовища IDE. Отже, я прокатав свої власні плагіни vim. В даний час я думаю, що я фактично маю кращі умови для розвитку, які використовували будь-які ІДЕ в минулому.

Моя установка розміщується на github , сміливо дивіться та розплачуйте те, що вам подобається. Для швидкого огляду плагінів:

  • збудник
  • python-mode, для мотузки, піфляки та інтеграції підока
  • vimpdb для налагоджувача python
  • проект для списку файлів у проекті
  • список тегів для стрибків тегів
  • supertab для заповнення вкладки
  • snipmate для фрагментів
  • conqueterm для інтегрованої оболонки, або командного рядка, bash, python, або ipython

Є ще деякі речі, але вони мають усі функції, які мають більш популярні IDE. Мені це не коштувало ні копійки, і я можу використати всю силу Vim. Розщеплення, команди руху, регістри, стрибки, вміння запускати все моє середовище розробників за допомогою клавіатури ...


4

Чи будь-які конкретні IDE (або менші налаштування "все в одному") отримали абсолютно чудову підтримку динамічної мови,

Зважаючи на те, що Вашу оцінку важко зрозуміти ("абсолютно видатна"? "Безглуздий / надмісячний"?), Сумнівно, що будь-який ІДЕ міг відповідати загальноприйнятому стандарту.

Тривіально порівнювати проти Eclipse + Java - нерозумно, оскільки динамічні мови - це не Java.

чи це все ще "невирішена" проблема?

Не зовсім.

Це, мабуть, нерозв'язне. Ваші вимоги ("відсутність доповнень та інших активів") ускладнюють бути точнішими.

Динамічні мови не можуть мати такий самий вид заповнення коду, що і статичні мови. Це по суті неможливо.

Деякі ІДЕ роблять добру справу вгадуванням. Наприклад, Eclipse має додатки для динамічних мов.


3

Я думаю, що ця презентація Стіва Йегге все ще актуальна. у горіховій оболонці є дещо наполовину гідні ідентичні сценарії Java (intelliJ IDEA), але динамічні мови в цілому грають на підхоплення, а не тому, що в створенні цих інструментів (чи справді мов) є щось складніше, це лише статичні мови. вся увага спочатку.


Насправді презентація Йегге була першопричиною мого запитання: якщо євристика та інші описані методи існують, то де всі цікаві реалізації? Про IntelliJ: дивіться коментар, який я залишив у своєму початковому дописі (і дайте мені знати, чи не помиляюся)
vemv

2014 року - не всі ще не рівня кращих статичних Іди
Den

3

Я цілий день програмую в javascript / php та ruby, працюючи над веб-додатками, і найкращий IDE, який я знайшов для цього, - Aptana. Він має завершення коду для всіх трьох цих мов (і python), він підбирає мої локальні vars і, крім того, під час роботи з html та css він збирає ідентифікатори в html для використання в css / javascript і підбирає функцію назви, коли я роблю щось швидке і брудне і пишу вбудований javascript (я знаю погано, але іноді корисно для підтвердження концепції). Він вбудований у завдання рейку та підтримує підтримку git та консолі командного рядка. Мені знадобилося трохи встати, але одного разу я виявив, що навряд чи коли-небудь залишаю свій IDE при кодуванні, і це економить мені тонни часу.


Чому прихильний голос відповіді, який говорить про динамічно набраний розвиток мови всередині IDE, який досяг із мого досвіду "абсолютно неперевершений досвід". Що це те, про що просили?
Райан

2

Я виявив, що підтримка Python від Wing IDE справді видатна. Він робить хорошу роботу з заповненням коду, і його налагоджувач настільки ж потужний, як і Visual Studio для нединамічного C #.

Я можу засвідчити, що це не баггі, повільно або безглуздо. Я ніколи не використовував Eclipse, тому я не знаю цього питання, але я вважаю, що головне питання: чи є якийсь властивий бар'єр для розвитку повного і підвищення продуктивності IDE для динамічних мов. Враховуючи свій досвід роботи з Python and Wing, я схильний сказати, що це не так. Однак, звичайно, складніше.


2

Visual Studio Microsoft - це IDE, який використовується багатьма програмістами, і він підтримує IronRuby , IronPython та 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
Ідея не може працювати під час виконання - або точніше, може працювати лише на одній можливій гілці за раз. Час виконання є ситуаційним, заданий символ МОЖЕ означати одне на одному проході, а інше - на іншому, тому якщо ваш "Редактор" - "Запуск" (як це навіть працює ???) на "Один прохід", як це робити отримати інформацію від "Інший пропуск" для завершення тексту? З цього питання, що робити, якщо ви пишете бібліотеку, яку потрібно підключити до ще неписаного модуля?
Білл К

@billk На практиці IDE працює чудово під час виконання. якщо ви працюєте на тесті, спочатку ваш час роботи знає об'єкт, який ви очікуєте. Спробуйте невелику розмову на деякий час.
Стефан Еггермонт

0

Принаймні для PHP багато IDE «розуміють» щось подібне

/** @var $foo ClassA **/

Якщо ви документуєте стандартизованим способом (у цьому випадку phpDocumentor ), IDE максимально використовуватиме його.


2
Отже, ви говорите, що якщо ви введете все, що статично складена мова вимагає від вас введення, ви можете знайти ту саму інформацію, що і з будь-якою статично набраною мовою - правда, я думаю, але чому б не просто пропустити додатковий крок і перейти до статично набраної мови?
Білл К

Тому що знову-таки принаймні php робить автоматичний кастинг для простих типів. А також тому, що завдяки цьому динамічна мова дозволяє вирішити, де вказати тип. Завдяки спритній розробці, можливо, ви хочете відкласти рішення типу "Чи я використовую клас як тип чи інтерфейс?"
ACNB

@ACNB: Чимало "статичних" мов також дозволяють здійснювати автоматичне введення і введення типів. Наприклад, C ++, C # тощо.
Арафангіон

0

З усіх IDE для динамічних мов (мови, які вирішують тип під час виконання) найкращим є ... Visual Studio for Python

  • Інформація про тип продажу для Intellisense
  • Навігація
  • Налагодження

Варто спробувати.


Чи можете ви конкретно вказати, якими способами VS для Python є кращим ніж, давайте просто виберемо його випадковим чином, Hopscotch?
Йорг W Міттаг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.