IT이야기

C가 강하게 타이핑되었니?

cyworld 2022. 4. 25. 21:42
반응형

C가 강하게 타이핑되었니?

위키백과를 인용하려면:

여러 종류의 암묵적 변환을 지원하는 공통적으로 사용되는 두 가지 언어는 C와 C++이며, 때로는 약하게 타이핑된 언어라고 주장하기도 한다.그러나 다른 이들은 이러한 언어가 서로 다른 유형의 피연산자를 어떻게 혼합할 수 있는지에 대해 충분한 제한을 두고 있으며, 이 두 언어를 강력한 형식의 언어로 간주해야 한다고 주장한다.

더 명확한 답변이 있는가?

"강력하게 타이핑"과 "약하게 타이핑"은 널리 합의된 기술적 의미가 없는 용어다.뜻이 정립된 용어는

  • 동적 타이핑은 런타임 시 값에 유형이 첨부됨을 의미하며, 다른 유형의 값을 혼합하려고 하면 "런타임 유형 오류"가 발생할 수 있다.예를 들어, 스키마에서 쓰기를 통해 true에 하나를 추가하려고 하는 경우(+ 1 #t)이것은 오류를 일으킬 것이다.위반 코드를 실행하려는 경우에만 오류가 발생함

  • 정적으로 타이핑된 것은 컴파일할 때 타입을 체크하고, 정적 타입이 없는 프로그램은 컴파일러에 의해 거부되는 것을 의미한다.예를 들어, 만약 당신이 ML에서 true를 쓰려고 한다면 당신은 true에 하나를 추가하려고 한다.1 + true, 프로그램은 (암호 암호화) 오류 메시지와 함께 거부될 것이다.코드가 실행되지 않을 수 있더라도 항상 오류가 발생함

사람들마다 유연성이 얼마나 중요한지, 런타임 오류에 대해 얼마나 걱정하는지에 따라 부분적으로 다른 시스템을 선호한다.

때때로 "강력하게 타이핑"은 "정적으로 타이핑된" 것을 의미하는데 느슨하게 사용되고, "약하게 타이핑된"은 "동적으로 타이핑된" 것을 의미하는데 잘못 사용된다.'강력한 활자'라는 용어의 더 좋은 용어는 '유형제도는 일할 수 없거나 전복할 수 없다'는 것이고, '약한 활자'는 '유형제도에 허점이 있다'는 뜻이다.비뚤게 보면, 정적 타입 시스템을 가진 대부분의 언어에는 허점이 있는 반면, 동적 타입 시스템을 가진 많은 언어에는 허점이 없다.

이 용어들 중 어떤 것도 언어로 사용할 수 있는 암묵적 변환의 수와 어떤 식으로도 연관되지 않는다.

프로그래밍 언어에 대해 정확하게 이야기하려면 "강력하게 타이핑"과 "약하게 타이핑"이라는 용어를 피하는 것이 좋다.나는 C는 정적으로 타이핑된 언어지만 허점이 많은 언어라고 말하고 싶다.한 가지 허점은 어떤 포인터 타입이든 자유롭게 다른 포인터 타입에 캐스팅할 수 있다는 것이다.또한 문제의 유형별로 한 명씩 두 명의 조합원이 있는 C조합을 선언함으로써 자신이 선택한 두 가지 유형 사이에 허점을 만들 수 있다.

나는 왜 해석-랑스-대부분 더덕더덕-반복-강접-강접-에 정적-동적 타이핑에 대해 더 많이 썼다.

컴파일러 오류 없이 캐스트를 통해 어떤 유형이든 다른 유형으로 변환할 수 있기 때문에 C는 약하게 타이핑된 것으로 간주된다.당신은 여기서 그 문제에 대해 더 자세히 읽을 수 있다.

Dennis Ritchie (C )와 Brian Kernighan에 따르면, C는 강하게 타이핑된 언어가 아니다.C 프로그래밍 언어 3페이지의 다음 행은 5항이다.

C는 강한 형식의 언어는 아니지만 진화하면서 형식 점검이 강화됐다.

강하게 입력되지 않음.

다음 함수 프로토타입이 인수의 데이터 유형에 대해 무엇을 의미하는지 고려하십시오.

void func (int n, char ch, ...);

아무 것도 없어요.그래서 나는 강한 타이핑은 여기에 적용되지 않는 것을 제안한다.

문헌은 이것에 대해 명확하지 않다.나는 강하게 타이핑하는 것이 예/아니오라고 생각하지 않는다. 강한 타이핑의 정도는 다양하다.

프로그래밍 언어는 그것이 프로그램을 실행하는 방법에 대한 명세를 가지고 있다.때로는 특정 프로그램으로 실행하는 방법이 명확하지 않을 때도 있다.예를 들어 숫자에서 문자열을 빼려고 하는 프로그램.아니면 0으로 나누는 프로그램.이러한 조건에 대처하는 방법에는 여러 가지가 있다.일부 언어에는 이러한 오류를 처리하는 규칙이 있다(예: 예외를 발생시킨다).다른 언어들은 단지 이러한 상황을 다룰 규칙이 없다.이들 언어는 일반적으로 불특정 행동을 유발하는 프로그램을 편성하는 것을 막기 위한 형식 체계를 갖추고 있다.그리고 지정되지 않은 행동을 가지고 있고 컴파일 시간에 이러한 오류를 방지할 수 있는 유형 시스템이 없는 언어도 존재한다(지정되지 않은 행동을 때리는 프로그램을 작성하면 미사일을 발사할 수도 있다).

자:

문자열에 숫자를 추가하는 것과 같이 모든 경우에 런타임에 어떤 일이 일어나는지 지정하는 언어를 동적으로 타이핑한 언어라고 한다.컴파일 시 오류가 있는 프로그램을 실행할 수 없는 언어는 정적으로 입력된다.어떤 일이 일어나는지 특정하지 않고 오류를 방지할 수 있는 유형 시스템도 없는 언어를 약하게 타이핑된 언어라고 한다.

그래서 자바를 정적으로 타이핑한 거야?그렇다, 그것의 유형 시스템은 숫자에서 문자열을 빼는 것을 허용하지 않기 때문이다.아니, 0으로 나눌 수 있으니까.형식 시스템으로 컴파일할 때 0으로 나누지 않도록 할 수 있다.예를 들어 0이 될 수 없는 숫자 유형(예: NonZeroInt)을 만들고 이 유형을 가진 숫자로만 나눌 수 있도록 허용한다.

그렇다면 C는 강하게 타이핑을 하거나 약하게 타이핑을 하는 것일까?C는 형식 시스템이 일부 형식 오류를 허용하지 않기 때문에 강하게 입력된다.그러나 그것은 어떤 일이 일어나는지 정의되지 않을 때(그리고 유형 시스템은 당신을 보호하지 않는다) 다른 경우에는 약하게 타이핑된다.

모든 언어를 '약하게' 또는 '강하게' 타자로 분류하는 것은 어렵다. - 그것은 연속체에 가깝다.그러나 다른 언어에 비해 C는 상당히 강하게 타이핑되어 있다.모든 개체에는 컴파일 시간 유형이 있으며, 컴파일러 유형이 허용하지 않는 개체로 어떤 작업을 수행할 경우 컴파일러가 알려 줄 것이다.예를 들어, 잘못된 유형의 매개 변수, 존재하지 않는 구조체/조합원에 대한 액세스 등 기능을 호출할 수 없다.

그러나 몇 가지 약점이 있다.한 가지 주요한 약점은 타이프캐스트 이다. 그들은 본질적으로 당신이 물체의 종류로 장난칠 것이라고 말하고, 컴파일러는 조용해야 한다. void*또 다른 약점이다. 알 수 없는 타입에 대한 일반적인 포인터다. 그리고 그것들을 사용할 때, 여러분은 옳은 일을 하고 있다는 것에 각별히 주의해야 한다.컴파일러가 대부분의 사용을 정적으로 확인할 수 없음void*.void*또한 깁스 없이 어떤 타입으로든 포인터로 변환될 수 있다(C++가 아닌 C에만 있다). 이것은 또 다른 약점이다.

내 생각에는 C/C++가 강하게 타이핑되어 있는 것 같아.타입 변환(void*)을 가능하게 하는 해킹의 종류는 기계에 대한 C의 근접성 때문에 있다.즉 파스칼로부터 조립자 명령을 호출하여 포인터를 조작할 수 있으며 파스칼은 여전히 강하게 타이핑된 언어로 간주된다.JNI를 통해 Java에서 조립자와 C 실행 파일을 호출할 수 있지만 Java를 약하게 타이핑하지는 않는다.

C는 단지 조립자에게 생포인터 등을 내장하고 있을 뿐이다.

C는 정적으로 타이핑된 것으로 간주된다(int에서 float로 변수를 변경할 수 없다).변수는 일단 선언되면 그렇게 고착된다.

그러나 활자는 플립 플립될 수 있기 때문에 약하게 타이핑된 것으로 간주된다.

0이란 무엇인가?'\0', FALSE, 0.0 등..

조건에서는 부울 식에서 부울 값만 사용하기 때문에 많은 언어로 IF(변수)라고 말할 수 없다.이것들은 좀 더 강하게 타이핑되어 있다.문자와 정수 사이를 오가는 것도 마찬가지다.

기본적으로 c는 정수와 부동 소수점 번호(다양한 정밀도에도 불구하고)라는 두 가지 주요 단순 데이터 유형을 가지고 있다.다른 모든 술자리, 에넘(단순하지는 않지만 딱 들어맞는다) 등은 그 중 하나로 구현된다.심지어 글자도 기본적으로 정수다.

문자열 유형이 있는 다른 언어, 정의된 값에만 할당할 수 있는 열거형, 술어를 생성하는 표현식 또는 참/거짓만 사용할 수 있는 부울 유형과 비교해 보십시오.

그러나 Perl C에 비해 강하게 타이핑되어 있다고 주장할 수 있다.그래서 그것은 유명한 주장들 중 하나이다. (vi 대 emacs, Linux 대 윈도우 등)C#는 C보다 강한 타이핑이다.기본적으로 어느 쪽이든 논쟁할 수 있다.그리고 당신의 대답은 아마도 양방향으로 갈 것이다:) 또한 일부 교과서/웹 페이지에는 C가 약하게 타이핑되어 있고, 일부는 C가 강하게 타이핑되어 있다고 말할 것이다.위키피디아에 가면 C 항목에 "부분적으로 약한 타이핑"이라고 적혀 있다.Python C에 비하면 약하게 타이핑된 것 같아.파이톤/C#, C, Perl은 연속체에.

여기에 좋은 답이 많이 있다.나는 Real World Haskell로부터 중요한 점을 제기하고 싶다.

많은 언어 공동체들이 "강력한 유형"에 대한 그들만의 정의를 가지고 있다는 것을 아는 것은 유용하다.그럼에도 불구하고, 우리는 형식 시스템의 강도에 대한 개념에 대해 간략하고 넓은 용어로 말할 것이다.

(snip)

활자 시스템 주변의 불꽃놀이는 보통 영어에 뿌리를 두고 있는데, 사람들은 "약하다"와 "강하다"라는 단어에 가치관을 붙인다: 우리는 보통 힘을 약점보다 낫다고 생각한다.많은 프로그래머들이 학문적인 전문용어보다 쉬운 영어를 구사하고 있으며, 꽤 자주 학자들은 그들의 마음에 들지 않는 유형 시스템에 정말로 큰 타격을 가하고 있다.그 결과는 종종 인기 있는 인터넷 오락, 불꽃 전쟁이다.

그러므로 C와 C++에 대한 답을 보되 '강한'과 '약한'은 '좋은'과 '나쁜'으로 매핑되지 않는다는 것을 기억하라.

모든 표현은 그 가치의 함수가 아닌 유형이 있기 때문에 강한 유형이라고 말할 수 있다. 즉, 런타임 전에 알 수 있다.

OTOH 나는 그것이 강하게 타이핑된 정확한 설명인지 잘 모르겠다.내가 언어에 대한 이유를 알 수 있는 유일한 강력한 주장은 재해석형 깁스, 조합, 다른 언어로의 호출, 포인터, 조립 언어 등을 통해 런타임에 유형 시스템을 전복할 수 없다는 확신일 것이다.이와 같은 언어는 존재하지만 너무나 장애가 있어 높은 보증과 학계 밖의 프로그래머에게는 별로 관심이 없는 것 같다.누군가 지적한 바와 같이, 실제로 그렇게 하기 위해서는 다음과 같은 타입이 필요하게 된다.nonZeroInt뭐 그런 것도 아니고.우웩

C는 Javascript보다 더 강하게 타이핑되고 Ada보다 덜 강하게 타이핑된다.

나는 그것이 연속체의 강하게 타이핑된 면에 더 떨어진다고 말하고 싶다.하지만 다른 누군가가 동의하지 않을 수도 있다.

확정적으로 말하면 어때?

c는 약하게 타이핑되고 b는 무타입이다.

강하게 타이핑된 용어는 합의된 정의가 없다.따라서 '강력하게 타이핑했다'는 으로 뜻을 정의하지 않으면 질문에 대답할 수 없다.

내 경험상 '강력하게 타이핑'과 '약하게 타이핑된'이라는 용어는 트롤이 독점적으로 사용하는데, 왜냐하면 트롤의 정의가 부족하기 때문에 트롤들이 자신의 의제에 맞게 중간 주장을 재정립할 수 있기 때문이다.불꽃놀이를 시작하는 것 말고는, 이 용어들은 거의 쓸모가 없다.

여러분은 또한 강하게 타이핑된 언어의 주요 측면은 무엇인가?StackOverflow에 대해 알아보십시오.

"약하게 타이핑된"과 "강하게 타이핑된" 사이에 여러 개의 평행한 보수가 있는 연속체가 있는데, 이 두 용어는 제대로 정의되지도 않았다.

컴파일러가 모든 로컬 변수와 구조체 멤버의 선언된 유형을 알고 있다는 점에서 C는 정적으로 입력된다.

각 개체마다 특정 유형이 있지만 컴파일러가 해당 유형을 알 방법이 없는 경우 동적으로 입력된 언어는 여전히 강하게 입력할 수 있다.

당신이 질문한 이유는 무엇인가?내가 질문하는 이유는 이것이 약간의 차이점이고 당신의 특정한 "강력한 유형"의 사용은 어느 정도 설명이 필요할 수 있기 때문이다.나는 자바와 다른 언어들이 암묵적인 유형의 대화에 더 엄격한 제한을 가지고 있다고 분명히 말하고 싶다.

'강력한 활자'라는 구체적 정의가 없는 상황에서 구체적인 답을 내놓기는 어렵다.모든 변수와 모든 표현에는 유형이 있지만, 깁스를 사용하여 유형을 변경할 수 있고, 한 유형의 표현을 다른 형식으로 재해석할 수 있다는 점에서 C는 강하게 타이핑된다고 말하고 싶다.

나는 C가 당신의 컴파일러/플랫폼이 지시하는 것만큼 강하게 타이핑되어 있다고 말하고 싶다.예를 들어, 엄격한 플랫폼에 건물을 짓고 있는 경우, 유형 펀딩 포인터를 폐기하면 다음과 같은 문제가 발생할 수 있다.

void m_free(void **p)
{
        if (*p != NULL) {
                free(*p);
                *p = NULL;
        }
}

....
char *str = strdup("foo");
m_free((void **) &foo);

컴파일러에게 엄격한 별칭은 건너뛰라고 한다면 그건 문제가 되지 않을 겁니다. 하지만 아주 휴대할 수는 없을 겁니다.그래서 그런 의미에서 언어의 한계를 넘어서는 것은 가능하지만 아마도 최선의 생각은 아닐 것이다.그것은 일반적인 캐스팅을 넘어서는 한 단계 더 나아가서, 즉 오랫동안 캐스팅을 하고 있을 때 발생할 수 있는 공허의 함정 중 하나를 실제로 보여준다.

그래서, 나는 C가 기본적으로 엄격하게 타이핑되어 있다고 말하지만, 그것의 다양한 컴파일러들은 프로그래머가 가장 잘 알고 있고 약간의 융통성을 허용한다고 추측한다.이것은 정말로 컴파일러에 달려있다. 몇몇은 그 잠재적인 ops를 알아차리지 못할 것이다.그래서 그런 의미에서 선택 컴파일러는 질문에 대답할 때 정말 역할을 한다.옳은 것은 종종 당신의 컴파일러가 당신이 벗어날 수 있도록 허락하는 것과 다르다.

참조URL: https://stackoverflow.com/questions/430182/is-c-strongly-typed

반응형