문제

어떤 장점과 한계의 동적 유형 언어를 비교하는 정지형 언어로 사용할 수 있습니까?

또한 참조: 무슨과 함께 사랑의 동적 언어 (훨씬 더 많은 논란의 스레드...)

도움이 되었습니까?

해결책

통역사가 유형 및 유형 변환을 추론 할 수있는 능력은 개발 시간을 더 빨리 만들지 만 컴파일 타임에 잡을 수있는 정적으로 입력 한 언어로 얻을 수없는 런타임 장애를 유발할 수 있습니다. 그러나 요즘 커뮤니티에서 (그리고 오랜 시간 이래) 커뮤니티에서 더 나은 사람 (또는 항상 사실이라도)이 더 나은 것이 더 나은지.

문제에 대한 좋은 취향은입니다 가능한 경우 정적 타이핑, 필요할 때 동적 타이핑 : 프로그래밍 언어 간의 냉전 종료 Microsoft의 Erik Meijer와 Peter Drayton :

정적 타이핑의 옹호자들은 정적 타이핑의 장점은 프로그래밍 실수의 조기 감지 (예 : 유형 서명 형태의 더 나은 문서 (예 : 이름을 해결할 때의 수와 유형을 통합), more의 더 나은 문서화를 포함한다고 주장합니다. 컴파일러 최적화 기회 (예 : 수신기의 정확한 유형이 정적으로 알려진 경우 직접 통화로 가상 호출을 교체 함), 런타임 효율성 증가 (예 : 모든 값이 동적 유형을 전달할 필요는 없음) 및 더 나은 설계 시간 개발자 경험 (예 : 아는 것) 수신기의 유형 인 IDE는 모든 해당 멤버의 드롭 다운 메뉴를 표시 할 수 있습니다). 정적 타이핑 광신자들은 우리가“잘 된 프로그램이 잘못 될 수 없다”고 믿게 만들려고 노력합니다. 이것은 확실히 인상적으로 들리지만 다소 공허한 진술입니다. 정적 유형 검사는 프로그램의 런타임 동작의 컴파일 타임 추상화이므로 반드시 부분적으로 건전하고 불완전합니다. 즉, 유형-체커가 추적하지 않는 속성으로 인해 프로그램이 여전히 잘못 될 수 있으며 잘못 될 수는 없지만 유형 검사 할 수없는 프로그램이 있습니다. 정적 타이핑을 덜 부분적이고 더 완전한 원인으로 만들기위한 충동은 유형 시스템이“팬텀 유형”및“흔들리는 유형”[10]과 같은 개념에 의해 목격 된 바와 같이 지나치게 복잡하고 이국적이 될 수있게한다. 이것은 다리에 묶인 공과 체인으로 마라톤을 달리는 것과 같습니다. 첫 1 마일 이후에 벨리를 쫓아도 거의 만들었습니다.

동적으로 입력 된 언어의 옹호자들은 정적 타이핑이 너무 단단하고 동적 언어의 부드러움으로 인해 변경되거나 알려지지 않은 요구 사항이있는 프로토 타이핑 시스템에 이상적으로 적합하거나 예측할 수 없을 정도로 변화하는 다른 시스템 (데이터 및 응용 프로그램 통합)이 이상적이라고 주장합니다. 물론, 동적으로 입력 된 언어는 메소드 차단, 동적로드, 모바일 코드, 런타임 반사 등과 같은 진정한 역동적 인 프로그램 동작을 다루는 데 필수 불가결합니다. 프로그래밍 언어는 코드가 재사용 가능성이 높고 장황하며 더 안전하지 않으며 동적으로 입력 한 스크립팅 언어보다 표현력이 떨어집니다. 이 주장은 역동적으로 입력 된 스크립팅 언어의 많은 지지자들에 의해 문자 그대로 앵무새입니다. 우리는 이것이 오류라고 주장하며 선언 프로그래밍의 본질이 과제를 제거하고 있다고 주장하는 것과 같은 범주에 속한다고 주장합니다. 또는 John Hughes가 말했듯이 [8], 특징을 생략함으로써 언어를 더욱 강력하게 만드는 것은 논리적으로 불가능합니다. 모든 유형 검사를 런타임으로 지연시키는 것이 좋은 일이라는 사실을 방어하는 것이 좋으며, 가능한 한 초기에 오류가 발생한다는 사실로 타조 전술을 재생하는 것입니다.

다른 팁

