Який сенс додавати підтримку ідентифікатора Unicode до різних мовних реалізацій?


14

Я особисто вважаю, що код читання, повний ідентифікаторів Unicode, бентежить. На мій погляд, це також не дозволяє легко підтримувати код. Не кажучи вже про всі зусилля, необхідні авторам різних перекладачів для здійснення такої підтримки. Я також постійно помічаю відсутність (або наявність) підтримки Unicode-ідентифікаторів у списках (не) переваг різних мовних реалізацій (як це насправді має значення). Я не розумію: чому так багато уваги?


1
Ви маєте на увазі назви речей, або ви маєте на увазі особливих символів, таких як зірки, лямбда та середні точки?
Френк Шірар

5
Лол ! Чи знали ви, що світ існує поза межами англомовних країн? Відкриття Amazign, чи не так?
deadalnix

3
deadalnix: Я живу в такій країні, тому ми можемо використовувати такі ідентифікатори größe. Це сказало, що я ніколи цього не роблю, і я сильно переконую це робити. Тому питання дуже справедливе.
користувач281377

2
deadalnix: Я ніколи до цього не був у англомовній країні. Чому б не звернути увагу на власне питання, а не на запитувача?
Єгор Тенсін

6
Я хочу, щоб мови орієнтувались на те, щоб Unicode був правильним в обробці рядків і не залишав фантазійні ідентифікатори unicode. Хороші ресурси програмування так чи інакше є англійською мовою (StackOverflow), тому давайте визнаємо, програмування повинно здійснюватися англійською мовою (також полегшує обмін) та зосередимось на застосуванні правильної маніпуляції з рядками Unicode.
Матьє М.

Відповіді:


17

Коли ви думаєте про unicode, ви думаєте про китайські чи російські символи, що змушує вас думати про якийсь вихідний код, написаний російською мовою, який ви бачили в Інтернеті, і який був непридатний (якщо ви не знаєте російську мову).

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

Коли ви пишете код для певного поля, за допомогою unicode, ви можете скоротити код і зробити його більш читабельним . Замість:

const numeric Pi = 3.1415926535897932384626433832795;
numeric firstAlpha = deltaY / deltaX + Pi;
numeric secondAlpha = this.Compute(firstAlpha);
Assert.Equals(math.Infinity, secondAlpha);

Ви можете написати:

const numeric π = 3.1415926535897932384626433832795;
numeric α₁ = Δy / Δx + π;
numeric α₂ = this.Compute(α₁);
Assert.Equals(math.∞, α₂);

що може не бути простим для читання середньому розробнику, але все ще легко читати людині, яка щодня використовує математичні символи .

Або, роблячи додаток, пов’язаний із дзеркальною фотографією, замість:

int aperture = currentLens.GetMaximumAperture();
Assert.AreEqual(this.Aperture1_8, aperture);

ви можете замінити діафрагму символом ƒ, написом ближче до ƒ/1.8:

int ƒ = currentLens.GetMaximumƒ();
Assert.AreEqual(this.ƒ1¸8, ƒ);

Це може бути незручно : коли ви вводите загальний код C #, я вважаю за краще писати:

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.Average()
double sum = this.ProductPrices.Sum();

а не:

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.x̅()
double sum = productPrices.Σ();

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

Це, як кажуть, у деяких випадках все-таки корисно. currentLens.GetMaximumƒ();мого попереднього прикладу може покладатися на IntelliSense і його набирати так само просто GetMaximumAperture, як і коротший і читабельніший. Також для конкретних доменів з великою кількістю символів комбінації клавіш можуть допомогти вводити символи швидше, ніж їхні буквальні еквіваленти у вихідному коді.

Те саме, до речі, стосується і коментарів. Ніхто не хоче читати код, повний коментарів китайською мовою (якщо ви самі добре не знаєте китайську мову). Але в деяких мовах програмування символи unicode все ще можуть бути корисними. Один із прикладів - виноски¹.


¹ Мені, звичайно, не сподобаються виноски в коді C #, де є суворий набір стильових правил, як писати коментарі. У PHP, з іншого боку, якщо є багато речей для пояснення, але ці речі не дуже важливі, чому б не поставити їх у нижню частину файлу та створити виноску в PHPDoc методу?


