1. 개요
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 운영체제를 개발할 수 있고 셰이더 프로그램을 개발할 수도 있다.
2. 언어적 특성
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 등에 있던 기능을 가져온 것으로, 형식 문자열을 사용해야 했던 기존 방식의 불편함을 많이 해소하여 생산성을 향상시켰다.
버전업이 될 때마다 다른 언어의 긍정적인 요소들을 적극적으로 차용하여 개발자들의 생산성을 향상시키면서도 되도록이면 해당 문법을 사용하지 않고도 개발이 가능하도록 유지하는 경향이 있다.
3. 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를 폐쇄하거나 통합할 가능성이 있다.
4. 국제 표준
C# 1.0, 1.1, 2.0은 ECMA 및 ISO 표준으로 등록되어 있다. 따라서 이 버전들은 규격을 마음대로 가져다 사용해도 큰 문제가 없다. 이후의 버전은 ECMA나 ISO 어느쪽에도 국제 표준으로 등록되지 않았지만 C# 5.0의 경우에는 2014년부터 ECMA 표준 등록 절차를 밟고 있다는 뜬소식은 있다.
5. 개발 가능 소프트웨어의 종류
- 명령프롬프트 응용프로그램 (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)
- ...
6. 자유 소프트웨어 진영에서의 우려
자유 소프트웨어 진영에서는 C# 언어 또는 Mono 런타임을 사용하는 것이 Microsoft에 의한 소송의 우려가 있다며 사용을 자제해달라는 말을 해왔다. Microsoft에서는 이를 반박해왔으며, 현재까지 C#을 Windows 이외의 플랫폼에서 사용하여 발생한 소송은 없다. 오히려 Microsoft 자신이 다른 플랫폼에의 C# 언어 개발 지원을 위해 Microsoft Visual Studio Code IDE와 .NET Core CLR을 공개하는 등 아낌없는 지원을 하고 있다.