Vala(프로그래밍 언어)

Vala (programming language)
바라
Vala Logo.svg
패러다임멀티패러다임: 명령형, 구조화, 객체 지향형
개발자위르그 빌레터, 라파엘레 산드리니
처음 등장한2006년, 16년 전(2006년)
안정된 릴리스
  • 2022년 7월 14일 0.56.2[1], 25일 전(2022-07-14)
타이핑 분야정적, 강력, 추정, 구조
OS크로스 플랫폼은 모두 GLib에서 지원되지만 소스 코드로만 배포됩니다.
면허증.LGPLv2.1+
파일 이름 확장자.vala, .valai
웹 사이트vala.dev
영향을 받다
C, C++, C#, D, Java, Boo

Vala는 C 코드를 생성하고 GObject 시스템을 사용하는 자체 호스팅 컴파일러를 사용하는 객체 지향 프로그래밍 언어입니다.

Vala는 구문적으로 C#과 비슷하며 익명 함수, 신호, 속성, 제네릭, 보조 메모리 관리, 예외 처리, 유형 추론 및 포어치 [2]문과 같은 주목할 만한 기능을 포함합니다.개발자인 Jürg Billeter와 Raffaele Sandrini는 GObject 객체 시스템을 타깃으로 하여 오버헤드가 적고 특별한 런타임 지원이 없는 플레인 C 런타임에 이러한 기능을 제공하고자 했습니다.기계어나 어셈블리 언어로 직접 컴파일하는 대신 하위 중간 언어로 컴파일합니다.소스-투-소스 컴파일러는 C로 컴파일되며, C 컴파일러는 GCCClang[3]같은 특정 플랫폼을 위해 컴파일됩니다.

네이티브 코드 라이브러리에서 기능을 사용하려면 vapi 파일을 작성하고 라이브러리 인터페이스를 정의해야 합니다.특히 GObject에 기반한 경우 이러한 인터페이스 정의를 C 라이브러리에 대해 잘 문서화되어 있습니다.바인딩은 이미 멀티미디어 라이브러리 SDL, OpenGL 등 GObject에 기반하지 않은 C 라이브러리를 포함하여 많은 라이브러리에 사용할 수 있습니다.

묘사

Vala는 스크립트 언어의 고급 빌드 시간 성능과 하위 프로그래밍 언어의 런타임 성능을 결합한 프로그래밍 언어입니다.C로 작성된 애플리케이션 및 라이브러리와 비교하여, 추가 런타임 요구 사항을 부과하지 않고 다른 ABI를 사용하지 않고 GNOME 개발자들에게 현대적인 프로그래밍 언어 기능을 제공하는 것을 목표로 한다.Vala의 구문은 C#과 비슷하며 GObject 유형 시스템에 [4]맞게 수정되었습니다.

역사

Vala는 Jürg Bilter에 의해 고안되었으며, 그와 Raffaele Sandrini에 의해 구현되었습니다.그는 GNOME 어플리케이션 개발을 위한 보다 높은 수준의 대안을 원했습니다.C#의 구문과 시멘틱스는 마음에 들었지만 Mono를 사용하고 싶지 않았기 때문에 2006년 5월에 컴파일러를 완료했습니다.처음에는 C를 사용하여 부트스트랩이 이루어졌으며 1년 후(2007년 7월 버전 0.1.0 출시) Vala 컴파일러는 셀프호스트가 되었습니다.2021년 현재 장기 지원을 받고 있는 안정 릴리스 브랜치는 0.48이며, 안정 [5]버전 1.0 출시를 목표로 언어 개발이 진행 중입니다.

