[terminology] 정적 / 동적 vs 강 / 약

나는이 용어들이 프로그래밍의 모든 곳에서 얽혀있는 것을 보았고 그것이 의미하는 바에 대한 모호한 개념을 가지고있다. 검색 결과 실제로 그러한 모든 것들이 스택 오버플로 오버플로로 요청되었음을 보여줍니다. 내가 아는 한 언어의 정적 / 동적 입력은 강력 / 약한 입력과 미묘하게 다르지만 그 차이점은 무엇입니까? 다른 출처는 다른 의미를 사용하거나 용어를 서로 바꿔서 사용하는 것처럼 보입니다. 둘 다에 대해 이야기하고 실제로 차이를 설명하는 곳을 찾을 수 없습니다. 좋은 점은 누군가 나와 나와 다른 세계를 위해 이것을 명확하게 철자 할 수 있다면 좋습니다.



답변

  • 정적 / 동적 입력 은 유형 정보가 수집 될 때 (컴파일 타임 또는 런타임시)에 관한 것입니다.

  • 강하고 약한 타이핑 은 타입이 얼마나 엄격하게 구별되는지에 관한 것입니다 (예 : 언어가 문자열에서 숫자로 암시 적 변환을 시도하는지 여부).

자세한 정보는 위키 페이지 를 참조하십시오.


답변

아마추어가 프로그래밍 언어에 대해 이야기하는 데 사용하는 용어에서 소프트 스팟을 발견했습니다.
“strong”및 “weak”typing이라는 용어 는 보편적으로 동의 된 기술적 의미가 없으므로 사용하지 마십시오 . 반대로 정적 유형 지정 은 프로그램이 실행되기 전에 확인되고 프로그램이 시작되기 전에 거부 될 수 있음을 의미합니다. 동적 유형 지정실행 중에 유형 이 검사 됨을 의미하며, 유형이 잘못된 조작으로 인해 프로그램이 중지되거나 런타임시 오류를 표시 할 수 있습니다 . 정적 타이핑의 주요 이유는 “동적 유형 오류”가있는 프로그램을 배제하기위한 것입니다.

타이핑은 일반적으로 타입 시스템에 허점없음을 의미하는 반면, 타이핑이 약하다 는 것은 타입 시스템이 파괴 될 수 있음을 의미합니다 (보증이 무효화 됨). 정적 및 동적 입력을 의미하기 위해이 용어는 종종 잘못 사용됩니다. 차이점을 보려면 C를 생각해보십시오. 언어는 컴파일 타임에 유형 검사 (정적 입력)이지만 허점이 많이 있습니다. 거의 모든 유형의 값을 동일한 크기의 다른 유형으로 캐스트 할 수 있습니다. 특히 포인터 유형을 자유롭게 캐스트 할 수 있습니다. 파스칼은 강력하게 형식화되었지만 의도하지 않은 허점을 가지고있는 언어였습니다. 태그가없는 변형 레코드입니다.

강력한 형식의 언어 구현은 종종 시간이 지남에 따라 허점을 얻으므로 대개 런타임 시스템의 일부를 고급 언어로 구현할 수 있습니다. 예를 들어 Objective Caml에는 Obj.magic단순히 인수를 반환하는 런타임 효과 가있는 함수 가 있지만 컴파일 타임에는 모든 유형의 값을 다른 유형 중 하나로 변환합니다. 내가 가장 좋아하는 예는 Modula-3인데, 그의 디자이너는 타입 캐스팅 구문이라고 불렀다 LOOPHOLE.

이미 말했듯이, “strong”과 “weak”라는 단어를 정확히 같은 방식으로 사용하는 두 사람은 믿을 수 없습니다. 따라서 피하십시오.


답변

간단하게 이런 식으로 넣어 : A의 정적으로 입력 된 언어 유형은 정적 당신이 유형에 대한 변수를 설정하면 의미, 당신은 변경할 수 없습니다. 이는 타이핑이 참조하는 값이 아니라 변수와 연관되어 있기 때문입니다.

예를 들어 Java의 경우 :

String str = "Hello";  //statically typed as string
str = 5;               //would throw an error since java is statically typed

동적 유형 언어 에서는 유형이 dynamic 인 반면 변수를 유형으로 설정 한 후에는 유형을 변경할 수 있습니다. 타이핑은 변수가 아닌 값과 연관되어 있기 때문입니다.

예를 들어 파이썬에서 :

str = "Hello" # it is a string
str = 5       # now it is an integer; perfectly OK

