사람들이 동적 언어에서 그토록 매력적이라고 ​​생각하는 것은 무엇입니까? [닫은]


81

요즘 모두가 다이나믹하고 컴파일되지 않은 악 대차에 뛰어 드는 것 같습니다. 저는 대부분 컴파일 된 정적 유형 언어 (C, Java, .Net)로만 작업했습니다. 동적 언어에 대한 경험은 ASP (Vb Script), JavaScript 및 PHP와 같은 것입니다. 이러한 기술을 사용하는 것은 동적 언어에 대해 생각할 때 입에 나쁜 맛을 남겼습니다. 맞춤법이 틀린 변수 이름 및 잘못된 유형의 값을 변수에 할당하는 것과 같이 일반적으로 컴파일러에 의해 포착되었을 수있는 것은 런타임까지 발생하지 않습니다. 그런 다음에도 새 변수를 만들고 일부 기본값을 할당하기 때문에 오류가 발생하지 않을 수 있습니다. 또한 변수에는 명시 적 유형이 없기 때문에 동적 언어에서 intellisense가 잘 작동하는 것을 본 적이 없습니다.

제가 알고 싶은 것은 사람들이 동적 언어에 대해 매력적이라고 ​​생각하는 것은 무엇입니까? 다이나믹 언어로 할 수있는 일의 측면에서 할 수 없거나 컴파일 된 언어로하기 어려운 주요 이점은 무엇입니까? 오래 전에 우리가 런타임 예외를 던지는 컴파일되지 않은 ASP 페이지와 같은 것은 나쁜 생각이라고 결정한 것 같습니다. 이러한 유형의 코드가 왜 부활합니까? 그리고 적어도 Ruby on Rails가 10 년 전에 ASP로 할 수 없었던 어떤 것과도 다르게 보이는 이유는 무엇입니까?


9
동적 언어를 방어하는 사람이 너무 적다는 사실은 슬프고 이상합니다.
davidtbernal

11
이것이 아래의 모든 동적 혐오 자들을 해결하는 유일한 방법이기 때문에 여기서 대답하겠습니다. 동적 언어를 사용하면 코드를 더 빠르게 작성할 수 있습니다. 두 가지 방법이 없습니다. 내 변수의 유형에 대해 걱정할 필요가 없으며 코드를 작성하기 위해 크고 무거운 IDE를 실행할 필요가 없습니다. 따라서 유형 시스템의 번거 로움으로 인해 컴파일러에게 모든 것을 알려주기 때문에 정적 유형 시스템으로 더 오래 걸리는 빠른 작업을 수행하는 것이 훨씬 좋습니다.
RCIX

2
C # 프로그래머의 편협한 근시는 무엇입니까?
Azeem.Butt


5
철자가 잘못된 변수 이름이 문제가되는 것은 정적 / 동적이 아닌 암시 적 변수 선언에서 비롯됩니다. 명시적인 변수 선언 (예 : Smalltalk)이 필요한 동적 언어에는이 문제가 없습니다.
Frank Shearar 2010

답변:


101

그 이유는 사람들이 매우 제한적이고 표현력이없는 유형 시스템을 가진 정적으로 유형화 된 언어에 익숙하기 때문이라고 생각합니다. 이들은 Java, C ++, Pascal 등과 같은 언어입니다.보다 표현적인 유형 시스템과 더 나은 유형 추론의 방향으로가는 대신 (예를 들어 Haskell, 심지어 SQL에서와 같이 어느 정도까지) 어떤 사람들은 모든 "유형"정보를 머리 (및 테스트)에 포함하고 정적 유형 검사를 모두 제거합니다.

이것이 결국 당신을 사게하는 것은 불분명합니다. typechecking에 대한 오해가 많이 있습니다. 제가 가장 흔히 접하는 것은이 두 가지입니다.

오류 : 동적 언어는 덜 장황합니다. 오해는 유형 정보가 유형 주석과 같다는 것입니다. 이것은 완전히 사실이 아닙니다. 우리 모두는 타입 어노테이션이 성가시다는 것을 알고 있습니다. 기계는 그런 것들을 알아낼 수 있어야합니다. 사실, 그것은 현대 컴파일러에서도 마찬가지입니다. 다음은 Haskell의 두 줄에있는 정적으로 형식화 된 QuickSort입니다 ( haskell.org ).

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

다음은 LISP에서 동적으로 입력 된 QuickSort입니다 ( swisspig.net ).

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

Haskell 예제는 정적으로 입력 된 가설을 위조 하므로 verbose . LISP 예제는 자세한 가설을 위조 하므로 정적으로 입력 됩니다. 타이핑과 자세한 정도 사이에는 어떤 의미도 없습니다. 당신은 그것을 당신의 마음에서 안전하게 제거 할 수 있습니다.

오류 : 정적으로 형식화 된 언어는 해석이 아니라 컴파일되어야합니다. 다시 말하지만 사실이 아닙니다. 정적으로 입력 된 많은 언어에는 인터프리터가 있습니다. Scala 인터프리터, Haskell 용 GHCi 및 Hugs 인터프리터가 있습니다. 물론 SQL은 내가 살아있는 것보다 더 오랫동안 정적으로 입력되고 해석되었습니다.

아시다시피, 역동적 인 군중은 자신이하는 일에 대해 신중하게 생각할 필요가없는 자유를 원할 것입니다. 소프트웨어가 정확하지 않거나 견고하지 않을 수 있지만 반드시 그럴 필요는 없습니다.

개인적으로 형식 안전을 포기하고 일시적인 자유를 구입하려는 사람들은 자유도 형식 안전도받을 자격이 없다고 생각합니다.


26
자유를 위해 유형 안전을
포기할

6
lisp는 그 자체로 매우 장황합니다. 동적으로 입력하는 것과는 아무 관련이 없습니다. 파이썬에서 시도해보세요. def qsort (l) : return qsort ([x for x in l [1 :] if x <l [0]]) + l [0] + qsort ([x for x in l [1 :] if x> = l [0]) if l else l
fortran

13
그게 바로 요점입니다. 동적 또는 정적으로 입력되는 것과는 관련이 없습니다.
Apocalisp

9
나는 당신의 예가 다소 가난하다고 주장합니다. 역동적 인 언어를 찬양하는 사람들은 하스켈의 Lisp를 선택하지 않을 것입니다. 그들은 아마도 자바 나 C #보다 파이썬이나 루비를 선택할 것입니다.
Corey D

8
주장은 장황함과 유형 성 사이에 연관성이 있다는 것입니다. 보시다시피 그러한 우연은 순수한 우연입니다. 비정형이 바로 제가이 언어를 선택한 이유입니다. Haskell은 다른 어떤 것보다 더 강력하게 입력되므로 정적으로 입력 된 언어를 잘 대표합니다. LISP는 다른 모든 것이 반드시 모방하지만 절대 복제하지 않는 전형적인 동적 언어입니다.
Apocalisp

70

컴파일러가하는 일을 대체하기 위해 단위 테스트에서 10 배의 코드 커버리지를 작성해야한다는 것을 잊지 마십시오.

나는 거기에 있었고, 동적 언어로 그렇게했고, 전혀 이점이 없다고 생각합니다.


4
내가 유일한 사람이 아니 어서 다행입니다. 밤에 더 잘 수 있습니다.
erikkallen

이것은 실제로 동적 타이핑에 비해 정적의 큰 장점입니다. 컴파일러가 더 많은 버그를 찾을 수 있도록 C ++에서 typesafe typedef를 몇 번이나 놓쳤는 지 알 수 없습니다. (이동 컴파일러는, 가서 좀 더 많은 버그를 가져옵니다 :-)!
디미트리 C.에게

무의미한 말. 메서드를 테스트하고 메서드를 호출하는 메서드를 테스트하는 경우 매개 변수 전달이 괜찮다는 것을 알 수 있습니다. 정의에 따라 잘 테스트 된 코드는 정적 타이핑의 추가적인 이점을 얻지 못합니다.
Garth Kidd

4
@Garth : 이상한 정의. 많은 사람들이 동의하지 않을 것입니다. OTOH, 대부분의 사람들은 컴파일러의 유형 검사기가 많은 (때로는 매우 복잡한) 테스트를 구현한다는 데 동의합니다.
Konrad Rudolph

3
@yar, 코드를 테스트하지 않으면 논리 버그에 취약합니다. 저는 10 년 동안 파이썬에서 일했습니다. 프로덕션에서 TypeError가 발생한 적이 없다고 생각합니다. 그래도 논리 버그가 많았습니다. 결론 : 정적 유형 검사는 많이 필요하지 않지만 확실히 단위 테스트가 필요합니다.
Garth Kidd

40

다른 사람들의 반응을 읽을 때 동적 언어에 대한 세 가지 주장이 다소있는 것 같습니다.

1) 코드가 덜 장황합니다. 나는 이것이 유효하지 않다고 생각합니다. 일부 동적 언어는 일부 정적 언어보다 덜 장황합니다. 그러나 F #은 정적으로 입력되지만 정적 입력은 코드를 많이 추가하지 않습니다. 하지만 암시 적으로 형식화되어 있지만 이는 다릅니다.

