맨위로가기

발라 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

발라는 GNOME 애플리케이션 개발을 위해 C 언어 대신 사용하기 위해 설계된 고급 프로그래밍 언어이다. C#과 유사한 문법을 가지며, GObject, GLib 등을 핵심 라이브러리로 사용하여 다양한 운영 체제에서 사용 가능하다. 2006년에 컴파일러가 완성되었으며, 현재 0.48 버전이 장기 지원되고 있고, 버전 1.0의 안정적인 릴리스를 목표로 개발이 진행 중이다. Vala는 인터페이스, 속성, 시그널, 람다 표현식 등 최신 언어 기능을 지원하며, GTK GUI 툴킷과 Glade GUI 빌더를 사용하여 그래픽 사용자 인터페이스를 개발할 수 있다. 메모리 관리는 참조 계수를 통해 자동화되며, C 라이브러리에 대한 런타임 바인딩을 제공한다. GNOME Builder, Visual Studio Code 등 다양한 IDE를 지원하며, GDB 또는 LLDB 디버거를 사용하여 디버깅할 수 있다.

더 읽어볼만한 페이지

  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
  • C 프로그래밍 언어 계열 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 계열 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
  • LGPL 라이선스 소프트웨어 - Qt (소프트웨어)
    Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다.
  • LGPL 라이선스 소프트웨어 - GTK
    GTK는 GIMP를 위해 개발된 크로스 플랫폼 GUI 툴킷으로, 다양한 운영체제와 프로그래밍 언어를 지원하며 여러 데스크톱 환경 및 애플리케이션에서 활용된다.
발라 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
일반 정보
발라 로고
발라 로고
패러다임멀티 패러다임: 명령형, 구조적, 객체 지향
개발자위르크 빌레터, 라파엘레 산드리니, 리코 치슈홀츠
최초 출시 연도2006년
최신 버전0.56.17
최신 버전 출시일2024년 4월 19일
자료형정적, 강한, 추론, 구조적
영향을 받은 언어C, C++, C#, D, 자바, Boo, 파이썬
운영체제크로스 플랫폼, GLib에서 지원하는 모든 운영체제, 소스 코드 형태로만 배포
라이선스LGPLv2.1+
웹사이트발라 공식 웹사이트
파일 확장자.vala, .vapi

2. 역사

발라는 쥐르그 빌레터(Jürg Billeter)가 구상하였고, 그와 라파엘레 산드리니(Raffaele Sandrini)가 C 대신 GNOME 애플리케이션 개발을 위한 상위 레벨 대안을 원하여 구현되었다. 그들은 C#의 구문과 의미를 좋아했지만 모노를 사용하고 싶지 않았기 때문에 2006년 5월에 컴파일러를 완성했다. 처음에는 C를 사용하여 부트스트래핑되었으며, 1년 후(2007년 7월 버전 0.1.0 릴리스) 발라 컴파일러는 자기 호스팅되었다.[4] 2008년에는 발라 컴파일러에 파이썬과 유사한 구문을 노출하기 위해 제니(Genie) 언어가 생성되었다.[4] 2021년 현재, 장기 지원이 포함된 현재 안정적인 릴리스 브랜치는 0.48이며, 버전 1.0의 안정적인 릴리스를 목표로 언어가 활발히 개발되고 있다.[5]

버전릴리스 날짜[6]비고
0.0.12006-07-15
0.1.02007-07-09
0.10.02010-09-18
0.20.02013-05-27
0.30.02015-09-18
0.40.02018-05-12안정적인 장기 지원
0.42.02018-09-01
0.44.02019-05-09
0.46.02019-09-05
0.48.02020-03-03안정적인 장기 지원
0.50.02020-09-10
0.52.02021-05-17
0.54.02021-09-16
0.40.252021-01-11안정적인 장기 지원
0.56.02022-03-17안정적인 장기 지원
0.48.252022-09-16안정적인 장기 지원
0.56.172024-04-19안정적인 장기 지원


3. 언어 디자인

