IDE для динамических языков - как далеко вы можете получить?

56

Я нахожу разочаровывающим то, как скорость разработки, которую должны предлагать динамические языки, значительно снижается из-за отсутствия дополнений и других ресурсов, которые IDE предоставили бы вам в своих статических аналогах.

Это не просто печатать меньше - это повышение производительности и простое удовольствие, которое вы получаете, просматривая API без необходимости постоянно обращаться к документации, которая не интегрирована с редактором.

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

  • детская коляска
  • медленный
  • невежественный / чрезмерно восторженный (как в показе всех возможных завершений)
  • или просто не так полно, как, скажем, Eclipse + Java.

Я знаю, что динамический анализ кода не является тривиальной задачей. Но нельзя не задаться вопросом - действительно ли этот кусок кода так сложно понять ?

Итак, мой вопрос:

Достигли ли какие-либо конкретные среды IDE (или менее все-в-одном) полностью выдающейся поддержки динамического языка, или это все еще «нерешенная» проблема?

vemv
источник
30
+1 Каждая PHP IDE, которую я пробовал, была просто ужасна по сравнению с Visual Studio + C # / C ++.
Матей Забский
5
Не уверен насчет всеобъемлющего вопроса, но, возможно, вы захотите взглянуть на IDE JetBrains. Их подход - «у нас уже есть отличная IDE, давайте сделаем так, чтобы она работала для $ LANGUAGE». Возможно, проблема с теми, которые вы пробовали, заключалась в следующем: «$ LANGUAGE не имеет IDE, кто-то должен ее создать».
миллимус
2
Я действительно нашел IDEA просто замечательным, особенно для работы с Java и задачами, связанными с проектом. Но что касается JavaScript, он, похоже, не распознает «методы», определенные в пространстве имен или содержащихся в нем объектах.
vemv
IntelliJ IDEA или любой из IDE JetBrains для конкретного языка.
Сильванаар
1
@FrustratedWithFormsDesigner Я использовал Komodo. У него гораздо лучшая автозаполнение, чем у любой другой RoR IDE, которую я видел ... но я видел очень мало IDE для Ruby, которые даже пытаются реализовать автозаполнение. Тем не менее, это лучше, чем ничего
Эрлз

Ответы:

21

Smalltalk - высокодинамичный язык - всегда имел превосходную среду IDE, в которой такие мелочи, как автоматический рефакторинг, SUnit (прародитель всех * инфраструктур Unit), «кто отправляет это сообщение?», «Кто реализует этот метод?» и тому подобное были первопроходцами. Так что да, IDE действительно могут поддерживать динамические языки до уровня, который до самого недавнего времени намного превосходил уровень языков со статической типизацией.

С. Лотт говорит, что «у динамических языков не может быть такого же завершения кода, как у статических языков. По сути, это невозможно».

«По существу невозможно» в теоретическом, абсолютистском смысле? Конечно. В практическом смысле? На самом деле, нет. Существует много способов определения типа для динамических языков, статически ( k-CFA , RoelTyper ), во время выполнения ( PIC ) и других методов, например, использование недавней истории программиста - «Как история программы может улучшить завершение кода» .

Конечно, сообщества Pharo и Squeak очень довольны своими инструментами завершения кода .

Фрэнк Шиарар
источник
3
+1 от меня. Несмотря на то, что в наши дни я работаю в мире Java, я все еще вспоминаю, насколько вы более продуктивны в Smalltalk по сравнению с любым другим языком, который я знаю. Интеграция IDE и кода в вашем изображении, когда код постоянно «жив» (Smalltalkers поймут, что я имею в виду), просто непревзойденна. С Pharo и Seaside, которые внедряют новую жизнь в то, что многие считают «языком, который был», а Eclipse - как IDE, я все больше и больше возвращаюсь к Smalltalk. Превосходные соглашения по именованию в Smalltalk определенно помогают с прогнозирующим завершением кода.
Амос М. Карпентер
16

Почти все, что вы знаете из IDE, было впервые разработано в Smalltak, который является динамическим языком. Все остальное просто копирует их. Очевидно, что все эти функции возможны в динамических языках.

Сегодня динамические языки отстают от статических языков. Но почему?

До недавнего времени считалось, что статическая типизация превосходит динамическую типизацию. Многие программисты недавно изменили свое мнение по этому вопросу. Сосредоточиться на IDE для динамически типизированных языков не было.

Я думаю, что функции для IDE менее полезны в динамически типизированных языках. Работая в Java или Objective-C, я чувствую, что IDE необходима, чтобы помочь мне работать с языком, но это не относится к динамическим языкам.

Некоторые части задачи проще в статическом языке. Это просто, чтобы выяснить тип выражения. Выполнение того же на динамическом языке требует либо полного анализа программы, либо регистрации типов во время выполнения. Так как многое из того, что IDE вращается вокруг типов, это имеет эффект.

