| パラダイム | マルチパラダイム:命令型、構造化、オブジェクト指向 |
|---|---|
| 開発者 | ユルグ・ビレッター、ラファエレ・サンドリーニ、リコ・ツィヒホルツ |
| 初登場 | 2006年 |
| 安定版リリース | 0.57.0
/ 2023年4月11日 |
| タイピングの規律 | 静的、強い、推測された、構造的な |
| OS | クロスプラットフォームはすべてGLibでサポートされていますが、ソース コードとしてのみ配布されます。 |
| ライセンス | LGPLv2.1+ |
| ファイル名拡張子 | .vala、.vapi |
| Webサイト | vala.dev |
| 影響を受けた | |
| C、C++、C#、D、Java、ブー | |
Vala は、 Cコードを生成し、GObjectシステムを使用する自己ホスティング コンパイラを備えたオブジェクト指向 プログラミング言語です。
Valaは構文的にはC#に似ており、匿名関数、シグナル、プロパティ、ジェネリック、メモリ管理支援、例外処理、型推論、foreach文などの注目すべき機能が含まれています。 [1]開発者のJürg BilleterとRaffaele Sandriniは、GObjectオブジェクトシステムをターゲットにすることで、これらの機能をほとんどオーバーヘッドなしで、特別なランタイムサポートなしでプレーンCランタイムに導入したいと考えました。マシンコードやアセンブリ言語に直接コンパイルするのではなく、低レベルの中間言語にコンパイルします。ソースからソースへのコンパイルはCに行われ、その後、 GCCやClangなどの特定のプラットフォーム用のCコンパイラでコンパイルされます。[2]
ネイティブ コードライブラリの機能を使用するには、ライブラリインターフェイスを定義する vapi ファイルを作成する必要があります。これらのインターフェイス定義の作成は、C ライブラリの場合、十分に文書化されています。マルチメディア ライブラリSDLやOpenGLなど、GObject に基づいていないライブラリを含む多数のライブラリのバインディングが既に利用可能です。
説明
Valaは、スクリプト言語の高レベルなビルド時パフォーマンスと低レベルプログラミング言語のランタイムパフォーマンスを組み合わせたプログラミング言語です。C言語で書かれたアプリケーションやライブラリと比較して、追加のランタイム要件を課したり、異なるABIを使用したりすることなく、GNOME開発者に最新のプログラミング言語機能を提供することを目指しています。Valaの構文はC#に似ていますが、 GObject型システムに適合するように変更されています。[3]
歴史
ValaはJürg Billeterによって考案され、彼とRaffaele Sandriniによって実装されました。彼らはCの代わりにGNOMEアプリケーションを開発するためのより高水準の代替手段を望んでいました。彼らはC#の構文とセマンティクスを気に入っていましたが、Monoを使用したくなかったため、2006年5月にコンパイラを完成させました。最初はCを使用してブートストラップされ、1年後(2007年7月にバージョン0.1.0がリリース)、Valaコンパイラはセルフホストになりました。2008年には、 Pythonのような構文をValaコンパイラに公開するためにGenie言語が作成されました。 [4] 2021年現在、長期サポート付きの現在の安定リリースブランチは0.48であり、この言語は安定バージョン1.0のリリースを目標に活発に開発されています。[5]
言語設計
特徴
Vala は、コア ライブラリとしてGLib とそのサブモジュール ( GObject 、GModule、GThread、GIO) を使用します。これは、ほとんどのオペレーティング システムで使用でき、プラットフォームに依存しないスレッド、入出力、ファイル管理、ネットワーク ソケット、プラグイン、正規表現などを提供します。Vala の構文は現在、次のような最新の言語機能をサポートしています。
グラフィカル ユーザー インターフェイスは、 GTK GUI ツールキットとGlade GUI ビルダーを使用して開発できます。
メモリ管理
メモリ管理については、GType またはGObjectシステムが参照カウントを提供します。C では、プログラマは参照の追加と削除を手動で管理する必要がありますが、Vala では、プログラマが単純なポインタではなく言語に組み込まれた参照型を使用すると、そのような参照カウントの管理は自動化されます。心配する必要がある唯一の詳細は、参照サイクルを生成しないようにすることです。参照サイクルが発生すると、このメモリ管理システムが正しく動作しないためです。[7]
Vala では、オプションとして ポインタを使用した手動のメモリ管理も可能です。
バインディング
Vala は、既存の C ライブラリ、特にGObjectベースのライブラリへのランタイム アクセスを、ランタイム バインディングを必要とせずに提供することを目的としている。Vala でライブラリを使用するために必要なのは、Vala 構文のクラスとメソッドの宣言を含む API ファイル (.vapi) だけである。ただし、C++ ライブラリはサポートされていない。現在、GTKを含むGNUプロジェクトと GNOME プラットフォームの大部分の vapi ファイルが Vala の各リリースに含まれます。また、Vala で書かれた Gee と呼ばれるライブラリもあり、これはよく使用されるデータ構造用のGObjectベースのインターフェイスとクラスを提供します。[8]
Vala パーサーはライブラリとして記述されているため、バインディングを生成するときにすべてのコンパイル時情報が利用できるため、C# などの他の言語で記述されたアプリケーションから Vala ライブラリにアクセスするためのバインディング ジェネレーターを簡単に記述できるはずです。
ツール
編集者
Vala 開発用のツールは、ここ数年で大幅に改善されました。以下は、Vala でのプログラミングをサポートするプラグインを備えた、 人気のIDEとテキスト エディターの一覧です。
- GNOME ビルダー
- Visual Studio Code、Valaプラグイン付き[9]
- Vim、arrufat/vala.vimプラグイン付き[10]
- Emacs、vala-mode付き[11]
- 原子
- ジェニー
コードインテリジェンス
現在、Vala のコード インテリジェンスを提供する、積極的に開発中の言語サーバーが2 つあります。
- vala-lang/vala-language-serverは、VSCode、vim、GNOME Builderなど、LSPをサポートするあらゆるエディタ向けに設計されています[12]
- esodan/gvlsは現在GNOME BuilderのValaのデフォルトの言語サーバーであり、LSPをサポートするあらゆるエディターをサポートしています[13]
ビルドシステム
現在、 Automake、CMake、Mesonなど、 Valaをサポートするビルドシステムは数多く存在します。[14]
デバッグ
ValaプログラムのデバッグはGDBまたはLLDBで行うことができます。IDEでのデバッグの場合は、
- GNOME Builder には、GDBを使用した Vala のデバッグ サポートが組み込まれています。
- Visual Studio CodeにはcpptoolsやCodeLLDBなどGDBとLLDBの拡張機能があります。 [9]
例
こんにちは世界
Vala でのシンプルな「Hello, World!」プログラム:
void main () { print ( "Hello World \n " ); }
ご覧のとおり、C や C++ とは異なり、Vala にはヘッダー ファイルはありません。ライブラリへのリンクは、コンパイル時にパラメータを指定して行います--pkg。さらに、GLib ライブラリは常にリンクされており、その名前空間は省略できます (print実際には ですGLib.print)。
オブジェクト指向プログラミング
HelloWorld以下は、基本クラス ( GObjectGLib.Objectクラスとも呼ばれます) から継承するサブクラスを定義する、より複雑なバージョンです。これは、Vala のオブジェクト指向機能
の一部を示しています。
クラス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 /* 先頭に '@' が付いた文字列は文字列テンプレートです。 */ print ( @"Hello World, $(this.year) \n " ); } }
void main ( string [ ] args ) { var helloworld = new HelloWorld.with_year ( 2021 ) ; helloworld.greeting ( ) ; }
GObject ライブラリの場合と同様に、Vala は多重継承をサポートしていませんが、Vala のクラスは任意の数のインターフェースを実装でき、そのインターフェースにはメソッドのデフォルト実装を含めることができます。以下は、デフォルト実装 (ミックスインと呼ばれることもあります) を持つ Vala インターフェースを示すサンプル コードです。
GLibを使用します。
インターフェースPrintable { public abstract string print ();
パブリック仮想文字列pretty_print () { return "Please " + print (); } }
クラスNormalPrint : Object 、Printable { string print () { return "私のことを忘れないで" ; } }
クラスOverridePrint : Object 、Printable { string print () { return "Mind the gap" ; }
パブリックオーバーライド文字列pretty_print () { return "Override" ; } }
void main ( string [] args ) { var Normal = new NormalPrint (); var overridden = new OverridePrint ();
print (通常の.pretty_print ()); print (オーバーライドされた.pretty_print ( ) ) ; }
シグナルとコールバック
以下は、コンパクトではないクラスでシグナルを定義する方法を示す基本的な例です。このクラスには、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 (); }
スレッド
Vala の新しいスレッドは、実行時に同時に実行するように要求される関数などのコードの一部です。新しいスレッドの作成と同期はThread、次の (非常に簡略化された) 例に示すように、新しいスレッドを作成するときに関数をパラメーターとして受け取る GLib のクラスを
使用して行われます。
int question (){ // いくつかの印刷操作for ( var i = 0 ; i < 3 ; i ++ ){ print ( "." ); Thread . usleep ( 800000 ); stdout . flush (); }
42を返します。
void main () { if ( ! Thread.supported ( )) { stderr.printf ( "スレッドサポートなしでは実行できません。\n " ); return ; } print ( "人生、宇宙、そして万物についての究極の疑問" ) ; //ジェネリックパラメータは戻り値の型ですvar thread = new Thread < int > ( "question" , question );
印刷( @"$(thread.join()) \n " );
}
グラフィカルユーザーインターフェース
以下は、 GTK を使用して Vala でGUI 「Hello, World!」プログラム ( GTK hello worldも参照)を作成する例です。
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 =新しいラベル( "Hello, World!" );
window.add (ラベル) ; window.show_all ( ) ;
Gtk . main (); 0 を返す; }
このステートメントは、イベントをリッスンするメイン ループGtk.main ()を作成して開始します。イベントはシグナルを介してコールバック関数に渡されます。この例ではGTKパッケージを使用しているため、コンパイルするには追加のパラメータ ( Cバックエンドでpkg-config を呼び出す)が必要です。
--pkg
valac --pkg gtk+-3.0 hellogtk.vala
参照
- Vala で書かれた画像オーガナイザーShotwell 。
- Geary はVala で書かれた電子メール クライアントです。
- elementary OS は、主に Vala でプログラムされたデスクトップ環境を備えた Linux ディストリビューションです。
- Budgie は、主に Vala でプログラムされた Linux デスクトップ環境です。
参考文献
- ^ 「Vala: 余分なものが少ない高レベルプログラミング」Ars Technica 2007年9月2日2011年12月13日閲覧。
- ^ 「2つの新しい言語、ValaとClojureについて」
- ^ “Vala· GitLab”. GNOME . 2021年3月16日閲覧。
- ^ Jančár, M.; Chodarev, S. (2015). 「CRUD ベースの Linux デスクトップ アプリケーション開発のための生成フレームワーク」。2015 IEEE 13th International Scientific Conference on Informatics。ポプラト、スロバキア。pp. 133–138。doi :10.1109/Informatics.2015.7377821。Valaコンパイラーは、
構文を除けば Vala とほぼ同等の Genie 言語もサポートしています。Genie の構文はシンプルで「Python のような」ため、モデルを定義する場合に特に便利です。
- ^ Michael Lauer (2019). Valaプログラミングの紹介. doi :10.1007/978-1-4842-5380-9. ISBN 978-1-4842-5379-3. S2CID 207911698 . 2021年3月16日閲覧。
- ^ 「Vala Releases」Vala Project . 2021年3月18日閲覧。
- ^ 「Vala のメモリ管理の説明」。
- ^ 「Gitlab 上の Libgee」。
- ^ ab 「Visual Studio Code を使用した Vala でのコーディング」 。2021年3 月 17 日閲覧。
- ^ 「VimテキストエディタでValaにコーディングする」 。 2021年3月17日閲覧。
- ^ 「GNU EmacsでVala構文強調表示とコードブラウザのサポートを有効にする」 。 2021年3月17日閲覧。
- ^ 「vala-lang/vala-language-server on Github」。GitHub 。 2021年3月17日閲覧。
- ^ 「esodan/gvls on GitLab」 。 2021年3月17日閲覧。
- ^ 「Vala Tools」 . 2021年3月29日閲覧。
外部リンク
- 公式サイト
- GNOME Wiki ページ
- APIドキュメント
- GNOME上の Vala リポジトリ· GitLab
- LibGee は、Vala 用のユーティリティ ライブラリです。
- 初心者向けValaサンプルコード
- Valaプログラムのリスト
- Autovala は、Vala/C プロジェクト用の CMake および Meson ファイルの作成を自動化および簡素化するプログラムです。
- GitHub 上の Vala コミュニティ
- Akira - Linux ネイティブ デザイナー ツール
- Kangaroo - 一般的なデータベース用のクロスプラットフォーム データベース クライアント ツール
- 他の言語との比較
- ヴァラとジャワ
- Vala と C#
- Valaを含むさまざまな言語のベンチマーク