발라는 고급 프로그래밍 언어의 빌드 타임 성능과 저급 프로그래밍 언어의 런타임 성능을 결합한 프로그래밍 언어이다. C로 작성된 애플리케이션 및 라이브러리와 비교했을 때 추가적인 런타임 요구 사항을 부과하지 않고, 다른 ABI를 사용하지 않으면서 GNOME 개발자에게 최신 프로그래밍 언어 기능을 제공하는 것을 목표로 한다. 발라의 구문은 C#와 유사하며, GObject 타입 시스템에 더 잘 맞도록 수정되었다.[3]

Vala는 GObject, GModule, GThread, GIO를 포함하는 GLib 및 하위 모듈을 핵심 라이브러리로 사용하며, 대부분의 운영 체제에서 사용할 수 있다. 이는 플랫폼 독립적인 쓰레딩, 입/출력, 파일 관리, 네트워크 소켓, 플러그인, 정규 표현식 등을 제공한다.

GType 또는 GObject 시스템은 메모리 관리를 위해 참조 계수를 제공한다. C에서는 프로그래머가 수동으로 참조를 추가하고 제거해야 하지만, 발라에서는 일반 포인터 대신 언어의 내장 참조 형식을 사용하는 경우 이러한 참조 계수 관리가 자동화된다. 유일하게 신경 써야 할 세부 사항은 이 메모리 관리 시스템이 제대로 작동하지 않는 참조 순환을 생성하지 않도록 하는 것이다.[7]

발라는 또한 포인터를 사용하여 수동 메모리 관리를 선택 사항으로 제공한다.

발라는 런타임 바인딩 없이 기존 C 라이브러리, 특히 GObject 기반 라이브러리에 대한 런타임 접근을 제공하도록 설계되었다. 발라에서 라이브러리를 사용하려면 발라 구문으로 클래스와 메서드 선언이 포함된 API 파일(.vapi)만 있으면 된다. 그러나 C++ 라이브러리는 지원되지 않는다. 현재 GTK를 포함하여 GNU 프로젝트와 GNOME 플랫폼의 상당 부분에 대한 vapi 파일은 각 발라 릴리스에 포함되어 있다.[8] Gee라는 라이브러리도 발라로 작성되었는데, 이는 일반적으로 사용되는 자료 구조에 대한 GObject 기반 인터페이스와 클래스를 제공한다.

발라 파서는 라이브러리로 작성되어 컴파일 시 모든 정보를 바인딩 생성 시 사용할 수 있으므로, C#과 같은 다른 언어로 작성된 응용 프로그램에서 발라 라이브러리에 접근하기 위한 바인딩 생성기를 쉽게 작성할 수도 있다.

3. 1. 특징

발라는 고급 프로그래밍 언어의 빌드 타임 성능과 저급 프로그래밍 언어의 런타임 성능을 결합한 프로그래밍 언어이다. C로 작성된 애플리케이션 및 라이브러리와 비교하여 추가적인 런타임 요구 사항을 부과하지 않고, 다른 ABI를 사용하지 않으면서 GNOME 개발자에게 최신 프로그래밍 언어 기능을 제공하는 것을 목표로 한다. 발라의 구문은 C#와 유사하며, GObject 타입 시스템에 더 잘 맞도록 수정되었다.[3]

Vala는 대부분의 운영 체제에서 사용할 수 있는 핵심 라이브러리로 GObject, GModule, GThread, GIO를 포함하는 GLib 및 하위 모듈을 사용하며, 플랫폼 독립적인 쓰레딩, 입/출력, 파일 관리, 네트워크 소켓, 플러그인, 정규 표현식 등을 제공한다. Vala의 구문은 현재 다음과 같은 최신 언어 기능을 지원한다.

그래픽 사용자 인터페이스GTK GUI 툴킷과 Glade GUI 빌더로 개발할 수 있다.

3. 2. 메모리 관리

GType 또는 GObject 시스템은 메모리 관리를 위해 참조 계수를 제공한다. C에서는 프로그래머가 수동으로 참조를 추가하고 제거해야 하지만, 발라에서는 프로그래머가 일반 포인터 대신 언어의 내장 참조 형식을 사용하는 경우 이러한 참조 계수 관리가 자동화된다. 유일하게 신경 써야 할 세부 사항은 이 메모리 관리 시스템이 제대로 작동하지 않는 참조 순환을 생성하지 않도록 하는 것이다.[7]

발라는 또한 포인터를 사용하여 수동 메모리 관리를 선택 사항으로 제공한다.