2) "내가 가장 좋아하는 동적 언어 X에는 내가 가장 좋아하는 기능적 기능 Y가 있으므로 동적이 더 좋습니다." 기능과 동적을 혼동하지 마십시오 (왜 이것이 말해야하는지 이해할 수 없습니다).

3) 동적 언어에서는 결과를 즉시 볼 수 있습니다. 뉴스 : Visual Studio (2005 년부터)에서도 C #으로 그렇게 할 수 있습니다. 중단 점을 설정하고 디버거에서 프로그램을 실행하고 디버깅하는 동안 프로그램을 수정하면됩니다. 나는 항상 이것을하고 완벽하게 작동합니다.

저 자신은 정적 타이핑을 강력하게 옹호합니다. 한 가지 주된 이유는 유지 관리입니다. 나는 거기에 자바 스크립트의 몇 10K 라인 시스템을 가지고 있고, 어떤 I는 (존재하지 않는) 컴파일러가 변수가 엉망 이름 바꾸기가 무엇인지 말하지 때문에 반나절처럼 걸릴 싶지 리팩토링. 그리고 그것은 내가 직접 작성한 코드이며 IMO도 잘 구성되어 있습니다. 나는 다른 사람이 작성한 동등한 동적 시스템을 담당하는 작업을 원하지 않을 것입니다.

나는 이것에 대해 엄청나게 비추천받을 것 같지만 기회를 잡을 것입니다.


인용문 : 동적 언어로 결과를 즉시 볼 수 있습니다. 뉴스 : Visual Studio (2005 년부터)에서도 C #으로 그렇게 할 수 있습니다. 중단 점을 설정하고 디버거에서 프로그램을 실행하고 디버깅하는 동안 프로그램을 수정하면됩니다. 나는 항상 이것을하고 완벽하게 작동합니다. 이것은 첫날 (1995 년?)부터 델파이에 있었고 아마도 그 이전에는 터보 파스칼에 있었을 것입니다 (정확히 기억하지 못합니다).
No'am Newman

6
10,000 줄의 자바 스크립트? 약 9,000 줄이 너무 많고 스크립팅 언어를 좋아합니다
오즈.

@ No'am : 알아요. Visual C ++ 6에서도 할 수 있습니다 (실제로 VS2k5가 나올 때까지 C #으로 전환하지 않는 것이 주된 요점이었습니다). 어쨌든 이것은 요점을 추가합니다. @Oz : 내 JS가해야 할 일이 얼마나되는지 어떻게 알 수 있습니까?
erikkallen

변경 사항을 보는 것을 좋아하는 사람들은 VS가 아닌 일반 텍스트 편집기를 사용하는 것처럼 즉시 적용됩니다. 각자 자신에게. JSLint와 같은 것을 사용하는 것을 고려할 수 있습니다.
dlamblin

2
리팩토링에 좋은 점입니다. 저는 빠른 프로토 타이핑과 작은 스크립트를 위해 Ruby를 정말로 즐기기 시작했지만, 정적 타이핑 없이는 여러 개발자에게 큰 제품을 유지하려고하지 않습니다.
LoveMeSomeCode

19

VBScript는 다른 버전의 VB와 비교하지 않는 한 짜증납니다. PHP는 너무 자란 템플릿 언어라는 점을 기억하는 한 괜찮습니다. 현대 자바 스크립트는 훌륭합니다. 정말. 엄청난 재미. "DHTML"태그가 붙은 스크립트를 멀리하십시오.

런타임 오류를 허용하지 않는 언어를 사용한 적이 없습니다. IMHO, 그것은 대체로 붉은 청어입니다. 컴파일러는 모든 오타를 포착하지 않으며 의도를 검증하지도 않습니다. 명시 적 유형은 명시 적 유형이 필요할 때 유용하지만 대부분 그렇지 않습니다. 여기서 질문을 검색 generics하거나 서명되지 않은 유형을 사용하는 것이 인덱스 변수에 적합한 선택인지 여부 에 대한 질문을 검색합니다. 대부분의 경우이 항목은 방해가되며 시간이있을 때 사람들이 손을 움직일 수있게합니다. .

그러나 나는 당신의 질문에 정말로 대답하지 않았습니다. 동적 언어가 매력적인 이유는 무엇입니까? 잠시 후 코드 작성이 지루해지고 알고리즘을 구현하고 싶기 때문입니다. 당신은 이미 모든 것을 펜으로 작업하고 잠재적 인 문제 시나리오를 도표화하고 해결할 수 있음을 증명했으며 남은 것은 20 줄의 구현을 코딩하는 것뿐입니다 ... 그리고 컴파일 할 수 있도록 200 줄의 상용구를 작성하는 것입니다. . 그럼 당신은 당신이 작업하는 타입 시스템은 당신이 실제로 무슨 일을하는지 반영하지 않는다는 것을 깨닫게하지만, 다른 사람이 당신이 무엇을 매우 추상적 인 생각이 일을 할, 당신은 오래 전에 그렇게 knicknack의 미세 조정의 삶을 위해 프로그램을 포기했습니다 가상의 탐정 애드리안 몽크조차도 부끄럽게 만들 것이라는 강박 적입니다.

당신의 그 반죽 가서 시작 동적 언어에 심각하게보고있다.


흥미로운 것들 ... 루비가 저를 설득하는지 볼게요. PHP는 그렇지 않지만 OO 물건이기 때문에 많은 부분이 나중에 생각됩니다.
Dan Rosenstark

3
"20 줄의 구현 ... 그리고 컴파일을위한 200 줄의 상용구": 나는이 진술에 동의하지 않는다. 물론 자바 시대에는 사실 이었지만 C # 3과 Scala는 필요한 상용구의 양을 크게 줄였습니다.
cdmckay

5
자바 시대는 끝났습니까? 맥주를 깨고 축하 할 준비를 해요 오 ... 잠깐 ... C ++.
Shog9

2
"VBScript는 다른 버전의 VB와 비교하지 않는 한 짜증납니다."응? VBScript가 Visual Basic 의 가장 좋은 변형 이라고 말하는 건가요 ? 당신을 오해 했나봐요
MusiGenesis

19

저는 정적으로 형식화 된 C #의 고통에 완전히 푹 빠진 풀 타임 .Net 프로그래머입니다. 그러나 저는 현대 JavaScript를 좋아합니다.

일반적으로 동적 언어를 사용하면 정적으로 입력 된 언어보다 의도를 더 간결하게 표현할 수 있다고 생각합니다 . 많은 경우에 표현하려는 구성 요소가 무엇인지 정의하는 데 시간과 공간을 덜 소비하기 때문입니다.

