강자와 약자의 타이핑

Strong and weak typing

컴퓨터 프로그래밍에서, 프로그래밍 언어가 구어체로 분류되는 많은 방법 중 하나는 언어의 유형 시스템이 그것을 강하게 타이핑하는지 약하게 타이핑하는지 여부이다.그러나 용어들이 무엇을 의미하는지 정확한 기술적 정의는 없으며 용어들의 함축적 의미와 주류 프로그래밍 언어의 유형 시스템의 "강점"의 상대적 순위에 대해 서로 다른 저자들이 동의하지 않는다.

일반적으로 강력한 유형의 언어는 컴파일보다 엄격한 입력 규칙을 가지고 있으며, 이는 컴파일 중에 오류와 예외가 발생할 가능성이 높다는 것을 의미합니다.이러한 규칙의 대부분은 변수 할당, 함수 반환 값, 프로시저 인수 및 함수 호출에 영향을 미칩니다.동적 유형 언어(실행유형 확인)도 강력한 유형으로 입력할 수 있습니다.동적으로 입력되는 언어에서는 값에는 변수가 아닌 유형이 있습니다.

약하게 입력된 언어에는 입력 규칙이 느슨하여 예측할 수 없거나 잘못된 결과가 생성되거나 실행 [1]시 암묵적인 유형 변환을 수행할 수 있습니다.동적 유형 언어(일반적으로 "약하게 유형화된" 언어)를 옹호하는 사람들은 이러한 우려가 과장된 것을 발견하고, 정적 타이핑이 실제로 기하급수적으로 더 큰 일련의 문제와 비효율성을 [2]야기한다고 믿습니다.다른 개념이지만 관련된 개념은 잠복형입니다.

역사

1974년, 리스코프와 S. Zilles는 강한 타입의 언어를 "객체가 호출함수에서 호출함수로 전달될 때마다,[3] 그 유형은 호출함수에 선언된 유형과 호환되어야 한다"고 정의했다.1977년 K. Jackson은 "강력하게 타이핑된 언어에서는 각 데이터 영역이 고유한 유형을 가지며 각 프로세스는 이러한 [4]유형의 관점에서 통신 요구사항을 명시할 것입니다."라고 썼다.

'강함' 또는 '약함'의 정의

많은 다른 언어 설계 결정이 "강력한" 또는 "약한" 타이핑의 증거로 언급되어 왔다.이들 대부분은 타입 안전성, 메모리 안전성, 정적 타입 체크 또는 동적 타입 체크의 유무로 보다 정확하게 이해됩니다.

"강력한 타이핑"은 일반적으로 코드의 불변성을 포착하고 그 정확성을 보장하며 특정 클래스의 프로그래밍 오류를 확실히 배제하기 위해 프로그래밍 언어 유형을 사용하는 것을 말합니다.따라서 이러한 목표를 달성하기 위해 사용되는 "강력한 타이핑" 훈련이 많이 있습니다.

암묵적 유형 변환 및 "유형 펀닝"

일부 프로그래밍 언어에서는 한 유형의 값을 다른 유형의 값인 것처럼 쉽게 사용할 수 있습니다.이를 "weak typing"이라고 부르기도 합니다.

예를 들어 Ahz Maruch는 다음과 같이 말합니다. "Coercion정적으로 입력된 언어가 있고 언어의 구문 기능을 사용하여 한 유형을 다른 유형으로 사용하도록 강제할 때 발생합니다(C에서 void*의 일반적인 사용을 고려).강요는 보통 타이핑이 약한 증상이다.반면 변환은 적절한 [5]유형의 완전히 새로운 개체를 생성합니다."

또 다른 예로서 GCC는 이를 타입퍼닝이라고 설명하고 엄밀한 에일리어싱을 해제한다고 경고합니다.Tiago Macieira는 타입 퍼닝으로 인해 컴파일러가 부적절[6]최적화를 했을 때 발생할 수 있는 몇 가지 문제에 대해 설명합니다.

암묵적인 유형 변환을 허용하는 언어의 예는 많지만, 안전한 방식으로 가능합니다.예를 들어, C++와 C#을 모두 사용하면 프로그램에서 연산자를 정의하여 명확하게 정의된 시멘틱스를 사용하여 한 유형에서 다른 유형으로 값을 변환할 수 있습니다.C++ 컴파일러는 이러한 변환이 발생하면 함수 호출과 동일하게 처리됩니다.반대로 값을 C타입으로 변환한다.void*는 컴파일러에 보이지 않는 안전하지 않은 조작입니다.

포인터

일부 프로그래밍 언어에서는 포인터가 숫자 값인 것처럼 노출되어 사용자가 포인터에 대해 산술을 수행할 수 있습니다.포인터 산술은 언어의 유형 시스템을 우회하는 데 사용될 수 있기 때문에 이러한 언어를 "weakly type"이라고 부르기도 합니다.

태그 없는 조합

일부 프로그래밍 언어에서는 태그 없는 유니언을 지원하므로 한 유형의 값을 다른 유형의 값으로 볼 수 있습니다.

정적 유형 검사

Luca Cardelli기사 Typeful Programming에서 "[7]strong type system"은 체크되지 않은 런타임 타입 에러의 가능성이 없는 것으로 기술되어 있습니다.다른 글에서는 점검되지 않은 런타임 오류가 없는 것을 안전 또는 형식 안전이라고 한다.토니 호어의 초기 신문은 이것을 부동산 담보라고 [8]부른다.

동적 유형 검사

