Mono 1.0이 나온지 무려 4년여만에 2.0이 새롭게 모습을 드러내고 있습니다. 정식 버전은 올해 가을에 발표될 예정이며 이제 슬슬 그 윤곽을 드러내고 있습니다.

http://mono.ximian.com/monobuild/preview/archive/2.0/windows-installer/0/mono-2.0-gtksharp-2.10.4-win32-0.exe

Mono 2.0은 Microsoft .NET Framework 2.0과의 호환성을 상당부분 개선하였으며, C# 3.0 스펙과, Visual Basic 컴파일러를 내장하고 있고, IronPython과 Microsoft DLR 환경을 지원하는, 멀티 플랫폼 기반 CLI 프레임워크입니다. Microsoft .NET이 Windows에 최적화된 것이 특징이라면 Mono는 이와는 반대로 다양한 플랫폼에 걸쳐서 다재다능한 역할을 수행해내는 것이 다른 점이며, 최근에는 임베디드 장비로도의 이식이 진행 중입니다.

Major Highlights (주요 변경 사항)

Mono 2.0 is a major milestone in the Mono project, and it supports the following features:
Mono 2.0은 Mono 프로젝트에 있어서 중요한 전환점이며, 다음의 기능들을 지원합니다:

Microsoft Compatible API (Microsoft 호환 API):

  • ADO.NET 2.0 API for accessing databases.
    데이터베이스 접근을 위한 ADO.NET 2.0 API를 지원합니다.
  • ASP.NET 2.0 API for developing Web-based applications.
    웹 기반 응용프로그램 개발을 위한 ASP.NET 2.0 API를 지원합니다.
  • Windows.Forms 2.0 API to create desktop applications.
    데스크톱 응용프로그램 개발을 위한 Windows Forms 2.0 API를 지원합니다.
  • System.XML 2.0: An API to manipulate XML documents.
    XML 문서를 다루기 위한 API인 System.Xml의 2.0 API를 지원합니다.
  • System.Core: Provides support for the Language Integrated Query (LINQ).
    언어 통합 질의문 (LINQ)를 위한 System.Core API를 지원합니다. (닷넷 3.5)
  • System.Xml.Linq: Provides a LINQ provider for XML.
    Linq를 통한 XML 접근을 위한 XLinq를 지원합니다.
  • System.Drawing 2.0 API: A portable graphics rendering API.
    이식 가능한 그래픽 API인 System.Drawing의 2.0 API를 지원합니다.

Mono APIs (Mono 고유의 API, Microsoft .NET에는 없는 사항들입니다):

  • Gtk# 2.12: A binding to the Gtk+ 2.12 and GNOME libraries for creating desktop applications on Linux, Windows and MacOS X.
    Gtk+ 2.12와 GNOME 라이브러리에 바인딩되는 GTK# 2.12를 제공하여 리눅스, 윈도, 맥 OS X를 위한 데스크톱 응용프로그램을 제작할 수 있습니다.
  • Mono.Cecil: A library to manipulate ECMA CLI files (the native format used for executables and libraries).
    ECMA CLI 파일을 낮은 수준에서 재생산할 수 있는 Mono.Cecil 라이브러리를 제공합니다. (System.Reflection.Emit보다 한단계 더 낮은 수준의 기능을 뜻합니다. Mono.Cecil을 이용하면, 프레임워크의 버전이나 환경을 초월하는 특수 어셈블리 생산이 가능합니다.)
  • Mono.Cairo: A binding to the Cairo Graphics library to produce 2D graphics and render them into a variety of forms (images, windows, postscript and PDF).
    Cairo 그래픽 라이브러리에 바인딩되는 Mono.Cairo 라이브러리를 제공하며, 이미지, GUI, 포스트스크립트, PDF 제작을 지원합니다.
  • Mono's SQLite support: a library to create and consume databases created with SQLite.
    SQLite 데이터베이스에 관한 API가 제공됩니다.
  • Mono.Posix: a library to access Linux and Unix specific functionality from your managed application. With both a low-level interface as well as higher level interfaces.
    리눅스와 유닉스 시스템의 낮은 수준 API들과 함께 이를 응용하는 고급 API들을 공개적으로 지원하는 Mono.Posix 라이브러리를 제공합니다. Microsoft .NET의 Microsoft.Win32 네임스페이스의 위치와 유사한 것입니다.

