Що розуміється під "рідною підтримкою функції" мовою програмування?


15

Я пройшов лінію приблизно таким чином "PHP не має вбудованої підтримки Unicode". Також я читав, що Python має вбудовану підтримку Unicode. Тепер ви можете викликати функцію utf8_encode()в PHP для кодування рядка в Unicode, а ви можете використовувати функцію unicode()в Python для перетворення рядка в unicode. Отже, що означає підтримка Unicode вродженого? Також деякі мови мають вбудовану підтримку для одночасності, а деякі не мають рідної підтримки. Отже, що мається на увазі під

Мова X підтримує функцію Y


Насправді, Python 3 підтримує Unicode спочатку. Як і 2.7.
nmichaels

Відповіді:


16

Це означає, що для підтримки заданої функції розробнику не потрібно використовувати компонент, який не вбудований у саму мову, як розширення чи сторонній продукт.

Наприклад, PHP не має вбудованої підтримки для unicode, оскільки кожна функція, що стосується рядків у PHP, не підтримує unicode. Наприклад, щоб отримати підрядку, ви не можете використовувати substr, але потрібно використовувати mb_substr, для чого потрібно використовувати розширення Multibyte String.

Щоб мати вбудовану підтримку даної функції, недостатньо просто включити розширення в магістраль вихідного коду. Натомість PHP матиме вбудовану підтримку unicode, якщо unicode буде кодуванням за замовчуванням, як у C # або Java.


1
Тож справа лише в тому, чи є компонент частиною мови чи ні? Я маю на увазі, якщо вони включають mb_stringфункціонал у джерело PHP, він стане рідним?
loveh

1
@lovesh: це не так просто. Якщо вони включають розширення у магістраль PHP, але не роблячи кодування за замовчуванням unicode , я не впевнений, чи вважатиметься він нативним. Якщо замість цього, Unicode стане кодуванням за замовчуванням, як у C #, то так, це буде нативна підтримка.
Арсеній Муренко

Або ви можете сказати, що він підтримується в основному, але не є загальним / не за замовчуванням. Це просто семантика.
BlueRaja - Danny Pflughoeft

2
Для того, щоб мова спочатку підтримувала якийсь рядок, я хоч би вимагав, щоб він мав синтаксис для рядкових літералів для цього виду рядка. Наприклад, було б щось подібне s = "Müsliriegel"mb;замість чогось подібного s = toMb("Müsliriegel");(це, звичайно, тривіально виконується всіма мовами, які використовують кодування UTF8 як кодування за замовчуванням)
user281377

11

"Мова X підтримує функцію Y" означає, що ви можете використовувати функцію Y без будь-яких розширень чи будь-яких інших зусиль, щоб вона працювала. Це безпосередньо можна використовувати з самої мови.

Наприклад, ви можете сказати,

"Мова C ++ споконвічно підтримує перевантаження оператора."

"Мова Java підтримує автоматичне збирання сміття", тому що вам не потрібно використовувати інші бібліотеки чи інструменти, які здійснюють автоматичне збирання сміття. Він поставляється з самим лангажком (і платформою).


9

Я б читав рідне в контекстах, які ви назвали вбудованими . Якщо мова не забезпечує вбудовану підтримку певної функції, вам потрібно буде реалізувати її самостійно або знайти якусь бібліотеку або модуль, який її надає.

Ще один контекст, де ви побачите багато рідного - це стосується програм на тій чи іншій платформі. У цих випадках це означає, складений для платформи , на відміну від того, щоб якось інтерпретувати чи перекладати. Рідне додаток IOS є той , який написаний на мові , як Objective-C і компілюється код , який працює безпосередньо на ARM сімейства процесорів (який є те , що ви знайдете в пристроях IOS).


5

Я вважаю, що це неправильне використання терміна. Для того, щоб щось було "рідним" для мови, потрібно будувати засоби для цього. Рідна підтримка чогось на зразок unicode матиме необроблені типи в мові, які певним чином реалізують unicode. Зазвичай це не частина мови, а частина бібліотеки.

ІМХО, що викликає щось, що з’являється в бібліотеці за замовчуванням для мови або не, не робить щось рідним чи ні.

Деякі приклади:

C ++ має вбудовану підтримку для занять. З - ні. Немає мовних ключових слів чи засобів типу, які б дозволяли писати та використовувати класи, ви повинні кодувати їх вручну.

Я б сказав, хоча, що C ++ більше не має рідного типу рядка, ніж C. Шаблон basic_string є в стандартній бібліотеці, але це не мовний інструмент.

C ++ 11, хоча, здавалося б, фактично додав підтримку Unicode, оскільки нові ключові слова та сировинні типи були додані до самої мови для полегшення роботи зі значеннями Unicode.

Сподіваюсь, що прояснить різницю, яку я бачу.


Ваше вживання слів "сировинні типи" мене бентежить. Не могли б ви уточнити?
Джеремі Хайлер

У Python 3 всі рядки є unicode (є окремий bytesтип), тому я думаю, що справедливо сказати, що Python підтримує unicode на самому рівні.
Брендан Лонг

Python 2 добре unicodeдопомагає в тому, що він має тип, хоча використовувати його більш болісно, ​​ніж Python 3. C ++ - дивний звір у тому, що стільки всього, що зазвичай є частиною мови, є в бібліотеках.
Gort the Robot

@JeremyHeiler: Схоже, що "сировинні типи" - це фундаментальні, нескладені, небібліотечні типи. Так , наприклад, С робить мають строковий тип ( char[]), і навіть рядкові літерали. Не всі "сировинні типи" повинні мати відповідні літерали, наприклад, покажчики на C. ( NULLможна перетворити лише на int*)
MSalters

-1

"Рідна підтримка", щонайменше, в інтерпретованих або JIT-компільованих мовах, як правило, означає код, який в основному є лише посиланням на попередньо складений функціонал, який знаходиться нижче інтерпретатора.

Наприклад, у JavaScript, якщо ви попередили window.open у Firefox, ви, ймовірно, побачите функцію, внутрішня частина якої говорить щось на кшталт "[рідний код]." Незважаючи на те, що всі посилання подаються на інтерпретатора, і потрібно вжити заходів для встановлення контексту та сфери застосування, внутрішні елементи в основному кешовані та готові до роботи. Наприклад, window.open, ймовірно, викликає щось із середовища виконання браузера.

Це відрізняється від ненормативних об'єктів та методів, які ви або хтось ще написав, тому що в цих випадках всі ваші твердження потрібно інтерпретувати / оцінювати.

Якби хтось використовував цей термін стосовно мови, яка попередньо компілюється, я б припустив, що він мав на увазі всі основні мовні речі, які компілятор насправді токенізує та перетворює на машинний код, порівняно з речами, які ви самі визначаєте, і це стосується більше структури та посилання, що використовуються для того, щоб зв'язати все це разом.


1
Це не рідна підтримка мови; це рідна підтримка в бібліотеці.
СЛАкс

З якою точкою ви не згодні? Або ти мене неправильно читаєш, або я не розумію якоїсь основної концепції, але це щось невиразно.
Ерік Реппен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.