Tôi học được từ cuốn sách của Kip Irvine . Nếu bạn bỏ qua những lời chỉ trích (công bằng) về các thư viện (không liên quan) của anh ấy, tôi có thể giới thiệu nó như một lời giới thiệu tốt về chính ngôn ngữ - mặc dù đối với những thứ thực sự thú vị, bạn phải tìm kiếm những kẻ ám ảnh trên mạng.
Tôi nghĩ sẽ hữu ích khi hiểu những gì xảy ra ở các cấp thấp hơn. Khi bạn nghiên cứu trình hợp dịch, bạn sẽ tìm hiểu về đường dẫn cpu, dự đoán rẽ nhánh, căn chỉnh bộ nhớ cache, SIMD, sắp xếp lại lệnh, v.v. Kiến thức về những điều này sẽ giúp bạn viết mã cấp cao tốt hơn.
Hơn nữa, sự khôn ngoan thông thường là không cố gắng tối ưu hóa bằng tay hầu hết thời gian mà hãy để trình biên dịch lo lắng về điều đó. Khi bạn nhìn thấy một số ví dụ về những thứ xoắn mà trình biên dịch tạo ra, bạn sẽ hiểu rõ hơn tại sao sự khôn ngoan thông thường lại tồn tại.
Ví dụ: Các LFSR chạy nhanh với lệnh xoay-mang-mang, đối với những trường hợp cụ thể như thế này, việc viết phiên bản trình hợp dịch cũng dễ dàng như việc phát hiện xem trình biên dịch có đủ thông minh để tìm ra nó hay không. Đôi khi bạn chỉ biết một cái gì đó mà trình biên dịch không.
Nó cũng giúp bạn hiểu thêm về các vấn đề bảo mật - ghi hoặc thực thi, ghi đè ngăn xếp, v.v.
Một số vấn đề đồng thời chỉ trở nên rõ ràng khi bạn nhận thức được những gì đang xảy ra ở cấp độ mỗi lệnh.
Đôi khi nó có thể hữu ích khi gỡ lỗi nếu bạn không có mã nguồn hoàn chỉnh.
Có giá trị tò mò. Các chức năng ảo được thực hiện như thế nào? Bạn đã bao giờ cố gắng viết các chương trình DirectX hoặc COM trong trình hợp dịch chưa? Làm thế nào để các cấu trúc lớn được trả về, hàm gọi có cung cấp không gian cho chúng hay ngược lại?
Sau đó, có các ngôn ngữ lắp ráp đặc biệt cho phần cứng đồ họa, mặc dù các ngôn ngữ shader đã đạt cấp độ cao cách đây vài năm, bất cứ thứ gì cho phép bạn suy nghĩ về một vấn đề theo cách khác đều tốt.