여러 종류의 동적 언어도 있다고 생각합니다. VBScript에서 고전적인 ASP 페이지를 작성하는 것으로 돌아가고 싶지 않습니다. 유용하게 사용하려면 동적 언어가 핵심에서 일종의 수집, 목록 또는 연관 구성을 지원해야 객체 (또는 객체에 전달되는 내용)를 표현하고 더 복잡한 구성을 만들 수 있습니다. (어쩌면 우리는 모두 LISP로 코딩해야 할 것입니다 ... 농담입니다 ...)

.Net 서클에서 동적 언어는 VBScript 및 / 또는 JavaScript와 관련되어 있기 때문에 나쁜 평가를받습니다. VBScript는 Kibbee가 언급 한 여러 이유 때문에 악몽으로 회상 될뿐입니다. 누구나 CLng를 사용하여 VBScript에서 유형을 적용하여 32 비트 정수에 대해 충분한 비트를 얻었음을 기억합니다. 또한 JavaScript는 여전히 모든 브라우저에 대해 다른 방식으로 작성된 드롭 다운 메뉴의 브라우저 언어로 간주됩니다. 이 경우 문제는 언어가 아니라 다양한 브라우저 개체 모델입니다. 흥미로운 점은 C #이 성숙할수록 더 역동적으로 보이기 시작한다는 것입니다. 저는 Lambda 표현식, 익명 객체 및 유형 추론을 좋아합니다. 매일 JavaScript처럼 느껴집니다.


1
나는 누군가가 파일 처리, 소켓을 추가 할, 그리고 자바 스크립트에 대한 GUI 라이브러리는 다음 ....... 바탕 화면에 ... JS를 컴파일러를 구축
UnkwnTech


또한 항상 jscript를 사용하여 Windows GUI 앱을 작성할 수있었습니다. 어쨌든 아주 오랫동안. 자세한 내용은 "windows hta"를 참조하십시오. 브라우저에서 얻을 수없는 hta에서 실행되는 추가 API를 얻을 수 있습니다. 대시 보드 위젯은 많은 힘을 얻습니다. 아이폰의 웹앱은 대부분의 사람들이 인정하는 것보다 훨씬 더 강력합니다. Apple은 모바일 사파리에서 JS를 검색 할 수있는 강력한 API를 많이 만들었습니다.
Breton


여기에서 의도에 +1. 언젠가는 코드가 정적 언어로 번역 될 수 있지만 역학 (특히 Python)은 일회성 및 프로토 타입에 적합합니다.
new123456 2011 년

18

다음은 Haskell의 두 줄 (haskell.org에서)에있는 정적으로 형식화 된 QuickSort입니다.

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

다음은 동적으로 입력 된 LISP의 QuickSort입니다 (swisspig.net에서 제공).

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

나는 당신이 여기에서 선택한 언어로 일을 편향시키고 있다고 생각합니다. Lisp는 악명 높게 괄호가 무겁습니다. Haskell과 더 가까운 것은 Python입니다.

if len(L) <= 1: return L
return qsort([lt for lt in L[1:] if lt < L[0]]) + [L[0]] + qsort([ge for ge in L[1:] if ge >= L[0]])

여기 에서 파이썬 코드


25
그것은 반박이 아니라지지하는 주장입니다. 언어의 유형 시스템 (또는 그것의 부족)은 그것이 장황 할 것인지 간결 할 것인지에 대해 우리에게 거의 알려주지 않는다는 것을 보여줍니다.
Apocalisp

2
나는 Apocalisp에 동의하며, 자세한 내용은 동적 또는 정적 언어에 의존하지 않습니다. 정적 / 동적 타이핑은 언어의 장황함에 거의 영향을 미치지 않는다고 말할 수도 있습니다. 네, 이것은 레토르트를 파괴하는 정적 타이핑 캠프가 아닙니다.
BefittingTheorem

또는 펄! 정렬 (@array);
James Anderson

Apocalisp의 전체 비교는 헛소리였습니다. 첫째, quicksort (Tony Hoare의 원본 논문에 정의 됨)는 최소한의 추가 공간을 사용하도록 특별히 설계된 인플레 이스 알고리즘이지만 Apocalisp는 점근 적으로 더 많은 메모리를 낭비하고 수백 번 실행되는 Haskell 커뮤니티의 엉터리 버전을 사용했습니다. 실제 퀵소트보다 느립니다. Haskell은 돌연변이 (!)에 의존하기 때문에 실제 퀵 정렬 알고리즘을 표현하는 데 어려움을 겪습니다. Haskell 시도를 확인하고 Haskell의 간결성에 대해 저에게 다시 연락하십시오 : haskell.org/haskellwiki/Introduction/Direct_Translation
JD

둘째, 언어 중 하나에 대해 특별히 타락한 알고리즘의 두 가지 구현을 기반으로 장황함에 대해 강력한 진술을 할 수 없습니다. APL, J, K, Mathematica 또는 기타 간결한 (= 현대적인) 동적 형식 언어를 살펴보십시오. 정적으로 입력 된 언어보다 더 간결해야합니다. 유형 추론은 간격을 줄이지 만 여전히 간격이 있어야합니다.
JD

15

나에게 동적 언어의 장점은 Ruby의 블록 및 Python의 목록 이해와 같은 코드 및 기능적 기술 이 적기 때문에 코드가 얼마나 더 읽기 쉬워진다는 것 입니다.

그러나 나는 컴파일 시간 검사 (오타 발생)와 IDE 자동 완성을 놓칩니다. 전반적으로 적은 양의 코드와 가독성이 저에게 갚았습니다.

또 다른 장점은 일반적으로 해석되거나 컴파일되지 않은 언어의 특성입니다. 일부 코드를 변경하고 즉시 결과를 확인하십시오. 개발하는 동안 정말 시간을 절약 할 수 있습니다.

마지막으로, 콘솔을 실행 하고 이전에 사용한 적이없는 클래스 나 메서드와 같이 확실하지 않은 것을 시도해보고 어떻게 작동하는지 확인할 수 있다는 사실이 마음에 듭니다. 콘솔에는 많은 용도가 있으며 알아낼 수 있도록 남겨 두겠습니다.


내가 아는 적어도 하나의 Python IDE (즉, 일반적인 Python 인터프리터 빌드와 함께 제공되는 IDLE)에는 실제로 자동 완성 기능이 있지만 선언 된 변수는 인터프리터 창에만 있습니다.
JAB

읽을 수 있습니까? Quicksort 예제를 보셨습니까? 나는 거기에 무슨 일이 일어나고 있는지 전혀 모른다. u는 얼마나 빨리 무언가를 쓸 수 있는지 보여주기 위해 잘못 쓰여졌지만 읽을 수는 없다고 주장 할 수 있습니다.
IAdapter

1
@ 01 : 언어의 공통 구조를 사용합니다. 언어의 기본을 아는 경우 상당히 읽기 쉽습니다.
Esteban Küber

1
가독성은 동적 타이핑과 관련이 없습니다. 예를 들어 Scala의 람다는 일반적으로 Ruby의 블록보다 짧고 (아마도 더 표현력이 풍부합니다) Haskell과 Python의 목록 완성도를 비교하는 것과 같습니다. REPL 콘솔은 예를 들어 F #, Scala, Haskell 용으로 존재합니다. 변경된 코드를 실행중인 애플리케이션에 빠르게로드하는 것은 동적 언어의 장점입니다. 정적 언어를 허용하는 몇 가지 기술이 있지만 (예 : JavaRebel).
Alexey

1
흥미롭게도 나는 코드가 덜 읽기 쉽다는 것을 알았다. 첫 번째는 IDE를 사용하여 선언과 포함 된 문서 등을 찾기 위해 압축 할 수 없기 때문이며 두 번째는 구문이 매우 간결하기 때문에 대체로 그 의미를 잊어 버립니다! 또한 IDE 자동 완성 손실에 대해 훨씬 더 큰 가중치를 두었습니다. 그것은 신의 선물 일뿐만 아니라 유지 보수성을 절대적으로 높여 준다고 생각합니다.
spronkey

12

