急に暑さが加わってまいりました。 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.