Có nghĩa là gì khi hỗ trợ bản địa của đối với một tính năng trong ngôn ngữ lập trình?


15

Tôi đã trải qua một dòng như thế này "PHP không có hỗ trợ gốc cho Unicode". Ngoài ra tôi đọc rằng Python có hỗ trợ riêng cho Unicode. Bây giờ bạn có thể gọi một hàm utf8_encode()trong PHP để mã hóa một chuỗi thành Unicode và bạn có thể sử dụng một hàm unicode()trong Python để chuyển đổi một chuỗi thành unicode. Vì vậy, nó có nghĩa là gì để hỗ trợ Unicode nguyên bản? Ngoài ra, một số ngôn ngữ có hỗ trợ riêng cho đồng thời trong khi một số ngôn ngữ không có hỗ trợ riêng. Vậy ý nghĩa của nó là gì

Ngôn ngữ X vốn hỗ trợ tính năng Y


Trên thực tế, Python 3 không hỗ trợ unicode nguyên bản. Cũng như 2.7.
nmichaels

Câu trả lời:


16

Điều đó có nghĩa là để hỗ trợ một tính năng nhất định, nhà phát triển không cần sử dụng một thành phần không được nhúng trong chính ngôn ngữ, như tiện ích mở rộng hoặc sản phẩm của bên thứ ba.

Ví dụ, PHP không có hỗ trợ riêng cho unicode, bởi vì mọi hàm liên quan đến chuỗi trong chính PHP đều không hỗ trợ unicode. Ví dụ: để có được chuỗi con, bạn không thể sử dụng substr, nhưng cần sử dụng mb_substr, yêu cầu sử dụng tiện ích mở rộng Chuỗi đa chuỗi.

Để có sự hỗ trợ riêng của một tính năng nhất định, việc kết hợp một phần mở rộng trong trung kế mã nguồn là không đủ. Thay vào đó, PHP sẽ có hỗ trợ riêng cho unicode nếu unicode sẽ là mã hóa mặc định, như trong C # hoặc Java.


1
Vì vậy, nó chỉ là về việc thành phần là một phần của ngôn ngữ hay không? Ý tôi là nếu chúng bao gồm mb_stringchức năng của nguồn trong nguồn PHP thì nó sẽ trở thành bản địa?
lovesh

1
@lovesh: không dễ như thế đâu. Nếu họ kết hợp phần mở rộng trong trung kế PHP, nhưng không thực hiện unicode mã hóa mặc định , tôi không chắc liệu nó có được coi là bản địa hay không. Nếu, thay vào đó, unicode sẽ trở thành mã hóa mặc định, như trong C #, thì có, đây sẽ là một hỗ trợ riêng.
Arseni Mourzenko

Hoặc bạn có thể nói nó thực sự được hỗ trợ nhưng không phổ biến / không mặc định. Nó chỉ là ngữ nghĩa.
BlueRaja - Daniel Pflughoeft

2
Đối với một ngôn ngữ để natively hỗ trợ một số loại chuỗi, tôi sẽ yêu cầu ít nhất nó phải có một cú pháp cho xâu cho rằng loại chuỗi. Ví dụ: sẽ có một cái gì đó giống như s = "Müsliriegel"mb;thay vì một cái gì đó giống như s = toMb("Müsliriegel");(tất nhiên, điều này được đáp ứng một cách tầm thường bởi tất cả các ngôn ngữ sử dụng UTF8 làm mã hóa mặc định)
user281377

11

"Ngôn ngữ X vốn hỗ trợ tính năng Y" có nghĩa là bạn có thể sử dụng tính năng Y mà không cần bất kỳ tiện ích mở rộng hoặc nỗ lực nào khác để làm cho nó hoạt động. Nó có thể sử dụng trực tiếp từ chính ngôn ngữ.

Ví dụ, bạn có thể nói rằng,

"Ngôn ngữ C ++ vốn hỗ trợ quá tải toán tử."

"Ngôn ngữ Java vốn hỗ trợ bộ sưu tập rác tự động", vì bạn không cần sử dụng bất kỳ thư viện hoặc công cụ nào khác thực hiện thu gom rác tự động. Nó đi kèm với ngôn ngữ (và nền tảng) chính nó.


9

Tôi đã đọc bản địa trong các ngữ cảnh bạn đã đề cập dưới dạng tích hợp . Nếu một ngôn ngữ không cung cấp bản địa hỗ trợ đối với một số tính năng, bạn sẽ cần phải thực hiện nó cho mình hoặc tìm thấy một số thư viện hoặc mô-đun cung cấp nó.