동적 언어에 대한 귀하의 주장은 완벽하게 유효합니다. 그러나 다음 사항을 고려하십시오.

  1. 동적 언어는 컴파일 할 필요가 없습니다 . 실행하기 만하면됩니다. 대부분의 경우 애플리케이션을 다시 시작하지 않고 런타임에 파일을 다시로드 할 수도 있습니다.
  2. 동적 언어는 일반적으로 덜 장황하고 읽기 쉽습니다 . 정적 언어로 구현 된 주어진 알고리즘이나 프로그램을 살펴본 다음 Ruby 또는 Python에 해당하는 것과 비교 한 적이 있습니까? 일반적으로 코드 줄이 3 배 감소하는 것을보고 있습니다. 동적 언어에서는 많은 스캐 폴딩 코드가 필요하지 않습니다. 즉, 최종 결과가 더 읽기 쉽고 실제 문제에 더 집중됩니다.
  3. 타이핑 문제에 대해 걱정하지 마십시오 . 동적 언어로 프로그래밍 할 때 일반적인 접근 방식은 타이핑에 대해 걱정할 필요가 없습니다. 대부분의 경우 올바른 종류의 인수가 메서드에 전달됩니다. 그리고 가끔 누군가는 그냥 작동하는 다른 종류의 논쟁을 사용하기도합니다. 일이 잘못되면 프로그램이 중지 될 수 있지만 몇 가지 테스트를 수행 한 경우에는 거의 발생하지 않습니다.

저도 처음에는 안전한 정적 타이핑 세계에서 벗어나는 것이 약간 무섭다는 것을 알았습니다.하지만 저에게는 장점이 단점보다 훨씬 큽니다.


23
1 .. 완전 쓰레기. 컴파일이 보이지 않는다고해서 그것이 일어나지 않는다는 의미는 아닙니다. 달리는 동안 발생합니다. 2 .. 완전 쓰레기. 잘 구조화되고 주석이 달린 코드는 모든 언어에서 쉽게 준비 할 수 있습니다. 3 대부분의 시간! 대부분의 시간을 편안하게 느끼십니까? 드물게 HA!
baash05

7
@wvdschel : 귀하의 논리에 따라 C # 및 Java와 같은 컴파일 된 언어는 컴파일 할 필요가 없다고 주장 할 수 있습니다. IDE에서 "Play"버튼을 클릭하기 만하면 실행되기 때문입니다. IDE가 나를 위해 컴파일하고 있다는 것을 알지 못하기 때문에 "중요하지 않습니다".
cdmckay

2
@cdmckay : 그리고 실행중인 C # / Java 프로그램에 연결하고 이에 대해 명령을 실행하여 실행 중에 수정하거나 쿼리 할 수 ​​있습니다. 해석 된 (많은 동적 언어가있는) 언어는 컴파일 된 언어가 할 수없는 런타임 내부 검사를 허용합니다.
RHSeeger

4
@RHSeeger-음, 예, Visual Studio로 모든 작업을 수행 할 수 있습니다. 편집 및 계속은 동적 언어로 제한되지 않습니다.
Greg Beech

4
@ baash05, 나는 당신 이이 대답의 요점을 완전히 놓쳤다 고 생각합니다 .1은 컴파일러가 모든 작은 변화의 효과를 볼 때까지 기다릴 필요가 없다는 것을 의미합니다. 2. 날씨 당신이 그것의 효과에 동의하든 그렇지 않든이 사실을 논박하지 않고 쓸 코드가 줄어들 것입니다.
Fire Crow

8

나는 동적 유형 언어에 대한 "새로운 발견 된 사랑"이 특정 동적 언어의 인기 증가보다 정적으로 유형화 된 언어가 더 나은지 최악인지와 관련이 없다고 생각합니다 . Ruby on Rails는 분명히 동적 언어의 부활을 야기하는 큰 현상이었습니다. 레일을 매우 인기있게 만들고 정적 캠프에서 많은 변환을 생성 한 것은 주로 매우 간결하고 DRY 코드 및 구성이었습니다. 많은 XML 구성이 필요한 Java 웹 프레임 워크와 비교할 때 특히 그렇습니다. 많은 자바 프로그래머 (스마트 한 프로그래머)가 전환했으며 일부는 루비와 기타 동적 언어를 전파했습니다. 저에게는 세 가지 고유 한 기능을 통해 Ruby 또는 Python과 같은 동적 언어가 더 간결해질 수 있습니다.

  1. 미니멀리즘 구문-큰 문제는 유형 주석이 필요하지 않지만 언어 설계자가 처음부터 간결하게 언어를 설계했다는 것입니다.
  2. 인라인 함수 구문 (또는 람다)-인라인 함수를 작성하고 변수로 전달하는 기능은 여러 종류의 코드를 더 간단하게 만듭니다. 특히 이것은 목록 / 배열 작업에 해당됩니다. 이 아이디어의 뿌리는 분명히 LISP였습니다.
  3. 메타 프로그래밍-메타 프로그래밍은 레일을 틱하게 만드는 중요한 부분입니다. 라이브러리의 클라이언트 코드를 훨씬 더 간결하게 만들 수있는 새로운 코드 리팩토링 방법이 생겼습니다. 이것은 또한 LISP에서 비롯됩니다.

이 세 가지 기능 모두 동적 언어에만 국한되지는 않지만 오늘날 널리 사용되는 정적 언어 인 Java 및 C #에는 확실히 존재하지 않습니다. C #이 델리게이트에서 # 2를 가지고 있다고 주장 할 수 있지만, 목록 작업과 같이 널리 사용되지는 않는다고 주장합니다.

고급 정적 언어에 관해서는 ... Haskell은 멋진 언어입니다. # 1과 # 2가 있습니다. 그리고 # 3은 없지만 유형 시스템이 너무 유연해서 메타의 부족함을 찾지 못할 것입니다. 제한적입니다. 컴파일 타임에 언어 확장을 사용하여 OCaml에서 메타 프로그래밍을 할 수 있다고 믿습니다. Scala는 매우 최근에 추가되었으며 매우 유망합니다. .NET 캠프를위한 F #. 그러나 이러한 언어의 사용자는 소수이므로 프로그래밍 언어 환경의 이러한 변화에 실제로 기여하지 않았습니다. 사실 Ruby의 인기가 다른 동적 언어 외에도 Haskell, OCaml, Scala 및 F #과 같은 언어의 인기에 긍정적 인 영향을 미쳤다고 생각합니다.


5
-1 : 단서가 없습니다. OCaml을 포함한 ML 계열 언어는 특히 메타 프로그래밍을 위해 만들어졌습니다. 이것이 ML이 Meta Language를 의미하는 이유입니다. ML 프로그래머는 프로그래밍 언어 환경을 계속해서 혁신하고 있습니다. .NET 및 Java의 제네릭은 ML에서 나왔습니다. Microsoft의 새로운 Visual F # 2010은 직접적인 ML 하위 항목이며 # 1, # 2 및 # 3을 충족합니다.
JD

7

개인적으로 저는 여러분이 사용한 "동적"언어의 대부분이 일반적으로 언어의 형편없는 예라고 생각합니다.

나는 방법 C 또는 Java보다 파이썬에서 생산성, 그리고 당신이 편집 - 컴파일 - 링크 - 실행 춤을 할 필요가 있기 때문이다. Objective-C에서 생산성이 높아지고 있지만 아마도 프레임 워크 때문일 것입니다.

말할 필요도없이, 저는 PHP보다 이러한 언어에서 더 생산적입니다. 지옥, PHP보다는 Scheme 또는 Prolog로 코딩하는 것이 좋습니다. (하지만 최근에 나는 다른 어떤 것보다 프롤로그를 더 많이하고 있으니, 그것을 소금과 함께 가져 가세요!)


6

동적 언어에 대한 저의 감사는 그 기능 이 얼마나 기능적인가 와 매우 관련 이 있습니다. Python의 목록 이해, Ruby의 클로저, JavaScript의 프로토 타입 객체는 모두 이러한 언어의 매우 매력적인 측면입니다. 모두는 또한 일류 기능을 갖추고 있습니다. 다시는없이 사는 것을 볼 수 없습니다.