반면에 언어 의 강하고 약한 타이핑 은 암시 적 유형 변환과 관련이 있습니다 (부분적으로 @Dario의 답변에서 가져옴).

예를 들어 파이썬에서 :

str = 5 + "hello"
# would throw an error since it does not want to cast one type to the other implicitly.

반면 PHP에서는 :

$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0
// PHP is weakly typed, thus is a very forgiving language.

정적 타이핑을 사용하면 컴파일시 유형 정확성을 확인할 수 있습니다. 정적 형식 언어는 일반적으로 컴파일되며 동적 형식 언어는 해석됩니다. 따라서 동적으로 입력 된 언어는 런타임에 입력을 확인할 수 있습니다.


답변

타이핑이 약하다는 것은 상황에 따라 객체 유형이 변경 될 수 있음을 의미합니다. 예를 들어 약한 유형의 언어에서 다른 숫자를 추가하면 문자열 “123”이 숫자 123으로 처리 될 수 있습니다. 타이핑이 약한 언어의 예는 bash, awk 및 PHP입니다.

또 다른 종류의 약한 유형의 언어는 C이며, 여기서 메모리 주소의 데이터는 캐스팅에 의해 다른 유형으로 취급 될 수 있습니다.

강력한 형식의 언어에서는 객체의 유형이 변경되지 않습니다. int는 항상 int이며 문자열로 사용하려고하면 오류가 발생합니다. Java와 Python은 모두 강력하게 형식화됩니다.

동적 유형 지정과 정적 유형 지정의 차이점은 유형 규칙이 적용되는 시점입니다. 정적으로 유형이 지정된 언어에서 모든 변수 및 매개 변수의 유형은 소스에서 선언해야하며 컴파일시 적용됩니다. 동적 형식 언어에서는 형식이 런타임에 사용될 때만 형식이 검사됩니다. 따라서 Java는 정적으로 유형이 지정되고 Python은 동적으로 유형이 지정됩니다.

그러나 때때로 경계가 약간 흐려질 수 있습니다. 예를 들어 Java는 정적으로 유형이 지정되지만 리플렉션 또는 캐스트를 사용할 때마다 (예 : Objects 컨테이너를 사용할 때) 런타임에 유형 검사를 연기합니다.

마찬가지로 가장 강력하게 입력 된 언어는 여전히 정수와 부동 소수점 사이에서 자동으로 변환됩니다 (일부 언어에서는 임의 정밀도 BigInts).


답변

오늘이 주제에 대해 연구 하면서이 위대한 기사 http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html 을 발견했습니다. 저를위한 것 그리고 나는 그것이 위의 위대한 답변 중 일부에 추가 될 수 있다고 생각했습니다.

강하고 약한 타이핑 :

유형 시스템이 분류되는 가장 일반적인 방법은 “강한”또는 “약한”것입니다. 이 단어는 거의 의미가 없기 때문에 불행한 일입니다. 두 언어를 매우 유사한 유형의 시스템과 비교하고 하나를이 두 시스템 중 더 강력한 것으로 지정할 수 있습니다. 그 외에도 그 단어는 전혀 의미가 없습니다.

정적 및 동적 유형

이것은 거의 의미가있는 유형 시스템의 거의 유일한 분류입니다. 사실, 그 중요성은 종종 과소 평가되고있다. […] 동적 및 정적 타입 시스템은 완전히 다른 두 가지로, 목표가 부분적으로 겹치게된다.

정적 유형 시스템은 컴파일러가 소스 코드를 검사하고 레이블 ( “유형”이라고 함)을 구문 조각에 할당 한 다음이를 사용하여 프로그램의 동작에 대한 무언가를 유추하는 메커니즘입니다. 다이나믹 타입 시스템은 컴파일러가 프로그램에서 사용하는 일종의 데이터 ( “타입”이라고도 함)를 추적하는 코드를 생성하는 메커니즘입니다. 물론이 두 시스템에서 같은 단어 “유형”을 사용하는 것은 실제로 우연의 일치가 아닙니다. 그러나 그것은 일종의 약한 역사적 중요성을 갖는 것으로 가장 잘 이해됩니다. “유형”이 실제로 두 시스템에서 동일한 것을 의미하는 세계관을 찾으려고 시도한 결과 큰 혼란이 생겼습니다. 그렇지 않습니다.

명시 적 / 암시 적 유형 :

