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 개발 가능 소프트웨어의 종류

  1. 명령프롬프트 응용프로그램 (Windows, Linux, OS X)
  2. Windows Forms 응용프로그램
  3. Windows Presentation Foundation 응용프로그램
  4. Windows Communication Foundation 서비스
  5. Silverlight 웹 플러그인
  6. Silverlight for Windows Phone 애플리케이션
  7. Windows 8/8.1(WinFX) 애플리케이션
  8. Universal Windows App 애플리케이션
  9. ASP.NET 웹 애플리케이션
  10. ASP.NET 웹 서비스
  11. Xamarin.Android 애플리케이션 (Android)
  12. Xamarin.iOS 애플리케이션 (iOS)
  13. Xamarin.Mac 애플리케이션 (OS X)
  14. Unity 게임 응용프로그램 (Windows, Linux, OS X, Android, iOS, Windows Phone, Playstation, Xbox, ...)
  15. Microsoft Office 플러그인
  16. 운영체제 (COSMOS)
  17. ...

6 자유 소프트웨어 진영에서의 우려

자유 소프트웨어 진영에서는 C# 언어 또는 Mono 런타임을 사용하는 것이 Microsoft에 의한 소송의 우려가 있다며 사용을 자제해달라는 말을 해왔다. Microsoft에서는 이를 반박해왔으며, 현재까지 C#을 Windows 이외의 플랫폼에서 사용하여 발생한 소송은 없다. 오히려 Microsoft 자신이 다른 플랫폼에의 C# 언어 개발 지원을 위해 Microsoft Visual Studio Code IDE와 .NET Core CLR을 공개하는 등 아낌없는 지원을 하고 있다.