Chỉnh sửa toàn cầu: xin lỗi các bạn, tôi đã bị sa thải và viết rất nhiều điều vô nghĩa. Chỉ là một lão già gặm nhấm.
Tôi muốn tin rằng C đã được tha, nhưng than ôi kể từ C11, nó đã được đưa lên ngang hàng với C ++. Rõ ràng, việc biết trình biên dịch sẽ làm gì với các hiệu ứng phụ trong các biểu thức đòi hỏi phải giải quyết một câu đố toán học nhỏ liên quan đến việc sắp xếp một phần các chuỗi mã dựa trên "được đặt trước điểm đồng bộ hóa".
Tôi tình cờ đã thiết kế và triển khai một vài hệ thống nhúng thời gian thực quan trọng trong những ngày K & R (bao gồm cả bộ điều khiển của một chiếc xe điện có thể khiến mọi người đâm vào bức tường gần nhất nếu động cơ không được kiểm tra, công nghiệp 10 tấn robot có thể đè bẹp con người vào bột giấy nếu không được chỉ huy đúng cách và một lớp hệ thống, mặc dù vô hại, sẽ có vài chục bộ xử lý hút bus dữ liệu của chúng khô với hệ thống dưới 1%).
Tôi có thể quá già hoặc ngu ngốc để có được sự khác biệt giữa không xác định và không xác định, nhưng tôi nghĩ rằng tôi vẫn có một ý tưởng khá tốt về việc thực thi đồng thời và truy cập dữ liệu có nghĩa là gì. Theo ý kiến được cho là thông tin của tôi, nỗi ám ảnh về C ++ và bây giờ là những người C với ngôn ngữ thú cưng của họ tiếp quản các vấn đề đồng bộ hóa là một giấc mơ đắt giá. Hoặc bạn biết thực thi đồng thời là gì và bạn không cần bất kỳ gizmos nào, hoặc bạn không, và bạn sẽ làm cho thế giới rộng lớn không cố gắng gây rối với nó.
Tất cả các khối lượng trừu tượng của rào cản bộ nhớ tưới nước này chỉ đơn giản là do một số hạn chế tạm thời của các hệ thống bộ đệm đa CPU, tất cả đều có thể được gói gọn trong các đối tượng đồng bộ hóa hệ điều hành phổ biến như, ví dụ, các biến thể và biến điều kiện C ++ cung cấp.
Chi phí của việc đóng gói này là nhưng hiệu suất giảm một phút so với việc sử dụng các hướng dẫn CPU cụ thể có thể đạt được là một số trường hợp.
Các volatile
từ khóa (hoặc một#pragma dont-mess-with-that-variable
đối với tất cả tôi, với tư cách là một lập trình viên hệ thống, quan tâm) sẽ là khá đủ để nói với trình biên dịch ngừng sắp xếp lại các truy cập bộ nhớ. Mã tối ưu có thể dễ dàng được tạo ra bằng các chỉ thị asm trực tiếp để rắc trình điều khiển và mã hệ điều hành cấp thấp với các hướng dẫn cụ thể của CPU ad hoc. Nếu không có kiến thức sâu sắc về cách thức hoạt động của phần cứng cơ bản (hệ thống bộ đệm hoặc giao diện bus), bạn chắc chắn sẽ viết mã vô dụng, không hiệu quả hoặc bị lỗi.
Một phút điều chỉnh volatile
từ khóa và Bob sẽ là tất cả mọi người trừ chú của các lập trình viên cấp thấp khó tính nhất. Thay vào đó, các nhóm toán học C ++ thông thường đã có một ngày thực địa thiết kế một sự trừu tượng khó hiểu khác, mang lại xu hướng điển hình của họ là thiết kế các giải pháp tìm kiếm các vấn đề không tồn tại và nhầm lẫn định nghĩa của ngôn ngữ lập trình với thông số kỹ thuật của trình biên dịch.
Chỉ lần này, sự thay đổi cần thiết để làm mất đi một khía cạnh cơ bản của C, vì những "rào cản" này phải được tạo ra ngay cả trong mã C cấp thấp để hoạt động chính xác. Điều đó, trong số những thứ khác, rèn sự định nghĩa trong biểu thức, không có lời giải thích hay biện minh nào.
Kết luận, việc một trình biên dịch có thể tạo ra một mã máy nhất quán từ đoạn C vô lý này chỉ là hậu quả xa vời của cách những kẻ C ++ đối phó với sự không nhất quán tiềm tàng của các hệ thống bộ đệm vào cuối những năm 2000.
Nó đã tạo ra một mớ hỗn độn khủng khiếp về một khía cạnh cơ bản của C (định nghĩa biểu thức), do đó, phần lớn các lập trình viên C - những người không đưa ra một hệ thống bộ nhớ cache chết tiệt, và đúng như vậy - giờ đây buộc phải dựa vào các bậc thầy để giải thích sự khác biệt giữa a = b() + c()
và a = b + c
.
Cố gắng đoán những gì sẽ trở thành của mảng không may này là mất thời gian và nỗ lực ròng. Bất kể trình biên dịch sẽ làm gì với nó, mã này là sai về mặt bệnh lý. Điều duy nhất có trách nhiệm phải làm với nó là gửi nó vào thùng.
Về mặt khái niệm, các tác dụng phụ luôn có thể được chuyển ra khỏi các biểu thức, với nỗ lực tầm thường là để cho phép sửa đổi xảy ra trước hoặc sau khi đánh giá, trong một tuyên bố riêng.
Loại mã shitty này có thể đã được chứng minh vào những năm 80, khi bạn không thể mong đợi một trình biên dịch để tối ưu hóa bất cứ điều gì. Nhưng bây giờ các trình biên dịch từ lâu đã trở nên thông minh hơn hầu hết các lập trình viên, tất cả những gì còn lại là một đoạn mã shitty.
Tôi cũng không hiểu tầm quan trọng của cuộc tranh luận không xác định / không xác định này. Hoặc bạn có thể dựa vào trình biên dịch để tạo mã với hành vi nhất quán hoặc bạn không thể. Cho dù bạn gọi đó là không xác định hoặc không xác định có vẻ như một điểm moot.
Theo ý kiến được cho là của tôi, C đã đủ nguy hiểm trong trạng thái K & R của nó. Một sự tiến hóa hữu ích sẽ là thêm các biện pháp an toàn thông thường. Ví dụ, sử dụng công cụ phân tích mã nâng cao này, thông số kỹ thuật buộc trình biên dịch phải thực hiện ít nhất là tạo cảnh báo về mã bonkers, thay vì âm thầm tạo mã có khả năng không đáng tin cậy đến mức cực đoan.
Nhưng thay vào đó, các chàng trai đã quyết định, ví dụ, để xác định một thứ tự đánh giá cố định trong C ++ 17. Bây giờ mọi phần mềm imbecile đều được kích hoạt để đưa các tác dụng phụ vào mã của anh ấy / cô ấy một cách có chủ đích, dựa trên sự chắc chắn rằng các trình biên dịch mới sẽ háo hức xử lý obfuscation theo cách xác định.
K & R là một trong những tuyệt tác thực sự của thế giới điện toán. Trong hai mươi đô la, bạn có một đặc tả toàn diện về ngôn ngữ (Tôi đã thấy các cá nhân đơn lẻ viết trình biên dịch hoàn chỉnh chỉ bằng cách sử dụng cuốn sách này), một hướng dẫn tham khảo tuyệt vời (mục lục thường sẽ chỉ cho bạn trong một vài trang câu trả lời của bạn câu hỏi), và một cuốn sách giáo khoa sẽ dạy bạn sử dụng ngôn ngữ một cách hợp lý. Hoàn thành với những lý lẽ, ví dụ và những lời cảnh báo khôn ngoan về vô số cách bạn có thể lạm dụng ngôn ngữ để làm những việc rất, rất ngu ngốc.
Phá hủy di sản đó để kiếm được rất ít dường như là một sự lãng phí tàn nhẫn đối với tôi. Nhưng một lần nữa tôi rất có thể không nhìn thấy điểm hoàn toàn. Có lẽ một linh hồn tốt bụng nào đó có thể chỉ cho tôi theo hướng của một ví dụ về mã C mới có lợi thế đáng kể của các tác dụng phụ này?