ASCII включає 37 символів, які можна використовувати в ідентифікаторах; Я б очікував, що в більшості шрифтів вони досить візуально відрізняються, що навіть люди, які не володіють латинським алфавітом, могли б навчитися розповідати два рядки символів у різних шрифтах, що були однаковим ідентифікатором. Скільки зусиль для налагодження буде витрачено даремно, коли програміст використовує "Ф" для кута замість "Φ"?
supercat

1
@supercat: хороший момент. Але приклад, який ви наводите, показує, що інструмент погано використовує, а не сам інструмент поганий. Δxабо -∞це дійсне використання (з деякими недоліками, які я пояснив у своїй відповіді). Ф/ Φз іншого боку, це лише ознаки того, що програміст не розуміє, як правильно називати змінні.
Арсеній Мурценко

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

1
@supercat: Ви мали на увазі грецьку букву phi? Моя думка полягає в тому, що якщо програміст використовує цей символ у програмі, де очікується термін «функція накопичувального розподілу», будь-яка людина, яка знає термінологію та символи домену, зрозуміє, що означає «. cumulativeDistributionFunctionзанадто довго. CDFменш читабельна, ніж Φ. cumDistFuncнекрасивий Це також означає, що якщо програміст використовує кирилицю з малої літери EF (Ф) замість цього контексту, це просто помилка. Таким же чином програміст міг використати неправильний термін або неправильну абревіатуру.
Арсеній Муренко

1
Якщо ім'я змінної складається з підкреслень, 0-9, az та AZ, то хтось із копією коду, який не підтримує копіювати / вставляти (наприклад, роздруківку), може сподіватися, що вона буде точно відтворена. Хтось, хто намагається скопіювати "ɸ", не знаючи, що це означає, може дуже легко закінчитись "Ф", і навіть якщо програміст знає, що це повинно бути "фі", не було б очевидно, чи є "φ" або "ɸ" відповідний. [Один - це "Малий літера латинської мови", а один - "Грецький малий останній фі" - вони відображаються чітко в цьому шрифті коментаря, але не в Lucida Sans Unicode].
supercat

8

Я б сказав:

  1. полегшити непрофесіоналів та новачків, які вивчають програмування (наприклад, у школі) та не знають англійської мови. Вони все одно не пишуть виробничий код. Я багато разів бачив такий код:

    double upsos, baros;
    cin >> upsos >> baros;
    

    Просто дозвольте бідному хлопцеві написати це своєю мовою:

    double ύψος, βάρος;
    cin >> ύψος >> βάρος;
    
  2. Вам це не подобається?

    class ☎ {
    public:
        ☎(const char*);
        void 📞();
        void 🎧(👨);
    };
    
    ☎ ☏("031415926");
    ☏.🎧(👨("Bob"));
    ofstream f;
    f.💾();
    

За іронією долі, код у розділі "Не подобається тобі" не відображається належним чином, що ілюструє суть того, чому ти можеш хотіти осторонь використання фанк-символів.
Кріс

5

Звичайно, сьогодні кожен компілятор повинен мати справу з вихідним кодом Unicode. Наприклад, рядкові константи, можливо, повинні містити символи Unicode. Але як тільки цього досягти, чому б не дозволити також ідентифікатори unicode? Не важливо, якщо ваш код компілятора не залежить від того, що символи є 7-бітовими кодами.

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

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


Проблема з дозволом ідентифікаторів Unicode полягає в тому, що він дозволяє вихідному коду містити інформацію, яка є семантично важливою, але не для друку. Наприклад, якщо клас оголошує поле А, його конструктор приймає параметр Α, а заява в конструкторі говорить var x = A.boz();, чи Aпосилатиметься на поле, параметр чи, можливо, щось інше? Як можна було сказати?
supercat

1
Так, але тоді лише декілька символів схожі на себе, і тоді це, як це часто, є питанням стилю, кодування керівництвом та надійністю впевненості, що потрібно переконатися, що ви не використовуєте 3 різних символів, схожих на A одне місце. ОТОХ, будучи любителем свободи, я заперечую заборону чогось лише тому, що не впевнений, що його хтось може зловживати.
Інго

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

4

Я думаю, що має багато сенсу дозволити символи Unicode в рядках та коментарях. І якщо лексеру та аналізатору доводиться підтримувати unicode для цього, письменник-компілятор, ймовірно, отримує підтримку символів unicode безкоштовно в ідентифікаторах, тому, здавалося б, довільним обмеженням дозволяється лише ідентифікатори ASCII в ідентифікаторах.


