12/08/2018, 15:51

10 tính năng kì quái trong ngôn ngữ lập trình

Mỗi ngôn ngữ lập trình đều có những thứ kì quặc, như cú pháp lạ lùng, chức năng hiếm thấy hoặc các thiết lập không theo quy chuẩn nào. Những thứ này có thể khiến nhà lập trình cảm thấy lạ lẫm với ngôn ngữ ấy, thậm chí những tay lập trình viên lâu năm phải… gãi đầu. Thỉnh thoảng, những yếu tố ...

Mỗi ngôn ngữ lập trình đều có những thứ kì quặc, như cú pháp lạ lùng, chức năng hiếm thấy hoặc các thiết lập không theo quy chuẩn nào. Những thứ này có thể khiến nhà lập trình cảm thấy lạ lẫm với ngôn ngữ ấy, thậm chí những tay lập trình viên lâu năm phải… gãi đầu. Thỉnh thoảng, những yếu tố ấy khiến nhà lập trình cảm thấy bế tắc, nhưng đôi khi, chúng lại dễ hiểu, độc đáo và tạo nên nét riêng cho một ngôn ngữ nào đó.

Trong khi có vô vàn đặc tính riêng về ngôn ngữ lập trình nhưng có vài đặc tính trong số ấy rất đáng chú ý khi giới lập trình thảo luận về chủ đề này. Dưới đây là 10 tính năng ngôn ngữ lập trình trong số ấy:

Vấn đề: Toán tử + có đầy trong JavaScript, trở thành một toán tử bổ sung cho số và toán tử nối cho chuỗi. Nếu một toán hạng là một chuỗi thì JavaScript chuyển đổi biến số khác thành một chuỗi và quá trình nối chuỗi diễn ra, nên ‘1’ + 1 sẽ thành 11.

Lí do: Điều này hoàn toàn do cách quy định loại dữ liệu quá lỏng lẻo của JavaScript. Ví dụ Python cũng sử dụng + cho nối chuỗi nhưng nó là ngôn ngữ quy định loại dữ liệu rất chặt chẽ, nên nó sẽ báo lỗi nếu bạn cố thêm một chuỗi vào một số nguyên.

Vấn đề: module Perl luôn luốn kết thúc với khai báo 1; còn nếu không thì khai báo cuối cùng không thể trả về giá trị TRUE, và sẽ gây lỗi.

Lí do: các module Perl có thể chứa mã khai báo cũng như thủ tục con. Sau khi tải file, Perl kiểm tra bất kĩ mã thực thi thành công nào bằng cách tìm một giá trị trả về là TRUE. Thậm chí nếu không có mã khai báo thì Perl vẫn sẽ tìm kiếm một khai báo cuối cùng trả về giá trị TRUE, còn không thì nó báo lỗi.

Vấn đề: C (và C++) hỗ trợ một tập 9 bộ ba kí tự, và sẽ tự động chuyển đổi thành các kí tự đơn trước khi xử lí tiếp theo, ví dụ ??! sẽ được đổi thành |. Do vậy chúng có thể tạo ra những điều không ngờ tới được và khiến mã nguồn khó kiểm soát hơn.

Lí do: nhóm ba kí tự cho phép các nhà lập trình C thời gian đầu có thể tạo ra những kí tự nào đó mà bàn phím chưa hỗ trợ, như là dấu ngoặc móc.

Vấn đề: Trong khi các bộ nhận diện trong các ngôn ngữ khác thường phân biệt chữ hoa, chữ thường thì các hàm chức năng trong PHP (cũng như tên của class và method) thì không phân biệt hoa hay thường gì cả. Càng khiến cho các nhà phát triển rối hơn là các tên biến, hằng số và thuộc tính class trong PHP lại phân biệt chữ hoa, chữ thường.

Lí do: Hầu hết những gì mà PHP thừa hưởng là từ một tập mã của CGI để biến nó trở thành một ngôn ngữ lập trình chính thức.

Vấn đề: Trong Ruby, giá trị 0 tương đương với TRUE. Điều này trái ngược với rất nhiều ngôn ngữ khác, như C và Python, 0 tương đương với FALSE, nên khiến nhiều nhà phát triển Ruby mới làm quen thấy rất ngạc nhiên.

Lí do: Trong Ruby, chỉ có giá trị Boolean FALSE và nil là tương đương với FALSE; mọi thứ còn lại đều có giá trị TRUE. 0 được tính cũng như mọi con số khác.

Vấn đề: không dùng dấu câu hoặc từ khoá, Python sử dụng khoảng trắng để mô tả một khối mà một hàng mã thuộc khối ấy. Nếu số lượng khoảng trắng không đúng (hoặc lẫn lộn giữa nút tab và spacebar) đều có thể sinh lỗi.

Lí do: Giúp cho mã nguồn dễ đọc hơn và giảm số lượng cần gõ vì nhiều công cụ viết mã tự động thụt vào đầu dòng.

Vấn đề: Trong C, mảng hành động như bộ trỏ đến các khối bộ nhớ, nên a[i] = *(a + i) = *(i + a) = i[a].

Vấn đề: Perl có một danh sách dài tham số với các tên gọi rất khó hiểu (mặc dù chúng cũng có những từ tiếng Anh tương đương). Đối với người lập trình không quen với Perl thì họ có thể phải tra tài liệu Perl thường xuyên và khiến quá trình viết mã rất khó đọc.

Lí do: Những tham số này thường cung cấp thông tin và truy cập đến nhiều loại khía cạnh thực thi chương trình, như tiến trình ID ($$), thông điệp báo lỗi (@) và hợp regex (^R).

Vấn đề: JavaScript sử dụng dấu chấm phẩy (            </div>
            
            <div class=

0