Уинстон Эверт
источник
2
В Squeak и Pharo RoelTyper делает довольно хорошую работу по выводу типа чего-либо, просматривая, какие сообщения вы ему отправляете. В противном случае, k-CFA Shivers & Might обеспечивает настраиваемый вывод типа, в том смысле, что вы можете обменивать затраты на точность.
Фрэнк Шиарар
13
I think that the features for IDEs are less useful in dynamically typed languages- Забавно, я думаю, что с точностью до наоборот. Так как многие динамические языки не требуют, чтобы вы объявляли переменные заранее, неправильное написание переменной является серьезной проблемой ... проблема, которая облегчается хорошей IDE. Между тем, остальные основные функции - синтаксическая раскраска, инструменты рефакторинга, функции отладки - одинаково полезны на всех языках.
BlueRaja - Дэнни Пфлюгофт
2
@Winston: Тогда вы никогда не делали проект на не декларативном языке с несколькими людьми :) Это особенно раздражает, когда язык чувствителен к регистру. Пример из личного опыта: Слово «Рабочий порядок» иногда пишется как одно слово («Рабочий порядок»), поэтому при создании переменной некоторые люди пишут, workOrderа некоторые пишут workorder. Это две отдельные переменные в Python> _ <
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft, напротив, я делал проекты на Python с несколькими людьми. Когда вы говорите, что проблема заключается в следующем: вы запускаете и получаете исключение, потому что ссылаетесь на несуществующую переменную, ваш код не проходит первоначальное тестирование, потому что вы храните свои данные в неправильном месте, или вы получаете необнаруженные ошибки, приводящие к ошибкам код, выходящий в производство?
Уинстон Эверт
2
«Многие программисты недавно изменили свое мнение по этому вопросу». Почему это?
Пабби
10

Я столкнулся с этой проблемой с Python, вроде. Я хотел vim в качестве редактора, но это означало, что у меня не будет среды IDE. Итак, я свернул свои собственные с плагинами vim. В настоящее время, я думаю, у меня действительно лучшая среда для разработки, чем любая IDE, которую я использовал в прошлом.

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

  • патогенный микроорганизм
  • Python-режим, для веревки, Pyflakes и Pydoc интеграции
  • vimpdb для отладчика Python
  • проект для списка файлов в проекте
  • taglist для тега прыжки
  • супертаб для дополнения табуляции
  • снипмат для сниппетов
  • conqueterm для интегрированной оболочки, командной строки, bash, python или ipython

Есть еще кое-что, но у него есть все функции, которые есть у более популярных IDE. Это не стоило мне ни копейки, и я могу использовать всю силу Вима. Разделение, команды перемещения, регистры, прыжки, возможность запуска всей среды разработки с клавиатуры ...

Спенсер Рэтбун
источник
4

Достигли ли какие-либо конкретные среды IDE (или менее универсальные установки) абсолютно выдающейся поддержки динамического языка,

Учитывая, что вашу оценку трудно понять («совершенно выдающийся»? «Невежественный / чрезмерно восторженный»?), Сомнительно, что любая IDE может соответствовать подразумеваемому стандарту.

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

или это все еще нерешенная проблема?

Не совсем.

Это, вероятно, неразрешимо. Ваши требования («отсутствие доработок и других активов») затрудняют уточнение.

Динамические языки не могут иметь такого же завершения кода, как статические языки. Это по сути невозможно.

Некоторые IDE хорошо угадывают. Например, в Eclipse есть плагины для динамических языков.

С. Лотт
источник
3

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

JK.
источник
На самом деле, презентация Йегге была основной причиной моего вопроса: если есть эвристика и другие описанные методы, где все классные реализации? На IntelliJ: см. Комментарий, который я оставил к своему исходному сообщению (и дайте мне знать, если я ошибаюсь)
vemv
2014 - по-прежнему не подходит для лучших статических IDE
Ден
3

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

Райан
источник
Почему отрицательный голос за ответ, который говорит о динамическом типизированном развитии языка в среде IDE, который благодаря моему опыту достиг «совершенно выдающегося опыта». О чем просила опера?
Райан
2

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

Я могу засвидетельствовать, что это не глючит, медленный или невежественный. Я никогда не использовал Eclipse, поэтому я не знаю об этом, но думаю, что главный вопрос заключается в следующем: существует ли какой-то внутренний барьер для разработки полной и повышающей производительность IDE для динамических языков. Учитывая мой опыт работы с Python и Wing, я склонен сказать, что это не так. Это, однако, безусловно, сложнее.

Адам Кроссленд
источник
2

Microsoft Visual Studio - это IDE, которая используется многими программистами и поддерживает IronRuby , IronPython и F #. Большинство считает, что Ruby и Python являются динамическим языком программирования, а F # - менее.

В ответ на комментарий F # является языком программирования.

F # (произносится F Sharp) - это мультипарадигмальный язык программирования, ориентированный на .NET Framework, который включает функциональное программирование, а также дисциплины императивного и объектно-ориентированного программирования. Это вариант ML и в значительной степени совместим с реализацией OCaml.

Хотя точное определение того, что именно определяет «динамический язык», все еще остается предметом дискуссий, большинство согласится с тем, что JavaScript более «динамичен», чем, например, C #. Согласно Википедии:

Определение динамического языка неоднозначно, потому что оно пытается различать код и данные, а также между компиляцией и временем выполнения, которые не являются универсальными. Виртуальные машины, своевременная компиляция и способность многих языков программирования в некоторых системах напрямую изменять машинный код делают различие абстрактным. В целом утверждение о том, что язык является динамическим, является скорее утверждением о простоте использования динамических функций, чем четким заявлением о возможностях языка.

Я не хочу открывать здесь банку с червями. Некоторые могут предположить, что F # более правильно описывается как функциональный, а не динамический язык, и я бы не стал возражать против этого. На мой взгляд, было бы справедливо сказать, что для различных языков .Net язык F # обычно считается более подходящим для динамического программирования, чем C # или VB.

Возможно, вы захотите посмотреть: что определяет язык программирования как динамический?

JonnyBoats
источник
4
Можете ли вы объяснить, что вы подразумеваете под «F # [...] это динамический язык», и как он более динамичен, чем, скажем, C #?
Арсений Мурзенко
1
Во-вторых, я не считаю F # динамическим языком. Черт, C # может быть (я не уверен, что F # имеет легкодоступный эквивалент) "более динамичным", уже dynamicвстроенным. Но в любом случае, ни один из них, как правило, не является динамически типизированным, и большинство других функций (не говоря уже о культурных вещах), связанных с «динамическими языками», также отсутствуют.
2

Основное различие между статически типизированными языками и динамически типизированными языками состоит в том, что система может точно знать, что означает ссылка на символ во время компиляции.

Это позволяет действительно легко собирать информацию, необходимую для создания хорошей IDE, непосредственно из информации, сгенерированной компилятором во время компиляции (которая по большей части просто перемещается вверх во время «редактирования»).

Если у вас есть автономная сигнатура метода, которая просто говорит, что метод требует «вещь», как редактор может помочь вам узнать, что отправлять? Как это может помочь предложить способы использования вещи?

Утиная печать здесь тоже не поможет - даже самый умный из возможных редакторов не сможет сказать вам это просто потому, что у вашего объекта есть метод .executeFooOp (), который он может завершить с кодом «.executeBarOp» для этого объекта (Хотя это может отмыть остальную часть кода и сделать некоторые умные предположения).

Однако если вы знаете, что это «строка» в сигнатуре, вы знаете все методы, которые вы можете вызывать в этой строке, и вы можете предложить эту переменную, когда этот пользователь находится в процессе ввода вызова метода, который требует Строка в качестве параметра. Вы можете даже предложить подклассы, в которые он может быть включен, если хотите.

Информации просто нет с динамически типизированными языками, если вы не можете выполнить полное сканирование всей кодовой базы с помощью чего-то НАМНОГО более умного, чем ваш типичный компилятор.

Билл К
источник
1
«Основное различие между статически типизированными языками и динамически типизированными языками состоит в том, что система может точно знать, что означает ссылка на символ во время компиляции». - Да, но это не обязательно. Если IDE работает во время выполнения, а не во время компиляции, тогда ей не нужно знать эту информацию во время компиляции. Во время выполнения, информация является доступна, в противном случае программа не может работать даже.
Йорг Миттаг
1
Ide не может работать во время выполнения - или, точнее, может работать только на одной возможной ветви за раз. Время выполнения является ситуативным, данный символ МОЖЕТ означать одно на одном проходе, а другое на другом проходе, поэтому, если ваш «Редактор» «Выполнен» (как это вообще работает ???) на «Один проход», как он получить информацию от "Другой Пасс", чтобы завершить текст? В этом отношении, что, если вы пишете библиотеку, которая должна быть подключена к еще не написанному модулю?
Билл К
@billk На практике IDE прекрасно работает во время выполнения. если вы работаете в тестовом режиме, ваша среда выполнения знает ожидаемый вами объект. Попробуйте немного поговорить.
Стефан Эггермонт
0

По крайней мере, для PHP многие IDE "понимают" что-то вроде

/** @var $foo ClassA **/

Если вы документируете стандартизированным способом (в данном случае phpDocumentor ), IDE максимально использует его.

ACNB
источник
2
Итак, вы говорите, что если вы печатаете все, что требует статически скомпилированный язык, вы можете найти ту же информацию об этом, что и с любым статически типизированным языком - правда, я полагаю, но почему бы не пропустить дополнительный шаг и перейти на статически типизированный язык?
Билл К
Потому что опять же, по крайней мере, php выполняет автоматическое приведение для простых типов. А также потому, что при этом динамический язык позволяет вам решить, где указывать тип. В гибкой разработке вы можете отложить принятие решений, таких как «Использую ли я класс как тип или интерфейс?»
ACNB
@ACNB: множество «статических» языков также позволяют автоматическое приведение и вывод типов. Например, C ++, C # и тому подобное.
Арафангион
0

Из всех IDE для динамических языков (языков, которые разрешают тип во время выполнения) лучшим является ... Visual Studio для Python

  • Информация о типе буллинга для Intellisense
  • навигация
  • отладки

Стоит попробовать.

Лукаш Мадон
источник
Можете ли вы указать конкретно, чем VS лучше для Python, чем, давайте просто выберем один случайным образом, Hopscotch?
Йорг Миттаг