버전 발매일[6]
이전 버전, 더 이상 유지 관리되지 않음: 0.0.1 2006-07-15
이전 버전, 유지 보수 불필요: 0.1.0 2007-07-09
이전 버전, 유지 보수 불필요: 0.10.0 2010-09-18
이전 버전, 더 이상 유지 보수되지 않음: 0. 2013-05-27
이전 버전, 더 이상 유지 관리되지 않음: 0.30.0 2015-09-18
이전 버전, 더 이상 유지 보수되지 않음: 0.40.0 2018-05-12
이전 버전, 유지 보수 불필요: 0.42.0 2018-09-01
이전 버전, 더 이상 유지 보수되지 않음: 0.44.0 2019-05-09
이전 버전, 더 이상 유지 관리되지 않음: 0.46.0 2019-09-05
현재 안정적인 버전: 0.48.18 2021-06-09
현재 안정적인 버전: 0.50.9 2021-06-04
현재 안정적인 버전: 0.52.4 2021-06-04
범례:
구버전
이전 버전, 아직 유지 관리됨
최신 버전
최신 프리뷰 버전
향후 출시
이전 버전의 경우 첫 번째 포인트릴리즈만 표시됩니다.

언어 설계

특징들

Vala는 GLib와 그 서브모듈(GOBject, GMochedule, GThread, GIO)을 코어 라이브러리로 사용합니다.이 라이브러리는 대부분의 운영체제에서 사용할 수 있으며 플랫폼에 의존하지 않는 스레드화, 입출력, 파일 관리, 네트워크 소켓, 플러그인, 정규 표현 등의 기능을 제공합니다.Vala의 구문은 현재 다음과 같은 현대 언어 기능을 지원합니다.

그래픽 사용자 인터페이스는 GTK GUI 툴킷과 Glade GUI 빌더를 사용하여 개발할 수 있습니다.

메모리 관리

메모리 관리의 경우, GType 또는 GObject 시스템은 참조 카운트를 제공합니다.C에서는 프로그래머가 참조 추가 및 삭제를 수동으로 관리해야 하지만 Vala에서는 프로그래머가 플레인 포인터가 아닌 언어의 내장 참조 유형을 사용하면 참조 카운트를 자동으로 관리할 수 있습니다.이 경우 메모리 관리 시스템이 [7]제대로 작동하지 않기 때문에 참조 사이클을 생성하지 않도록 주의해야 합니다.

Vala는 포인터를 옵션으로 사용하여 수동으로 메모리를 관리할 수도 있습니다.

바인딩

Vala는 런타임 바인딩 없이 기존 C 라이브러리, 특히 GObject 기반 라이브러리에 런타임 액세스를 제공하기 위한 것입니다.Vala에서 라이브러리를 사용하려면 Vala 구문의 클래스 및 메서드 선언을 포함하는 API 파일(.vapi)만 있으면 됩니다.단, C++ 라이브러리는 지원되지 않습니다.현재 GNU 프로젝트의 대부분과 GNOME 플랫폼의 vapi 파일은 GTK를 포함한 Vala의 각 릴리스에 포함되어 있습니다.또한 Gee라는 라이브러리는 Vala로 작성되어 있으며, 일반적으로 사용되는 데이터 [8]구조를 위한 GObject 기반 인터페이스와 클래스를 제공합니다.