8
Не зовсім. У рядкових літералах символи, що не належать до ASCII, можуть трактуватися як непрозорі. За допомогою ідентифікаторів потрібно прийняти рішення про те, які символи є дійсними та чи нормалізувати їх (наприклад, várте саме, що vár?)
dan04

4

Що стосується мене, це суто з маркетингових причин. А ще може ускладнити наше життя.

Аргументи маркетингу

Ви знаєте цей божевільний список функцій, якими хвалиться більшість мов? Це взагалі дуже марно, оскільки це так далеко від мови, що не дає багато інформації про конкретні, але це дозволяє швидко одягати столи з тиками та хрестиками і правильно зробити висновок, що оскільки у X більше кліщів, ніж у Y, це повинно бути будь кращим.

Ну, підтримка Unicode для ідентифікаторів є одним із цих рядків. Не має значення, що порівняно з підтримкою Lambda, підтримкою загального програмування тощо ... це може бути не так багато, люди, що малюють таблиці, не хвилюються про якість кожного рядка, а лише про кількість їх.

І таким чином вони можуть похвалитися: "Ах, з Y у вас немає підтримки Unicode для ваших ідентифікаторів! У X ми це робимо, тому для студентів це набагато простіше!"

Помилковість доступності

На жаль, аргумент доступності є помилковим.

О, я розумію, що можливість писати "résultatDuJetDeDé" замість "diceThrowResult" (так, я є французом) може здатися перемогою за короткий термін ... проте є і недоліки!

Програмування стосується спілкування

Ваша програма призначена не лише для компілятора (який може менше піклуватися про використовувані вами ідентифікатори), але і для ваших побратимів. Їм потрібно вміти її читати і розуміти.

  • Читання цього означає, що ви можете візуалізувати використані вами символи, Unicode не так добре підтримується всіма шрифтами
  • розуміючи це, це означає покладатися на ідентифікатори - якщо ви не доповните їх довгими коментарями, але це порушує правило DRY.

Звичайно, ваш однокласник може розмовляти тією ж мовою, що і ви (не очевидно, що в мене були уроки програмування з німцями, іспанцями, ліванцями та китайцями), і так може бути і з вашим вчителем ... але припустимо, що ви якось працюєте над цим вдома і раптом потрібна допомога: Інтернет чудовий, ви можете поговорити з тисячами тисяч людей, які знають рішення, вони дадуть відповідь, лише якщо вони зрозуміють ваше питання. І вам потрібно зрозуміти і їх відповідь.

Програмування вимагає розуміння

Доступність та ініціація вимагають базуватися на бібліотеках, щоб зробити важку атлетику для вас: ви не хочете винаходити шар IO для читання / запису на консоль під час першого завдання.

  • Якою мовою пишуться ці бібліотеки?
  • Якою мовою ці бібліотеки задокументовані?

Якщо ви відповісте Morrocan арабською мовою, я буду здивований.

Якщо ви не покладатися тільки на лекції ви сприяти, і присутні повну документацію по кожній бібліотечної функції вам необхідно використовувати (і , можливо , навіть в перекладі бібліотек), то ви будете мати , щоб дізнатися modicrum англійської мови. Але тоді ви, мабуть, зробили вже задовго до того, як ви все-таки почали цей курс програмування.

Англійська мова - це ...

... lingua franca програмістів (і більшості вчених).

Чим швидше це визнає і піде разом із ним, а не бореться з цим, тим швидше можна по-справжньому вчитися та прогресувати.

Деякі з них неминуче заперечуватимуть проти цього і справедливо відстоюють своє право говорити мовою за власним вибором (рідною рідною мовою), однак, як показав Вавілон, чим більше мов використовується, тим складніше спілкування стає.

Все-таки ...

Так, як це вже заперечувалося, деяка підтримка Unicode (в основному символи) може значно полегшити розуміння людям, які мають перевести математичні чи фізичні формули, наприклад, у код. Є недоліком того, що деякі символи перевантажені, але це все-таки може допомогти.

Так чому ?

Ну, як було сказано, мова йде не про зручність користувачів, а про маркетингові претензії. Це теж мертво, оскільки аналізатор вже знає Unicode для рядків та коментарів, так що більшість з них стрибає.

І певні користувачі можуть мати користь.