Third Party APIs bundled with Mono (Mono에 번들링된 써드파티 API들, 역시 Microsoft .NET에는 없는 사항들입니다):

  • Extensive support for databases: PostgresSQL, DB2, Oracle, Sybase, SQL server, SQLite and Firebird.
    PGSQL, DB2, Oracle, 사이베이스, SQL 서버, SQLite, 파이어버드 DB와의 연동을 제공합니다.
  • C5 Generics Library: we are bundling the C5 generics collection class library as part of Mono.
    C5 제네릭 라이브러리를 번들링합니다. (제네릭을 이용한 다양한 컨셉 컬렉션을 제공합니다. C++ STL과 비슷한 개념으로 생각하시면 됩니다.)

Compilers (컴파일러):

  • C# 3.0 compiler implementation, with full support for LINQ.
    C# 3.0 컴파일러와 함께 LINQ가 지원됩니다. (C# 1.0과 2.0은 이미 지원되고 있습니다.)
  • Visual Basic 8 compiler.
    Visual Basic 8.0 컴파일러가 지원됩니다.
  • IL assembler and disassembler and the development toolchain required to create libraries and applications.
    IL 어셈블러와 디스어셈블러가 지원됩니다.

좀 더 자세한 정보는 http://www.mono-project.com/ 을 참고하세요. :-)

Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

사용자 삽입 이미지

Microsoft Live Labs Volta 프로젝트 (이하 Volta 프로젝트)는 Technology Preview 단계의 프로젝트로서 클라이언트 응용프로그램에서 사용하던 프로그래밍 기법 (플랫폼 특정적인 기법이 아닌 디자인 패턴과 같은 주제들)을 웹 응용프로그램에서도 손쉽게 적용할 수 있는 모델을 구현하는 독특한 프로젝트입니다. 이름에서 알 수 있듯이 "빠르고 간편함"을 강조하고 있습니다.

Volta 프로젝트를 통하여 완성할 수 있는 응용프로그램은 상당히 특이한 모양을 지니고 있습니다. Volta Application Server를 통하여 실행할 수 있도록 간단한 스텁 코드와 컨텐츠 서버만이 제공된 상태에서 이를 Volta Application Server나 IIS 호스팅 환경 상에 게시하여 로컬 컴퓨터와 인터넷 응용프로그램으로의 Formation 전환이 손쉽게 되어있습니다.

Volta 프로젝트를 통해서 다계층 응용프로그램, AJAX 기반 웹 응용프로그램, 스마트 클라이언트와의 통합, Open API 매쉬업 등 최근 이슈가 되고 있는 다양한 웹 2.0 기술들을 한 번에 해결할 수 있게 하여 "새로운 것"에 대한 부담감을 개발자들에게서 덜어내고자 하는 것이 프로젝트의 궁극적인 목표라고 합니다.

Volta는 앞서 언급한 대로 Technology Preview 단계에 있기 때문에 기술적인 한계와 불편함이 아직 남아있으며, 발견되지 않은 문제점들도 있을 가능성이 있습니다. 제일 큰 걸림돌은 Volta가 동적으로 생성하는 JavaScript 코드와 라이브러리가 무겁고, 다운로드 시간과 처리 속도가 느리다는 단점이 있습니다. 이 문제는 향후 Volta 프로젝트가 정식 버전에 가까워질수록 많은 개선이 있을 것입니다.

조만간 Volta 프로젝트 기반의 응용프로그램에 대한 상세한 원리와 기술적 접근을 블로그에 별도의 카테고리로 개설하여 강좌를 올릴 예정이니 많은 관심 바랍니다.