PHP와 VB (스크립트)를 같은 방식으로 분류하지 않습니다. 나에게 그것들은 당신이 제안하는 모든 동적 타이핑 결점을 가진 대부분 명령형 언어입니다.

물론 컴파일 시간이 없기 때문에 동일한 수준의 컴파일 시간 검사를 얻지는 못하지만 정적 구문 검사 도구가 시간이 지남에 따라 적어도 부분적으로는 그 문제를 해결하기 위해 발전 할 것으로 예상합니다.


나는 그가 JavaScript 프로토 타입 객체를 좋아한다고 제안하는 사람조차 들어 본 적이 없다.
erikkallen

6

동적 언어에 대해 지적 된 장점 중 하나는 코드를 변경하고 계속 실행할 수 있다는 것입니다. 다시 컴파일 할 필요가 없습니다. VS.Net 2008에서 디버깅 할 때 실제로 코드를 변경하고 다시 컴파일하지 않고도 계속 실행할 수 있습니다. 컴파일러와 IDE의 발전으로 동적 언어 사용의 이점과 기타 이점이 사라질 수 있습니다.


실행중인 시스템에서 코드를 변경할 수있는 동적 형식 언어에는 고유 한 것이 없다는 것이 맞습니다. 해석 된 언어 (동적과 혼동하지 말 것)를 사용하면 훨씬 쉽지만 컴파일 된 코드로도 수행 할 수 있습니다. 예를 들어, Oracle의 PL / SQL은 정적으로 형식화 된 컴파일 언어이며 Oracle은 실행중인 시스템에서 PL / SQL 프로 시저를 수정할 수있는 기능을 수십 년 동안 가지고 있습니다.
Apocalisp

Mono에 C # repl이 있습니다. mono-project.com/CsharpRepl
Steve Gilham

동적 언어는 디버거 외부애플리케이션 내 에서 이러한 작업을 수행 할 수 있습니다 . 또한 단위 테스트시 클래스에 원숭이 패치를 적용 할 수있는 가능성은 시간을 절약 해줍니다.
Esteban Küber

6

아, 비슷한 질문을 올렸을 때이 주제를 보지 못했어요

여기에 언급 된 동적 언어에 대해 언급 한 나머지 사람들은 좋은 기능을 제외하고는 모두가 가장 기본적인 것, 즉 메타 프로그래밍을 잊어 버린다고 생각합니다.

프로그램 프로그래밍.

일반적으로 예를 들어 .Net을 사용하면 컴파일 된 언어로 수행하기가 매우 어렵습니다. 작동하려면 모든 종류의 맘보 점보를 만들어야하며 일반적으로 약 100 배 느리게 실행되는 코드로 끝납니다.

대부분의 동적 언어에는 메타 프로그래밍을 수행하는 방법이 있습니다. 이것이 저를 계속 유지시켜줍니다. 메모리에 모든 종류의 코드를 생성하고이를 제 응용 프로그램에 완벽하게 통합 할 수있는 능력입니다.

예를 들어 Lua에서 계산기를 만들려면 다음과 같이하면됩니다.

print( loadstring( "return " .. io.read() )() )

이제 .Net에서 해보십시오.


6
계산기를 자주 만드십니까? 값이 전혀없는 "20 자 이내로 hello world 응용 프로그램을 만들 수 있습니다."유형의 인수를 찾습니다.
erikkallen

당신은 당신이 얼마나 극도로 낮은 상상력을 가지고 있는지 보여주었습니다. m8 프로그래밍에 나쁜 점. GL.
majkinetor

개인적으로 할 필요가 없습니다. 나는 그 요점이 타당하다고 생각한다. 'C #에서 콘솔에 한 줄을 인쇄하기 위해 작성해야하는 코드의 양을보세요. lua에서는 print ( "Hello, world")라고 말할 수있는 유형의 인수를 만드는 것은 매우 쉽고 일반적입니다. '. 그러나 실제 코드와 상용구의 비율은 프로젝트가 실제 크기로 커질 때 그대로 유지되지 않습니다.
erikkallen 2009

2
엉터리. 다음은 .NET에서 실행되는 정적으로 형식화 된 F #입니다. Linq.QuotationEvaluator.Evaluate <@ 2 + 3 @>
JD

6

동적 (쓰레드의 초점 인 것 같기 때문에 타이핑 된) 언어를 좋아하는 주된 이유는 내가 사용한 (작업 환경에서) 언어가 내가 사용한 비 동적 언어보다 훨씬 우수하기 때문입니다. C, C ++, Java 등 ... 모두 실제 작업을 수행하기에는 끔찍한 언어입니다. 동적으로 입력되는 많은 언어로 프로그래밍하기에 자연스러운 암시 적으로 입력 된 언어를보고 싶습니다.

즉, 동적으로 입력되는 언어에서 놀라운 특정 구조가 있습니다. 예를 들어, Tcl에서

 lindex $mylist end-2

원하는 색인을 나타 내기 위해 "end-2"를 전달한다는 사실은 독자에게 매우 간결하고 분명합니다. 나는 아직 그것을 수행하는 정적으로 입력 된 언어를 보지 못했습니다.


1
어떤면에서 $ mylist.length-2보다 낫습니까? 나에게 일종의 구문은 실제 이점이없는 추가 키워드 만 추가하는 것 같습니다. 즉, 언어를 배우기가 더 어렵습니다.
erikkallen

나는 약간 현명하고 언어 자체에 키워드를 추가하지 않고 해당 명령에 추가한다는 점을 지적 할 것입니다. 즉, 그것은 더 명확 해지는 문제입니다. "끝"이라는 용어는 거기에 도달하는 방법보다는 의도 / 의미를 표현합니다. "마지막 요소"라고되어 있습니다.
RHSeeger

1
내가 당신이 맞다는 것을 이해한다면, 그 경우는 더 나쁩니다. 각 명령에 대한 새로운 구문을 배워야합니다. foo 명령에서 사용될 때 키워드 bar는 무엇을 의미합니까?
erikkallen 2009

@erikkallen : 표준 라이브러리에 대한 다른 입력이 다른 언어에 대해 무엇인지 배우는 것과 같습니다. 사실, 핵심 Tcl의 모든 명령은 표준 라이브러리의 일부일뿐입니다. 이론적으로 제거 할 수없고 순수한 Tcl 코드로 다시 구현할 수없는 명령은 없습니다. 즉, 입력과 그 의미는 해당 라이브러리에서 상당히 일관 적입니다 (즉, end는 모든 명령에서 동일한 것을 의미합니다)
RHSeeger

5

나는 이런 종류의 주장이 약간 어리 석다고 생각합니다. "맞춤법이 틀린 변수 이름과 잘못된 유형의 값을 변수에 할당하는 것과 같이 컴파일러에 의해 일반적으로 잡혔을 것들은 런타임까지 발생하지 않습니다."그렇습니다. PHP 개발자 나는 런타임까지 잘못된 입력 변수와 같은 것을 보지 못하지만 런타임은 나에게 2 단계입니다 .C ++ (내가 경험 한 유일한 컴파일 언어)에서는 링크 및 컴파일 후 3 단계입니다.
내 코드가 컴파일 중입니다
말 그대로 몇 시간이 걸릴 수있는 컴파일 된 언어와는 달리, 코드를 실행할 준비가 될 때까지 저장을 누른 후 몇 초가 걸린다는 것은 말할 것도 없습니다. 이것이 약간 화나게 들리면 미안하지만, 코드를 컴파일 할 필요가 없기 때문에 사람들이 나를 2 급 프로그래머로 대하는 것에 지쳤습니다.


3
오, 실제로 ... 글쎄요, 아마도 제가 무능 할 수도 있지만, PHP에서는 맞춤법 오류로 인한 변수가 엄청난 시간 낭비입니다. 특히 엄격한 경고를 켤 수없는 거대한 코드 기반을 상속 할 때.
Dan Rosenstark

