C#은 Microsoft, Hewlett-Packard, Intel의 세 회사가 합작해 만든 컴퓨터 언어로, Java의 대항마로 개발되었다. 현재는 Microsoft만 언어 표준 정의 및 개발을 하고 있다. 공식 C# 컴파일러는 C# 6.0 컴파일러부터 Roslyn으로 개발된 컴파일러를 사용하며, 비공식 C# 컴파일러로 Mono C# 컴파일러가 있다. 이 컴파일러들은 C# 원시 코드를 CIL 어셈블리 코드로 변환하는 기능을 수행한다. C#의 런타임으로는 .NET Framework를 사용하며, 이를 사용할 수 없는 환경에서는 Mono 런타임을 사용한다. 런타임에는 JIT 컴파일러가 내장되어 있어 CIL 어셈블리 코드를 CPU 네이티브 코드로 변환하여 캐시해서 사용한다.
이름의 유래는 C++++으로, ++ 두 개를 위아래로 배치하여 #을 사용하는 것으로 알려져 있다. 다만 #이라는 글자가 URI에서 해당 문자 뒤의 모든 문자를 무시하는 문자이기 때문에 각종 위키 문서 등에서는 # 문자 대신 Sharp 등 단어를 사용하는 등 불편함이 있다.
JIT 컴파일러 언어이긴 하지만 CPU 명령어로 변환하는 프로그램 등을 이용하여 네이티브 프로그램으로 변환할 수도 있다. 실제로 이런 원리로 iOS 앱이나 COSMOS 운영체제를 개발할 수 있고 셰이더 프로그램을 개발할 수도 있다.
역사
C# 언어는 초기에 마이크로소프트의 주도 하에 휴렛 팩커드, 인텔의 지원에 힘입어 개발된 언어이다. Java 언어에 대항하여 개발이 시작되었는데, 이 배경에는 마이크로소프트의 비주얼 J++ 및 마이크로소프트 JVM을 이유로 썬 마이크로시스템즈에 의해 소송당한 이유가 크다.
닷넷 프레임워크 2.0과 함께 배포된 C# 2.0은 ECMA[1] 및 ISO[2]에 표준으로 등록되었다. 다만 이후 새 버전들은 5.0을 제외하면 ISO에 개정안이 제출되지 않았다. ECMA에는 1.0버전부터 최신 버전인 7.0까지 모두 등록되어 있다.
C# 2.0이 사용되던 시기에는 수세 리눅스로 유명한 노벨 사의 한 프로그래머가 Mono라는 런타임 및 C# 컴파일러를 개발했는데, 많은 오픈소스 커뮤니티 사용자들은 C#을 사용할 경우 마이크로소프트의 특허 침해로 인한 위기를 맞을 수 있다며 우려했으며, 많은 언어 이용자들을 확보해야 하는 마이크로소프트는 Mono를 상당히 반겨했으며 절대로 C# 및 닷넷으로 특허권을 행사하지 않겠다고 약속했다.
특징
기본적인 문법은 Java에서 계승되었으나, 상당히 많은 프로그래밍 언어의 문법들이 참고되어 적용되었다. 이를 테면 함수형 언어의 특징이 녹아있는 Lambda 문법, 두 개의 함수가 교차 실행되는 Coroutine 문법, DBMS에서 사용하는 SQL 문법이 차용된 Linq 문법, 인터프리터 언어에서 자주 쓰이는 동적 객체 및 동적 타입, PHP 및 스위프트 등에서 유용하게 쓰이는 형태의 문자열 보간 문법 등 상당히 많은 언어들이 분석 및 참고되어 새 버전에 계속 추가되고 있다.
C#의 새 버전은 보통 닷넷 프레임워크의 주 버전이 개정될 때 갱신되는데, 최신 버전의 C# 문법은 이전 버전 닷넷 프레임워크에서도 사용할 수 있다. 다만 개발 도구를 업데이트 해야 사용할 수 있기 때문에 최신 문법을 이용하려면 최신 버전의 비주얼 스튜디오를 사용해야 한다.
- C# 초기 버전에서는 Java의 언어적 특성을 많이 차용했고 C++의 문법을 최대한 사용하려고 노력한 흔적이 보인다. 실제로도 Java 사용자 지분을 가져오기 위해 Java와 비슷한 문법을 통해 C#과 Java 간의 코드 변환 도구도 제공하고 아예 Java의 jar 파일을 참조하여 사용하는 기능도 지원했다. C# 2.0에서 추가된 제네릭 프로그래밍의 경우 C++의 템플릿 프로그래밍보다는 Java의 제네릭 프로그래밍 쪽에 더 초점을 맞추어 개발되었다.
- C# 3.0부터는 LINQ 문법을 추가하여 SQL과 같은 쿼리 형태로 사용하는 기능을 추가하여 SQL에 익숙한 개발자 등이 환영했다. 또한 Lambda 문법이 추가되어 함수형 언어의 특성을 가져오기도 했다.
- C# 4.0에서 추가된 Covariant 및 Contravariant 제네릭 타입은 제네릭 타입에 있어서의 객체지향적인 문법을 강화했다. 그러면서도 선택적 인자 문법의 추가로 C++이나 Visual Basic에서 지원하던 매개변수 기본 값의 지원을 시작해 생산성을 향상시켰다.
- C# 5.0에서 추가된 async 및 await 문법을 통해 비동기 연산에 강한 언어적 특성이 추가되었다.
- C# 6.0에서 추가된 String Interpolation 기능은 Swift 등에 있던 기능을 가져온 것으로, 형식 문자열을 사용해야 했던 기존 방식의 불편함을 많이 해소하여 생산성을 향상시켰다.
버전업이 될 때마다 다른 언어의 긍정적인 요소들을 적극적으로 차용하여 개발자들의 생산성을 향상시키면서도 되도록이면 해당 문법을 사용하지 않고도 개발이 가능하도록 유지하는 경향이 있다.
Mono
Mono는 .NET Framework 및 C# 컴파일러 등의 오픈소스 버전으로, Microsoft와는 전혀 상관 없이 개인이 제작을 시작하였다. 이후 Novell에서 관리되기 시작했고, WPF, WCF 등과 같은 규모가 큰 .NET Framework 구성요소들은 구현되지 않았으며 한동안 유니코드에 약한 모습을 보였다.
Novell에서 운영할 때는 자사 제품인 OpenSUSE등 Linux 위주에서 특히 강한 모습을 보였으나 Xamarin에서 인수한 뒤로는 Android, iOS 등에서의 동작을 최적화하는 등 더 나은 모습을 보여주었고, Microsoft에서 .NET CLR 관련 소스코드들을 모두 오픈한 뒤로는 Mono에서 일부 소스코드를 가져다 사용하는 등 점점 .NET Framework와의 차이점을 좁히고 있다.
현재 Xamarin이 Microsoft에 인수되었기 때문에 Mono도 Microsoft에서 관리하는 셈이 되었는데, 최근 Microsoft가 Linux나 OS X 등에서도 구동이 가능한 .NET Core CLR를 공개했기 때문에 점차 Mono를 폐쇄하거나 통합할 가능성이 있다.
국제 표준
C# 1.0, 1.1, 2.0은 ECMA 및 ISO 표준으로 등록되어 있다. 따라서 이 버전들은 규격을 마음대로 가져다 사용해도 큰 문제가 없다. 이후의 버전은 ECMA나 ISO 어느쪽에도 국제 표준으로 등록되지 않았지만 C# 5.0의 경우에는 2014년부터 ECMA 표준 등록 절차를 밟고 있다는 뜬소식은 있다.
용도
C#이 공개된 초기에는 C#을 이용할 수 있는 용도로는 Win32 응용프로그램, Win32 콘솔 응용프로그램, Win32 서비스, ASP.NET 웹 서비스 정도만 개발할 수 있었다.
C#이 구동되는 런타임인 닷넷 프레임워크가 지원하는 플랫폼의 한계가 컸기 때문인데, 이후로도 스티브 발머의 CEO 재임 기간에는 마이크로소프트와 관련된 플랫폼인 윈도우, 윈도우 CE 및 윈도우 모바일, Zune, 윈도우폰, 엑스박스 360을 제외하면 ASP.NET 웹 서비스, 실버라이트 웹 플러그인 정도나 C#으로 개발할 수 있었고 이 외에는 정식 지원 플랫폼이 아닌 리눅스 및 유닉스, macOS를 Mono를 이용해 구동하는 정도였다.
사티아 나델리가 마이크로소프트의 새 CEO가 된 이후로는 공식 지원 플랫폼의 범위가 넓어져서 C#의 최신 버전인 7.0을 개발할 수 있는 IDE인 Visual Studio 2017 기준으로 아래와 같은 플랫폼을 공식 지원하게 되었다.
오픈소스 버전인 Mono 런타임이 지원하는 플랫폼은 아래와 같다.
이 외에 Cosmos라는 프로젝트에서 C#을 이용해 운영체제를 개발할 수 있는 도구를 제공한다.[3]
개발 가능 소프트웨어의 종류
- 명령프롬프트 응용프로그램 (Windows, Linux, OS X)
- Windows Forms 응용프로그램
- Windows Presentation Foundation 응용프로그램
- Windows Communication Foundation 서비스
- Silverlight 웹 플러그인
- Silverlight for Windows Phone 애플리케이션
- Windows 8/8.1(WinFX) 애플리케이션
- Universal Windows App 애플리케이션
- ASP.NET 웹 애플리케이션
- ASP.NET 웹 서비스
- Xamarin.Android 애플리케이션 (Android)
- Xamarin.iOS 애플리케이션 (iOS)
- Xamarin.Mac 애플리케이션 (OS X)
- Unity 게임 응용프로그램 (Windows, Linux, OS X, Android, iOS, Windows Phone, Playstation, Xbox, ...)
- Microsoft Office 플러그인
- 운영체제 (COSMOS)
- ...
자유 소프트웨어 진영에서의 우려
자유 소프트웨어 진영에서는 C# 언어 또는 Mono 런타임을 사용하는 것이 Microsoft에 의한 소송의 우려가 있다며 사용을 자제해달라는 말을 해왔다. Microsoft에서는 이를 반박해왔으며, 현재까지 C#을 Windows 이외의 플랫폼에서 사용하여 발생한 소송은 없다. 오히려 Microsoft 자신이 다른 플랫폼에의 C# 언어 개발 지원을 위해 Microsoft Visual Studio Code IDE와 .NET Core CLR을 공개하는 등 아낌없는 지원을 하고 있다.
부연 설명
출처
- ↑ “Standard ECMA-334”. 《ECMA International》.
- ↑ “ISO/IEC DIS 23270”. 《International Organization for Standardization》.
- ↑ “COSMOS - C# Open Source Managed Operating System”.