3. 3. 바인딩

발라는 런타임 바인딩 없이 기존 C 라이브러리, 특히 GObject 기반 라이브러리에 대한 런타임 접근을 제공하도록 설계되었다. 발라에서 라이브러리를 사용하려면 발라 구문으로 클래스와 메서드 선언이 포함된 API 파일(.vapi)만 있으면 된다. 그러나 C++ 라이브러리는 지원되지 않는다. 현재 GTK를 포함하여 GNU 프로젝트와 GNOME 플랫폼의 상당 부분에 대한 vapi 파일은 각 발라 릴리스에 포함되어 있다.[8] 발라로 작성된 Gee라는 라이브러리도 있는데, 이는 일반적으로 사용되는 자료 구조에 대한 GObject 기반 인터페이스와 클래스를 제공한다.

발라 파서는 라이브러리로 작성되어 컴파일 시 모든 정보를 바인딩 생성 시 사용할 수 있으므로, C#과 같은 다른 언어로 작성된 응용 프로그램에서 발라 라이브러리에 접근하기 위한 바인딩 생성기를 쉽게 작성할 수도 있다.

4. 도구

Vala 개발 도구는 최근 몇 년 동안 크게 개선되었다. Vala 프로그래밍을 지원하는 플러그인을 갖춘 인기 있는 IDE 및 텍스트 편집기에 대한 자세한 내용은 하위 섹션을 참조하면 된다.

Vala는 코드 인텔리전스, 빌드 자동화, 디버깅 또한 지원한다. 자세한 내용은 하위 섹션을 참조하면 된다.

4. 1. 편집기 및 IDE

편집기/IDE비고
안주타
Atomlanguage-vala-modern 패키지
GNOME Builder
Emacsvala-mode 포함[11]
Euclide
지니
모노디벨롭
넷빈즈
RedCar
Sublime Text구문 플러그인
TextMate
GeditVala Toys
Val(a)IDE발라로 작성됨[20][21]
Valable이클립스 플러그인
Valama발라로 작성됨
Valencia
Vim플러그인 포함[10]
Visual Studio CodeVala 플러그인 포함[9]


4. 2. 코드 인텔리전스

현재, 발라(Vala)에 대한 코드 인텔리전스를 제공하는 두 개의 언어 서버가 활발히 개발되고 있다.

  • vala-lang/vala-language-server영어는 LSP를 지원하는 모든 편집기(VSCode, vim, GNOME Builder 등)용으로 설계되었다.[12]
  • esodan/gvls영어는 현재 GNOME Builder에서 발라의 기본 언어 서버이며, LSP를 지원하는 모든 편집기를 지원한다.[13]

4. 3. 빌드 시스템

현재 Vala를 지원하는 다수의 빌드 자동화 시스템이 있으며, 여기에는 오토메이크, CMake, 메이슨 등이 있다.[14]

4. 4. 디버깅

발라 프로그램의 디버깅은 GDB 또는 LLDB를 사용하여 수행할 수 있다. IDE에서 디버깅을 수행하는 경우, 다음과 같다.

  • GNOME Builder는 GDB를 사용하여 발라에 대한 내장 디버깅을 지원한다.
  • Visual Studio Code는 cpptools 및 CodeLLDB와 같은 GDBLLDB의 확장을 가지고 있다.

5. 예제

Vala 코드 예제는 다음과 같다.


  • '''"Hello, World!" 프로그램'''

```vala

void main () {

print ("Hello World\n");

}

```

Vala의 간단한 "Hello, World!" 프로그램이다. C나 C++와는 다르게 Vala에는 헤더 파일이 없다. 라이브러리와의 연결은 컴파일 중에 `--pkg` 매개변수를 지정하여 수행된다. GLib 라이브러리는 항상 연결되며 해당 네임스페이스는 생략될 수 있다 ( `print`는 사실 `GLib.print`이다).[1]

  • '''GObject를 상속받는 클래스'''

```vala

class HelloWorld: Object {

private uint year = 0;

public HelloWorld () {

}

public HelloWorld.with_year (int year) {

if (year>0)

this.year = year;

}

public void greeting () {

if (year == 0)

print ("Hello World\n");

else

/* Strings prefixed with '@' are string templates. */

print (@"Hello World, $(this.year)\n");

}

}

void main (string[] args) {

var helloworld = new HelloWorld.with_year (2021);

helloworld.greeting ();

}

```

