Tại sao các mảng có chiều dài thay đổi được thực hiện tùy chọn trong C 2011?


12

Khi VLAs được giới thiệu vào C 1999, tôi nghĩ rằng đó là một sự đổi mới tuyệt vời cho ngôn ngữ. Tuy nhiên, khi biết nó được thực hiện tùy chọn trong C 2011, tôi tự hỏi điều gì dẫn đến sự thay đổi trạng thái của nó và liệu điều đó có nghĩa là tính năng này thực sự hướng đến sự lỗi thời. Nếu vậy, có một khái niệm tương đương về quản lý tự động dữ liệu có kích thước động đang được xem xét để thay thế nó không?

Tôi đã cố gắng tìm tài liệu hợp lý C 2011, nhưng dường như nó chưa được công bố.


Thiếu con nuôi?
Ryan Reich

@RyanReich: Có thể, nhưng tại sao sự kháng cự từ các nhà cung cấp?
jxh

Câu trả lời:


8

Tôi đã nghe các truyền thuyết khác nhau từ "nó nên là tùy chọn vì một số trình biên dịch nhỏ sẽ có thể tuân thủ C11 mà không cần VLAs" thành "đó là một lỗi ở nơi đầu tiên". Tôi chưa bao giờ có một câu trả lời đúng và chắc chắn cho điều này, mặc dù. Cuối cùng, tôi không tin bất cứ ai thực sự có một lý do (giả sử - và hy vọng - có một) không bao giờ được tiết lộ (theo như các tìm kiếm cũ của tôi đã đi).


Từ Chương 4 (trang 13) Cơ sở lý luận cho tiêu chuẩn quốc tế - Ngôn ngữ lập trình - C 5.10 (2003)

Bằng cách xác định việc triển khai tuân thủ theo các chương trình mà họ chấp nhận, Tiêu chuẩn sẽ mở ra cơ hội cho một lớp mở rộng rộng lớn như là một phần của việc thực hiện tuân thủ. Bằng cách xác định cả việc thực hiện tự do lưu trữ và tuân thủ tuân thủ, Tiêu chuẩn nhận ra việc sử dụng C để viết các chương trình như hệ điều hành và ứng dụng dựa trên ROM, cũng như các ứng dụng được lưu trữ thông thường hơn. Ngoài sơ đồ hai cấp này, không có tập hợp con bổ sung nào được xác định cho C, vì Ủy ban C89 cảm thấy mạnh mẽ rằng có quá nhiều cấp làm giảm hiệu quả của một tiêu chuẩn .

Nhấn mạnh mỏ. Lưu ý rằng quyết định này đi ngược lại lý do của chính họ. Tuy nhiên, một điều khác làm tùy chọn. Bây giờ bạn có thể nhận được __STDC_NO_VLA__hoặc hỗ trợ VLA. Đó là một quyết định rất kỳ quặc.


@jxh Thậm chí không thấy điều đó. Cảm ơn đã chỉ ra, nó đã được thay đổi thành một từ ngữ rõ ràng hơn và ít mơ hồ hơn. Tôi đã xem mô típ như một từ đồng nghĩa của động lực và mục tiêu trong một số bối cảnh, nhưng tôi tin rằng nó chỉ phổ biến trong các kịch bản nghệ thuật.
Bernardo Sulzbach

Vấn đề với việc chỉ có sơ đồ hai cấp là có nhiều tính năng và đảm bảo hữu ích được hỗ trợ rộng rãi nhưng không được hỗ trợ rộng rãi và có thể cho phép một số loại chương trình được viết hiệu quả hơn nhiều so với khả năng khác. Việc thiếu bất kỳ phương tiện kiểm tra tiêu chuẩn nào về tính khả dụng của các tính năng đó khiến cho một phần đáng kể nếu không phải là phần lớn các chương trình thực tế trong nhiều lĩnh vực để sử dụng các bảo đảm ngoài các tiêu chuẩn có trong Tiêu chuẩn và gây khó khăn cho việc xác định chắc chắn cho dù có cụ thể ...
supercat

