IDE dla języków dynamicznych - jak daleko można się dostać?

56

Uważam za frustrujące, w jaki sposób szybkość rozwoju, jaką powinny oferować dynamiczne języki, zostaje znacznie zmniejszona z powodu braku uzupełnień i innych zasobów, które IDE dałyby ci w swoich statycznych odpowiednikach.

Nie chodzi tylko o pisanie mniej - chodzi o zwiększenie wydajności i zwykłą zabawę podczas przeglądania interfejsów API bez konieczności ciągłego odwoływania się do dokumentacji niezintegrowanej z edytorem.

Do tej pory wszystkie dynamiczne kombinacje językowe IDE + - które uczciwie nie są aż tak bardzo - próbowałem:

  • powozik
  • powolny
  • nieświadomy / nadmierny entuzjazm (jak pokazanie wszystkich możliwych uzupełnień)
  • lub po prostu nie tak kompletne jak, powiedzmy, Eclipse + Java.

Wiem, że dynamiczna analiza kodu nie jest trywialnym zadaniem. Ale nie można przestać się zastanawiać - czy naprawdę trudno jest zrozumieć ten fragment kodu ?

Więc moje pytanie brzmi:

Czy jakieś konkretne środowiska IDE (lub mniej konfiguracji typu „wszystko w jednym”) uzyskały całkowicie wyjątkową obsługę dynamicznego języka, czy też jest to nadal problem „nierozwiązany”?

vemv
źródło
30
+1 Każde pojedyncze IDE PHP, którego próbowałem, było po prostu okropne w porównaniu do Visual Studio + C # / C ++.
Matěj Zábský
5
Nie jestem pewien co do nadrzędnego pytania, ale możesz rzucić okiem na IDE JetBrain. Podejście to brzmi: „mamy już świetne IDE, sprawmy, żeby działało dla $ LANGUAGE”. Problem z tymi, które wypróbowałeś, mógł polegać na zastosowaniu następującego podejścia: „$ LANGUAGE nie ma IDE, ktoś powinien go stworzyć”.
millimoose
2
Uważam, że IDEA jest po prostu cudowna, szczególnie do pracy z Javą i zadaniami związanymi z projektami. Jednak w przypadku JavaScript nie wydaje się rozpoznawać „metod” zdefiniowanych w przestrzeni nazw lub zawartych w niej obiektach.
vemv
IntelliJ IDEA lub dowolne IDE specyficzne dla języka JetBrains.
sylvanaar
1
@FrustratedWithFormsDesigner Użyłem Komodo. Ma znacznie lepsze automatyczne uzupełnianie niż jakikolwiek inny IDR RoR, jaki widziałem ... ale widziałem bardzo niewiele IDE dla Ruby, które nawet próbują wdrożyć automatyczne uzupełnianie. To powiedziawszy, to lepsze niż nic
Earlz

Odpowiedzi:

21

Smalltalk - wysoce dynamiczny język - zawsze miał doskonałe IDE, w którym drobne rzeczy, takie jak automatyczne refaktoryzowanie, SUnit (dziadek wszystkich * frameworków Unit), „kto wysyła ten komunikat?”, „Kto wdraża tę metodę?” i tym podobne były pionierami. Tak więc, IDE mogą rzeczywiście obsługiwać języki dynamiczne do poziomu, który do niedawna znacznie przekraczał język języków o typie statycznym.

S. Lott mówi, że „Języki dynamiczne nie mogą mieć tego samego rodzaju uzupełniania kodu, co języki statyczne. Jest to w zasadzie niemożliwe”.

„Zasadniczo niemożliwe” w sensie teoretycznym, absolutystycznym? Pewnie. W sensie praktycznym? Nie całkiem. Istnieje wiele sposobów wnioskowania o typach dla języków dynamicznych, statycznych ( k-CFA , RoelTyper ), w czasie wykonywania ( PIC ) i innych metodach, takich jak używanie najnowszej historii programisty - „Jak historia programu może poprawić uzupełnianie kodu” .

Z pewnością społeczności Pharo i Squeak są bardzo zadowolone z narzędzi do uzupełniania kodu .