Volta 공식 홈페이지: http://labs.live.com/volta
Volta 팀 블로그: http://labs.live.com/volta/blog/


Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

C#과 CLR C++에서는 params 키워드, VB.NET에서는 ParamArray를 사용하여 구현할 수 있는 가변 매개 변수 배열은 참 편리한 도구입니다. 하지만 간과하기 쉬운 몇 가지 사실을 같이 숨기게 됩니다.

1. 말장난같지만 결국 배열이다.

public static object[] ToArray(params object[] args)
{
    return args;
}

위의 코드는 "말장난"입니다. 하지만 실제 사용되는 예를 보면 다음과 같습니다.

object[] test = ToArray(1, 2, 3, 4, 5, 6);

new object[] { } 대신 ToArray를 이용하여 간단히 배열을 초기화할 수 있었습니다. 이와 같이 가변 매개 변수 배열에 지정하는 모든 파라미터들은 배열로 묶여서 데이터로 지정이 되게 됩니다. 이러한 특성을 잘 이용하면 상당히 편리한 도구를 만들 수도 있는 것입니다. 이 "말장난"같은 함수가 ASP.NET과 같은 환경에서는 상당히 유용해집니다.

<%# ToArray(1, 2, 3, 4, 5, 6) %>

위와 같이 Data Assignment 표현식에서 프로그래밍 언어에 관계없이 완곡하고도 보기 쉬운 표현을 만들어낼 수 있는 것입니다. 즉, 함수를 부를 수 있는 시점이면 어떤 식으로든 사용이 가능하다는 의미입니다.

2. 가변 매개 변수 배열로는 원소가 0개이거나 null인 배열이 "절대" 올 수 없다?

결론부터 말하면 "아닙니다". 어떻게 해서 가능한 일일까요?

object[] test = ToArray((object[])null);

컴파일러가 해석하기 나름인 구문이 될 수 있겠으나, Visual C# 컴파일러의 경우 이 구문을 해석할 때, params 키워드로 지정하게 될 가변 매개 변수 항목 전체에 대한 "대체 구문"으로 인지를 하게 됩니다. 그래서 ToArray 입장에서는 전달되는 매개변수 배열 전체가 null 참조로 지정됩니다. 그렇다면 new object[] { } 같은 구문이나 이와 동일한 상태로 설정된 개체가 오는 경우에도 전체 배열이 대치될까요? 이 경우에도 같습니다.

그렇다면 이들을 배열의 원소로 포함을 시키려면 어떻게 해야 할까요? 답은 가변 매개 변수 배열의 자식 원소 형식으로 캐스팅하여 지정하는 방법입니다. 즉, null의 경우 (object)null로, 배열의 경우 (object)new object[] { }와 같습니다.

3. 리플렉션을 이용하여 접근하는 경우는 어떻게 되나?

그냥 가져다 쓰기에도 이렇게 복잡한 사실들을 많이 내포하고 있는데 리플렉션에서는 어떨까 싶습니다. 다행스럽게도, 리플렉션을 이용하여 접근하는 입장에서는 params 키워드와는 관계없이 일반 배열 개체를 대신 지정함으로서 이런 혼란을 사전에 피할 수 있습니다. 2번 토픽에서 보았던 특징을 그대로 반영하는 것입니다. :-)

Bouns: 실험을 위하여 사용한 코드 조각

using System;

static class Program
{
 static object[] ToArray(params object[] args)
 {
  return args;
 }

 static void Main()
 {
  object[] test = ToArray(1, 2, 3, 4, 5);
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), (test.Length > 0));

  test = ToArray(new object[] { });
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), (test.Length > 0));

  object[] temp = new object[] { };
  test = ToArray(temp);
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), (test.Length > 0));

  test = ToArray((object)temp);
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), (test.Length > 0));

  test = ToArray((object)null);
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), (test.Length > 0));

  test = ToArray((object[])null);
  Console.WriteLine("test != null: {0}, test.Length > 0: {1}", (test != null), "N/A");
 }
}


Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다