1
항상 엄격한 error_reporting ()을 켤 수 있으며 좋은 IDE는 변수 맞춤법 오류의 99 %를 방지합니다.
UnkwnTech

말할 것도없이 어떤 언어로든 철자가 틀릴 수 있지만, 내 인터프리터가 링크 / 컴파일에서 동일한 단계에 있기 때문에 이러한 실수를 찾는 것이 더 쉽습니다 (아마도 더 빠릅니다).
UnkwnTech

4
-1 : 컴파일하는 인수가 정적 또는 동적 타이핑에 관한 실제 인수에서주의를 분산시킵니다. 동적 및 정적 언어 모두 컴파일 및 해석이 가능합니다. 철자 및 컴파일 시간에 대한 불만은 이러한 문제를 벗어납니다.
BefittingTheorem

말 그대로 시간? 원래 IBM PC에서 무엇을 컴파일하고 있습니까?
xcramps

3

논쟁은 이것보다 더 복잡합니다 ( 흥미로운 개요를 위해 Yegge의 기사 "Is Weak Typing Strong Enough" 를 읽으십시오 ).

동적 언어에는 오류 검사가 반드시 필요한 것은 아닙니다. C #의 형식 유추가 한 예일 수 있습니다. 같은 방식으로 C와 C ++에는 끔찍한 컴파일 검사가 있으며 정적으로 형식화됩니다.

동적 언어의 주요 장점은 a) 기능 (항상 사용할 필요는 없음) 및 b) Boyd의 반복 법칙입니다 .

후자의 이유는 엄청납니다.


3
유형 추론은 동적 유형 지정과 동일하지 않습니다. 추론 된 유형은 컴파일 타임에 여전히 명확하게 알려야하기 때문입니다.
Marcus Downing

4
-1 : C #은 동적으로 입력되지 않고 정적으로 입력됩니다.
Juliet

2

아직 Ruby를 좋아하지는 않지만 동적 언어가 정말 훌륭하고 강력한 도구라고 생각합니다.

유형 검사 및 변수 선언이 없다는 생각은 실제로 큰 문제가 아닙니다. 물론 런타임까지 이러한 오류를 포착 할 수는 없지만 숙련 된 개발자에게는 이는 실제로 문제가되지 않으며 실수를했을 때 일반적으로 쉽게 고쳐집니다.

또한 초보자는 자신이 쓰고있는 내용을 더주의 깊게 읽어야합니다. PHP를 배우는 것은 내가 실제로 타이핑하는 것에 더주의를 기울이는 것을 배웠고, 컴파일 된 언어로도 프로그래밍을 향상 시켰습니다.

좋은 IDE는 변수가 "선언"되었는지 여부를 알 수 있도록 충분한 정보를 제공하며 변수가 무엇인지 알 수 있도록 몇 가지 유형 추론을 시도합니다.

동적 언어로 수행 할 수있는 작업의 힘은 실제로 작업하기에 매우 재미있게 만드는 것입니다. 물론 컴파일 된 언어로도 동일한 작업을 수행 할 수 있지만 더 많은 코드가 필요합니다. Python 및 PHP와 같은 언어를 사용하면 더 짧은 시간에 개발하고 대부분의 시간에 기능적인 코드베이스를 더 빠르게 얻을 수 있습니다.

그리고 기록을 위해 저는 풀 타임 .NET 개발자이고 컴파일 된 언어를 좋아합니다. 나는 자유 시간에만 동적 언어를 사용하여 그들에 대해 더 많이 배우고 개발자로서 더 나아졌습니다.


2
나는 "경험있는 개발자들에게 이것은 실제로 문제가되지 않는다"를 사용하는 어떤 주장도 일반적으로 약간 위험하다고 생각합니다. 에서처럼 C ++의 OOP / 메모리 관리 등은 숙련 된 개발자에게 문제가되지 않는다고 말할 수 있습니다. 변수 선언 및 기본 유형 검사와 같은 간단한 작업으로 왜 그렇게 신중하고 경험이 필요합니까? 정적 접근 방식을 사용하여 쉽게 방지 할 수있는 오류를 만들 수 있도록하는 것보다 언어가 프로그래밍에 도움이되기를 바랍니다. 그리고 저는 장황함이 동적 또는 정적 타이핑과 거의 관련이 없다고 생각합니다. Haskell 또는 Scala를 확인하십시오.
BefittingTheorem

동의합니다. 논쟁도 약간 위험합니다. 내 요점은 코딩시 유형 검사 문제가 그리 나쁘지 않다는 것입니다. 90 %의 경우 오류가 즉시 표시됩니다. 암시 적 형식 변환이 스트레스를 유발할 수있는 경우의 10 %에 대한 문제이지만 수행중인 작업을 알고 있으면 그렇게되지 않습니다. JavaScipt는 위험 할 수있는 10 %의 좋은 예입니다.하지만 저는 그것을 위해 개발하는 내내 그것에 물린 적이 없습니다.
Dan Herbert

@Brian Heylin : 그럼 당신은 싫어해야합니다 C! 발에 자신을 쏘는 많은 방법이 있지만 너무 많이 사용되고 (어떤 경우에는) 사랑받습니다.
Esteban Küber

2

우리가 이루고자하는 것과 해결하려는 것에 따라 다른 유형의 언어가 필요하다고 생각합니다. 인터넷을 통해 데이터베이스에서 레코드를 생성, 검색, 업데이트 및 삭제하는 응용 프로그램을 원한다면 정적으로 형식화 된 언어로 처음부터 작성하는 것보다 한 줄의 ROR 코드 (스캐 폴드 사용)를 사용하는 것이 좋습니다. 동적 언어를 사용하면 마음이

  • 어떤 변수에 어떤 유형이 있는지
  • 필요에 따라 동적으로 문자열을 늘리는 방법
  • 하나의 변수 유형을 변경하면 그와 상호 작용하는 모든 함수를 다시 작성할 필요가 없도록 코드를 작성하는 방법

비즈니스 요구에 더 가까운 문제에

  • 데이터가 데이터베이스에 저장 / 업데이트되고 있습니다. 내 사이트로 트래픽을 유도하는 데 어떻게 사용합니까?

어쨌든, 느슨하게 입력 된 언어의 한 가지 장점은 그것이 예상대로 작동한다면 그것이 어떤 유형인지에 대해 정말로 신경 쓰지 않는다는 것입니다. 이것이 우리가 동적으로 타이핑 된 언어로 덕 타이핑을하는 이유입니다. 그것은 훌륭한 기능이며 필요한 경우 동일한 변수 이름을 사용하여 다른 유형의 데이터를 저장할 수 있습니다. 또한 정적으로 형식화 된 언어는 기계처럼 생각하게하는 반면 (컴파일러가 코드와 어떻게 상호 작용하는지 등) 동적으로 형식화 된 언어, 특히 ruby ​​/ ror는 기계가 사람처럼 생각하도록합니다.

이것들은 동적 언어에 대한 내 직업과 경험을 정당화하기 위해 사용하는 몇 가지 주장입니다!


1
귀하의 요점 1과 3은 동일하며 IMO는 정적 타이핑을 선호하는 이유입니다. 유형을 호환되지 않는 것으로 변경하면 어떻게됩니까? 변수를 int에서 문자열로 변경하면 아마도 이유가있을 것입니다. 그렇지 않은 경우 모든 빌드 오류가 사라질 때까지 프로젝트를 다시 빌드하십시오. 일반적으로 그렇게 오래 걸리지 않으며 때로는 그 과정에서 컴파일러가 지적한 것에 만족하는 실제 문제를 발견합니다. 포인트 2는 캐릭터를 성장하는 것은 C. 제외한 모든 언어 (나는 지난 15 년 발견 한 모든 적어도 내가 추측)에 자동으로 무효 수행한다
erikkallen