Frank Shearar
źródło
3
+1 ode mnie Pomimo tego, że pracuję obecnie w świecie Java, wciąż wspominam o ile jesteś bardziej produktywny w Smalltalk w porównaniu do jakiegokolwiek innego języka, który znam. Integracja IDE i kodu w obrazie, ponieważ kod jest cały czas „żywy” (Smalltalkers będzie wiedział, co mam na myśli), jest po prostu niedościgniony. Gdy Pharo i Seaside wprowadzają nowe życie w to, co wielu ludzi uważa za „dotychczasowy język”, tak dobry jak Eclipse jako IDE, wracam do zabawy z Smalltalk coraz bardziej. Doskonałe konwencje nazewnictwa Smalltalk zdecydowanie pomagają w przewidywalnym uzupełnianiu kodu.
Amos M. Carpenter
16

Prawie wszystko, co znasz z IDE, zostało po raz pierwszy opracowane w Smalltak, który jest językiem dynamicznym. Cała reszta to tylko ich kopiowanie. Oczywiście wszystkie te funkcje są możliwe w dynamicznych językach.

Obecnie języki dynamiczne stoją za językami statycznymi. Ale dlaczego?

Do niedawna powszechnie uważano, że pisanie statyczne jest lepsze niż pisanie dynamiczne. Wielu programistów ostatnio zmieniło zdanie w tej sprawie. Nie było skupienia się na IDE dla języków dynamicznie wpisywanych.

Myślę, że funkcje IDE są mniej przydatne w dynamicznie pisanych językach. Pracując w Javie lub Objective-C, uważam, że IDE jest konieczne, aby pomóc mi w pracy z tym językiem, ale to samo nie dotyczy języków dynamicznych.

Niektóre części zadania są łatwiejsze w języku statycznym. Zrozumienie rodzaju wyrażenia jest proste. Wykonanie tego samego w języku dynamicznym wymaga analizy całego programu lub zarejestrowania typów w czasie wykonywania. Ponieważ wiele z tego, co IDE obraca się wokół typów, ma to wpływ.

Winston Ewert
źródło
2
W Squeak i Pharo RoelTyper ma dość dobrą możliwość wnioskowania o typie czegoś, sprawdzając, jakie wiadomości do niego wysyłasz. W przeciwnym razie k-CFA Shivers & Might zapewnia dostrajanie wnioskowania o typ, w tym sensie, że można kompromis kosztować w stosunku do dokładności.
Frank Shearar
13
I think that the features for IDEs are less useful in dynamically typed languages- Zabawne, myślę wręcz przeciwnie. Ponieważ tak wiele języków dynamicznych nie wymaga wcześniejszego deklarowania zmiennych, błędne pisanie zmiennej jest poważnym problemem ... problemem, który jest łagodzony przez dobre IDE. Tymczasem pozostałe główne funkcje - kolorowanie składni, narzędzia do refaktoryzacji, funkcje debugowania - są równie przydatne we wszystkich językach.
BlueRaja - Danny Pflughoeft
2
@Winston: Wtedy nigdy nie robiłeś projektu w nie deklaratywnym języku z wieloma osobami :) Jest to szczególnie denerwujące, gdy w języku rozróżniana jest wielkość liter. Przykład z własnego doświadczenia: słowo „Zamówienie pracy” jest czasami pisane jako jedno słowo („Workorder”), więc podczas tworzenia zmiennej niektórzy ludzie będą pisać, workOrdera inni będą pisać workorder. Są to dwie oddzielne zmienne w Pythonie> _ <
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft, przeciwnie, projektowałem w Pythonie z wieloma osobami. Kiedy mówisz, że masz problem: uruchamiasz się i otrzymujesz wyjątek, ponieważ odwołujesz się do zmiennej, która nie istnieje, kod nie przechodzi wstępnego testowania, ponieważ przechowujesz dane w niewłaściwym miejscu lub otrzymujesz niewykryte błędy, które powodują błędy kod ucieka do produkcji?
Winston Ewert
2
„Wielu programistów ostatnio zmieniło zdanie w tej sprawie”. Dlaczego to?
Pubby
10

