Что подразумевается под «встроенной поддержкой функции» в языке программирования?

15

Я прошел через примерно такую ​​строку: «PHP не имеет встроенной поддержки Unicode». Также я читал, что Python имеет встроенную поддержку Unicode. Теперь вы можете вызвать функцию utf8_encode()в PHP для кодирования строки в Unicode и использовать функцию unicode()в Python для преобразования строки в Unicode. Так что же значит поддерживать Unicode изначально? Также некоторые языки имеют встроенную поддержку параллелизма, в то время как некоторые не имеют встроенной поддержки. Так что подразумевается под

Язык X изначально поддерживает функцию Y

lovesh
источник
На самом деле, Python 3 поддерживает Unicode изначально. Как и 2.7.
nmichaels

Ответы:

16

Это означает, что для поддержки данной функции разработчику не нужно использовать компонент, который не встроен в сам язык, например расширение или сторонний продукт.

Например, в PHP нет встроенной поддержки юникода, потому что каждая функция, которая работает со строками в самом PHP, не поддерживает юникод. Например, чтобы получить подстроку, вы не можете использовать substr, но должны использовать mb_substr, что требует использования расширения Multibyte String.

Чтобы иметь встроенную поддержку данной функции, недостаточно просто включить расширение в ствол исходного кода. Вместо этого PHP будет иметь встроенную поддержку Юникода, если Юникод будет кодировкой по умолчанию, как в C # или Java.

Арсений Мурзенко
источник
1
То есть, является ли компонент частью языка или нет? Я имею в виду, если бы они включили mb_stringфункциональность в исходный код PHP, он стал бы нативным?
lovesh
1
@lovesh: это не так просто, как это. Если они включают расширение в транк PHP, но без использования кодировки по умолчанию в кодировке Юникод , я не уверен, будет ли оно рассматриваться как нативное. Если вместо этого юникод станет кодировкой по умолчанию, как в C #, то да, это будет встроенная поддержка.
Арсений Мурзенко
Или вы можете сказать, что он изначально поддерживается, но не распространен / не используется по умолчанию. Это просто семантика.
BlueRaja - Дэнни Пфлюгофт
2
Чтобы язык изначально поддерживал какую-либо строку, я бы по крайней мере потребовал, чтобы он имел синтаксис для строковых литералов для такой строки. Например, было бы что-то вроде, s = "Müsliriegel"mb;а не что-то вроде s = toMb("Müsliriegel");(это, конечно, тривиально выполняется всеми языками, которые используют UTF8 в качестве кодировки по умолчанию)
user281377
11

«Язык X изначально поддерживает функцию Y» означает, что вы можете использовать функцию Y без какого-либо расширения или каких-либо других усилий, чтобы заставить ее работать. Его можно использовать непосредственно из самого языка.

Например, вы можете сказать, что

«Язык C ++ изначально поддерживает перегрузку операторов».

«Язык Java изначально поддерживает автоматическую сборку мусора», потому что вам не нужно использовать какие-либо другие библиотеки или инструменты, которые выполняют автоматическую сборку мусора. Он поставляется с самим языком (и платформой).

Мерт Акчакая
источник
9

Я бы прочитал нативный в тех контекстах, которые вы упомянули как встроенные . Если язык не обеспечивает встроенную поддержку какой-либо функции, вам нужно будет реализовать ее самостоятельно или найти библиотеку или модуль, который ее предоставляет.

Другой контекст, в котором вы часто видите натив, касается приложений на той или иной платформе. В этих случаях это означает, что он скомпилирован для платформы, а не как-то интерпретирован или переведен. Родное приложение IOS является тот , который написан на языке , как Objective-C и компилируется код , который работает непосредственно на ARM семейства процессоров (который является то , что вы найдете в устройствах IOS).

Калеб
источник
5

Я бы посчитал это неправильным употреблением этого термина. Чтобы что-то было «родным» для языка, в нем должны быть встроены средства. Встроенная поддержка чего-то вроде юникода будет иметь необработанные типы в языке, которые каким-то образом реализуют юникод. Хотя обычно это не часть языка, а часть библиотеки.

ИМХО вызов чего-то, что появляется в библиотеке языка по умолчанию или нет, не делает что-то родное или нет.

Несколько примеров:

C ++ имеет встроенную поддержку классов. С не делает. Не существует языковых ключевых слов или средств ввода типов, которые позволяют писать и использовать классы, вы должны кодировать их вручную.

Я бы сказал, однако, что C ++ не имеет собственного строкового типа, чем C. В стандартной библиотеке есть шаблон basic_string, но это не языковая возможность.

В C ++ 11, казалось бы, фактически добавлена ​​поддержка Unicode, поскольку новые ключевые слова и необработанные типы были добавлены к самому языку для облегчения работы со значениями Unicode.

Надеюсь, это проясняет разницу, которую я вижу.

Эдвард Стрендж
источник
Ваше использование слов «необработанные типы» смущает меня. Не могли бы вы уточнить?
Джереми Хейлер
В Python 3 все строки являются Unicode (есть отдельный bytesтип), поэтому я думаю, что будет справедливо сказать, что Python поддерживает Unicode изначально.
Брендан Лонг
Python 2 делает unicodeто же самое в том смысле, что у него есть тип, хотя его более болезненно использовать, чем Python 3. C ++ - странный зверь в том, что большая часть того, что обычно является частью языка, находится в библиотеках.
Gort Робот
@JeremyHeiler: кажется, что «необработанные типы» являются фундаментальными, не составными, небиблиотечными типами. Так , например, С делает имеют строковый тип ( char[]), и даже строковые литералы. Не все «необработанные типы» должны иметь совпадающие литералы, например указатели в C не имеют. ( NULLможет быть преобразован только в int*)
MSalters
-1

«Встроенная поддержка», по крайней мере, в интерпретируемых или JIT-скомпилированных языках обычно означает код, который в основном представляет собой ссылку на предварительно скомпилированную функциональность, которая находится ниже интерпретатора.

Например, в JavaScript, если вы оповестите window.open в Firefox, вы, вероятно, увидите функцию, внутренности которой говорят что-то вроде «[native code]». В то время как все ссылки передаются интерпретатору, и необходимо предпринять шаги для установления контекста и области действия, внутренности в основном кэшируются и готовы к работе. Например, window.open, вероятно, вызывает что-то из среды выполнения браузера.

Это отличается от неродных объектов и методов, которые вы или кто-то другой написал, потому что в этих случаях все ваши утверждения необходимо интерпретировать / оценивать.

Если бы кто-то использовал этот термин в отношении языка, который предварительно компилируется, я бы предположил, что он имел в виду все базовые языковые вещи, которые компилятор фактически токенизирует и преобразует в машинный код, по сравнению с тем, что вы определяете сами, что больше относится к структуры и ссылки используются, чтобы связать все это вместе.

Эрик Реппен
источник
1
Это не родная поддержка в языке; это нативная поддержка в библиотеке.
SLaks
С каким пунктом вы не согласны? Либо ты неправильно меня понимаешь, либо я не понимаю какую-то основную концепцию, но это не совсем понятно.
Эрик Реппен