Co oznacza „natywna obsługa funkcji” w języku programowania?

15

Przeszedłem przez linię podobną do tej: „PHP nie ma natywnej obsługi Unicode”. Przeczytałem również, że Python ma natywne wsparcie dla Unicode. Teraz możesz wywołać funkcję utf8_encode()w PHP, aby zakodować ciąg znaków w Unicode, i możesz użyć funkcji unicode()w Pythonie, aby przekonwertować ciąg znaków na Unicode. Co to znaczy natywnie obsługiwać Unicode? Również niektóre języki mają natywne wsparcie dla współbieżności, podczas gdy niektóre nie mają natywnego wsparcia. Co to znaczy

Język X natywnie obsługuje funkcję Y

lovesh
źródło
W rzeczywistości Python 3 natywnie obsługuje Unicode. Podobnie jak 2.7.
nmichaels

Odpowiedzi:

16

Oznacza to, że do obsługi danej funkcji programista nie musi używać komponentu, który nie jest osadzony w samym języku, takiego jak rozszerzenie lub produkt innej firmy.

Na przykład PHP nie ma natywnego wsparcia dla Unicode, ponieważ każda funkcja, która obsługuje łańcuchy w samym PHP, nie obsługuje Unicode. Na przykład, aby uzyskać podłańcuch, nie można go użyć substr, ale trzeba go użyć mb_substr, co wymaga użycia rozszerzenia Ciąg wielobajtowy.

Aby mieć natywną obsługę danej funkcji, nie wystarczy po prostu dodać rozszerzenie do pnia kodu źródłowego. Zamiast tego PHP miałoby natywne wsparcie dla Unicode, jeśli unicode byłoby domyślnym kodowaniem, jak w C # lub Java.

Arseni Mourzenko
źródło
1
Więc chodzi tylko o to, czy składnik jest częścią języka, czy nie? Mam na myśli, że jeśli zawierają mb_stringfunkcjonalność w źródle PHP, stałaby się natywna?
lovesh
1
@lovesh: to nie jest takie proste. Jeśli dołączą rozszerzenie do pnia PHP, ale bez ustawiania domyślnego kodowania unicode , nie jestem pewien, czy byłoby to uważane za rodzime. Jeśli zamiast tego Unicode stałoby się kodowaniem domyślnym, jak w C #, to tak, byłoby to wsparcie natywne.
Arseni Mourzenko
Lub można powiedzieć, że jest natywnie obsługiwany, ale nie jest powszechny / nie jest domyślny. To tylko semantyka.
BlueRaja - Danny Pflughoeft
2
Aby język natywnie obsługiwał jakiś ciąg znaków, wymagałbym przynajmniej posiadania składni literałów łańcuchowych dla tego rodzaju łańcucha. Na przykład byłoby coś takiego s = "Müsliriegel"mb;zamiast czegoś podobnego s = toMb("Müsliriegel");(jest to oczywiście trywialnie spełniane przez wszystkie języki, które używają UTF8 jako domyślnego kodowania)
281377
11

„Język X natywnie obsługuje funkcję Y” oznacza, że ​​można używać funkcji Y bez żadnego rozszerzenia ani żadnego innego wysiłku, aby ją uruchomić. Jest bezpośrednio użyteczny z samego języka.

Możesz na przykład powiedzieć,

„Język C ++ natywnie obsługuje przeciążanie operatora”.

„Język Java natywnie obsługuje automatyczne czyszczenie pamięci”, ponieważ nie trzeba używać żadnych innych bibliotek ani narzędzi, które wykonują automatyczne czyszczenie pamięci. Pochodzi z samego języka (i platformy).

Mert Akcakaya
źródło
9

Czytałbym natywny w kontekstach, które wspomniałeś jako wbudowane . Jeśli język nie zapewnia natywnej obsługi niektórych funkcji, musisz go zaimplementować samodzielnie lub znaleźć bibliotekę lub moduł, który je zapewnia.

Innym kontekstem, w którym często widujesz natywny, jest aplikacja na jakiejś platformie. W takich przypadkach oznacza to skompilowanie dla platformy, a nie interpretację lub tłumaczenie. Natywna aplikacja iOS to taki, który jest napisany w języku Objective-C jak i kompilowane do kodu, który działa bezpośrednio na rodziny ARM procesorów (czyli to, co można znaleźć w urządzeniach z iOS).