Vala의 객체 지향 기능을 보여주는 예제이다.[1]

  • '''GTK를 사용한 GUI "Hello, World!" 프로그램'''

```vala

using Gtk;

int main (string[] args) {

Gtk.init (ref args);

var window = new Window ();

window.title = "Hello, World!";

window.border_width = 10;

window.window_position = WindowPosition.CENTER;

window.set_default_size(350, 70);

window.destroy.connect (Gtk.main_quit);

var label = new Label ("Hello, World!");

window.add (label);

window.show_all ();

Gtk.main ();

return 0;

}

```

GTK를 사용한 GUI "Hello, World!" 프로그램 예제이다. `Gtk.main ()` 구문은 콜백 함수에 신호를 통해 전달되는 이벤트를 수신하는 메인 루프를 생성하고 시작한다. 컴파일 하려면 C 백엔드에서 pkg-config를 호출하는 추가 `--pkg` 매개변수가 필요하다.

```bash

valac --pkg gtk+-3.0 hellogtk.vala

```[1]
```vala

using GLib;

interface Printable {

public abstract string print ();

public virtual string pretty_print () {

return "Please " + print ();

}

}

class NormalPrint: Object, Printable {

string print () {

return "don't forget about me";

}

}

class OverridePrint: Object, Printable {

string print () {

return "Mind the gap";

}

public override string pretty_print () {

return "Override";

}

}

void main (string[] args) {

var normal = new NormalPrint ();

var overridden = new OverridePrint ();

print (normal.pretty_print ());

print (overridden.pretty_print ());

}

```

Vala는 다중 상속을 지원하지 않지만, 클래스는 여러 개의 인터페이스를 구현할 수 있다. 인터페이스는 메서드에 대한 기본 구현을 포함할 수 있으며, 이를 믹스인이라고도 한다.[1]

  • '''신호 및 콜백'''

```vala

class Foo {

public signal void some_event (); // 신호 정의

public void method () {

some_event (); // 신호 발생 (콜백 호출)

}

}

void callback_a () {

stdout.printf ("콜백 A\n");

}

void callback_b () {

stdout.printf ("콜백 B\n");

}

void main () {

var foo = new Foo ();

foo.some_event.connect (callback_a); // 콜백 함수 연결

foo.some_event.connect (callback_b);

foo.method ();

}

```

GLib를 통해 내장된 발라(Vala)의 신호 시스템을 보여주는 예시이다. 간결하지 않은 클래스에서 신호를 정의하는 방법을 보여준다. 콜백 함수는 클래스 인스턴스의 신호에 등록된다. 인스턴스가 신호를 발생시키면, 해당 인스턴스의 신호에 연결된 각 콜백 함수(핸들러라고도 함)는 연결된 순서대로 호출된다.
```vala

int question(){

// Some print operations

for (var i = 0; i < 3; i++){

print (".");

Thread.usleep (800000);

stdout.flush ();

}

return 42;

}

void main () {

if (!Thread.supported ()) {

stderr.printf ("Cannot run without thread support.\n");

return;

}

print ("The Ultimate Question of Life, the Universe, and Everything");

// Generic parameter is the type of return value

var thread = new Thread ("question", question);

print(@" $(thread.join ())\n");

}

```

Vala에서 새로운 스레드는 런타임에 동시에 실행되도록 요청된 함수와 같은 코드의 일부이다. 새로운 스레드의 생성 및 동기화는 GLib의 `Thread` 클래스를 사용하여 수행되며, 이 클래스는 새로운 스레드를 생성할 때 함수를 매개변수로 사용한다.

5. 1. Hello World 프로그램

vala

void main () {

print ("Hello World\n");

}

```

Vala의 간단한 "Hello, World!" 프로그램이다. C나 C++와는 다르게 Vala에는 헤더 파일이 없다. 라이브러리와의 연결은 컴파일 중에 `--pkg` 매개변수를 지정하여 수행된다. GLib 라이브러리는 항상 연결되며 해당 네임스페이스는 생략될 수 있다 ( `print`는 사실 `GLib.print`이다).[1]

다음은 GObject 클래스라고도 하는 기본 클래스 `GLib.Object`에서 상속받는 하위 클래스 `HelloWorld`를 정의하는 보다 복잡한 버전이다. Vala의 몇 가지 객체 지향 기능을 보여준다.[1]

```vala