Але особисто я матиму справу лише з кодом, написаним англійськими ідентифікаторами. Мені байдуже, чи потрібна вам моя допомога з вашим кодом, чи ваша бібліотека просто приголомшлива, і я міг би багато чого використати: якщо я не можу це зрозуміти, мені просто доведеться її ігнорувати.


Отже, ви один з тих, хто готовий перетворитись на історичні фактичні реалії на де-юре (вибачте за відсутність акцентів; нібито ніхто сьогодні не хвилює)?
Milind R

@MilindR: Я одна з тих, хто думає, що світ був би кращим місцем, якби всі говорили однією мовою; і я досить прагматичний, щоб вважати англійську за роль, незважаючи на те, що вона є французькою. Я можу переконатися, що підмножина Unicode може бути корисною загалом (грецькі літери для математики / фізики). Я розумію, що для навчання програмуванню корисна мова програмування, де студент може виражати ідентифікатори рідною мовою; для цього не потрібно, щоб будь-яка та всі мови підтримували повні ідентифікатори Unicode. Це моя особиста думка, зроби з неї те, що ти будеш :)
Матьє М.

3

Як ви збираєтесь набрати ідентифікатори ASCII на китайській клавіатурі? Кілька мовних ключових слів - це одне, і потрібно робити весь код таким чином - інше.

Програмісти повинні мати право і здатність називати свої змінні все, що вони хочуть. На якій мові ви не займаєтесь.

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


4
Я набираю це повідомлення за допомогою "російської" клавіатури. У мене в Google є китайська клавіатура ( goo.gl/U1q0m ), і я не бачу різниці з російською ( goo.gl/af04R ). Зауважте, до речі, що обидва мають латинське розташування поряд із рідним.
Єгор Тенсін

2
Скажімо, я використовую ідентифікатори за допомогою кирилиці. А як щодо китайського мого коду? Скажімо, він знайомий з латинськими літерами, але тепер він змушений обробляти зовсім інший набір символів! Не кажучи вже про арабські багато прикрашені букви та ін.
Єгор Тенсін

2
3-й абзац - це точна причина використовувати лише англійською мовою, чи не так?
Антон Барковський

9
@Egor: Це причина, що команда чи менеджер проектів може прийняти правило. Але це не привід для того, щоб мова чи реалізація її застосовувала. Команда чи компанія завжди можуть обмежити ідентифікатори далі - вони не можуть вибрати розширений набір. Ось чому оригінальний набір повинен бути максимально великим.
DeadMG

3
"Як ви збираєтесь набрати ідентифікатори ASCII на китайській клавіатурі?" - точно так само, як і на англійській клавіатурі. Ви вибрали поганий приклад; Китайські (та японські) зазвичай вводяться як англійські літери, що описують вимову, тоді відображається список відповідних китайських / японських, з яких користувач може вибрати правильний, якщо за замовчуванням невірно (сучасні системи використовують аналіз контексту, щоб переконатися, що це зазвичай є).
Майкл Боргвардт

2

Згідно з PEP 3131 - Підтримка ідентифікаторів , що не належать до ASCII, датованих 2007 роком, перша частина обгрунтування говорить:

Код Python написаний багатьма людьми світу, які не знайомі з англійською мовою або навіть добре знайомі з латинською системою письма. Такі розробники часто хочуть визначати класи та функції з іменами рідною мовою, а не придумувати (часто неправильний) англійський переклад концепції, яку вони хочуть назвати. Завдяки використанню ідентифікаторів рідною мовою поліпшується чіткість і збереження коду серед носіїв цієї мови.

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


1

Це дійсно полегшило б життя (для когось із нас, все одно), якби компілятор не підтримував Unicode. Праві наліво ідентифікатори жахливі. Комбіновані ідентифікатори римського алфавіту та праворуч-ліворуч ідентифікатори Unicode ще гірші.

Погано в непідтримці полягає в тому, що певні майстри графічного інтерфейсу беруть текст, який ви вводите для елемента, і автоматично використовуєте цей текст як ідентифікатор елемента. То що б вони робили з текстом Unicode на цих елементах? Боязна відповідь не проста.

Коментарі Unicode справа наліво теж можуть бути смішними. Наприклад, у VS 2010 коментарі XML відображають (правильно) як RTL у коді ..., але коли ви використовуєте Intellisense для підведення ідентифікатора в іншому місці коду, підказка відображає (неправильно) LTR. Краще, можливо, якби не було підтримки в першу чергу? Знову ж таки, нелегкий дзвінок.

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