정적 유형 시스템은 정적으로 특정 오류를 제거하고 프로그램을 실행하지 않고 검사하고 특정 측면에서 건전성을 증명하려고 시도합니다. 일부 유형 시스템은 다른 유형 시스템보다 더 많은 오류를 잡을 수 있습니다. 예를 들어, C#은 올바르게 사용하면 널 포인터 예외를 제거 할 수 있지만 Java는 그러한 전원이 없습니다. Twelf에는 실제로 유형 시스템이 있습니다 증거가 종료 될 것을 보장합니다, "해결" 중단 문제.

그러나 유형 시스템은 완벽하지 않습니다. 특정 클래스의 오류를 제거하려면 규칙을 위반하는 완벽하게 유효한 특정 프로그램을 거부해야합니다. 그렇기 때문에 Twelf가 실제로 정지 문제를 해결하지 못하는 이유는 이상한 문제를 해결하여 이상한 방식으로 종료되는 완벽하게 유효한 증거를 버려서 피합니다. 마찬가지로 Java의 유형 시스템은 Clojure를 거부합니다 PersistentVector 이종 어레이 사용으로 인한 구현. 런타임에 작동하지만 유형 시스템은 확인할 수 없습니다.

이러한 이유로 대부분의 유형 시스템은 정적 체커를 무시하는 "탈출"을 제공합니다. 대부분의 언어에서는 캐스팅의 형태를 취하지만 일부 (C# 및 Haskell과 같은)는 "안전하지 않은"것으로 표시된 전체 모드를 가지고 있습니다.

주관적으로, 나는 정적 타이핑을 좋아합니다. 제대로 구현되었습니다 (힌트 : ~ 아니다 Java), 정적 유형 시스템은 생산 시스템에 충돌하기 전에 오류를 제거하는 데 큰 도움이 될 수 있습니다. 동적으로 입력 한 언어는 더 많은 단위 테스트가 필요한 경향이 있으며, 이는 가장 좋은 시간에 지루합니다. 또한 정적으로 입력 한 언어는 동적 유형 시스템에서 불가능하거나 안전하지 않은 특정 기능을 가질 수 있습니다 (암시 적 전환 봄). 그것은 모두 요구 사항과 주관적인 취향의 문제입니다. 나는 더 이상 루비에서 다음 일식을 만들지 않을 것입니다. 어셈블리에 백업 스크립트를 작성하거나 Java를 사용하여 커널을 패치하는 것보다

아, 그리고 그렇게 말하는 사람들 "엑스 타이핑은 10 배 더 생산적입니다 와이 타이핑 ""은 단순히 연기를 불고 있습니다. 동적 타이핑은 많은 경우 더 빨리 "느낌"을 느낄 수 있지만 실제로 멋진 응용 프로그램을 만들려고하면지면이 잃어 버립니다. 운영. 마찬가지로, 정적 타이핑은 완벽한 안전망 인 것처럼 보일 수 있지만, Java에서 더 복잡한 일반 유형 정의 중 일부를 살펴보면 대부분의 개발자가 눈가리개를 긁어냅니다. 유형 시스템과 생산성이 있더라도은 총알은 없습니다.

최종 참고 : 정적을 동적 타이핑과 비교할 때 성능에 대해 걱정하지 마십시오. V8 및 Tracemonkey와 같은 현대식 Jits는 정적 언어 성능에 위험하게 클릭됩니다. 또한 Java가 실제로 본질적으로 역동적 인 중간 언어로 컴파일한다는 사실은 대부분의 경우 동적 타이핑이 일부 사람들이 만드는 거대한 성능-킬러가 아니라는 힌트 여야합니다.

론,양쪽은 매우,매우 매우 매우 오해하고 또한 두 개의 완전히 다른 것입니다. 되지 않은 상호 배타적.

정적 유형의 제한 언어의 문법.정적으로 입력 분석 언 엄격하게 말할 수 있었지 컨텍스트의 무료입니다.단순한 사실은 그것이 불편하게 표현하는 언어를 올바로 수행에서 문맥 자유 문법하지 않는 치료하는 모든 데이터를 단순히 비슷합니다.정적 유형을 시스템의 일부 언어의 문법은 어떤 경우에,그들은 단순히 제한 그것보다 더 문맥 자유 문법 수 있는,문법 확인 따라서 일어나 두권을 통해 원본니다.정적 유형에 해당하는 수학적 개념의 형식이론,유형이론 수학에서 단순히 제한의 적법성부 표현.처럼,나는 말할 수 없 3 + [4,7] 에서 수학하기 때문에,이것이 형식의 이론습니다.

정적 유형에 따라서는 방법'오류가 발생하지 않도록 하'이론적인 관점에서,그들은 그러한 제한의 문법입니다.실제로 제공+,3,간격으로 일반적인 집합론적 정의는 경우에,우리는 유형을 제거 시스템 3 + [4,7]꽤 잘 정의된 결과는 설정합니다.'런타임 오류를 입력'이론적으로,존재하지 않는 유형 시스템의 실질적인 사용을 방지하는 것이는 작업 인간의 존재 만들 것은 의미가 없습니다.작업은 여전히 단지의 이동 및 조작의 비트는 물론입니다.

Catch 하여 이 유형 시스템을 결정할 수 없는 경우 이러한 작업은 가 발생하거나지 않는 경우는 것을 실행할 수 있습니다.으로서,정확하게 파티션 설정 가능한 모든 프로그램에서는 사람들이'오류',그리고 그는 없습니다.그것을 할 수 있는 일:

1:을 증명하는 입력 오류가 발생하에서 프로그램
2:는 것을 증명하기 위하여 가고 있지 않에서 발생하는 프로그램

이처럼 보일 수도 있 나는 모순되는 자신입니다.하지만 무엇 C or Java 유형 검사가 거부하는 프로그램으로'ungrammatical',또 그것은 그것을 타입 오류'는 경우 할 수 없 에 성공 2.그것을 증명할 수 없지 않은가 발생하지 않는 것을 의미하지 않을 발생한,그것은 단지 그것을 입증할 수 없습니다.그것은 매우 잘하는 프로그램에는 없는 것입 error 유형은 거부했기 때문에 단순히 수 없에 의해 입증합니다.간단한 예제는 if(1) a = 3; else a = "string";, 확실히 때문에 그것은 항상 진실하면,다른 사람 분기 실행되지 않을 것이다 프로그램에서,그리고 없이 입력하여 오류가 발생합니다.하지만 그것을 증명할 수 없다 이러한 경우에는 일반적 방법,그래서 그것을 거부한다.이것은 주요 약점의 많은 정적으로 입력되어 있어 편리하고,당신을 보호에 대한 자신을,당신은 또한 반드시 보호되는 경우에 당신은 그것을 필요가 없습니다.

하지만,반대로 믿고,또한 정적으로 입력하는 언어에 의해 작동 원리 1.그들은 단순히 거절하고 모든 프로그램의하는 그들이 그것을 증명할 수 있는 것을 발생 입력하고,오류를 전달하고 모든 프로그램의하는 그들은 할 수 없습니다.그래서 그것은 가능한 그들은 프로그램 유형에 오류가 그 좋은 예제 입력되는 라켓,하이브리드 사 동적 및 정적 입력합니다.고 일부는 주장 당신은 두 세계의 최고에서 이 시스템입니다.

의 또 다른 장점은 정적 타는 형식을 컴파일할 때 알려진,이렇게 컴파일러는 이것을 사용할 수 있습니다.는 경우 우리는 자바 do "string" + "string"3 + 3, 모두 + 토큰에서 텍스트에서 끝을 나타내는 완전히 다른 작업과 데이텀 컴파일러 알고있는에서 선택 유형은 혼자입니다.

지금,나는 아주 논란이 문을 여기에 있지만 나와 함께 곰: '동적 입력하는'존재하지 않는.

소리는 매우 논쟁적인,하지만 그것은 사실,동적으로 입력되는 언어는 이론적인 관점에서 .그들은 그냥 정적으로 입력한 언어를 가진 단 하나의 유형입니다.또는 단순히 넣어,그들은 언어가 있습니다 실제로 문법적으로 생성하여 문맥 자유 문법 연습에 있습니다.

왜 그들은 그 종류?기 때문에 모든 작업 정의 및에서 허용되는 모든 작동,what's a'런타임 오류'정확히?그것은에서 이론적 예 순수 부작용.를 하는 경우 print("string") 출력하는 문자열은 작업,그때 그래서 이 length(3), 전는 부가적인 효과도 있습니다 writing string 표준 출력,후자는 단순히 error: function 'length' expects array as argument.,그것입니다.이 있는 이론적인 관점에서 그런 일이 없으로 동적으로 입력되는 언어입니다.그

모든 권리,명백한 이점을의'동적으로 입력한'언어 표현력,형 시스템이 아무것도하지만 제한을 표현하는 힘입니다.그리고 일반적으로,언어와 형식 시스템을 실제로 했을 정의 결과를 위해 모든 작업을 허용되지 않는 경우에는 유형 시스템이 그냥 무시한 결과 그냥하지 않습니다.많은 언어를 잃 Turing 완전성을 적용한 후 유형 시스템입니다.

명백한 불리는 사실이 작업이 발생할 수있는 결과를 생성하는 무의미할 수 있습니다.하는 동적으로 입력한 언어를 일반적으로 재정의 해당 작업이 아닌 생산하는 무의미한 결과들은 다시 정의하는 측면의 효과를 작성 오류,그리고 아마도 중단 프로그램을 모두 합니다.이것은'오류가'에서 모든 사실,어 사양은 일반적으로 알 수 있듯이,이것은 많은 동의어로 인쇄하는 문자열에서는 이론적인 관점입니다.형 시스템에 따라서 강제로 프로그래머는 이유에 대해 흐름의 코드는 것을 확인이 일어나지 않는다.또는 실제로 이렇게는 그것이 일어날 수 있습 편리한 어떤 점에서 디버깅을 위해,는 것을 보여주지 않는'error'에서 모든지만 잘 정의의 재산입니다.효과에서 한 잔의'동적 입력하는 대부분의 언어로 지키고에 대하여 부여한다.이것은 무엇을 동적 입력 없는 형식이 더 이상 없 유형보다는 다른 유형보다는 다른 모든 숫자입니다.어떤 사람들이 부르는'형'이 그냥 다른 속성의 기준,다음과 같 배열의 길이를,또는 첫 번째 문자의 문자열입니다.과 많은 동적으로 입력되어 있을 작성하는 것을 "error: the first character of this string should be a 'z'".

다른 것은 동적으로 입력되어 있을 사용할 수 있는 형식 런타임에 일반적으로 확인할 수 있습과 거래과정에서습니다.물론,이론 그것은 다른 것보다 액세스하는 첫 번째 문자의 배열을 보고 무엇이 그것입니다.사실에서,당신은 당신의 자신의 동적 C 단 하나만 사용 유형을 다음과 같 긴 int 고 사용할 첫 번째는 8 비트의 그것을 저장하는'유형'에 쓰기 기능에는 그에 따라 확인을 수행할 수 떠나 정수 추가 있습니다.을 정적으로 입력한 언어를 가진 하나의 유형,또는 역동적 언어입니다.

에서의 연습이 모든 프로그램,정적으로 입력한 언어를 일반적으로 사용되는 컨텍스트에서 작성의 상업용 소프트웨어는 반면,동적으로 입력되는 언어로 사용되는 경향이있의 컨텍스트에서 몇 가지 문제를 해결 및 자동화하는 몇 가지 작업이 있습니다.쓰기 코드는 정적으로 입력한 언어 단순히 길고 복잡하기 때문에 당신은 할 수 없는 것을 알고 있는 것을 끄는 괜찮아요 하지만 형식 시스템도 보호에 대한 당신 자신에 대한 오류는 없습니다.많은 코어는 그들은 이것 때문에 그것이 자신의 시스템에 있지만할 때는 코드는 정적 언어로,당신은 종종위 사실 유형 시스템을 못하게 하는 것이 잘못 갈 수 없기 때문에,그것은 그것을 증명할 수 없다 잘못되지 않을 것이다.

내가 언급,'정적으로 입력한'에서 일반적인 의미한 경우 2,죄 때까지 입증한다.하지만 일부 언어는 파생되지 않는 자신의 유형을 시스템에서 입력한 이론에서 모두 사용 규칙 1:죄 때까지 유죄로 판명될 수 있는 이상적인 하이브리드입니다.그래서,어쩌면 입력된 라켓은 당신을위한 것입니다.

또한,글,더 불리고 극단적인 예를 들어,저는 현재 구현하는 언어는'형식의'진정으로의 첫 번째 문자 배열로,그들은 데이터,데이터의'종류','유형',자체 유형과 기준,단지 기준은 그 자체로는 유형입니다.형식은 유한한 또는 정적으로 묶여 있지만 새로운 유형이 생길 수 있습에 기반한 런타임이 정보입니다.

동적 타이핑의 가장 큰 "혜택"은 얕은 학습 곡선 일 것입니다. 배우는 유형 시스템이없고 유형 제약 조건과 같은 코너 케이스에 대한 사소한 구문이 없습니다. 이를 통해 역동적 인 타이핑은 더 많은 사람들이 접근 할 수 있고 정교한 정적 유형 시스템이 손이 닿지 않는 많은 사람들에게 실현 가능합니다. 결과적으로, 동적 타이핑은 교육의 맥락 (예 : MIT의 체계/파이썬) 및 비 프로그래머를위한 도메인 별 언어 (예 : 수학). 동적 언어는 경쟁이 거의 없거나 전혀없는 틈새 시장 (예 : JavaScript)에서도 걸렸습니다.

가장 간결한 동적 인 언어 (예 : Perl, APL, J, K, 수학)는 도메인 특이 적이며 정적으로 가장 간결한 일반 목적 언어보다 훨씬 간결 할 수 있습니다 (예 : OCAML) 틈새 시장에서 그들은 설계되었습니다.

동적 타이핑의 주요 단점은 다음과 같습니다.

  • 런타임 유형 오류.

  • 동일한 수준의 정확성을 달성하기에는 매우 어렵거나 실질적으로 불가능할 수 있으며 훨씬 더 많은 테스트가 필요합니다.

  • 컴파일러 검증 문서가 없습니다.

  • 성능 저하 (일반적으로 런타임이지만 때로는 컴파일 타임에 대신 스탈린 체계) 및 정교한 최적화에 대한 의존성으로 인해 예측할 수없는 성능.

개인적으로, 나는 역동적 인 언어로 자랐지 만 다른 실행 가능한 옵션이 없다면 전문가로서 40 '극으로 만지지 않을 것입니다.

Artima 's에서 타이핑 : 강한 대 약함, 정적 대 다이내믹 기사:

강력한 타이핑은 불일치 유형 간의 혼합 작업을 방지합니다. 유형을 혼합하려면 명시 적 변환을 사용해야합니다.

약한 타이핑은 명시적인 변환없이 유형을 혼합 할 수 있음을 의미합니다.

Pascal Costanza의 논문에서 동적 대 정적 타이핑-패턴 기반 분석 (PDF), 그는 어떤 경우에는 정적 타이핑이 동적 타이핑보다 오류가 발생하기 쉽다고 주장합니다. 정적으로 입력 한 일부 언어는 "올바른 일"을하기 위해 동적 타이핑을 수동으로 모방하도록합니다. 그것은 논의합니다 람다 궁극.

그것은 컨텍스트에 따라 달라집니다.많은 혜택에 해당하는 동적 입력한 시스템을 위해 뿐 아니라 강력한 형식입니다.나의 의견의 흐름을 동적 형식 언어가 더 빠르다.동적 언어로 제한하지 않리와 함께 컴파일러는 생각에서 무슨 일이 일어 코드입니다.당신이 몇 가지도 자유입니다.또한,동적인 언어를 일반적으로 더 많은 표현과 그 결과에 코드는 좋은 것입니다.이것에도 불구하고,그것의 더 많은 오류가 발생하기 쉽도 의심하고 따라 달라집에 더 많은 유닛을 포함하는 시험.그것은 쉽게 시제품을 가진 동적 lang 그러나 유지 보수가 될 수 있다.

주요 이득을 통해 정적 입력한 시스템은 IDE 지원하고 확실하게 정적 해석기의 코드입니다.당신은 더 많은 자신감의 코드 후 모든 코드를 변경합니다.유지 보수는 평화와 케이크 같은 도구입니다.

정적 및 동적 언어에는 여러 가지가 있습니다. 저에게 주된 차이점은 동적 언어에서 변수에는 고정 유형이 없다는 것입니다. 대신, 유형은 값과 관련이 있습니다. 이 때문에 실행되는 정확한 코드는 런타임까지 결정되지 않습니다.

초기 또는 순진한 구현에서 이것은 큰 성능 드래그이지만, 현대식 주제는 정적 컴파일러를 최적화함으로써 얻을 수있는 최선에 가깝게 가깝습니다. (일부 프린지 케이스에서는 그보다 훨씬 낫습니다).

그것은 일자리에 적합한 도구에 관한 것입니다. 시간의 100%도 더 나은 것도 아닙니다. 두 시스템 모두 Man에 의해 만들어졌으며 결함이 있습니다. 미안하지만 우리는 빨고 완벽한 물건을 만들고 있습니다.

나는 동적 타이핑이 내 길을 벗어나기 때문에 좋아하지만 예, 런타임 오류는 내가 계획하지 않은 등장 할 수 있습니다. 정적 타이핑이 위에서 언급 한 오류를 고칠 수 있지만, 초보자 (타이핑 된 언어) 프로그래머를 일정한 숯과 문자열 사이에서 캐스팅하려고 노력합니다.

정적 타이핑 :Java 및 Scala와 같은 언어는 정적 유형입니다.

변수는 코드에 사용되기 전에 정의되고 초기화되어야합니다.

전. in x; x = 10;

System.out.println (x);

동적 타이핑 :Perl은 역동적 인 유형 언어입니다.

변수는 코드에서 사용하기 전에 초기화 할 필요가 없습니다.

y = 10; 코드의 후반부 에이 변수를 사용하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top