일부 프로그래밍 언어에는 정적 유형 검사가 없습니다.이러한 많은 언어에서 대부분의 정적 유형 검사기에 의해 거부되는 프로그램을 작성하는 것은 쉽습니다.예를 들어 변수는 숫자 또는 부울 값 "false"를 저장할 수 있습니다.

프로그래밍 언어에 따른 변화

이러한 정의 중 일부는 모순되고, 다른 일부는 단순히 개념적으로 독립적이며, 다른 일부는 더 "자유로운" 정의의 특수한 경우(추가 제약이 있음)라는 점에 유의하십시오.이러한 정의들 사이에 큰 차이가 있기 때문에, 대부분의 프로그래밍 언어에 대한 주장이 강하거나 약하게 입력되어 있다는 것을 변호할 수 있습니다.예:

  • Java, Pascal, Ada C는 모든 변수가 선언된 유형을 가지며 다른 산술 유형에 대한 산술 값의 명시적 캐스트 사용을 지원합니다.Java, C#, Ada 및 Pascal은 C보다 더 강한 타입이라고 불리기도 합니다.이것은 아마도 C가 더 많은 종류의 암묵적 변환을 지원한다는 사실에 근거하고 있을 것입니다.또한 C는 Java와 Pascal은 지원하지 않는 반면 포인터 값을 명시적으로 캐스팅할 수 있습니다.자바에서 정적 유형 시스템을 회피하는 방법은 자바 가상 머신의 유형 시스템에 의해 제어되기 때문에 자바 자체는 파스칼보다 더 강력한 유형으로 간주될 수 있습니다.C# 및 VB.NET은 코드 세그먼트를 명시적으로 "안전하지 않은 컨텍스트"에 배치함으로써 동적 유형 검사를 비활성화할 수 있지만, 그런 점에서 Java와 유사합니다.파스칼의 타입 시스템은 배열이나 문자열의 크기가 그 타입의 일부이기 때문에 일부 프로그래밍 태스크가 [9][10]매우 어렵기 때문에 "너무 강하다"고 묘사되어 왔다.
  • Smalltalk, Perl, Ruby, Python Self는 모두 런타임에 입력 오류가 방지되고 암묵적인 유형 변환이 거의 이루어지지 않는다는 점에서 "강력하게 입력"되어 있지만, 이러한 언어들은 정적 유형 확인을 사용하지 않는다: 컴파일러는 유형 제약 규칙을 확인하거나 적용하지 않는다. 타이핑이라는 용어는 이제 이 그룹의 언어에서 사용되는 동적 타이핑 패러다임을 설명하는 데 사용됩니다.
  • Lisp 계열의 언어는 모두 실행 시 입력 오류가 방지된다는 의미에서 "강력하게 입력"되어 있습니다.Common Lisp 또는 Clojure같은 일부 Lisp 방언은 다양한 형식의 유형[11] 선언을 지원하며, 일부 컴파일러(CMUL[12] 및 관련)는 이러한 선언을 유형 추론과 함께 사용하여 다양한 최적화와 제한된 형식의 컴파일 시간 유형 검사를 가능하게 합니다.
  • 표준 ML, F#, OCaml, Haskell, Go Rust는 정적으로 타입 체크되지만 컴파일러는 대부분의 값에 대해 정확한 타입을 자동으로 도출합니다.
  • 어셈블리 언어 Fourth는 입력되지 않은 것으로 특징지을 수 있습니다.유형 확인은 없습니다. 함수에 주어진 데이터가 적절한 유형인지 확인하는 것은 프로그래머에게 달려 있습니다.필요한 모든 유형의 변환은 명시적입니다.

이러한 이유로 활자 시스템에 대해 모호하지 않게 쓰기를 원하는 필자들은 종종 "활자 안전"과 같은 특정 표현을 선호하여 "강자 활자"라는 용어를 피한다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "CS1130. Transition to OO programming. – Spring 2012 --self-paced version". Cornell University, Department of Computer Science. 2005. Archived from the original on 2005. Retrieved 2015-11-23.
  2. ^ "The Unreasonable Effectiveness of Dynamic Typing for Practical Programs". Vimeo. September 12, 2013. Retrieved March 21, 2021.{{cite web}}: CS1 maint :url-status (링크)
  3. ^ Liskov, B; Zilles, S (1974). "Programming with abstract data types". ACM SIGPLAN Notices. 9 (4): 50–59. CiteSeerX 10.1.1.136.3043. doi:10.1145/942572.807045.
  4. ^ Jackson, K. (1977). Parallel processing and modular software construction. Design and Implementation of Programming Languages. Lecture Notes in Computer Science. Vol. 54. pp. 436–443. doi:10.1007/BFb0021435. ISBN 3-540-08360-X.
  5. ^ Aahz. "Typing: Strong vs. Weak, Static vs. Dynamic". Retrieved 16 August 2015.
  6. ^ "Type-punning and strict-aliasing - Qt Blog". Qt Blog. Retrieved 18 February 2020.
  7. ^ Luca Cardelli, "유형 프로그래밍"
  8. ^ Hoare, C. A. R. 1974년프로그래밍 언어 설계에 대한 힌트.컴퓨터 시스템의 신뢰성, ed.C. 분얀제20권505–534.
  9. ^ InfoWorld. 1983-04-25. Retrieved 16 August 2015.
  10. ^ Kernighan, Brian (1981). "Why Pascal is not my favorite programming language". Archived from the original on 2012-04-06. Retrieved 2011-10-22.
  11. ^ "CLHS: Chapter 4". Retrieved 16 August 2015.
  12. ^ "CMUCL User's Manual: The Compiler". Archived from the original on 8 March 2016. Retrieved 16 August 2015.