Zetknąłem się z tym problemem z pythonem. Chciałem vima jako mojego edytora, ale to oznaczało, że nie miałbym środowiska IDE. Więc stworzyłem własne z wtyczkami vim. Obecnie myślę, że mam lepsze środowisko do programowania niż IDE, z którego korzystałem w przeszłości.

Moja konfiguracja jest hostowana na github , możesz rzucić okiem na to, co lubisz. Szybki przegląd wtyczek:

  • patogen
  • tryb python, do integracji liny, płatków pyłu i pydoc
  • vimpdb dla debuggera Pythona
  • projekt dla listy plików w projekcie
  • taglist do skoków tagów
  • supertab do uzupełniania tabulatorów
  • snipmate dla fragmentów
  • conqueterm dla zintegrowanej powłoki, albo wiersz poleceń, bash, python lub ipython

Jest kilka innych rzeczy, ale ma wszystkie funkcje, które mają bardziej popularne IDE. Nie kosztowało mnie to ani grosza, a ja mogę wykorzystać całą moc vima. Dzieli, komendy ruchu, rejestry, skoki, możliwość uruchamiania całego środowiska programistycznego za pomocą klawiatury ...

Spencer Rathbun
źródło
4

Czy jakieś konkretne środowiska IDE (lub mniej konfiguracji all-in-one) osiągnęły całkowicie wyjątkową obsługę dynamicznego języka,

Biorąc pod uwagę, że twoja ocena jest trudna do zrozumienia („całkowicie wybitny”? „Nieświadomy / nadmiernie entuzjastyczny”?), Wątpliwe jest, aby jakiekolwiek IDE pasowało do domyślnego standardu.

Trywialne porównywanie z Eclipse + Java jest głupie, ponieważ dynamiczne języki to nie Java.

czy jest to nadal „nierozwiązany” problem?

Nie do końca.

Prawdopodobnie jest to nierozwiązywalne. Twoje wymagania („brak uzupełnień i inne zasoby”) utrudniają precyzję.

Języki dynamiczne nie mogą mieć tego samego rodzaju uzupełniania kodu, co języki statyczne. Jest to w zasadzie niemożliwe.

Niektóre IDE dobrze zgadują. Na przykład Eclipse ma wtyczki do dynamicznych języków.

S.Lott
źródło
3

Myślę, że ta prezentacja Steve'a Yegge jest nadal aktualna . w skorupce orzecha znajduje się około połowa przyzwoitych idów skryptów Java (intelliJ IDEA), ale generalnie języki dynamiczne odgrywają nadrabianie zaległości, nie dlatego, że tworzenie tych narzędzi (lub języków) jest z natury trudniejsze, to tylko statyczne języki cała uwaga pierwsza.

jk.
źródło
W rzeczywistości prezentacja Yegge była podstawową przyczyną mojego pytania: czy istnieją heurystyki i inne opisane techniki, gdzie są wszystkie fajne implementacje? Na IntelliJ: zobacz komentarz, który zostawiłem na moim oryginalnym poście (i daj mi znać, jeśli się mylę)
vemv
2014 - nadal nie dorównuje najlepszym IDE statycznych
Den
3

Programuję cały dzień w javascript / php i ruby, pracując na aplikacjach internetowych, a najlepszym IDE, jakie znalazłem do tego, jest Aptana. Ma uzupełnianie kodu dla wszystkich trzech języków (i python), pobiera moje lokalne zmienne, a ponadto podczas pracy z HTML i CSS pobiera identyfikatory w HTML do użycia w css / javascript i pobiera funkcję nazwiska, kiedy robię coś szybkiego i brudnego i piszę wbudowany javascript (znam kiepski, ale czasem przydatny jako dowód koncepcji). Ma wbudowane zadania prowizji i wsparcie dla git i konsoli wiersza poleceń. Trochę zajęło mi wstawanie, ale kiedy to zauważyłem, prawie nigdy nie zostawiam swojego IDE podczas kodowania i to oszczędza mi mnóstwo czasu.

Ryan
źródło
Dlaczego głosowanie w dół na odpowiedź, która mówi o dynamicznie wpisywanym rozwoju języka w środowisku IDE, który z mojego doświadczenia osiągnął „całkowicie wyjątkowe doświadczenie”. O co prosił op?
Ryan,
2