class HelloWorld: Object {

private uint year = 0;

public HelloWorld () {

}

public HelloWorld.with_year (int year) {

if (year>0)

this.year = year;

}

public void greeting () {

if (year == 0)

print ("Hello World\n");

else

/* Strings prefixed with '@' are string templates. */

print (@"Hello World, $(this.year)\n");

}

}

void main (string[] args) {

var helloworld = new HelloWorld.with_year (2021);

helloworld.greeting ();

}

```

GTK를 사용한 GUI를 만드는 "Hello, World!" 프로그램 예제는 다음과 같다.[1]

```vala

using Gtk;

int main (string[] args) {

Gtk.init (ref args);

var window = new Window ();

window.title = "Hello, World!";

window.border_width = 10;

window.window_position = WindowPosition.CENTER;

window.set_default_size(350, 70);

window.destroy.connect (Gtk.main_quit);

var label = new Label ("Hello, World!");

window.add (label);

window.show_all ();

Gtk.main ();

return 0;

}

5. 2. GUI 버전 Hello World

vala

using Gtk;

int main (string[] args) {

Gtk.init (ref args);

var window = new Window ();

window.title = "Hello, World!";

window.border_width = 10;

window.window_position = WindowPosition.CENTER;

window.set_default_size (350, 70);

window.destroy.connect (Gtk.main_quit);

var label = new Label ("Hello, World!");

window.add (label);

window.show_all ();

Gtk.main ();

return 0;

}

```

GTK를 사용한 GUI "Hello, World!" 프로그램 예제이다. `Gtk.main ()` 구문은 콜백 함수에 신호를 통해 전달되는 이벤트를 수신하는 메인 루프를 생성하고 시작한다.

컴파일하려면 GTK 패키지를 사용하므로 C 백엔드에서 pkg-config를 호출하는 추가 `--pkg` 매개변수가 필요하다.

```bash

valac --pkg gtk+-3.0 hellogtk.vala

5. 3. 객체 지향 프로그래밍

Vala는 GObject 라이브러리를 기반으로 하는 객체 지향 언어이다. GObject는 C 언어로 작성되었지만, Vala는 이를 활용하여 객체 지향 프로그래밍을 지원한다.

Vala에서 클래스는 `class` 키워드를 사용하여 정의하며, 다른 클래스를 상속하거나 인터페이스를 구현할 수 있다.

```vala

class HelloWorld: Object {

private uint year = 0;

public HelloWorld () {

}

public HelloWorld.with_year (int year) {

if (year>0)

this.year = year;

}

public void greeting () {

if (year == 0)

print ("Hello World\n");

else

/* Strings prefixed with '@' are string templates. */

print (@"Hello World, $(this.year)\n");

}

}

void main (string[] args) {

var helloworld = new HelloWorld.with_year (2021);

helloworld.greeting ();

}

```

위 코드는 `HelloWorld`라는 클래스를 정의하고, `Object` 클래스를 상속한다. `year`라는 private 멤버 변수와 생성자, 그리고 `greeting`이라는 public 메서드를 가지고 있다. `greeting` 메서드는 `year` 변수의 값에 따라 다른 문자열을 출력한다.

Vala는 다중 상속을 지원하지 않지만, 클래스는 여러 개의 인터페이스를 구현할 수 있다. 인터페이스는 메서드에 대한 기본 구현을 포함할 수 있으며, 이를 믹스인이라고도 한다.

```vala

using GLib;

interface Printable {

public abstract string print ();

public virtual string pretty_print () {

return "Please " + print ();

}

}

class NormalPrint: Object, Printable {

string print () {

return "don't forget about me";

}

}

class OverridePrint: Object, Printable {

string print () {

return "Mind the gap";

}

public override string pretty_print () {

return "Override";

}

}

void main (string[] args) {

var normal = new NormalPrint ();

var overridden = new OverridePrint ();

print (normal.pretty_print ());

print (overridden.pretty_print ());

}

```

