GCC 16 đã được phát hành
(gcc.gnu.org)- Bản phát hành mới của GNU Compiler Collection đánh dấu một bước chuyển quan trọng khi đổi chuẩn mặc định của C++ sang gnu++20, và không còn xem việc triển khai C++20 là experimental nữa
- Đã bổ sung các tính năng reflection, contracts, constexpr của C++26, các tính năng C++23, cùng hỗ trợ thư viện C++23·C++26 ở trạng thái experimental; chẩn đoán lỗi template và type trait constraint failure cũng chi tiết hơn với thông báo phân cấp
- OpenMP và OpenACC đã mở rộng GPU memory allocation, target memset, device memcpy API; các front end Ada·Fortran·Modula-2·Algol 68 cũng được bổ sung tính năng ngôn ngữ mới và trình biên dịch thử nghiệm
- x86-64 hỗ trợ AMD Zen6, Intel Wildcat Lake, Intel Nova Lake; phía AMD GPU·LoongArch·IBM z Systems·Solaris·Windows cũng được bổ sung các tính năng theo từng mục tiêu và thay đổi ABI
- Việc loại bỏ định dạng chẩn đoán JSON, tăng cường chẩn đoán SARIF·HTML, cải thiện static analyzer, và bổ sung 37 entrypoint cho libgdiagnostics đã mở rộng đáng kể khả năng tích hợp công cụ và hạ tầng chẩn đoán
Thay đổi về tương thích và cải tiến chung
- Trên Solaris,
int8_tvà các kiểu tương tự đã trở thànhsigned charđể tuân thủ chuẩn C99; đây là thay đổi không tương thích- Xem thêm mục Solaris trong Porting to GCC 16
- Trên Solaris, tùy chọn
-pthreadkhông còn định nghĩa sẵn_REENTRANTnữa- Xem thêm mục Solaris trong Porting to GCC 16
- Định dạng
jsoncủa-fdiagnostics-format=đã bị loại bỏ; nên dùng SARIF cho chẩn đoán mà máy có thể đọc được - Link-Time Optimization nay xử lý tốt hơn các câu lệnh asm cấp cao nhất với
-flto-toplevel-asm-heuristics - Speculative devirtualization xử lý được các lời gọi hàm gián tiếp thông thường và hỗ trợ suy đoán nhiều hơn một đích
- Vectorizer đã linh hoạt hơn trong việc nhận diện loop-level parallelism của reduction, đồng thời hỗ trợ vector hóa các vòng lặp không biết trước số lần lặp và uncounted loop
- Cũng hỗ trợ peeling để căn chỉnh cho vector length agnostic loop dùng masking, mutual peeling for alignment, và loại bỏ phép tính vector induction trong các vòng lặp early break
- GCC Command Options và option index đã được chỉnh sửa để bao quát nhiều tùy chọn từng bị bỏ sót trước đây
- Tài liệu GCC-specific attributes đã được hiện đại hóa để nhấn mạnh hơn cú pháp attribute chuẩn được cho phép trong mọi dialect C/C++ mà GCC hỗ trợ
- Tài liệu về attribute đã được tái cấu trúc để giảm lặp lại, và bổ sung attribute index mới
- Tài liệu về file spec của parameter và option đã được chuyển sang GCC internals manual dành cho nhà phát triển GCC và người dùng cần cấu hình GCC tùy biến
Các thay đổi chính theo ngôn ngữ
-
OpenMP và OpenACC
- Hỗ trợ cấp phát bộ nhớ của OpenMP được tăng cường:
pinnedtrait allocator vàompx_gnu_pinned_mem_allocsẽ sử dụng CUDA API khi khả dụng, giúp cải thiện hiệu năng truy cập bộ nhớ đó trên GPU Nvidia - GNU extension
ompx_gnu_managed_mem_allocallocator vàompx_gnu_managed_mem_spacecấp phát bộ nhớ mà device có thể truy cập từ host- Device vẫn có thể truy cập ngay cả khi unified-shared memory không được hỗ trợ, và ngay cả trên các hệ thống nơi toàn bộ host memory đều device-accessible, hành vi page-migration vẫn có thể khác với các loại bộ nhớ khác
- OpenMP 5.0 bổ sung hỗ trợ
declare mapperở mức hạn chế cho C/C++, còn mệnh đềuses_allocatorsbao gồm cả thay đổi cú pháp của OpenMP 5.2 lẫn hỗ trợ dấu chấm phẩy của OpenMP 6.0 - OpenMP 5.1 bổ sung hỗ trợ ban đầu cho
iteratormodifier của map clause vàtarget updateconstruct trong C/C++ - OpenMP 5.2 hỗ trợ
begin declare variantdirective trong C/C++ - OpenMP 6.0 bổ sung các API routine
omp_target_memsetvàomp_target_memset_async, đồng thời cũng có thể dùng assumptions clauseno_openmp_constructs - Các directive và clause bị deprecated trong OpenMP 5.0, 5.1, 5.2 mặc định sẽ phát sinh deprecation warning, và có thể tắt bằng
-Wno-deprecated-openmp- Warning cũng xuất hiện khi dùng named constant hoặc API routine đã deprecated, và có thể tắt bằng
-Wno-deprecated-declarations
- Warning cũng xuất hiện khi dùng named constant hoặc API routine đã deprecated, và có thể tắt bằng
- OpenACC bổ sung các API routine
acc_memcpy_devicevàacc_memcpy_device_asynccho C/C++/Fortran waitdirective của OpenACC 3.0 chấp nhậnifclause, còn các API routine Fortranacc_attachvàacc_detachcủa OpenACC 3.3 bổ sung cho các counterpart C/C++ của OpenACC 2.6- Trong OpenACC 3.4, việc dùng named constant
PARAMETERtrong Fortran data clause được cả đặc tả và GCC cho phép, nhưng trong GCC nó không ảnh hưởng tới hành vi lúc biên dịch hay khi chạy
- Hỗ trợ cấp phát bộ nhớ của OpenMP được tăng cường:
-
Ada, Fortran, Modula-2, Algol 68
- Các GNAT extension của Ada bổ sung Constructor và Destructor, cung cấp cơ chế construction/finalization khác biệt đáng kể so với Ada tiêu chuẩn
- Ada bổ sung các aspect Implicit with, Structural Generic instantiation, Extended_Access
Extended_Accesscó thể được chỉ định cho general access type declaration trỏ tới unconstrained array subtype, thay đổi biểu diễn con trỏ và giúp Ada dễ liên kết với foreign language trên vùng nhớ không do Ada cấp phát
- Ada có thể dùng VAST cho mục đích debug compiler thông qua
-gnatd_Vhoặc-gnatd_Wở chế độ verbose, đồng thời semantic analysis của Ada 2022 Reduction Expressions,Ada.Containers.Bounded_Indefinite_Holders, việc triển khai accessibility rule và hỗ trợ Android cũng được cải thiện - Fortran xử lý coarray dùng native shared memory multithreading trên máy single node và tính năng
TEAMcủa Fortran 2018 - Hỗ trợ Fortran 2003 Parameterized Derived Types được cải thiện, việc xử lý LEN parameter hiện hoạt động nhưng vẫn cần thay đổi representation trong tương lai theo PR82649
- Fortran 2018 hỗ trợ mở rộng
IMPORTstatement,REDUCEintrinsic vàGENERICstatement mới - Fortran 2023 hỗ trợ các hàm lượng giác bổ sung như
sinpi, intrinsic subroutinesplit, vàc_f_pointernhận optional lower bound làm đối số - Tùy chọn
-fexternal-blas64sẽ gọi external BLAS routine từMATMULvới đối số integer 64-bit, và chỉ có hiệu lực trên hệ thống 64-bit khi áp dụng-ffrontend-optimize - Modula-2 đưa ra spelling hint khi xử lý import list, tên module và symbol trong nested scope, đồng thời giới thiệu cách triển khai wide set mới và library module
M2WIDESET- Thay đổi đối với wide set làm thay đổi ABI và có thể gây link-time error với các object file từ phiên bản GCC cũ hơn
- Thư viện mặc định của Modula-2 được bổ sung binary dictionary module
BinDict, nhiều module có thêm các procedureWritevàWriteLn, và khả năng truy cập external library module được cải thiện qua tùy chọn-fm2-pathname-root= - GCC bao gồm
ga68, một compiler Algol 68 ở mức thử nghiệm, với mục tiêu triển khai Revised Report cùng errata đã được IFIP WG2.1 Algol 68 Support subcommittee phê duyệt- Một số GNU extension và POSIX prelude cũng được triển khai; thông tin về ngôn ngữ xem tại Algol 68 website, còn thông tin về front end xem tại wiki
C++ và libstdc++
- Phiên bản ngôn ngữ mặc định cho biên dịch C++ đã được đổi từ -std=gnu++17 sang -std=gnu++20
- Mã phụ thuộc vào các chuẩn C++ cũ cần thêm -std= vào build flag hoặc porting mã, tham khảo porting notes
- Hỗ trợ C++20 modules vẫn ở trạng thái experimental và phải bật bằng -fmodules
- Nhiều tính năng C++26 đã được triển khai, gồm reflection, annotations for reflection, base class subobject splicing, function parameter reflection, contracts, constexpr exceptions, constexpr virtual inheritance, v.v.
- P2996R13 Reflection được bật bằng
-std=c++26 -freflection - Một phần của P2686R4 được hỗ trợ một phần; structured binding có thể dùng
constexprnhưng tham chiếu tớiconstexprautomatic variable vẫn chưa được cho phép
- P2996R13 Reflection được bật bằng
- Các tính năng C++23 như P2036R3, P2590R2, P2246R1 đã được triển khai
- Thông báo lỗi C++ có cấu trúc phân cấp trong các vấn đề như liên quan đến template, và dùng thụt lề cùng bullet point để biểu thị message nesting
- Có thể khôi phục hành vi trước đây bằng
-fno-diagnostics-show-nestinghoặc-fdiagnostics-plain-output
- Có thể khôi phục hành vi trước đây bằng
- Hỗ trợ C++20 modules ở trạng thái experimental sẽ thêm tùy chọn
--compile-std-moduleđể build header unit<bits/stdc++.h>cùng các modulestd,std.compattrước khi compile source file- Nếu header unit
<bits/stdc++.h>đã được build,#includecủa standard library header có thể import sẽ được chuyển một cách trong suốt thành import<bits/stdc++.h> - Nhiều bug đã được báo cáo đã được sửa
- Nếu header unit
- Constraint failure diagnostics của type trait trong standard library sẽ cho biết chi tiết hơn vì sao
is_constructible_v,is_invocable_vv.v. trả vềfalse - Trên các target mà libstdc++ hỗ trợ 128-bit integer,
std::is_integral<__int128>và các trait tương tự sẽ luôn là true- Trước đây trong GNU dialect thì là true, nhưng trong strict dialect thì không phải vậy
- P0952R2: A new specification for
std::generate_canonicalđã được triển khai cho mọi mode bị ảnh hưởng từ C++11 trở đi, tác động đến output có thể quan sát được- Có thể khôi phục hành vi trước đây bằng định nghĩa
_GLIBCXX_USE_OLD_GENERATE_CANONICAL
- Có thể khôi phục hành vi trước đây bằng định nghĩa
- ABI của
std::variantđã được cập nhật để nhất quán với mode C++20 trở lên, và ảnh hưởng đến class layout trong một số mode C++17 nhất định- Có thể khôi phục hành vi trước đây bằng định nghĩa
_GLIBCXX_USE_VARIANT_CXX17_OLD_ABI, và ảnh hưởng này chỉ áp dụng cho mode C++17
- Có thể khôi phục hành vi trước đây bằng định nghĩa
- Việc thực thi
std::regexđã được viết lại để dùng stack trên heap thay vì system stack, giúp tránh stack overflow khi matching các string lớn hơn - Việc triển khai C++20 không còn là experimental nữa, và
std::chrono::current_zone()hoạt động trên Windows - Vì hỗ trợ C++20 trước GCC 16 là experimental, nên các chương trình dùng component C++20 cần được xem là không tương thích với các bản phát hành cũ hơn
- Các đối tượng có thay đổi ABI gồm hàm waiting/notifying của
<atomic>, kiểu semaphore của<semaphore>, synchronization của<syncstream>, args củastd::formatvà biểu diễn củastd::formatter,std::partial_orderingtrong<compare>, cùng biểu diễn của một số adaptor trong<ranges>
- Các đối tượng có thay đổi ABI gồm hàm waiting/notifying của
- Hỗ trợ thư viện C++23 ở trạng thái experimental bao gồm
std::mdspan,ranges::starts_with,ranges::ends_with,ranges::shift_left,ranges::shift_right,std::allocator_traits::allocate_at_least - Hỗ trợ thư viện C++26 ở trạng thái experimental bao gồm
std::simd,std::inplace_vector,std::optional<T&>,std::copyable_function,std::function_ref,std::indirect,std::polymorphic,std::owner_equalcho shared pointer, header<debugging>, v.v.
Hỗ trợ target và hệ điều hành
-
IA-32/x86-64
- CPU dựa trên AMD Zen6 được hỗ trợ với
-march=znver6, đồng thời bật thêm AVX512_BMM, AVX_NE_CONVERT, AVX_IFMA, AVX_VNNI_INT8, AVX512_FP16 bên trên các ISA extension đã được kích hoạt cho Zen5 - Khi bật hỗ trợ AVX512 và tuning là
znver4,znver5,znver6, auto-vectorization sẽ thử dùng masked vector epilog để giảm kích thước mã và cải thiện hiệu năng - Intel Wildcat Lake được hỗ trợ với
-march=wildcatlake, Intel Nova Lake được hỗ trợ với-march=novalake-march=novalakesẽ bật thêm APX_F, AVX10.1, AVX10.2, PREFETCHI bên trên các ISA extension dựa trên Panther Lake
- Từ GCC 16, việc bật AMX-TRANSPOSE, USER_MSR, CLDEMOTE, KL, WIDEKL, PREFETCHI trong nhiều switch
-march=đã bị loại bỏ -mavx10.1-256,-mavx10.1-512,-mevex512đã bị loại bỏ, và cảnh báo thay đổi hành vi của-mavx10.1cũng biến mất- Hỗ trợ AMX-TRANSPOSE đã bị loại bỏ trong GCC 16, và GCC không còn chấp nhận
-mamx-transpose - Tùy chọn configure mới
--enable-x86-64-mfentrybật-mfentry, sử dụng__fentry__thay chomcountcho profiling trên x86-64, và được bật mặc định trên target glibc --enable-tls=DIALECThỗ trợ điều khiển TLS dialect mặc định, giá trị mặc định làgnu, và các giá trị cho phép làgnuvàgnu2cho TLS descriptor
- CPU dựa trên AMD Zen6 được hỗ trợ với
-
AMD GPU, LoongArch, IBM z Systems
- Trên AMD GPU offloading, overhead khi khởi chạy OpenMP target region và OpenACC compute region đã giảm đáng kể
- Đã bổ sung hỗ trợ thử nghiệm cho thiết bị AMD Instinct MI300
gfx942, đồng thời bao gồmgfx950tương thích với genericgfx9-4-generictrong đa số trường hợp - Bộ multilib build mặc định cho AMD GPU nay chuyển thành
gfx908,gfx90a,gfx9-generic,gfx9-4-generic,gfx10-3-generic,gfx11-generic- Nếu có generic arch, multilib cho thiết bị cụ thể sẽ không còn được build mặc định nữa
- Generic architecture yêu cầu ROCm 6.4.0 trở lên
- Bộ multilib mặc định mới yêu cầu assembler và linker từ LLVM 20 trở lên
- Tham khảo AMD installation notes và configuration notes của GCC
- LoongArch hỗ trợ các kiểu số nguyên chính xác theo bit như
_BitInt (N)vàunsigned _BitInt (N) - LoongArch hỗ trợ Function Multi-Versioning thông qua attribute
target_clones, cho phép tạo các phiên bản hàm theo từng tính năng CPU và tự động chọn phiên bản tối ưu lúc runtime - Đã bổ sung hỗ trợ cho kiến trúc LoongArch32, bao gồm ABI mặc định
ilp32dcùng các ABIilp32f,ilp32s- Hỗ trợ cả phiên bản 32-bit tiêu chuẩn LA32 và phiên bản 32-bit rút gọn LA32R, cho phép sinh mã target 32-bit cho ứng dụng nhúng
- Tính năng này phụ thuộc vào hỗ trợ của Binutils và glibc
- S/390, System z, IBM z Systems hỗ trợ kiểu số nguyên chính xác theo bit và kiểu số thực dấu chấm động
_Float16- Các phép toán
_Float16được thực hiện bằng phần mềm hoặc bằng instructionfloat
- Các phép toán
- Với họ S/390, global stack protector để hỗ trợ runtime patching cho việc nạp địa chỉ canary của Linux kernel đã được bổ sung qua
-mstack-protector-guard=global, đồng thời cũng thêm-mstack-protector-guard-record - Hỗ trợ
-m31trên họ S/390 đã bị deprecate và sẽ bị loại bỏ trong các bản phát hành tương lai
-
Hệ điều hành
- Solaris hỗ trợ thuận tiện việc tạo Solaris CTF, tức Compact C Type Format, thông qua tùy chọn
-gsctf - Windows hỗ trợ native TLS, tức Thread-Local Storage
- Để kích hoạt, cần chỉ định
--enable-tlskhi configure và cần GNU binutils 2.44 trở lên
- Để kích hoạt, cần chỉ định
- Solaris hỗ trợ thuận tiện việc tạo Solaris CTF, tức Compact C Type Format, thông qua tùy chọn
Chẩn đoán, plugin, phân tích tĩnh
- GCC hỗ trợ xuất chẩn đoán định dạng HTML với
-fdiagnostics-add-output=experimental-html - Đầu ra SARIF tuân theo dump directory, và trong ví dụ đầu ra
build-dir/foo.o, GCC 16 ghi SARIF vàobuild-dir/foo.c.sarif- GCC 15 trong cùng ví dụ đã ghi vào
foo.c.sarif
- GCC 15 trong cùng ví dụ đã ghi vào
- Đầu ra SARIF ghi nhận logical location nesting và trong nhiều trường hợp bao gồm thuộc tính
descriptiontrong đối tượngfix - Thuộc tính
kindscủa SARIFthreadFlowLocationmới có thêm các giá trịthrow,catch,unwind,setjmp,longjmpđể biểu diễn control flow phi tiêu chuẩn - GCC diagnostics có thể đính kèm directed graph, và cũng có thể báo cáo global directed graph
- graph bị bỏ qua ở text sink nhưng được ghi nhận ở SARIF sink, còn
experimental-htmldùng dot để render dưới dạng SVG - Khi đặt
cfgs=yestrên SARIF hoặc HTML diagnostic sink, việc ghi nhận GCC intermediate representation cho mọi function của mọi optimization pass sẽ được bật
- graph bị bỏ qua ở text sink nhưng được ghi nhận ở SARIF sink, còn
- GCC diagnostics có thể tham chiếu logical location bên trong file XML và JSON
- Công cụ
sarif-replaydùng điều này để cung cấp JSON pointer khi báo cáo issue của đầu vào SARIF
- Công cụ
- Nếu
GCC_DIAGNOSTICS_LOGđược đặt trong environment, diagnostic subsystem sẽ xuất text log ra stderr hoặc file được chỉ định- Dùng để theo dõi các quyết định nội bộ như chẩn đoán bị loại bỏ chính xác khi nào và vì sao
- Nếu
EXPERIMENTAL_SARIF_SOCKETđược đặt trong environment, GCC sẽ cố gắng kết nối tới socket đó khi khởi động và gửi JSON-RPC notification cho mọi chẩn đoán phát sinh - Một framework publish/subscribe đã được thêm vào cho tác giả plugin để truyền các message strongly-typed giữa sender và receiver loosely-coupled
- Trong bản phát hành này, các topic mà plugin có thể subscribe chỉ gồm event bắt đầu/kết thúc optimization pass của function cụ thể và các event liên quan đến static analyzer
- GCC diagnostic sink có thể có đối tượng
extensionvới hookfinalizer, và plugin có thể dùng nó để ghi thêm thông tin vào file đầu ra SARIF - Trong GCC 16, diagnostic machinery đã được dọn dẹp lớn, và sẽ không ảnh hưởng tới các plugin chỉ dùng
diagnostic-core.h- Maintainer của các plugin dùng diagnostics phức tạp hơn cần tham khảo porting guide
- Static analyzer xử lý hỗ trợ ban đầu cho C++ Named Return Value Optimization và exception, nên có thể dùng với các ví dụ C++ đơn giản
- Do vấn đề về khả năng mở rộng, ở bản phát hành này rất có thể vẫn khó dùng cho mã C++ production
-fanalyzergiả định rằng external function call không có thuộc tínhnothrowcó thể ném exception khi-fexceptionsđược bật- Tùy chọn mới
-fanalyzer-assume-nothrowsẽ tắt giả định này - Mục đích là để tránh số lượng warning tăng lên trong các project dùng
-fexceptionscho mã C nhằm tương thích với C++, nhưng API C đang dùng ít có khả năng ném exception
- Tùy chọn mới
- Cấu trúc dữ liệu biểu diễn user code của
-fanalyzerđã được viết lại để dễ hiểu và debug hơn, đồng thời vị trí chẩn đoán cũng được cải thiện đôi chút- Đổi lại, mức sử dụng bộ nhớ của analyzer tăng lên
- Cấu trúc dữ liệu mô phỏng nội dung bộ nhớ của
-fanalyzerđã được triển khai lại để nhanh hơn và dễ bảo trì hơn - Analyzer đã bắt đầu sử dụng machinery
value_rangecủa GCC để loại bỏ một số false positive
libgdiagnostics và các vấn đề đã được sửa
- libgdiagnostics có thêm tổng cộng 37 entrypoint mới
- Bổ sung 5 entrypoint để làm việc với logical location
- Bổ sung 2 entrypoint để hỗ trợ command-line option và phát lại SARIF
- Bổ sung 12 entrypoint để làm việc với directed graph, hỗ trợ tạo graph, truyền global graph, gắn diagnostic graph, thêm·truy vấn node và edge, cũng như đặt label và location cho node
- Bổ sung 17 entrypoint để xây dựng diagnostic text vào buffer
- Bao gồm tạo·giải phóng message buffer, append string/text/byte/printf, append event id, xử lý phạm vi URL/quote/color, dump, hoàn tất diagnostic dựa trên buffer và thêm location label/event
- Cũng bổ sung
diagnostic_manager_set_debug_physical_locations() - Có thể xem danh sách các problem report được hệ thống theo dõi lỗi GCC đánh dấu là fixed cho bản phát hành 16.1 trong PR list
- Danh sách này có thể không đầy đủ và có thể thiếu một số PR đã được sửa
2 bình luận
Cuối cùng cũng ra..
Ý kiến trên Hacker News
Tôi muốn chỉ ra P2590R2 Explicit lifetime management như một tính năng được triển khai mà mọi người nên áp dụng nhưng có lẽ trên thực tế sẽ không được dùng nhiều
Đây là thứ dành cho
std::start_lifetime_as, là cách không phải UB để type-pun con trỏ sang kiểu có cấu trúcGần như mọi đoạn mã zero-copy xử lý bộ đệm I/O bên ngoài đều trông đại loại như
reinterpret_cast(buffer.get()), và đó là undefined behavior; giờ chỉ cần thayreinterpret_castbằngstart_lifetime_asthì không còn là làm điều xấu nữahttps://en.cppreference.com/cpp/memory/start_lifetime_as
Dùng
reinterpret_castở đây là một lỗistart_lifetime_ascòn làm thêm một việc ngoài chuyện đặt cho phép thuật memory laundering một cái tên chuẩn gọn gàng. Về mặt ngữ nghĩa nó không đụng vào bộ nhớ, trong khi no-opmemmovevề bản chất vẫn động tới bộ nhớ. Trên thực tế khác biệt không lớn vì compiler có thể nhận ramemmovelà no-op và tối ưu đireadđược triển khai. Nếu từ góc nhìn của compiler nó hoàn toàn opaque, thì những thứ như kernel hay card mạng thực sự đang dựng mộtFootrong bộ đệm đó, nên phép cast trở nên hoàn toàn chính đángstart_lifetime_ashữu ích khi lifetime của bộ đệm là minh bạch với compiler và có thể phá vỡ các giả định aliasingCó vẻ như ý họ là
Tlà một đối tượng mới hoàn chỉnh, có các subobject bên trong, và một trong số đó có kiểuU.Uđược khởi tạo như kiểubit_cast, có lẽ họ định nói là cast từ các bit đã có sẵn ở địa chỉ đó. Nhưngobjlại xuất hiện mà không được định nghĩa, nên có lẽ phải hiểu nó là một thứ gì đó nằm ở đúng địa chỉTuy nhiên E là gì thì vẫn mơ hồ. Trang đó ghi “E is the lvalue of type U denoting obj”, nhưng
objcó lẽ là kiểu nhưchar, và nếu nó vốn đã là kiểuUthì đâu cầnbit_castcharlà được phépTrước khi vừa tra thử thì tôi không biết lịch phát hành GCC lại đều đặn như vậy: https://gcc.gnu.org/develop.html
Cho đến tận thập niên 90, người ta vẫn nghĩ có thể làm những bản phát hành lớn kiểu waterfall, nhét vào mọi tính năng mong muốn, nhưng khi dự án đủ lớn thì sẽ luôn có ai đó đang làm một tính năng chưa sẵn sàng. Làm phát hành định kỳ thì ít nhất vẫn có thể giao bản phát hành cho khách hàng
Cách này buộc những lập trình viên có tính năng chưa chắc kịp phải tạo công tắc tắt các tính năng chưa ổn định, và thực tế đó gần như là phương án tốt nhất
Trước đây chậm hơn nhiều, và tôi đã tốn quá nhiều thời gian để lách lỗi C++ của GCC 2.95
Chỉ riêng việc tôi vẫn còn nhớ chính xác phiên bản gây rắc rối đó đã nói lên rất nhiều điều
Tôi đã dùng nó được một thời gian rồi. Debian sid có gói trunk
Nó có
c++26 reflection, nên tôi đang làm một số trò khá ảo với reflection, và trong vài trường hợp như ser-des thì tốt hơn hẳnChỉ mong trong hệ sinh thái có máy chủ LSP
libstdđang gây ra vấn đềCái gọi là định dạng
jsoncủa-fdiagnostics-format=đã bị loại bỏ trong bản phát hành này, và họ nói rằng nếu cần diagnostics machine-readable từ GCC thì hãy dùng SARIFNhưng họ cũng nói rằng giờ có thể xuất diagnostics ra HTML bằng
-fdiagnostics-add-output=experimental-htmlTôi khá tò mò về lý do đằng sau quyết định bỏ đầu ra JSON nhưng lại thêm đầu ra HTML
Câu hỏi hơi gà, nhưng tôi muốn biết liệu GCC có dùng LLVM ở đâu đó bên trong không, hay nó có pipeline tối ưu hóa và sinh mã riêng hoàn toàn. Tôi cũng muốn biết nếu so với LLVM thì nó ở mức nào
Nó hỗ trợ nhiều target hơn LLVM, và trong đa số trường hợp tạo ra executable tương đương hoặc tốt hơn
Theo Wikipedia, GCC là ngày 22 tháng 3 năm 1987, còn bản phát hành đầu tiên của LLVM là năm 2003
Một khác biệt lớn nữa là giấy phép. GCC dùng GPL, LLVM dùng Apache License, nên hai dự án không chia sẻ mã nguồn với nhau
Apple từng dùng
llvm-gccvào khoảng năm 2012, thời kỳ họ chuyển từ GCC sang LLVM, và đó là tổ hợp GCC front end với LLVM back endhttps://dragonegg.llvm.org
-Ofastgiờ vẫn còn bỏ qua-fno-fast-mathà?Tôi đã thử dùng mã nguồn unstable trong khoảng 3 tháng vừa qua
Có những chương trình không biên dịch được với GCC gần đây nhưng lại chạy tốt với GCC cũ hơn, nên hiện tại nhìn chung
gcc 15.xhợp với tôi hơnDù vậy, nếu xét việc biên dịch hơn 3000 chương trình thì phần lớn vẫn ổn, chỉ một số ít cần vá. Những bản vá đó thường có thể tìm thấy trong LFS/BLFS, và sửa từng lỗi bằng
sedthì đa phần cũng chạy đượcTôi mong những vấn đề đó đã được sửa. Tất cả chúng ta đều cần sự ổn định và cảm giác “cứ thế là chạy”