동적 언어와 정적 언어의 구조적 차이점


22

정적 언어 (예 : C # 또는 Java)와 동적 언어 (예 : Ruby 또는 Python)를 기반으로하는 응용 프로그램을 설계 할 때 아키텍처에 큰 차이가 있습니까?

한 유형에 적합한 디자인 가능성이 다른 유형의 디자인 가능성은 무엇입니까? 디자인과 아키텍처에서 다른 유형과는 다른 유형으로는 얻을 수있는 유용한 기능이 있습니까?

또한 동적 특정 디자인 패턴이 있습니까?


1
이러한 구조적 차이점이 무엇이든 동적 언어 인 IronRuby 및 IronPython은 .Net의 정적 언어를 쉽게 보완합니다.
IAbstract

3
확실하지는 않지만 동적 프로그래밍 언어에서 메타 프로그래밍이 더 쉬운 경우 (마지막으로 보았을 때 Ruby보다 Java에서 더 쉬워 보였음) 아키텍처 결정에 영향을 줄 수 있습니다. 이런 역동적 인 언어에서 큰 일을 한 적이 없었기 때문에 어떤 영향을 미쳤는지 잘 모르겠습니다.
FrustratedWithFormsDesigner

답변:


14

몇 가지 일을 바로 잡자 :

  1. 대화식 스크립팅과 정적 언어는 상호 배타적이지 않습니다. F #과 Haskell에는 모두 REPL 인터페이스가 있습니다.
  2. 동적 언어와 고성능은 상호 배타적이지 않지만 일부 최적화는 있습니다. 요즘 JavaScript는 대부분의 브라우저에서 매우 빠르게 실행됩니다.
  3. 동적 언어로도 유형을 문서화하고 기억하고 생각해야합니다.
  4. 타입 추론의 인기가 높아짐에 따라 많은 정적 언어는 더 이상 타입을 자주 표기 할 필요가 없습니다. 강력한 형식 유추가있는 정적 언어에서 컴파일러는 대부분 코드에서 형식이 무엇인지 파악하여 형식 정의를 위반하는 작업을 수행했는지 여부를 알려줍니다. 구문에 관한 한, 이것은 두 세계의 최고를 제공합니다.
  5. OOP와 동적 언어는 상호 배타적이지 않습니다. PHP는 이제 클래스와 상속까지 지원합니다.

이러한 놀라운 유사점을 제외하고 개발 프로세스에 영향을 미치는 실질적인 차이점이 있습니다.

  1. 동적 언어를 사용 하면 소규모로 데이터를 전달하는 흥미로운 방법을 사용할 수 있습니다.
  2. 정적 언어를 사용하면 많은 종류의 버그를 불가능하게하여 테스트 횟수를 줄일 수 있습니다.
  3. 같은 맥락에서 정적 언어 는 F #의 측정 단위 와 같은 흥미로운 유효성 검사 및 자동 변환 기능을 허용 합니다.
  4. 극단적으로 촬영, 정적 언어를 허용 코드 계약을 문서화하고 플랫 아웃 할 수있는 공식적인 검증 방지 등을 잠재적으로 나누기 제로, 무한 루프, 널 (null) 참조 무효 목록 크기 나 인덱스, 범위의 오류 및 기타 논리적으로 잘못된 상태 정의 할 수 있습니다.
  5. 이러한 극한의 제약으로 이러한 정적 제약 조건을 기반으로 CPU 최적화를 수행 할 수있어 성능이 훨씬 향상됩니다.

정적 타이핑 없이는 결코 만들 수 없었던 한 가지 유형의 프로그램 인 Singularity , 하드웨어 프로세스 경계가없는 OS가 있습니다. 코드 계약을 지원하는 소량의 C, 일부 C # 및 Spec #이라는 C #의 방언으로 작성되었습니다.

가비지 수집 언어로 작성 되었지만 모든 프로세스가 하나의 메모리 공간에서 실행되고 공식 검증 최적화로 인해이 OS의 멀티 태스킹 및 프로세스 간 통신 성능은 실제로 다른 것보다 습니다. 위에 언급했듯이. 프로그램이 나머지 시스템을 손상시킬 수 없도록하려면 통신 개체를 정적으로 확인할 수 있어야하기 때문에 정적 입력 없이는이 작업을 수행 할 수 없습니다.

그러나 대부분의 경우 아키텍처는 거의 동일하게 보입니다. 정적 언어는 유형이 잘 정의되어 있기 때문에 대부분의 경우 프로그램을 쉽게 추론 할 수 있지만, 잘 작성된 동적 언어 프로그램에는 최소한 개발자의 마음에 잘 정의 된 유형이 있습니다.


Singularity는 실시간 인식 최대 대기 시간 보장을 제공 할 수 있습니까?
Eonil

@Eonil 실제로 내 분야는 아니지만 실시간으로 열심히 할 수 있는지 묻는 것 같습니다. 나는 그것이 모든 곳에서 가비지 수집을 사용하기 때문에 그렇게 생각하지 않습니다. 특이점은 내가 아는 한 얼마 동안 업데이트되지 않았지만 누군가가 실시간 가비지 수집기와 비슷한 것을 만들었을 것입니다.
Rey Miyasaka

감사. 방금 확인하고 싶었습니다. 실시간 GC 구현이 있다고 들었지만 실제로 업계에서 어떻게 사용되는지 들어 보지 못했습니다…
Eonil

2

중요한 아키텍처 차이가 있습니다. 공연.

하드웨어 예산, 예상 작업량 및 서비스 수준 계약에 따라 동적 언어로는 요구 사항을 충족하지 못할 수 있습니다.

동적 언어에 의해 제공되는 개발 속도와 유연성은 응답 속도가 느릴수록 CPU 및 메모리 소비가 높아지는 경우가 많습니다. 그러나 예산이나 성능 제약이있는 대규모 시스템의 경우 동적 언어의 오버 헤드가 높아질 수 있습니다.


1

나는이 라인을 따라 생각한 적이 없다. 따라서 Google을 시작했을 때 Peter Norvig의 블로그 는 최고의 인기를 끌었습니다. 일부 디자인 패턴은 C ++과 같은 기존 객체 지향 언어보다 동적 언어로 구현하기 쉽다고 말합니다. 디자인 / 아키텍처에도 차이가 있어야한다고 생각하기 때문에 동적 언어에서는 구현이 더 쉽다는 점에 주목하기 때문입니다. 더 공부하면서 답변에 더 많은 것을 추가하려고 노력할 것입니다.


1

정적 언어 (예 : C # 또는 Java)와 동적 언어 (예 : Ruby 또는 Python)를 기반으로하는 응용 프로그램을 설계 할 때 아키텍처에 큰 차이가 있습니까?

아니.

동적 언어를위한 멋진 프레임 워크를 작성하는 것이 약간 더 쉽습니다. 그러나 그것은 응용 프로그램이 아닙니다.

한 유형에 적합한 디자인 가능성이 다른 유형의 디자인 가능성은 무엇입니까?

정말이지

어떤 언어로든 좋은 것을 쓸 수 있습니다.

디자인과 아키텍처에서 다른 유형과는 다른 유형으로는 얻을 수있는 유용한 기능이 있습니까?

아니.

차이점은 동적 언어는 "쓰기, 실행, 수정"입니다. 빠르게 실험하고 수정할 수 있습니다.

정적 언어는 "쓰기, 컴파일, 빌드, 실행, 수정"입니다. 당신은 쉽게 실험 할 수 없습니다.

그 외에는 기능면에서 거의 동일합니다.

동적 특정 디자인 패턴이 있습니까?

아마도. 파이썬 eval()execfile()함수는 어떤 식 으로든 정적 언어에서 다루기가 어렵지만 불가능한 동적 언어 기능을 가리 킵니다. 동일한 프로세스 공간에서 코드를 컴파일하고 실행하려면 훨씬 더 많은 코드 줄이 필요합니다.

동적 언어에 국한되지 않습니다. 더 쉽습니다.


2
"쉽게 실험 할 수는 없습니다."-사실, 컴파일러는 오류를 찾는 데 도움이되는 반면, 해석 된 언어를 사용하면 사용자가 해당 코드 줄을 실행할 때까지 오류를 찾을 수 없다는 단점이 있습니다.
Doug T.

4
@Doug T .: "컴파일러가 오류를 찾는 데 도움이됩니다." 때때로. 충분하지 않습니다. 흥미로운 오류는 컴파일러에서 전혀 찾을 수 없습니다. 그것이 단위 테스트의 목적입니다.
S.Lott

2
@ S.Lott 동적 언어로 작성된 API에는 조금 더 많은 문서가 필요하다는 것을 알았습니다. 정적 언어에서 메소드 서명은 어떤 유형의 인수가 필요한지 알려줍니다. 동적 언어에서는 쉽게 알 수 없습니다. API 설명서는 예상되는 객체를 알려줍니다.
Quancle

1
@quanticle : 그건 정말 건축 적이 지 않나요?
S.Lott

2
"당신은 쉽게 실험 할 수 없습니다." -F #과 Haskell은 정적 언어이며 본격적인 REPL이 있으며 식별자 또는 식 유형을 거의 묻지 않습니다.
Rei Miyasaka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.