이 용어가 사용될 때, 컴파일러는 프로그램의 정적 유형 부분에 대해 추론 할 정도를 나타냅니다. 모든 프로그래밍 언어에는 유형에 대한 추론 형식이 있습니다. 어떤 것들은 다른 것보다 더 있습니다. ML과 Haskell은 암시 적 타입을 가지고 있는데, 타입 선언이 필요하지 않거나 거의 사용되지 않습니다. Java와 Ada는 매우 명시적인 유형을 가지고 있으며 지속적으로 유형을 선언하고 있습니다. 위의 모든 것은 (예를 들어 C 및 C ++에 비해) 강력한 정적 유형 시스템을 가지고 있습니다.


답변

Scott의 Programming Language Pragmatics , 3 판, 291 페이지에서

유형 검사는 프로그램이 언어의 유형 호환성 규칙을 준수하도록하는 프로세스입니다. 규칙 위반은 유형 충돌이라고합니다. 언어 구현이 언어를 구현할 수있는 방식으로 해당 작업을 지원하지 않는 개체에 대한 작업의 적용을 금지하는 경우 언어를 강력하게 입력 했다고합니다. 언어는 강력하게 유형이 정해지고 유형 검사가 컴파일 타임에 수행 될 수있는 경우 정적으로 유형 이 정해집니다. 가장 엄격한 의미에서 정적으로 유형이 지정된 언어는 거의 없습니다. 실제로이 용어는 대부분의 유형 검사가 컴파일 타임에 수행 될 수 있고 나머지는 런타임에 수행 될 수있는 언어에 종종 적용됩니다.

몇 가지 예 : Ada는 강력하게 형식화되어 있으며 대부분 정적으로 형식화되어 있습니다 (실행시 특정 형식 제약 조건을 확인해야 함). Pascal 구현은 컴파일 타임에 대부분의 유형 검사를 수행 할 수 있지만 언어는 그다지 강력하게 형식화되어 있지 않습니다. C89는 이전의 방언보다 훨씬 강력하지만 파스칼보다 훨씬 덜 강합니다. 루프 홀에는 공용체, 가변 개수의 매개 변수가있는 서브 루틴 및 포인터와 배열의 상호 운용성 (섹션 7.7.1에서 설명)이 포함됩니다. C 구현은 런타임에 아무것도 확인하지 않습니다.

동적 (런타임) 유형 검사는 늦은 바인딩 형태이며 런타임까지 다른 문제를 지연시키는 언어에서도 발견되는 경향이 있습니다. 리스프와 스몰 토크는 동적으로 (강력하지만) 타이핑됩니다. 대부분의 스크립팅 언어는 동적으로 입력됩니다. 일부 (예 : Python 및 Ruby)는 강력하게 입력됩니다. 동적 범위를 가진 언어는 일반적으로 동적으로 형식이 지정되거나 전혀 형식이 지정되지 않습니다. 컴파일러에서 이름이 참조하는 개체를 식별 할 수없는 경우 일반적으로 개체의 형식도 확인할 수 없습니다.

간단히 말해서 정적 / 동적 타이핑은 유형 검사가 발생하는 시간, 즉 정적 타이핑을위한 컴파일 시간 및 동적 언어를위한 런타임을 나타냅니다. 마찬가지로 강력한 타이핑은 언어가 유형 시스템을 시행하는 데 얼마나 적극적인지를 나타냅니다.

Scott의 설명을 멋진 다이어그램으로 변환하려고했는데 아래에 게시했습니다.

정적 / 동적-강력 / 약한 입력 평면


답변

다른 동료들도 잘 해냈다 고 생각합니다. 정적 타이핑과 동적 타이핑의 차이점을 설명합니다. 그러나 강하고 약한 타이핑에 관한 한, 이해와 견해가 다르다고 말해야합니다.

다음은 두 가지 예입니다.

  • 일부는 만들 수 없습니다 때문에 하스켈은 강력하게 입력했는지 말을 어떤 형식 변환합니다.

  • 다른 사람들 (예를 들어 Dario의 견해)에 따르면 의도적으로 문자열에서 숫자로 암시 적으로 변환 할 수있는 언어는 약하게 입력되었지만 다른 사람들조차도 이것을 오리 입력이라고합니다.

두 진술은 유형 시스템의 반대 극단이 아니라 완전히 다른 측면을 강조합니다. 그래서 저는 램지 씨의 견해에 따라 유형 시스템을 구별하기 위해 “강한”과 “약한”이라는 용어를 사용하지 않는 것이 좋습니다.