Một bối cảnh khác mà bạn sẽ thấy bản địa rất nhiều là liên quan đến các ứng dụng trên một số nền tảng hoặc nền tảng khác. Trong những trường hợp đó, nó có nghĩa là được biên dịch cho nền tảng thay vì được giải thích hoặc dịch bằng cách nào đó. Một ứng dụng iOS có nguồn gốc là một trong đó được viết bằng một ngôn ngữ như Objective-C và biên dịch thành mã mà chạy trực tiếp trên máy ARM (đó là những gì bạn tìm thấy trong các thiết bị iOS).


5

Tôi nghĩ rằng việc sử dụng sai thuật ngữ này. Để một cái gì đó là "bản địa" cho một ngôn ngữ, cần phải được xây dựng trong các cơ sở cho nó. Hỗ trợ riêng cho một cái gì đó như unicode sẽ có các kiểu thô trong ngôn ngữ thực hiện unicode theo một cách nào đó. Thông thường mặc dù đây không phải là một phần của ngôn ngữ mà là một phần của thư viện.

IMHO gọi một cái gì đó xuất hiện trong thư viện mặc định của ngôn ngữ hoặc không tạo ra thứ gì đó nguyên bản hay không.

Vài ví dụ:

C ++ có hỗ trợ riêng cho các lớp. C không. Không có từ khóa ngôn ngữ hoặc loại cơ sở cho phép viết và sử dụng các lớp, bạn phải viết mã bằng tay.

Tôi sẽ nói mặc dù C ++ không có kiểu chuỗi gốc hơn C nào. Có một mẫu basic_ chuỗi trong thư viện chuẩn, nhưng đây không phải là một cơ sở ngôn ngữ.

C ++ 11 mặc dù dường như thực sự đã thêm hỗ trợ Unicode khi các từ khóa mới và các loại thô được thêm vào ngôn ngữ để tạo điều kiện làm việc với các giá trị Unicode.

Hy vọng rằng làm rõ sự khác biệt tôi nhìn thấy.


Việc bạn sử dụng các từ "kiểu thô" làm tôi bối rối. Bạn có thể làm rõ?
Jeremy Heiler

Trong Python 3, tất cả các chuỗi là unicode (có một bytesloại riêng ), vì vậy tôi nghĩ thật công bằng khi nói Python hỗ trợ unicode nguyên bản.
Brendan Long

Python 2 cũng có một unicodeloại, mặc dù nó khó sử dụng hơn Python 3. C ++ là một con quái vật kỳ lạ trong đó rất nhiều thứ thường là một phần của ngôn ngữ trong các thư viện.
Gort Robot

@JeremyHeiler: Dường như "các loại thô" là các loại cơ bản, không tổng hợp, không phải thư viện. Ví dụ, C không có một loại string ( char[]), và thậm chí xâu. Không phải tất cả các "kiểu thô" cần phải có nghĩa đen, con trỏ trong C chẳng hạn. ( NULLchỉ có thể được chuyển đổi thành int*)
MSalters

-1

"Hỗ trợ riêng" ít nhất là trong các ngôn ngữ được dịch hoặc JIT biên dịch thường có nghĩa là mã về cơ bản chỉ là một liên kết đến chức năng được biên dịch trước nằm bên dưới trình thông dịch.

Ví dụ, trong JavaScript, nếu bạn cảnh báo window.open trong Firefox, có thể bạn sẽ thấy một hàm có bộ phận bên trong nói điều gì đó như "[mã gốc]." Mặc dù tất cả các tài liệu tham khảo được đưa đến trình thông dịch và các bước cần phải được thực hiện để thiết lập bối cảnh và phạm vi, các bộ phận cơ bản được lưu trữ và sẵn sàng để đi. Chẳng hạn, window.open có thể gọi một cái gì đó từ môi trường thời gian chạy của trình duyệt.

Điều này khác với các đối tượng và phương thức không phải là bản địa mà bạn hoặc ai đó đã viết, bởi vì trong những trường hợp đó, tất cả các câu lệnh của bạn cần được diễn giải / đánh giá.

Nếu ai đó đang sử dụng thuật ngữ liên quan đến ngôn ngữ biên dịch trước, tôi sẽ cho rằng họ chỉ có nghĩa là tất cả các công cụ ngôn ngữ cốt lõi mà trình biên dịch thực sự mã hóa và chuyển đổi thành mã máy so với nội dung mà bạn tự xác định cấu trúc và tài liệu tham khảo được sử dụng để liên kết tất cả với nhau.


1
Đó không phải là hỗ trợ bản địa trong ngôn ngữ; đó là hỗ trợ riêng trong thư viện.
SLaks

Điểm nào bạn không đồng ý? Hoặc là bạn đang đọc sai tôi hoặc tôi không hiểu một số khái niệm cốt lõi nhưng điều đó thật mơ hồ.
Erik Reppen
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.