Przekonałem się, że obsługa Wing IDE dla Pythona jest naprawdę znakomita. Wykonuje dobrą robotę z uzupełnianiem kodu, a jego debugger jest tak samo wydajny jak Visual Studio dla niedynamicznego C #.

Mogę zaświadczyć, że nie jest wadliwy, powolny ani pozbawiony pojęcia. Nigdy nie korzystałem z Eclipse, więc nie znam się na tym, ale myślę, że większe pytanie brzmi: czy istnieje jakaś nieodłączna bariera w rozwoju kompletnego i zwiększającego produktywność IDE dla języków dynamicznych. Biorąc pod uwagę moje doświadczenie z Pythonem i Wingiem, jestem skłonny powiedzieć, że tak nie jest. Jest to jednak z pewnością trudniejsze.

Adam Crossland
źródło
2

Microsoft Visual Studio to IDE, które jest używane przez wielu programistów i obsługuje IronRuby , IronPython i F #. Większość uważa, że ​​Ruby i Python są dynamicznym językiem programowania, podczas gdy F # byłby mniejszy.

W odpowiedzi na komentarz F # jest językiem programowania.

F # (wymawiane F Sharp) jest językiem programowania opartym na wielu paradygmatach, ukierunkowanym na .NET Framework, który obejmuje programowanie funkcjonalne, a także dyscypliny programowania imperatywnego i obiektowego. Jest to wariant ML i jest w dużej mierze zgodny z implementacją OCaml.

Chociaż dokładna definicja tego, co dokładnie definiuje „język dynamiczny”, jest nadal przedmiotem dyskusji, większość zgadza się, że JavaScript jest bardziej „dynamiczny” niż na przykład C #. Według Wikipedii:

Definicja języka dynamicznego jest niejednoznaczna, ponieważ próbuje odróżnić kod i dane, a także kompilację od środowiska wykonawczego, które nie są uniwersalne. Maszyny wirtualne, kompilacja just-in-time oraz zdolność wielu języków programowania w niektórych systemach do bezpośredniej modyfikacji kodu maszynowego sprawiają, że rozróżnienie to jest abstrakcyjne. Zasadniczo twierdzenie, że język jest dynamiczny, jest bardziej stwierdzeniem o łatwości użycia funkcji dynamicznych niż wyraźnym stwierdzeniem możliwości tego języka.

Nie chcę tutaj otwierać puszki robaków. Niektórzy sugerują, że F # jest bardziej poprawnie opisany jako język funkcjonalny niż dynamiczny, i nie wziąłbym od tego wyjątku. To, co uważam za słuszne, by powiedzieć, że jest z różnych języków .Net, F # jest ogólnie uważane za bardziej odpowiednie do programowania dynamicznego niż C # lub VB.

Możesz chcieć zobaczyć: co kwalifikuje język programowania jako dynamiczny?

JonnyBoats
źródło
4
Czy możesz wyjaśnić, co masz na myśli mówiąc, że „F # [...] jest językiem dynamicznym” i jak jest bardziej dynamiczny niż, powiedzmy, C #?
Arseni Mourzenko
1
Po drugie, nie uważam F # za język dynamiczny. Heck, C # może być (nie jestem pewien, czy F # ma łatwo dostępny odpowiednik) „bardziej dynamiczny”, mając już dynamicwbudowane. Ale w obu przypadkach żadna z nich nie jest generalnie dynamicznie wpisywana, a brakuje też większości innych funkcji (nie wspominając o kulturach) związanych z „dynamicznymi językami”.
2

Główną różnicą między językami o typie statycznym a językiem o typie dynamicznym jest to, że system może na pewno wiedzieć, co oznacza symbol w czasie kompilacji.

To sprawia, że ​​bardzo łatwo jest zebrać informacje potrzebne do stworzenia dobrego IDE bezpośrednio z informacji generowanych przez kompilator w czasie kompilacji (które w większości są po prostu przenoszone do czasu „edycji”).