또한 Vala 파서는 라이브러리로 작성되므로 다른 언어로 작성된 애플리케이션(예를 들어 C#)에서 Vala 라이브러리에 액세스하기 위한 바인딩 생성기를 쉽게 작성할 수 있으므로 바인딩을 생성할 때 모든 컴파일 시간 정보를 사용할 수 있습니다.

도구들

에디터

Vala 개발을 위한 툴링은 최근 몇 년간 크게 개선되었습니다.다음은 Vala에서의 프로그래밍 지원을 추가하는 플러그인이 있는 일반적인 IDE 및 텍스트 편집기의 목록입니다.

코드 인텔리전스

현재 Vala에 다음과 같은 코드 인텔리전스를 제공하는 언어 서버가 2개 있습니다.

  • VSCode, vim, GNOME[12] Builder 등 LSP를 지원하는 모든 에디터용으로 설계된 benwaffle/vala-language-server
  • esodan/gvls - 현재 GNOME Builder에서 Vala용 기본 언어 서버이며[13] LSP를 지원하는 모든 에디터를 지원합니다.

시스템 구축

현재 Vala를 지원하는 빌드 시스템Automake, CMake, Meson [14]등 여러 가지가 있습니다.

디버깅

Vala 프로그램의 디버깅은 GDB 또는 LLDB하나를 사용하여 수행할 수 있습니다.IDE 디버깅의 경우

안녕 세계

Vala의 간단한 "Hello, World!" 프로그램:

무효 주된 () {  인쇄물 (헬로 월드\n"); } 

C나 C++와는 달리 Vala에는 헤더 파일이 없습니다.라이브러리에 대한 링크는 다음을 지정함으로써 이루어집니다.--pkg컴파일 중에 파라미터가 표시됩니다.게다가 GLib 라이브러리는 항상 링크되어 있기 때문에, 그 네임스페이스를 생략할 수 있습니다.print사실은GLib.print).

객체 지향 프로그래밍

아래는 서브클래스를 정의하는 보다 복잡한 버전입니다.HelloWorld기본 클래스에서 상속GLib.Object, 일명 GObject 클래스입니다.Vala의 객체 지향 기능 중 일부를 보여 줍니다.

학급 안녕 세계: 물건 {  사적인 설치하다 연도 = 0;    일반의 안녕 세계 () {  }    일반의 안녕 세계.년도 (인트 연도) {   한다면 (연도>0)    이것..연도 = 연도;  }   일반의 무효 인사 () {   한다면 (연도 == 0)    인쇄물 (헬로 월드\n");   또 다른    /* 앞에 '@'가 붙는 문자열은 문자열 템플릿입니다.*/    인쇄물 (@"Hello World, $(올해)\n");   } }  무효 주된 (스트링[] args) {  변화하다 안녕 세계 = 신규 안녕 세계.년도 (2021);  안녕 세계.인사 (); } 

GObject 라이브러리의 경우와 마찬가지로 Vala는 다중 상속을 지원하지 않지만 Vala의 클래스는 임의의 수의 인터페이스를 구현할 수 있으며 이러한 인터페이스에는 메서드의 기본 구현이 포함될 수 있습니다.다음은 기본 구현(믹스인이라고도 함)이 있는 Vala 인터페이스를 보여주는 샘플 코드입니다.

사용. GLIB;  인터페이스 인쇄 가능 {  일반의 추상적인 스트링 인쇄물 ();   일반의 가상 스트링 pretty_프린트 () {   돌아가다 "부탁드립니다." + 인쇄물 ();  } }  학급 통상 인쇄: 물건, 인쇄 가능 {  스트링 인쇄물 () {   돌아가다 '나를 잊지 마';  } }  학급 덮어쓰기 인쇄: 물건, 인쇄 가능 {  스트링 인쇄물 () {   돌아가다 "틈새 조심";  }   일반의 덮어쓰다 스트링 pretty_프린트 () {   돌아가다 "오버라이드";  } }  무효 주된 (스트링[] args) {  변화하다 보통의 = 신규 통상 인쇄 ();  변화하다 덮어쓰다 = 신규 덮어쓰기 인쇄 ();   인쇄물 (보통의.pretty_프린트 ());  인쇄물 (덮어쓰다.pretty_프린트 ()); } 

신호 및 콜백

다음으로 GLib를 통해 Vala에 의해 내장된 신호 시스템을 가진 콤팩트하지 않은 클래스의 신호를 정의하는 기본적인 예를 나타냅니다.그런 다음 콜백 함수가 클래스의 인스턴스 신호에 등록됩니다.인스턴스는 신호를 송신할 수 있으며, 해당 인스턴스의 신호에 연결된 각 콜백 함수(핸들러라고도 불립니다)는 연결된 순서대로 호출됩니다.

학급 푸우 {     일반의 신호. 무효 일부_이벤트 ();   // 신호의 정의      일반의 무효 방법 () {         일부_이벤트 ();                  // 신호 발신(콜백이 호출됨)     } }  무효 콜백_a () {     설치하다.인쇄물 (콜백 A\n"); }  무효 콜백_b () {     설치하다.인쇄물 ("콜백 B\n"); }  무효 주된 () {     변화하다 후우 = 신규 푸우 ();     후우.일부_이벤트.연결하다 (콜백_a);      // 콜백 함수 연결     후우.일부_이벤트.연결하다 (콜백_b);     후우.방법 (); } 

스레드화

Vala의 새로운 스레드는 실행 시 동시에 실행하도록 요청되는 함수 등의 코드 부분입니다.새로운 스레드의 작성과 동기화는 다음 명령어를 사용하여 수행합니다.ThreadGLib의 클래스: 다음(매우 단순화된) 예시와 같이 새 스레드를 작성할 때 함수를 매개 변수로 사용합니다.

인트 질문.(){     // 일부 인쇄 작업     위해서 (변화하다 i = 0; i < > 3; i++){         인쇄물 (".");         .자고 있다 (800000);         설치하다.붉어지다 ();     }      돌아가다 42; }  무효 주된 () {     한다면 (!.서포트되고 있다 ()) {         하드.인쇄물 (스레드 지원이 없으면 실행할 수 없습니다.\n");         돌아가다;     }     인쇄물 ("생명, 우주, 모든 것에 대한 궁극적인 질문");     // 일반 파라미터는 반환값 유형입니다.     변화하다  = 신규 < >인트> ("질문", 질문.);      인쇄물(@" $ (표준)가입())\n"); } 

그래피컬 사용자 인터페이스

다음으로 GTK를 사용하여 Vala에서 GUI "Hello, World!" 프로그램(GTK hello world도 참조)을 작성하는 예를 나타냅니다.

사용. gtk;  인트 주된 (스트링[] args) {  gtk.초기화 (레퍼런스 args);   변화하다 윈도 = 신규  ();  윈도.직함 = "안녕, 월드!";  윈도.border_width = 10;  윈도.창 위치 = 창 위치.중심;  윈도.set_default_size (350, 70);  윈도.파괴하다.연결하다 (gtk.main_main);   변화하다 라벨. = 신규 라벨. ("안녕, 월드!");   윈도.더하다 (라벨.);  윈도.모두 표시 ();   gtk.주된 ();  돌아가다 0; } 

스테이트먼트Gtk.main ()는 콜백 함수에 신호를 통해 전달되는 이벤트를 리슨하는 메인루프를 만들고 시작합니다.이 예에서는 GTK 패키지를 사용하고 있기 때문에, 이 패키지에 추가가 필요합니다.--pkg파라미터(C 백엔드에서 pkg-config를 호출):

valac --pkg gtk+-3.0 hellogtk.vala

「 」를 참조해 주세요.

  • Genie는 Python에 가까운 구문을 가진 Vala 컴파일러용 프로그래밍 언어입니다.
  • 숏웰, 발라로 쓰여진 이미지 오거나이저.
  • Geary, Vala로 작성된 이메일 클라이언트.
  • Vala에서 주로 프로그램된 데스크톱 환경을 갖춘 Linux 배포판인 Elementary OS입니다.
  • Budgie는 주로 Vala에서 프로그램된 Linux 데스크톱 환경입니다.

레퍼런스

  1. ^ "Vala - Compiler Using the GObject Type System". GNOME Project. News section. Retrieved 16 July 2022.
  2. ^ "Vala: high-level programming with less fat". Ars Technica. 2 September 2007. Retrieved 13 December 2011.
  3. ^ "A look at two new languages: Vala and Clojure".
  4. ^ "Vala· GitLab". GNOME. Retrieved 16 March 2021.
  5. ^ Michael Lauer (2019). Introducing Vala Programming. doi:10.1007/978-1-4842-5380-9. ISBN 978-1-4842-5379-3. S2CID 207911698. Retrieved 16 March 2021.
  6. ^ "Vala Releases". Vala Project. Retrieved 18 March 2021.
  7. ^ "Vala's Memory Management Explained".
  8. ^ "Libgee on Gitlab".
  9. ^ a b "Coding in Vala with Visual Studio Code". Retrieved 17 March 2021.
  10. ^ "Coding in Vala with the Vim Text Editor". Retrieved 17 March 2021.
  11. ^ "Enable Vala syntax highlighting and code browser support in GNU Emacs". Retrieved 17 March 2021.
  12. ^ "benwaffle/vala-language-server on Github". GitHub. Retrieved 17 March 2021.
  13. ^ "esodan/gvls on GitLab". Retrieved 17 March 2021.
  14. ^ "Vala Tools". Retrieved 29 March 2021.

외부 링크

다른 언어와의 비교