나는 응용 프로그램에 따라 다른 언어보다 두 가지 유형의 언어를 선호 할 이유가있을 수 있으며 더 빠른 정적 언어가 더 나은 성능을 제공 할 수 있다는 데 동의합니다. 하지만 다른 모든 웹 애플리케이션을 만들어야한다면 정적 언어보다 동적 언어를 사용하여 더 빠르게 기능을 제공하는 것이 더 나을 수 있다고 말하고 있습니다. 또한 x.func = "yes"및 x.func _ = "no"와 같은 방식으로 변수 x를 사용해야한다고 가정합니다. 어떤 유형인지 상관 없어요. 오리처럼 헤엄 치는 한 오리입니다. 이것이 동적 타이핑을 덕 타이핑이라고도 부르는 이유입니다. 0 개 남았습니다!
umar

1

두 스타일 모두 장점이 있다고 생각합니다. 제 생각에는 이런 생각이 우리 커뮤니티에 심각한 타격을줍니다. 나는 위에서 아래로 정적으로 입력 된 아키텍처에서 작업 해 왔으며 괜찮 았습니다. 내가 가장 좋아하는 아키텍처는 UI 수준에서 동적으로 입력하고 기능 수준에서 정적으로 입력하는 것입니다. 이것은 또한 UI와 기능의 분리를 강제하는 언어 장벽을 장려합니다.

냉소적이기 위해서는 단순히 동적 언어를 통해 개발자가 더 게으르고 컴퓨팅의 기본에 대해 덜 알면서도 일을 처리 할 수 ​​있습니다. 이것이 좋은 것인지 나쁜 것인지는 독자에게 달려 있습니다. :)


1

FWIW, 대부분의 응용 프로그램에서 컴파일하는 데 몇 시간이 걸리지 않습니다. 컴파일하는 데 몇 분이 걸리는 200-500k 라인 사이의 응용 프로그램으로 작업했습니다. 확실히 몇 시간이 아닙니다.

나는 컴파일 된 언어를 선호합니다. 디버깅 도구 (내 경험상 모든 것이 사실이 아닐 수도 있음)가 더 좋고 IDE 도구가 더 나은 것 같습니다.

내 Visual Studio를 실행중인 프로세스에 연결할 수있는 것을 좋아합니다. 다른 IDE에서 그렇게 할 수 있습니까? 그럴 수도 있겠지만 나는 그들에 대해 모른다. 나는 최근에 PHP 개발 작업을 해왔으며 솔직히 그렇게 나쁘지는 않습니다. 그러나 저는 C #과 VS IDE를 훨씬 선호합니다. 더 빨리 작업하고 문제를 더 빨리 디버깅하는 것 같습니다.

그렇다면 동적 / 정적 언어 문제보다 도구 세트에 더 가깝습니까?

마지막 코멘트 ... 로컬 서버로 개발하는 경우 저장하는 것이 컴파일보다 빠르지 만 종종 로컬 컴퓨터의 모든 항목에 액세스 할 수 없습니다. 데이터베이스와 파일 공유는 다른 곳에 있습니다. 웹 서버에 FTP를 연결 한 다음 내 PHP 코드를 실행하여 오류를 찾고 수정하고 다시 ftp하는 것이 더 쉽습니다.


1
컴파일 시간은 실제로 사용되는 언어에 달려 있다고 말할 수 있습니다. .Net에서는 해당 크기의 프로젝트를 컴파일하는 데 몇 분 밖에 걸리지 않습니다. C가 완료되면 모든 것을 컴파일하는 데 시간이 걸리는 것을 볼 수 있습니다.
Kibbee

좋아, 내가 줄게. 그러나 그것에 대해 생각할 때 C로 작성하려고 생각하는 프로젝트가 상당한 컴파일 시간으로 PHP로 작성하는 것이 가능할 것이라고 생각합니까? 통역 언어가 작업에 적합한 도구가 아니며 그 반대의 경우도 있다고 생각합니다. 저는 작업에 적합한 도구를 사용하고 가장 잘 작동하는 것을 사용하는 것을 열렬히 좋아합니다. 다른 언어가 더 쉽게 할 수있을 때 한 언어가 모든 작업을 수행하도록 할 이유가 없습니다. 알고있는 것을 다시 배울 이유가 없습니다.
bdwakefield

BTW, VS jcxsoftware.com/vs.php에 대한 php 플러그인이 있습니다. 아직 무료가 아니기 때문에 시도해 보지 않았지만 Zend (5.5 as 6 sucks)만큼 좋은 PHP를 사용했다고 들었습니다. VS의 장점
UnkwnTech 2009

아무도 동적 언어를 많이 사용하지 않는 가장 큰 이유 중 하나에 도달했습니다. 아무도 당신을 위해 거의 모든 것을 할 수있는 2m 줄의 코드 IDE를 만들지 않았습니다. 그래서 모든 사람들은 "타입이 안전하지 않아 실수하기가 너무 쉽습니다"에 대해 우는 소리를냅니다
RCIX

나는 유형 안전 넌센스에 신경 쓰지 않는다. 그다지 신경 쓰지 않습니다. 내 가장 큰 불만은 육체적으로 더 오래 걸리고 종종 문제를 추적하는 것이 훨씬 더 어렵다는 것입니다. 저에게는 개발 스타일이 제가 일하는 방식과 상반된다고 생각합니다.
bdwakefield

1

특정 상황에서의 생산성. 그러나 그것은 내가 알고 있거나 사용했던 다른 환경에 비해 내가 아는 하나의 환경에 불과합니다.

Seaside가 포함 된 Squeak / Pharo의 Smalltalk는 복잡한 애플리케이션의 경우 ASP.Net (/ MVC), RoR 또는 Wicket보다 훨씬 더 효과적이고 효율적인 웹 플랫폼입니다. 그 중 하나에 라이브러리가 있지만 스몰 토크가 아닌 것과 인터페이스해야 할 때까지.

철자가 틀린 변수 이름은 IDE에서 빨간색이고 IntelliSense는 작동하지만 구체적이지 않습니다. 웹 페이지의 런타임 오류는 문제가 아니라 기능입니다. 한 번의 클릭으로 디버거를 불러오고, 한 번의 클릭으로 내 IDE로 이동하고, 디버거에서 버그를 수정하고, 저장하고, 계속합니다. 간단한 버그의 경우이주기의 왕복 시간은 20 초 미만입니다.



1

상자의 유형을 선언해야하는 어리석은 생각이 들기 때문입니다. 유형은 컨테이너가 아니라 엔티티에 유지됩니다. 정적 타이핑은 상자의 유형이 메모리의 비트가 해석되는 방식에 직접적인 영향을 미칠 때 의미가있었습니다.

GoF의 디자인 패턴을 살펴보면 언어의 정적 인 특성에 맞서 싸울 좋은 부분이 있고 동적 언어에 존재할 이유가 없다는 것을 알게 될 것입니다.

또한 MyFancyObjectInterface f = new MyFancyObject ()와 같은 내용을 작성하는 데 지쳤습니다. 드라이 원칙 누구?


1

처음 시작할 언어를 선택하는 완전히 새로운 프로그래머의 자리에 앉으십시오. 그는 동적 대 staic 대 람다 대 이것 대 저것 등등에 관심이 없습니다. 어떤 언어를 선택 하시겠습니까?

씨#

using System;
class MyProgram
{
    public static void Main(string[] args)
    {
        foreach (string s in args)
        {
            Console.WriteLine(s);
        }
    }
}

루아 :

function printStuff(args)
    for key,value in pairs(args) do
       print value .. " "
    end
end
strings = {
    "hello",
    "world",
    "from lua"
}
printStuff(strings)

3
그것은 사실 논증이 아닙니다. 우리는 새로운 프로그래머가 아닙니다. 이 논쟁은 완전히 새로운 프로그래머가 아닌 사람들 사이에서 가장 치열합니다.
peSHIr 2010 년

프로그래머가 동적 언어를 선호하게 된 이유 중 하나 일뿐입니다. 그들은 일반적으로 다른 사람들보다 이해하기 쉬우므로 더 많은 새로운 프로그래머를 끌어들입니다.
RCIX

