急に暑さが加わってまいりました。 Zen 言語も多数の新機能を携え、よりあつくなって皆様のもとへお届けする準備ができました。
本リリースは、Zen 0.8 LTS (Long Term Support) の対象となります。 これより2年間、APIはフリーズしたまま、重大なバグフィックスなどのメンテナンスを継続します。 より安心して、Zen言語をご利用いただけます。
LLVM 10 への対応や非同期プリミティブ (async
) のドキュメンテーション追加をはじめ、飛躍的な改善を実施しています。
特に言語仕様では、ポインタ参照先をデフォルトでは変更できない修正を加えています。
この修正により、ポインタ参照先を書き換えたい場合には、mut
修飾を追加で記述しなければならなくなりました。
この仕様変更に伴い、既存のコードの移行を簡単にするため zen fmt
コマンドに --mut_conv
オプションを用意しています。
C言語では歴史的経緯により、ポインタ参照先を書き換えたくない場合にconst
修飾を追加します。
本来、無用なポインタ参照先への書き込みを防ぐために、必要な場合以外は全てconst
修飾をするべきです。
しかしながら、プログラマはしばしばconst
修飾を忘れがちです。
今C言語を再設計するのであればconst
がデフォルトになるでしょう。
初心者の方向けに、コンパイラ・エラーを説明するためのツールも登場しました。
困ったときには、ぜひご利用してみてください。
Zen言語は次の時代を作る新しいプログラミング言語ですので、よりプログラマが正しくプログラムを書ける言語仕様を目指します。
Zen 言語の漸進についてご紹介しましょう。
以下のエディタのシンタックスハイライトを更新しました。
LLVM 10.0.0
に対応しましたasync
/ await
のドキュメントを追加しました
async
に関連する標準ライブラリ event
のドキュメントを追加しました
--builtin
フラグ導入のため、builtin
コマンドを廃止しました
--mcmodel
を指定できるようになりました
-mcpu
を指定できるようになりました
-mattr
を指定できるようになりました
zen cc
コマンドを強化しました
-target
オプションでクロスビルド可能ですzen fmt
コマンドに --mut_conv
オプションを追加しました
deprecated
キーワードを導入しました
builtin
にバージョン番号を追加しましたzen_probe_stack
をcompiler_rt
からspecial/start*
に移動しましたstart_lib
をロードするようになりました。
start_lib
に移動しましたcompile_output
を追加しましたinterface
内で interface
型を返すメソッドが宣言できるようになりました@IntType
, @memberCount
, @memberType
, @memberName
, @typeId
, @ArgType
を廃止しました@Trap
が @trap
になりました@typeOf
が @TypeOf
になりました@overlay
を追加しました
@intToPtr
が型変換時にアライメントをチェックするようになりました
@call
を導入し、 @inlineCall
と @noInlineCall
と @newStackCall
と @asyncCall
を廃止しました
@export
の引数を変更しました
@to
を導入しました
@is
がオプション型を返すようになりました
@sqrt
など) から型パラメータを削除しました
extern
を廃止しましたvar
から anytype
に変更しました
mut
修飾を追加します。
addLLVMOption
をビルドスクリプトで利用できるようになりましたstd.dir
を追加しましたceil128
を実装しましたstd.http
を実装しましたstd.testing.notEqual
を追加しました
step
のAPIを interface を利用するように変更しました
standardTargetOptions
を追加しました
Deprecated リストは以下の通りです。
Deprecated | 代替のもの |
---|---|
build.Version | builtin.Version |
build.Target | Target |
build.CrossTarget | Target.Cross |
builtin.Os | Target.Os |
builtin.Arch | Target.Arch |
builtin.Abi | Target.Abi |
builtin.ObjectFormat | Target.ObjectFormat |
builtin.SubSystem | Target.SubSystem |
container.Buffer.ptr | 将来削除されます。 |
container.CustomAllocatorBuffer | CustomAllocatorSentinelBuffer(*mut vtable heap.Allocator, u8, 0) |
heap.direct_allocator | heap.page_allocator |
fs.File.access | fs.Dir.access(self: Dir, sub_path: []u8, flags: File.OpenFlags) AccessError!void |
fs.File.accessC | fs.Dir.accessZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) AccessError!void |
fs.File.accessW | fs.Dir.accessW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) AccessError!void |
fs.File.openRead | fs.Dir.openFile(self: Dir, sub_path: []u8, flags: File.OpenFlags) File.OpenError!File |
fs.File.openReadC | fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File |
fs.File.openReadW | fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File |
fs.File.openWrite | fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteMode | fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteModeC | fs.Dir.createFileZ(self: Dir, sub_path_c: [*:0]u8, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteModeW | fs.Dir.createFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteNoClobber | fs.Dir.createFile(self: Dir, sub_path: []u8, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteNoClobberC | fs.Dir.createFileZ(self: Dir, sub_path_c: [*:0]u8, flags: File.CreateFlags) File.OpenError!File |
fs.File.openWriteNoClobberW | fs.Dir.createFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.CreateFlags) File.OpenError!File |
fs.File.openHandle | 将来削除されます。 |
fs.Dir.open | fs.Dir.openDir(self: Dir, sub_path: []u8, args: OpenDirOptions) OpenError!Dir |
fs.Dir.openC | fs.Dir.openDirZ(self: Dir, sub_path_c: [*:0]u8, args: OpenDirOptions) OpenError!Dir |
fs.Dir.openRead | fs.Dir.openFile(self: Dir, sub_path: []u8, flags: File.OpenFlags) File.OpenError!File |
fs.Dir.openReadC | fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File |
fs.Dir.openReadW | fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File |
fs.Dir.openDirC | fs.Dir.openDirZ(self: Dir, sub_path_c: [*:0]u8, args: OpenDirOptions) OpenError!Dir |
fs.Dir.openFileC | fs.Dir.openFileZ(self: Dir, sub_path: [*:0]u8, flags: File.OpenFlags) File.OpenError!File |
fs.Dir.openFileWindows | fs.Dir.openFileW(self: Dir, sub_path_w: [*:0]u16, flags: File.OpenFlags) File.OpenError!File |
fs.deleteDir | fs.Dir.deleteDir(self: Dir, sub_path: []u8) DeleteDirError!void |
fs.deleteDirC | fs.Dir.deleteDirZ(self: Dir, sub_path_c: [*:0]u8) DeleteDirError!void |
fs.deleteDirW | fs.Dir.deleteDirW(self: Dir, sub_path_w: [*:0]u16) DeleteDirError!void |
fs.deleteTree | fs.Dir.deleteTree(self: Dir, sub_path: []u8) DeleteTreeError!void |
fs.readLink | fs.Dir.readLink(self: Dir, sub_path: []u8, buffer: *mut [MAX_PATH_BYTES]u8) ![]mut u8 |
fs.readLinkC | fs.Dir.readLinkZ(self: Dir, sub_path_c: [*:0]u8, buffer: *mut [MAX_PATH_BYTES]u8) ![]mut u8 |
fs.makePath | fs.Dir.makePath(self: Dir, sub_path: []u8) !void |
fs.readFileAlloc | fs.Dir.readFileAlloc(self: Dir, allocator: heap.Allocator, file_path: []u8, max_bytes: usize) ![]mut u8 |
fs.readFileAllocAligned | fs.Dir.readFileAllocAligned( self: Dir, allocator: heap.Allocator, file_path: []u8, max_bytes: usize, comptime A: u29,) ![]align(A) mut u8 |
fs.writeFile | fs.Dir.writeFile(self: Dir, sub_path: []u8, data: []u8) !void |
c.futimes | c.futimens(fd: fd_t, times: *[2]timespec) c_int |
c.parse | 将来削除されます。 |
os.accessC | os.accessZ(path: [*:0]u8, mode: u32) AccessError!void |
os.execveC | os.execveZ(path: [*:0]u8, child_argv: [*:null]?[*:0]u8, envp: [*:null]?[*:0]u8) ExecveError |
os.execvpeC | os.execvpeZ(file: [*:0]u8, argv: [*:null]?[*:0]u8, envp: [*:null]?[*:0]u8) ExecveError |
os.getenvC | os.getenvZ(key: [*:0]u8) ?[]u8 |
mem.lenWithSentinel | mem.len(ptr: anytype) usize |
mem.toSlice | mem.slice(ptr: anytype) Slice(@TypeOf(ptr)) |
mem.toSliceConst | mem.slice(ptr: anytype) Slice(@TypeOf(ptr)) |
mem.toSliceWithSentinel | mem.slice(ptr: anytype) Slice(@TypeOf(ptr)) |
mem.toSliceConstWithSentinel | mem.slice(ptr: anytype) Slice(@TypeOf(ptr)) |
lld
が weak リンケージを使えるようにしました
☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.