위 코드는 `Printable`이라는 인터페이스를 정의하고, `NormalPrint`와 `OverridePrint` 클래스가 이 인터페이스를 구현한다. `Printable` 인터페이스는 `print` 추상 메서드와 `pretty_print` 가상 메서드를 가지고 있다. `pretty_print` 메서드는 기본 구현을 제공하며, 하위 클래스에서 재정의할 수 있다.

5. 4. 신호 및 콜백

다음은 GLib를 통해 내장된 발라(Vala)의 신호 시스템을 보여주는 예시이다. 간결하지 않은 클래스에서 신호를 정의하는 방법을 보여준다. 콜백 함수는 클래스 인스턴스의 신호에 등록된다. 인스턴스가 신호를 발생시키면, 해당 인스턴스의 신호에 연결된 각 콜백 함수(핸들러라고도 함)는 연결된 순서대로 호출된다.



class Foo {

public signal void some_event (); // 신호 정의

public void method () {

some_event (); // 신호 발생 (콜백 호출)

}

}

void callback_a () {

stdout.printf ("콜백 A\n");

}

void callback_b () {

stdout.printf ("콜백 B\n");

}

void main () {

var foo = new Foo ();

foo.some_event.connect (callback_a); // 콜백 함수 연결

foo.some_event.connect (callback_b);

foo.method ();

}


5. 5. 스레딩

Vala에서 새로운 스레드는 런타임에 동시에 실행되도록 요청된 함수와 같은 코드의 일부이다. 새로운 스레드의 생성 및 동기화는 GLib의 `Thread` 클래스를 사용하여 수행되며, 이 클래스는 새로운 스레드를 생성할 때 다음 예제와 같이 함수를 매개변수로 사용한다.

```vala

int question(){

// Some print operations

for (var i = 0; i < 3; i++){

print (".");

Thread.usleep (800000);

stdout.flush ();

}

return 42;

}

void main () {

if (!Thread.supported ()) {

stderr.printf ("Cannot run without thread support.\n");

return;

}

print ("The Ultimate Question of Life, the Universe, and Everything");

// Generic parameter is the type of return value

var thread = new Thread ("question", question);

print(@" $(thread.join ())\n");

}

참조

[1] 웹사이트 Vala: high-level programming with less fat https://arstechnica.[...] Ars Technica 2011-12-13
[2] 웹사이트 A look at two new languages: Vala and Clojure https://lwn.net/Arti[...]
[3] 웹사이트 Vala· GitLab https://gitlab.gnome[...] GNOME 2021-03-16
[4] 학술회의 A generative framework for development of CRUD-based Linux desktop applications 2015
[5] 서적 Introducing Vala Programming https://link.springe[...] 2021-03-16
[6] 웹사이트 Vala Releases https://gitlab.gnome[...] Vala Project 2021-03-18
[7] 웹사이트 Vala's Memory Management Explained https://wiki.gnome.o[...]
[8] 웹사이트 Libgee on Gitlab https://gitlab.gnome[...]
[9] 웹사이트 Coding in Vala with Visual Studio Code https://wiki.gnome.o[...] 2021-03-17
[10] 웹사이트 Coding in Vala with the Vim Text Editor https://wiki.gnome.o[...] 2021-03-17
[11] 웹사이트 Enable Vala syntax highlighting and code browser support in GNU Emacs https://wiki.gnome.o[...] 2021-03-17
[12] 웹사이트 vala-lang/vala-language-server on Github https://github.com/v[...] 2021-03-17
[13] 웹사이트 esodan/gvls on GitLab https://gitlab.gnome[...] 2021-03-17
[14] 웹사이트 Vala Tools https://wiki.gnome.o[...] 2021-03-29
[15] 웹사이트 Vala - Compiler Using the GObject Type System https://wiki.gnome.o[...] 2024-08-20
[16] 뉴스 Vala: high-level programming with less fat - Ars Technica http://arstechnica.c[...] 2011-12-13
[17] 웹사이트 http://lwn.net/Artic[...]
[18] 웹사이트 https://developer.gn[...]
[19] 웹사이트 http://gnomejournal.[...]
[20] 웹사이트 Vala specific section,Vala Documentation https://live.gnome.o[...]
[21] 웹사이트 Val(a)IDEのソースコード https://code.launchp[...]
[22] 웹사이트 http://monodevelop.c[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com