1

이 모든 것은 부분적으로 특정 목표에 적합한 것과 일반적인 개인적 선호도에 달려 있습니다. (예 : 합당한 회의를 함께 진행할 수있는 것보다 더 많은 사람들이 관리하는 거대한 코드베이스가 될까요? 타입 검사를 원합니다.)

개인적인 부분은 개발 및 테스트 속도를 위해 일부 검사 및 기타 단계를 교환하는 것입니다 (일부 CPU 성능을 포기할 가능성이 있음). 이것이 해방되고 성능이 향상되는 사람들이 있습니다. 그리고 이것이 상당히 반대 인 사람들이 있습니다. 그렇습니다. 그것은 당신의 언어의 특정 풍미에도 의존합니다. 여기에 아무도 자바가 빠르고 간결한 개발에 적합하다고 말하지 않거나 PHP가 오타를 찾기 어렵게 만드는 견고한 언어라고 말하지 않습니다.


1

나는 정적 언어와 동적 언어를 모두 좋아합니다. 2002 년부터 제가 참여한 모든 프로젝트는 Python 인터 프리트가 내장 된 C / C ++ 애플리케이션이었습니다. 이것은 나에게 두 세계의 장점을 제공합니다.

  1. 애플리케이션을 구성하는 구성 요소와 프레임 워크는 애플리케이션의 특정 릴리스에 대해 변경 불가능합니다. 또한 매우 안정적이어야하며 따라서 잘 테스트되어야합니다. 정적으로 형식화 된 언어는 이러한 부분을 작성하는 데 적합한 선택입니다.
  2. 구성 요소 연결, 구성 요소 DLL로드, 아트 워크, 대부분의 GUI 등은 프레임 워크 나 구성 요소 코드를 변경할 필요없이 크게 다를 수 있습니다 (예 : 클라이언트에 맞게 응용 프로그램을 사용자 지정). 동적 인 언어는이를 위해 완벽합니다.

시스템을 구축하기위한 정적으로 입력 된 언어와이를 구성하기위한 동적 입력 언어의 혼합이 유연성, 안정성 및 생산성을 제공한다는 것을 알게되었습니다.

"동적 언어에 대한 사랑은 무엇입니까?"라는 질문에 답하기 위해 저에게는 상상할 수있는 방식으로 런타임에 시스템을 완전히 다시 연결하는 기능이 있습니다. 스크립팅 언어가 "쇼를 실행하는 것"이라고 생각하므로 실행중인 응용 프로그램이 원하는 모든 작업을 수행 할 수 있습니다.


1

나는 일반적으로 동적 언어에 대한 경험이 많지 않지만 내가 아는 하나의 동적 언어 인 JavaScript (일명 ECMAScript)를 절대적으로 좋아합니다.

잠깐, 여기서 토론은 무엇입니까? 동적 컴파일? 아니면 동적 타이핑? JavaScript는 두 가지 기반을 모두 다루므로 두 가지 모두에 대해 이야기하겠습니다.

동적 컴파일 :

시작하려면 동적 언어 컴파일되고 나중에 컴파일이 연기됩니다. 그리고 Java와 .NET은 실제로 두 번 컴파일됩니다. 각각의 중간 언어에 한 번, 그리고 다시 동적으로 기계 코드에.

그러나 컴파일이 연기되면 결과를 더 빨리 볼 수 있습니다. 이것이 하나의 장점입니다. 나는 단순히 파일을 저장하고 내 프로그램이 작동하는 것을 매우 빠르게 보는 것을 즐깁니다.

또 다른 장점은 런타임에 코드 작성하고 컴파일 할 수 있다는 것 입니다. 이것이 정적으로 컴파일 된 코드에서 가능한지 모르겠습니다. JavaScript를 컴파일하는 것은 궁극적으로 기계 코드이고 정적으로 컴파일되기 때문에 그럴 것이라고 생각합니다. 그러나 동적 언어에서 이것은 하찮은 일입니다. 코드는 스스로 작성하고 실행할 수 있습니다. (그리고 .NET이이 작업을 수행 할 수 있다고 확신하지만 .NET이 컴파일하는 CIL은 어쨌든 즉석에서 동적으로 컴파일되며 C #에서는 그렇게 사소하지 않습니다.)

동적 타이핑 :

동적 타이핑이 정적 타이핑보다 더 표현력이 있다고 생각합니다. 동적 타이핑이 적은 것으로 더 많은 것을 말할 수 있다고 말하기 위해 비공식적으로 표현이라는 용어를 사용하고 있습니다. 다음은 몇 가지 JavaScript 코드입니다.

var Person = {};

지금 Person이 뭔지 아세요? 일반 사전입니다. 나는 이것을 할 수있다 :

Person [ "First_Name"] = "John";
Person [ "Last_Name"] = "스미스";

그러나 그것은 또한 객체입니다. 다음과 같은 "키"를 참조 할 수 있습니다.

Person.First_Name

그리고 필요하다고 생각되는 방법을 추가하십시오.

Person.changeFirstName = function (newName) {
  this.First_Name = newName;
};

물론 newName이 문자열이 아닌 경우 문제가있을 수 있습니다. 당장 잡히지는 않지만 직접 확인할 수 있습니다. 안전을 위해 표현력과 유연성을 거래하는 문제입니다. 나는 타입 등을 확인하기 위해 코드를 추가하는 것을 신경 쓰지 않으며, 나에게 많은 슬픔을주는 타입 버그에 아직 부딪히지 않았다. )). 그러나 나는 즉시 적응할 수있는 능력을 매우 좋아합니다.


1

같은 주제에 대한 멋진 블로그 게시물 : Python이 나를 긴장하게 만듭니다.

메서드 서명은 파이썬에서 사실상 쓸모가 없습니다. 자바에서 정적 타이핑은 메소드 서명을 레시피로 만듭니다.이 메소드가 작동하도록 만드는 데 필요한 모든 것입니다. 파이썬에서는 그렇지 않습니다. 여기에서 메서드 서명은 작동하는 데 필요한 인수의 수를 알려줍니다. 때로는 ** kwargs와 함께 시작하면 그렇게하지 않을 것입니다.


0

재미 있기 때문에 재미 재미 있습니다. 메모리 할당에 대해 걱정하지 않는 것이 재미 있습니다. 컴파일을 기다리지 않는 것이 즐겁습니다. 등 등 등


19
가비지 수집은 정적 / 동적 유형 검사와 직교합니다.
mmagin

0

약한 유형의 언어를 사용하면 데이터를 유연하게 관리 할 수 ​​있습니다.

지난 봄에 여러 클래스에 VHDL을 사용했는데 비트 / 바이트를 나타내는 방법과 6 비트 버스를 9 비트 버스에 할당하려고 할 때 컴파일러가 오류를 포착하는 방법이 마음에 듭니다. 나는 그것을 C ++로 다시 만들려고 노력했고, 타이핑이 기존 유형과 원활하게 작동하도록 깔끔하게 얻기 위해 상당히 고군분투하고 있습니다. Steve Yegge는 강력한 유형 시스템과 관련된 문제를 매우 잘 설명합니다.

장황함과 관련하여 : Java와 C #이 상당히 장황하다고 생각합니다 (점을 "증명"하기 위해 작은 알고리즘을 선택하지 말자). 그리고 네, 둘 다 작성했습니다. C ++도 같은 영역에서 어려움을 겪습니다. VHDL은 여기에서 굴복합니다.

간결함은 일반적으로 동적 언어의 미덕 인 것으로 보입니다 (Perl과 F #을 예로 제시합니다).


9 비트 버스를 6 비트 버스에 할당하는 것과 동등한 것은 int를 short 또는 이와 유사한 것에 할당하는 것입니다. 이것은 C # (및 Java, 제 생각에)의 오류이며 모든 C 또는 C ++ 컴파일러는 이에 대한 경고를 발행 할 수 있어야합니다.
erikkallen

-1. Weakly typed language != Dynamically typed language.
Joe D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.