• Chủ Nhật, 28/09/2014 05:02 (GMT+7)

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

    Bùi Lê Duy
    Các ngôn ngữ lập trình chất chứa trong chúng nhiều điều đặc biệt, nhưng những điều dưới đây có thể khiến những nhà lập trình kỳ cựu cũng phải ngạc nhiên.

    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.

    + là toán tử nối trong JavaScript

    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.

    Module Perl phải trở về giá trị TRUE
    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.

    Nhóm ba kí tự trong C và C++

    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.

    Trường hợp chữ hoa/chữ thường của PHP

    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.

    Trong Ruby, 0 là có giá trị

    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.

    Khoảng trắng thụt đầu dòng dùng để mô tả khối trong Python

    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.
     
    Chỉ mục mảng trong C giống như bộ chỉ số học

    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].

    Tham số định nghĩa sẵn của Perl

    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).

    JavaScript tự động chèn dấu chấm phẩy

    Vấn đề: JavaScript sử dụng dấu chấm phẩy (;) vào cuối khai báo nào đó bằng cách tự động chèn ở nơi nào mà nó cho rằng cần phải có, như là xuống dòng. Do vậy điều này dễ dẫn đến lỗi.

    Lý do: việc chèn thêm dấu chấm phẩy có ý muốn mang lại thuận tiện cho nhà lập trình, giúp JavaScript có cú pháp giống như C để các nhà lập trình mới dễ học hơn.

    Tính năng autoboxing của Java với đệm Integer

    Vấn đề: Java sẽ tự động chuyển các loại dữ liệu nguyên hàm thành đối tượng (object), gọi là autoboxing, như int thành một đối tượng Integer. Mặc định thì nó cũng sẽ đệm các đối tượng Integer cho các giá trị từ -128 đến 127. Do vậy điều này dẫn đến những lỗi bất ngờ khi ta sử dụng == để so sánh các Integer được autoboxing với cùng giá trị (TRUE từ -128 đến 127; còn lại thì FALSE).

    Lý do: Autoboxing giảm số lượng mã nguồn mà nhà phát triển cần viết trong khi đệm Integer sẽ cải thiện tốc độ chương trình.
     

    Nguồn: Computerworld