V ( vlangとも呼ばれる)は、 2019年初頭にAlexander Medvednikovによって作成された、開発中の静的型付けコンパイル型プログラミング言語です。 [ 4 ] Goや、Oberon、Swift、Rustなどの他のプログラミング言語に影響を受けています。[ 5 ] [ 6 ] [ 7 ] MITライセンスの下でリリースされたフリーかつオープンソースのソフトウェアであり、現在はベータ版です。[ 8 ]
この新しい言語は、個人プロジェクトで使用されている既存の言語に対する不満から作成されました。[ 12 ]当初は個人使用を目的としていましたが、[ 12 ]公に言及され関心が高まったため、公開することにしました。[ 13 ] V は当初、Volt というデスクトップ メッセージング クライアントを開発するために作成されました。[ 6 ]公開時には、コンパイラは V で記述されており、自身をコンパイルすることができました。[ 4 ] [ 12 ] V を作成する際の主な設計目標は、学習と使用が容易であること、可読性が高いこと、コンパイルが速いこと、安全性の向上、効率的な開発、クロス プラットフォームの使いやすさ、C言語との相互運用性の向上、エラー処理の改善、最新の機能、保守性の高いソフトウェアでした。[ 14 ] [ 15 ] [ 10 ] [ 16 ]
V は、世界中の開発者や貢献者によって GitHub [ 17 ] [ 6 ]を通じて開発、保守、リリースされています。[ 4 ] 2025 年に、V はTIOBE インデックスにランク付けされるようになりました。[ 18 ]

V には、メモリの安全性、速度、および安全なコードを促進するためのポリシーがあり、[ 14 ] [ 20 ] [ 6 ]プログラムの安全性を高めるためのさまざまなデフォルト機能が含まれています。[ 7 ] [ 14 ] [ 12 ]境界チェックを使用して、変数の範囲外の使用を防止します。オプション/結果型が使用され、オプションデータ型( ?) は (可能な選択肢の中から) で表すことができnone、結果型 ( !) は返されたエラーを処理できます。安全性を高めるために、エラーチェックは必須です。デフォルトでは、変数、構造体、および関数引数は不変です。これには、文字列値も不変であるため、要素を変更することはできません。言語のデフォルトであるその他の保護は、未定義値の使用禁止、変数シャドウイング禁止、ヌルポインタ禁止 (安全でないとマークされていない場合)、またはグローバル変数禁止(フラグで有効にされていない場合) です。
V は値型と文字列バッファを使用してメモリ割り当てを削減します。[ 21 ] [ 22 ] [ 14 ]この言語は人間が読めるCにコンパイルでき、[ 7 ] [ 4 ]実行とコンパイルは高速であると考えられています。[ 14 ] [ 15 ] [ 12 ]
V は 4 つのメモリ管理オプションをサポートしています: [ 23 ] [ 6 ] [ 12 ] [ 4 ]
V はソース間コンパイラ(トランスパイラ) をサポートしており、C コードを V に変換できます。[ 15 ] [ 24 ] [ 10 ]
Go、JavaScript、WebAssembly用の動作する翻訳ツールも開発されています。[ 25 ] [ 26 ] [ 4 ]
V構文の代表的な例としては、以下のようなものがあります。
V言語の「Hello, World!」プログラム:[ 14 ] [ 27 ]
fn main () { println ( "Hello, World!" ) }:=変数はデフォルトでは不変であり、と値を使用して定義されます。変数を可変にするには、mut予約語(キーワード)を使用します。可変変数は、を使用してに代入できます=。[ 28 ] [ 27 ]
x : = 1 mut y : = 2 y = 3内部スコープ内または同じスコープ内で変数を再宣言することは許可されていません: [ 28 ] [ 27 ]
x : = 1 { x : = 3 // エラー: x の再定義} x : = 2 // エラー: x の再定義struct Foo { number int name string score f32 }// 構造体フィールドは名前で初期化できますvar1 : = Foo { number : 21 name : "baz" score : 2.5 }// または位置による指定var2 : = Foo { 50 , "taz" , 3.14 }デフォルトでは、構造体はスタックベースのメモリ割り当て(スタック上)によって割り当てられます。構造体がプレフィックスを使用して参照される場合&、または属性を持つ場合は、代わりにヒープベースのメモリ割り当て(ヒープ上)[heap]によって割り当てられます。 [ 4 ] [ 27 ]
struct Foo { number int }@ [ heap ] struct Baz { number f32 }// 参照される構造体はヒープに割り当てられますvar1 : = & Foo { 2 }// Baz は [heap] 属性のため常にヒープに割り当てられますvar2 : = Baz { 4.5 }Vにおけるメソッドは、レシーバ引数を持つ関数です。レシーバは、fnキーワードとメソッド名の間に、独自の引数リストとして記述されます。メソッドは、レシーバ型と同じモジュールに存在しなければなりません。
Clientenrolled_status メソッド (下記) には、という名前 の型のレシーバーがありますx。慣例として、self や this のようなレシーバー名は使用せず、短い名前を使用するのが望ましいです。例: [ 9 ] [ 10 ] [ 27 ]
struct Client { enrolled bool }fn ( x Client ) enrolled_status () bool { return x . enrolled }client_1 : = Client { true } client_2 : = Client { false }println ( client_1.enrolled_status ()) // "true" println ( client_2.enrolled_status ( ) ) // " false "結果型は、関数から返されるエラーを表す場合があります。結果型は、先頭に「:」を付けて宣言します!。!Type
オプション型は を表すことができますnone。オプション型は?型名の前にを付加します?Type。[ 9 ] [ 7 ] [ 23 ] [ 27 ]
fn something ( t string ) ! string { if t == "foo" { return "foo" } return error ( "invalid" ) }x : = something ( "foo" ) or { "default" } // x は "foo" になりますy : = something ( "baz" ) or { "default" } // y は "default" になりますz : = something ( "baz" ) or { panic ( "{err}" ) } // z はエラーで終了しますprintln ( x ) println ( y ){{cite web}}: CS1 maint: ref duplicates default ( link )