... chương trình sẽ làm việc với bất kỳ triển khai cụ thể. Xác định một loạt các tính năng tùy chọn lớn hơn và đảm bảo việc triển khai có thể hỗ trợ hoặc từ chối (bằng cách từ chối biên dịch) sẽ giúp có một cách kiểm tra tiêu chuẩn dễ dàng, liệu chương trình xác định đúng yêu cầu của nó có hoạt động chính xác trên nền tảng hay không: thử để xây dựng nó. Nếu nó xây dựng, nó sẽ hoạt động. Nếu không, nó rõ ràng sẽ không. Tăng tỷ lệ các chương trình có thể đảm bảo rằng một bản dựng thành công sẽ đảm bảo hoạt động thành công ...
supercat

... dường như có giá trị hơn nhiều so với việc chỉ tối đa hóa số lượng trình biên dịch có thể xử lý phần nhỏ các chương trình không được hưởng lợi từ các tính năng và đảm bảo vượt quá những gì Tiêu chuẩn yêu cầu.
supercat

4

Theo như tôi có thể xác định từ các tài liệu của ủy ban công cộng (cụ thể là N1395 ), một trong những lý do chính để làm cho VLA (cùng với số học và phân luồng phức tạp) là để có thể tạo trình biên dịch C phù hợp cho các bộ xử lý nhúng nhỏ.

Xu hướng là các nhà cung cấp trình biên dịch nhắm vào các hệ thống nhúng đang ở trên tiêu chuẩn C90, do việc giới thiệu các tính năng lớn mà khách hàng của họ không yêu cầu.


Trong nhiều trường hợp, "đã yêu cầu bỏ đi". Khi bạn nhìn vào thay đổi dấu chân RAM khi bạn bật các tính năng đó, điều đó trở nên rõ ràng tại sao một số người không muốn chúng. Nó có thể tăng gấp đôi chi phí của bộ xử lý, có thể là phần đắt nhất của hệ thống.
ღ uі

1
@JerryCoffin: Có, nhưng mã chỉ được tạo khi sizeof () thực sự được sử dụng trên mảng. Trình biên dịch cần theo dõi thông tin để có thể tạo mã chính xác, nhưng thông tin đó không cần phải được nhúng vào biểu diễn trong bộ nhớ của VLA.
jxh

2
@jxh: Như đã hình dung ban đầu, việc triển khai tự do và lưu trữ được sử dụng cùng một ngôn ngữ cốt lõi. Sự khác biệt được giới hạn trong thư viện. Trong trường hợp của VLAs, có một sự khác biệt trong ngôn ngữ mà (ít nhất một số nhà cung cấp cảm thấy) không thực sự phù hợp với các hệ thống nhúng nhỏ hơn. Theo như việc nhúng kích thước: không, có lẽ không bao giờ thực sự cần thiết, nhưng có thể là cách dễ nhất (ví dụ: một vài byte lưu trữ cho kích thước có thể tránh được nhiều byte mã để tính toán).
Jerry Coffin

1
@supercat: Tôi có thể thấy logic của chức năng thư viện C chọn cherry, nhưng làm cho các tính năng ngôn ngữ trở thành "tùy chọn" dường như vô ích đối với ai đó đang cố gắng viết mã C đa nền tảng. Nó sử dụng để được rằng C là sự lựa chọn hiển nhiên cho gần hệ thống kim loại lập trình mà có thể dễ dàng được retargeted đến một trình biên dịch khác nhau và nền tảng phần cứng khác nhau. Bây giờ, nó không quá rõ ràng.
jxh

1
@supercat: Ném bom ngăn xếp không phải là duy nhất đối với VLA. Các đối tượng tự động lớn bất thường hoặc ngăn xếp cuộc gọi chức năng không hạn chế sẽ có các vấn đề tương tự. Nếu tiêu chuẩn xác định một phương tiện để phát hiện lỗi cho những trường hợp đó, thì nó cũng có khả năng sẽ hoạt động cho VLA. Về mặt tùy chọn, việc tranh luận về việc sử dụng các tính năng C mới trong mã C mới trong các dự án mới được yêu cầu để làm việc trên nhiều nền tảng sử dụng trình biên dịch từ nhiều nhà cung cấp là khó khăn hơn.
jxh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.