Caleb
źródło
5

Uważam to za niewłaściwe użycie tego terminu. Aby coś było „rodzime” dla danego języka, należy zbudować odpowiednie udogodnienia. Natywne wsparcie dla czegoś takiego jak Unicode miałoby surowe typy w języku, który w jakiś sposób implementuje Unicode. Zwykle jednak nie jest to część języka, ale część biblioteki.

Wywołanie IMHO czegoś, co pojawia się w domyślnej bibliotece języka lub nie, nie powoduje, że coś jest rodzime.

Kilka przykładów:

C ++ ma natywne wsparcie dla klas. C nie. Nie ma słów kluczowych ani pism językowych, które umożliwiałyby pisanie i korzystanie z klas, należy je kodować ręcznie.

Powiedziałbym jednak, że C ++ nie ma natywnego typu ciągu niż C. W bibliotece standardowej znajduje się szablon basic_string, ale nie jest to narzędzie językowe.

Wydaje się jednak, że C ++ 11 dodał obsługę Unicode, ponieważ do samego języka dodano nowe słowa kluczowe i typy raw, aby ułatwić pracę z wartościami Unicode.

Mam nadzieję, że to wyjaśnia różnicę, którą widzę.

Edward Strange
źródło
Twoje użycie słów „surowe typy” myli mnie. Czy możesz to wyjaśnić?
Jeremy Heiler,
W Pythonie 3 wszystkie ciągi znaków są Unicode (istnieje osobny bytestyp), więc myślę, że można powiedzieć, że Python obsługuje Unicode natywnie.
Brendan Long
Python 2 radzi sobie równie dobrze, ponieważ ma swój unicodetyp, chociaż korzystanie z niego jest bardziej bolesne niż w Pythonie 3. C ++ jest dziwną bestią pod tym względem, że tak wiele tego, co zwykle jest częścią języka, znajduje się w bibliotekach.
Gort the Robot
@JeremyHeiler: Wygląda na to, że „typy surowe” są podstawowymi, nieskompozytowymi typami niebibliotecznymi. Na przykład, C nie mają typu string ( char[]), a nawet literały ciągów. Nie wszystkie „typy surowe” muszą mieć pasujące literały, na przykład wskaźniki w C nie. ( NULLmożna tylko przekonwertować na int*)
MSalters
-1

„Obsługa natywna” przynajmniej w językach interpretowanych lub skompilowanych w JIT zazwyczaj oznacza kod, który jest po prostu linkiem do wstępnie skompilowanej funkcjonalności, która znajduje się poniżej interpretera.

Na przykład w JavaScript, jeśli ostrzeżesz window.open w Firefox, prawdopodobnie zobaczysz funkcję, której wnętrzności mówią coś w stylu „[kod natywny]”. Chociaż wszystkie odniesienia są podawane do tłumacza i należy podjąć kroki w celu ustalenia kontekstu i zakresu, wnętrze jest w zasadzie buforowane i gotowe do użycia. Na przykład window.open prawdopodobnie wywołuje coś ze środowiska wykonawczego przeglądarki.

Różni się to od nienatywnych obiektów i metod napisanych przez ciebie lub kogoś innego, ponieważ w takich przypadkach wszystkie twoje wypowiedzi muszą być interpretowane / oceniane.

Gdyby ktoś użył tego terminu w odniesieniu do języka, który prekompiluje, założyłbym, że miał on na myśli wszystkie podstawowe rzeczy językowe, które kompilator faktycznie tokenizuje i konwertuje na kod maszynowy, w przeciwieństwie do tego, co sam definiujesz, co bardziej dotyczy struktury i odniesienia użyte do połączenia tego wszystkiego razem.

Erik Reppen
źródło
1
To nie jest natywne wsparcie w języku; to natywne wsparcie w bibliotece.
SLaks
Z którym punktem się nie zgadzasz? Albo źle mnie interpretujesz, albo nie rozumiem jakiejś podstawowej koncepcji, ale to trochę niejasne.
Erik Reppen