Jeśli masz samodzielny podpis metody, który mówi, że metoda przyjmuje „Rzecz”, w jaki sposób edytor może pomóc Ci wiedzieć, co wysłać? Jak może pomóc zasugerować sposoby korzystania z tego przedmiotu?

Pisanie kaczką też tu nie pomaga - nawet najinteligentniejszy edytor nie jest w stanie powiedzieć, że po prostu dlatego, że Twój obiekt ma metodę .executeFooOp (), która może uzupełnić kodem „.executeBarOp” na tym obiekcie (Chociaż może to przeszukać resztę kodu i dokonać pewnych inteligentnych domysłów).

Jeśli wiesz, że jest to „ciąg” w podpisie, znasz wszystkie metody, które możesz wywołać w tym ciągu ORAZ możesz zasugerować tę zmienną, gdy użytkownik jest w trakcie pisania wywołania metody, które wymaga Ciąg jako parametr. Możesz nawet zaproponować podklasy, w które można by rzucić, jeśli chcesz.

Informacji nie ma w dynamicznie wpisywanych językach, chyba że możesz wykonać pełne skanowanie całej bazy kodu za pomocą DUŻO inteligentniejszego niż typowy kompilator.

Bill K.
źródło
1
„Główną różnicą między językami o typie statycznym a językiem o typie dynamicznym jest to, że system może na pewno wiedzieć, co oznacza symbol w czasie kompilacji”. - Tak, ale nie musi. Jeśli IDE działa w czasie wykonywania zamiast w czasie kompilacji, nie musi znać tych informacji w czasie kompilacji. W czasie wykonywania informacje dostępne, w przeciwnym razie program nie mógłby nawet uruchomić.
Jörg W Mittag
1
Ide nie może działać w czasie wykonywania - a ściślej mówiąc, może działać tylko na jednym możliwym oddziale naraz. Środowisko wykonawcze ma charakter sytuacyjny, dany symbol MOŻE oznaczać jedną rzecz na jednym przejściu, a drugą na innym przejściu, więc jeśli Twój „Edytor” działa „(jak to działa ??) na„ Jednym przejściu ”, jak to działa uzyskać informacje z „Another Pass”, aby uzupełnić tekst? Co do tego, jeśli piszesz bibliotekę, która ma zostać podłączona do jeszcze niepisanego modułu?
Bill K
@billk W praktyce IDE działa dobrze w czasie wykonywania. jeśli pracujesz w pierwszej kolejności, Twój czas działania zna obiekt, którego oczekujesz. Spróbuj chwilę porozmawiać.
Stephan Eggermont
0

Przynajmniej dla PHP wiele IDE „rozumie” coś takiego

/** @var $foo ClassA **/

Jeśli dokumentujesz w znormalizowany sposób (w tym przypadku phpDocumentor ), IDE w pełni go wykorzysta.

ACNB
źródło
2
Mówisz więc, że jeśli wpiszesz wszystko, co wymagałoby statycznie skompilowanego języka, możesz znaleźć te same informacje na ten temat, co w przypadku każdego statycznie wpisanego języka - to prawda, ale dlaczego nie pominąć dodatkowego kroku i przejść do statycznie wpisanego języka?
Bill K
Ponieważ znowu przynajmniej php wykonuje pewne automatyczne rzucanie dla prostych typów. A także dlatego, że dzięki temu język dynamiczny pozwala zdecydować, gdzie określić typ. Dzięki zwinnemu programowaniu możesz chcieć odłożyć decyzje, takie jak „Czy używam klasy jako typu lub interfejsu?”
ACNB
@ACNB: Wiele języków „statycznych” pozwala również na automatyczne przesyłanie i wyprowadzanie typów. Np. C ++, C # i tym podobne.
Arafangion
0

Ze wszystkich IDE dla języków dynamicznych (języków, które rozwiązują typ w czasie wykonywania) najlepszym jest ... Visual Studio for Python

  • Informacje o typie bulling dla Intellisense
  • Nawigacja
  • Debugowanie

Warto spróbować.

Łukasz Madon
źródło
Czy możesz wskazać konkretnie, w jaki sposób VS for Python jest lepszy niż, wybieramy jeden losowo, gra w klasy?
Jörg W Mittag,