실제 애플리케이션 측면에서 C, C# 및 C++의 차이점은 무엇입니까?
앞서 여기에 게시한 바와 같이, 저는 이것들 중 하나를 시도해 보기로 결정했습니다. 하지만 웹 개발자로서 저의 관심사를 고려할 때, 저는 그것들이 실제 응용 분야에서 어떻게 다른지 알고 싶습니다.
노트 편집:
제가 웹 개발자인 동안, 그것이 당신의 대답을 제한하게 하지 마세요.난 30살...저는 앞으로 수년간의 경력 변화가 있을 것입니다.
제가 ASFAC++B를 한다는 것을 명심하세요. :) 제가 가장 중요한 차별화 요소를 먼저 꼽았습니다.
가비지 컬렉션
가비지 컬렉션(GC)은 이러한 언어를 구별하는 데 가장 중요한 단일 요소입니다.
C 및 C++는 GC와 함께 사용할 수 있지만, 사후에 볼트로 연결되어 작동할 수도 없습니다(가장 잘 알려진 것은 여기에 있습니다). "보수적"이어야 하므로 사용하지 않는 모든 메모리를 수집할 수 없습니다.
C#은 GC 플랫폼에서 작동하도록 처음부터 설계되었으며 표준 라이브러리도 그런 방식으로 설계되었습니다.그것은 믿을 만한 경험을 해야 하는 개발자 생산성에 절대적인 근본적인 차이를 만듭니다.
C/C++ 사용자들 사이에는 GC가 "나쁜 성능"과 동일시한다는 믿음이 널리 퍼져 있습니다.하지만 이것은 시대에 뒤떨어진 민속입니다(심지어 C/C++의 벰 수집가도 대부분의 사람들이 기대하는 것보다 훨씬 더 잘 수행합니다).일반적인 두려움은 프로그램이 중지되어 GC가 일부 작업을 수행할 수 있는 "긴 일시 중지"입니다.그러나 실제로 이러한 긴 일시 중지는 가상 메모리 시스템 위에서 실행되기 때문에 비GC 프로그램에서 발생합니다. 가상 메모리 시스템은 때때로 물리적 메모리와 디스크 간의 데이터 이동을 중단합니다.
또한 GC를 shared_ptr로 대체할 수 있다는 믿음이 널리 퍼져 있지만 그럴 수 없습니다. 아이러니하게도 멀티 스레드 프로그램에서는shared_ptrGC 기반 시스템보다 느립니다.
GC가 실용적이지 않을 정도로 절약되는 환경이 있지만 이러한 환경은 점점 더 희귀해지고 있습니다.휴대폰에는 일반적으로 GC가 있습니다.C#가 일반적으로 실행되는 CLR의 GC는 최첨단으로 보입니다.
약 18개월 전에 C#을 채택한 이후로 프로파일러를 사용하여 순수 성능 튜닝의 여러 단계를 거쳤으며 GC는 프로그램 운영 중에 거의 보이지 않을 정도로 효율적입니다.
GC는 만병통치약이 아닙니다. 모든 프로그래밍 문제를 해결하는 것은 아닙니다. 메모리 할당을 정말로 정리할 뿐입니다. 만약 당신이 매우 큰 메모리 블록을 할당하고 있다면, 당신은 여전히 주의가 필요할 것이고, 충분히 복잡한 프로그램에서 메모리 누수에 해당하는 양을 갖는 것은 여전히 가능합니다.GC가 생산성에 미치는 영향은 그것을 만병통치약에 꽤 근접하게 만듭니다!
정의되지 않은 동작
C++은 정의되지 않은 행동의 개념에 기초합니다.즉, 언어 사양은 특정한 좁은 범위에서 정의된 언어 기능의 사용의 결과를 정의하며, 다른 모든 사용은 정의되지 않은 행동을 유발하는 것으로 설명합니다.원칙적으로 작업이 어떤 결과를 가져올 수 있다는 것을 의미합니다(실제로 이것은 명백하게 비결정론적인 데이터 손상과 관련된 해결하기 어려운 버그를 의미합니다).
C++에 관한 거의 모든 것은 정의되지 않은 행동에 관한 것입니다.람다 식과 같은 매우 유용한 기능도 스택을 손상시키는 편리한 방법으로 쉽게 사용할 수 있습니다(참고로 로컬을 캡처하고 람다 인스턴스가 로컬보다 오래도록 허용).
C#은 가능한 모든 작업이 정의된 동작을 가져야 한다는 원칙에 기초합니다.발생할 수 있는 최악의 상황은 예외가 발생하는 것입니다.이것은 소프트웨어 구성의 경험을 완전히 바꿉니다.
(포인터가 있어 동작이 정의되지 않은 안전하지 않은 모드가 있지만 일반적으로 사용하는 것은 권장되지 않습니다. 임베디드 어셈블리 언어와 유사하다고 생각하십시오.)
복잡성
복잡성 측면에서, 특히 곧 표준화될 새로운 버전을 고려할 때 C++을 선택해야 합니다.C++는 GC를 가정하지 않고 스스로를 효과적으로 만들기 위해 할 수 있는 모든 것을 하며, 그 결과 놀라운 학습 곡선을 갖게 됩니다.언어 설계자들은 "이러한 기능은 일반 사용자가 아닌 라이브러리 작성자만을 위한 것입니다."라고 말하며 이를 대부분 설명하지만, 모든 언어에서 실제로 효과적으로 사용하려면 코드를 재사용 가능한 라이브러리로 구축해야 합니다.그래서 도망칠 수 없습니다.
긍정적인 면에서, C++는 너무 복잡해서 괴짜들의 놀이터와 같습니다!이 모든 것이 어떻게 조화를 이루는지 배우는 것이 매우 즐거울 것이라고 장담할 수 있습니다.그러나 메인스트림 플랫폼에서 생산적인 새로운 작업(오, 낭비된 세월...)의 기초로 이를 진지하게 추천할 수는 없습니다.
C는 언어를 단순하게 유지하지만("컴파일러는 쓰기 쉽다"는 의미에서 단순합니다), 이것은 코딩 기술을 더 난해하게 만듭니다.
모든 새로운 언어 기능이 복잡성을 가중시키는 것은 아닙니다.일부 언어 기능은 컴파일러가 사용자를 위해 확장하는 단축형이기 때문에 "통사적 설탕"으로 설명됩니다.이것은 최근 몇 년간 C#의 향상된 기능을 많이 생각해 볼 수 있는 좋은 방법입니다.언어 표준은 심지어 번역을 긴 손으로 제공함으로써 일부 기능을 지정합니다.using는 이술로확으로 됩니다.try/finally.
어느 순간, C++ 템플릿을 같은 방식으로 생각하는 것이 가능했습니다.하지만 그 이후로 그들은 매우 강력해졌고, 그들은 이제 그들만의 열정적인 사용자 커뮤니티와 관용구를 가진 언어의 완전히 다른 차원의 기초를 형성하고 있습니다.
도서관
C와 C++의 가장 이상한 점은 사전 컴파일된 라이브러리의 표준 호환 형식이 없다는 것입니다.다른 사람의 코드를 프로젝트에 통합하는 것은 항상 약간 엉성하며, 프로젝트에 연결하는 방법에 대해 모호한 결정을 내려야 합니다.
또한,기본적입니다 - 문자열을 또, 표는라러리는매다니우입 - C++완전한데이터구한다문있조니집을합습표자가방열현과고지하본는을법기적브 - C++준이는▁()을 가지고 .std::string), 하지만 그것은 여전히 미미합니다.디렉터리에서 파일 목록을 찾는 표준 방법이 있습니까?놀랍게도, 아니에요! 분석하거나 ?XML을 구문 분석하거나 생성하기 위한 표준 라이브러리 지원이 있습니까?아니요. 데이터베이스에 접근하는 건 어때요?좀 진지해 보세요!웹 사이트를 백엔드로 작성하시겠습니까?너 미쳤어?기타.
그래서 당신은 더 먼 들판을 사냥해야 합니다.XML의 경우 Xerces를 사용합니다.하지만 그것은 사용합니까?std::string 현는것하? 물론 당연히 그러면 안된다!
그리고 이 모든 제3자 도서관들은 클래스와 기능의 이름을 짓는 독특한 관습을 가지고 있습니까?물론이죠!
C#의 상황은 이보다 더 다를 수 없습니다. 기본적인 것들은 처음부터 제자리에 있었기 때문에 모든 것이 아름답게 상호 작용합니다(그리고 기본적인 것들이 CLR에 의해 제공되기 때문에, 언어 간 지원이 있습니다).
모든 것이 완벽한 것은 아닙니다. 제네릭은 처음부터 제자리에 있어야 하지만 그렇지 않았습니다. 이것은 일부 오래된 도서관에 눈에 띄는 흉터를 남깁니다. 하지만 이것을 외부적으로 고치는 것은 보통 사소한 일입니다.또한 많은 인기 있는 라이브러리가 Java에서 포팅되어 처음처럼 적합하지 않습니다.
폐쇄(로컬 변수 캡처를 사용하는 익명 방법)
자바와 C는 사실상 폐쇄가 없는 마지막 주류 언어이며, 라이브러리는 폐쇄가 없는 것보다 훨씬 깔끔하게 설계되고 사용될 수 있습니다(이것이 포팅된 자바 라이브러리가 C# 사용자에게 가끔 투박하게 보이는 한 가지 이유입니다).
C++의 재미있는 점은 C++의 표준 라이브러리가 언어(컨테이너 유형)로 클로저를 사용할 수 있는 것처럼 설계되었다는 것입니다.<algorithm>,<functional>, 그것들은 그리고 10년이 흘렀고, 이제 마침내 그것들이 추가되고 있습니다!그들은 큰 영향을 미칠 것입니다(위에서 언급한 바와 같이, 그들은 미세한 행동을 누설합니다).
C#과 JavaScript는 폐쇄가 "이형성"되는 가장 널리 사용되는 언어입니다. (이러한 언어들의 주요 차이점은 C#은 정적으로 입력되고 JavaScript는 동적으로 입력된다는 것입니다.)
플랫폼 지원
제가 이것을 마지막으로 한 것은 이 언어들이 여러분이 생각하는 것만큼 차별화되지 않는 것처럼 보이기 때문입니다.이러한 모든 언어는 여러 OS 및 시스템 아키텍처에서 실행될 수 있습니다.C는 가장 광범위하게 지원되며, 그 다음은 C++, 마지막으로 C#입니다(비록 C#은 Mono라고 불리는 오픈 소스 구현 덕분에 대부분의 주요 플랫폼에서 사용될 수 있지만).
윈도우와 다양한 유닉스 맛 사이에 C++ 프로그램을 포팅한 경험은 불쾌했습니다.저는 C#에서 매우 복잡한 것을 Mono로 포팅해 본 적이 없어서 그것에 대해 언급할 수 없습니다.
C와 C++는 모두 더 낮은 수준의 추상화를 제공하므로 복잡성이 증가하여 다른 언어에 노출될 필요가 없는 기본 기계 기능에 대한 광범위한 액세스를 제공합니다.C와 비교하여 C++은 전체 객체 지향 언어의 편의성(개발 시간 단축)을 추가하여 잠재적으로 추가 성능 비용을 추가할 수 있습니다.실제 애플리케이션의 측면에서, 저는 이러한 언어들이 다음과 같은 영역에 적용된다고 봅니다.
C
- 커널 레벨 소프트웨어.
- 하드웨어 장치 드라이버
- 오래되고 안정적인 코드에 대한 액세스가 필요한 애플리케이션.
C,C++
- 메모리 관리를 미세 조정해야 하는 애플리케이션 또는 서버 개발(일반 가비지 수집 솔루션에 맡길 수 없음)
- 보다 현대적인 관리 언어와 잘 연결되지 않는 라이브러리에 대한 액세스가 필요한 개발 환경.
- 관리되는 C++를 사용하여 .NET 프레임워크에 액세스할 수 있지만 원활한 전환은 아닙니다.
C#은 더 높은 수준의 추상화를 다시 추가하는 관리 메모리 모델을 제공합니다.이러한 추상화 수준은 편의성을 높이고 개발 시간을 향상시키지만 하위 수준의 API에 대한 액세스를 복잡하게 만들고 전문화된 성능 요구사항을 문제로 만듭니다.
관리되는 메모리 환경에서 매우 높은 성능의 소프트웨어를 구현할 수 있는 것은 확실하지만, 그 영향에 대한 인식은 필수적입니다.
C#의 구문은 C/C++보다 확실히 덜 까다롭고 오류가 발생하기 쉬우며, 초기 프로그래머에게는 더 얕은 학습 곡선을 가지고 있습니다.
C#
- 신속한 클라이언트 애플리케이션 개발.
- .NET 프레임워크의 이점을 활용하는 고성능 서버 개발(예: StackOverflow).
- .NET 프레임워크가 설계된 언어로 제공되는 이점이 필요한 응용 프로그램입니다.
Johannes Rösel은 C# Pointers, Sanforced 및 Unchecked 키워드를 사용하면 C#이 구축되는 추상화 계층을 돌파할 수 있다는 유효한 요점을 제시합니다.프로그래밍 유형은 대부분의 C# 개발 시나리오의 예외이며 언어의 기본 부분이 아닙니다(C/C++의 경우처럼).
C는 모든 것을 스스로 할 수 있도록 하는 단순하고 깨끗한 언어입니다.그것은 당신의 손을 잡는 것이 아니라, 당신의 발에 총을 쏘는 것을 막지 못합니다.하지만 그것은 여러분이 원하는 것을 하는 데 필요한 모든 것을 가지고 있습니다.
C++는 클래스가 추가된 C이고, 그 다음에는 많은 다른 것들과 더 많은 것들이 추가됩니다.손을 잡을 수는 없지만, 추가 GC나 RAII, 스마트 포인터를 사용하여 자신의 손을 잡을 수 있습니다.달성하고자 하는 것이 있다면 템플릿 시스템을 악용하여 비교적 쉬운 구문을 제공할 수 있습니다(C++0x의 경우 더 그렇습니다).이 복잡성은 또한 여러분이 실수로 여러분 자신의 12개의 인스턴스를 만들고 그것들을 모두 발에 쏠 수 있는 힘을 줍니다.
C#은 C++와 Java에서 향상된 Microsoft의 강점입니다.구문적 특징은 많지만, C++의 복잡성 근처에는 없습니다.전체 관리 환경에서 실행되므로 메모리 관리가 수행됩니다.그것은 당신이 "더럽게" 되고 필요하다면 안전하지 않은 코드를 사용할 수 있게 해주지만, 그것은 기본이 아니며, 당신은 스스로를 쏘기 위해 약간의 작업을 해야 합니다.
제 의견은 C#이고 웹 편향적인 개발은 ASP.NET이 세 가지 중에서 가장 좋을 것 같습니다.
나는 더 이상 C나 C++로 새로운 웹 앱을 쓰는 사람이 있는지 의심스럽습니다.이는 10년 전에 이루어졌으며, 아직도 많은 레거시 코드가 사용되고 있지만, 특별히 적합하지 않으며, 툴 지원이 많지 않은(진행 중인) 것으로 보이며, 웹 개발(아마도 웹 서버 개발 제외)을 수행하는 소규모 활성 커뮤니티를 보유하고 있을 것입니다.저는 예전에 많은 웹사이트 C++ COM 객체를 작성했지만, C#이 훨씬 더 생산적이어서 C나 C++(이 맥락에서) 코드를 작성할 필요가 없는 한 강제적인 이유가 없습니다.
저는 여전히 필요한 경우 C++를 쓰지만 일반적으로 작은 문제 영역을 위한 것입니다. 예를 들어 C#에서 P/Invoke를 통해 이전 C-style dll로 통신합니다. C#에서 완전히 서투른 작업을 수행하는 것은 C++ COM 개체를 브리지로 만드는 데 쉬운 일이었습니다.
C#의 좋은 점은 쓰기 Windows 및 콘솔 앱으로 쉽게 전환하여 C#에 머물 수 있다는 것입니다.모노를 사용하면 Windows(윈도우)로 제한되지 않습니다(사용하는 라이브러리로 제한될 수도 있음).
어쨌든 이것은 모두 웹에 편향된 관점에서 본 것입니다.임베디드 기기에 대해 묻는다면 C 또는 C++라고 말할 것입니다.이 중 어느 것도 웹 개발에 적합하지 않다고 주장할 수 있지만, C#/ASP.NET은 상당히 매끄럽고, 잘 작동하며, 온라인 리소스, 거대한 커뮤니티 및 무료 개발 도구가 있습니다.
따라서 현실적인 관점에서, 요청한 대로 C#, C++, C 중 하나만 선택하는 것이 일반적으로 C#을 고수하는 것이 좋습니다.
C - Hands-on으로 설명되는 이전 프로그래밍 언어입니다.프로그래머로서 당신은 프로그램에게 모든 것을 하라고 말해야 합니다.또한 이 언어는 당신이 거의 모든 것을 할 수 있게 해줄 것입니다.개체 또는 들여쓰기 코드를 지원하지 않습니다.따라서 수업이 없습니다.
C++ - C의 확장 언어 그 자체입니다.C 코드에서 ++는 증분 1을 의미합니다.따라서 C++가 C보다 낫습니다.고도로 제어되는 개체 또는 들여쓰기된 코드를 허용합니다.다시 한 번, 매우 세부적인 언어에 손을 댔습니다.
C# - C/C++ 코드 스타일과 유사한 전체 개체 또는 접미사 코드입니다.이것은 JAVA에 매우 가깝습니다.C#은 C 스타일 언어의 최신 버전이며 웹 애플리케이션을 개발하는 데 매우 좋습니다.
당신의 다른 게시물들을 보면, 당신은 새로운 기술을 얻기 위해 새로운 언어를 배우고 싶어하는 것 같습니다.제 조언은 언어가 정말 중요한 것이 아니라, 중요한 것은 커뮤니티의 품질(자문뿐만 아니라 읽고 배울 수 있는 기존 코드)과 사용 가능한 라이브러리/프레임워크입니다.이런 점에서, 저는 "C 패밀리"가 당신에게 최선의 선택이 아니라고 생각합니다. 웹 라이브러리와 프레임워크는 거의 없고, 휴대하기 어렵고, 훌륭하지 않으며, 당신이 공부할 수 있는 코드의 코딩 스타일은 매우 다양하고 당신을 많이 혼란스럽게 할 수 있습니다(C가 제가 좋아하는 언어이긴 하지만).
저는 그냥 C를 배우고 포인터의 개념을 정말로 이해하려고 노력한 다음 웹에 더 적응된 다른 언어로 이동하는 것이 좋다고 조언하고 싶습니다.또한 C 제품군에서 Objective-C는 파워와 심플함의 조합이 가장 뛰어나다고 생각하지만 틈새 플레이어입니다.
C는 CPU 머신 코드와 가장 유사하고 직접적으로 번역되는 핵심 언어입니다. CPU는 이동, 추가, 논리적 결합, 비교, 점프, 푸시 및 팝업 명령을 따릅니다.C는 훨씬 더 쉬운 구문을 사용하여 정확하게 이 작업을 수행합니다.분해를 공부하면 조립만큼 빠르고 콤팩트한 C 코드를 작성하는 법을 배울 수 있습니다.메모리가 제한된 8비트 마이크로 컨트롤러에서 제가 선호하는 언어입니다.C에서 대형 PC 프로그램을 작성하면 조직이 한정되어 있어 문제가 발생합니다.여기서 객체 지향 프로그래밍이 강력해집니다.데이터와 함수를 함께 포함하는 C++ 및 C# 클래스의 기능은 조직을 강화하므로 C보다 더 복잡한 작업이 가능합니다.과거 CPU에 코어가 하나밖에 없었던 C++은 빠른 처리에 필수적이었습니다.저는 이제 C#을 배우기 시작했습니다.클래스 전용 구조는 C++보다 더 높은 수준의 조직을 강제하는 것으로 보이며, 이는 궁극적으로 더 빠른 개발로 이어지고 코드 공유를 촉진해야 합니다.C#은 VB처럼 해석되지 않습니다.개발 시점에 부분적으로 컴파일된 후 런타임에 추가로 번역되어 플랫폼에 친숙해집니다.
원시 속도의 경우 C를 사용합니다.검정력의 경우 C++을 사용합니다..NET 호환성을 위해 C#을 사용합니다.
그들은 모두 언어적으로 매우 복잡합니다; C는 수십 년의 점진적인 증가를 거쳐가고, C++는 수년간의 더 빠른 발전을 거쳐가고, C#는 마이크로소프트의 힘을 통해 옵니다.
언급URL : https://stackoverflow.com/questions/692225/what-are-the-differences-between-c-c-sharp-and-c-in-terms-of-real-world-appli
'programing' 카테고리의 다른 글
| "LINQ 표현식 노드 유형 'Invoke'는 LINQ to Entities에서 지원되지 않습니다." - 스텀핑! (0) | 2023.07.15 |
|---|---|
| 정렬된 결과 집합의 위치를 기준으로 mysql 테이블에서 레코드에 대한 단일 행 번호 가져오기 (0) | 2023.07.15 |
| Ref 개체가 정의되지 않은 TypeScriptReact일 수 있습니다. (0) | 2023.07.15 |
| inteliJ 스프링 부트 그래들 플러그인 3.0.0에서 일치하는 변형을 찾을 수 없습니다. (0) | 2023.07.15 |
| 사전 및 집합의 순서가 임의인 이유는 무엇입니까? (0) | 2023.07.15 |