Чи сигіли полегшують читання вихідного коду?


13

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

Приклад;

 var $foo = "something";
 echo $foo;

Я розробляю нову мову сценаріїв для бізнес-програми, і мої цільові користувачі не мають досвіду програмування. Чи спрощують ці символи код для читання та використання?

Однією з причин використання PHP $є те, що без нього PHP не може визначити, чи є ім'я посиланням на функцію або змінною посиланням. Це тому, що мова дозволяє дивно посилатися на функції. Таким чином, $символ допомагає парсеру відокремити простір імен.

У мене немає проблеми в моєму аналізаторі. Тож моє запитання полягає лише в читанні та простоті використання. Я стільки років кодував PHP, що коли я бачу $foo, мені легко визначити це як змінну. Чи я просто надаю перевагу упередженості цьому ідентифікатору?


19
IMO, код легше читати без сигналів
Джон Дворак

6
@JanDvorak +1 за те, що він сказав мені нове слово дня. Я спробую sigilsсьогодні тричі використовувати їх у розмовах.
Реакційний

6
IMO Це залежить від того, чи має ваш редактор виділення синтаксису.
CodeBeard

5
Якщо ви використовуєте var $x = ...або type $x = ...тоді я вважаю, що долар зайвий. Якби ти щойно мав, $x = ...тоді це можна було б зробити. Особливо, якщо ви не хочете підтримувати виділення синтаксису в загальних редакторах. Однак, як уподобання, мені не подобаєтьсяsigils
CodeBeard

5
сигіли схожі на примусове угорське позначення
грохот виродка

Відповіді:


13

Фактичні технічні можливості та обмеження не є тими, як пропонується у цій темі. Розберемося спочатку.

Ось що $ робить можливим у PHP:

  • Змінні змінні
  • Змінні з назвою ключових слів, наприклад, $returnабо здатні використовувати те саме ім'я для змінної та функції функціонування / константа, наприклад$__FILE__

Обмеження або функції, не пов'язані з префіксом $:

  • В іншому випадку реалізація не може визначити різницю між функціями та змінними
  • Інтерполяція рядка PHP або синтаксис шаблону
  • Обов’язкова декларація змінної

Це означає, що технічних причин у вас не було

foo = "something";
echo foo;

або

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Однак ви не можете мати це (якщо returnце ключове слово)

return = "something";

Без серйозних ускладнень. Якби ви використовували префікс типу $, то це не було б жодної проблеми.

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


О return = "something";, у C # є "контекстні ключові слова", що також є варіантом, який варто перевірити під час проектування мов.
luiscubal

1
@luiscubal пише, що в C # не дивно потрібен sigil, тому якщо ви хочете, щоб цей код був скомпільований, вам потрібно написати @return = "something;". Існує деяка кількість контекстних ключових слів, так, але зробити їх усіма контекстуальними означатиме набагато складніша реалізація.
Esailija

7

Сигнали насправді мають набагато більше сенсу в perl, де вони забезпечують певну кількість перевірки типу. У php вони не дуже допомагають поза шаблонуванням. Ви можете зрозуміти їх корисність і читабельність, оглянувши різні мови. Навряд чи хтось ними користується.

У мові, орієнтованій на кінцевих користувачів, над якою я працюю, я навіть іду далі, роблячи регістри ідентифікаторів нечутливими та дозволяючи пробіли та апострофи. Це дозволяє мені робити такі імена змінних Karl's height, які набагато ближче до природних мов.


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

1
Мені подобається ідея. Але мені б не хотілося писати аналізатор для мови з пробілом в ідентифікаторі. :-)At Karl's for the night = true;
Мартін Йорк

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

2
Однак, нечутливість до справи має проблему інтернаціоналізації. Якщо ви дозволяєте символи з багатьох мов, ви можете зіткнутися з іменами, які є "однаковими" в деяких мовах, а не в інших.
luiscubal

1
Дозволити пробіл у змінних в принципі не є великою справою - це просто означає граматичне правило для ідентифікаторів, яке дозволяє декілька слів. Однак це означає, що інші речі можуть бути неможливі в граматиці без створення неоднозначності. Наприклад, у Haskell map sum- це частково застосований виклик функції - функція sumпередається як параметр map. Але обидва - це лише імена бібліотеки, тому при багатослов’ятних ідентифікаторах компілятор не міг знати, чи map sumє одним багатослівним ідентифікатором чи функціональним додатком, що базується на двох однословних ідентифікаторах.
Стів314

7

Роки тому я навчився Applesoft Basic. Струни завжди були суфіксними, $а масиви мали суфікс %. Ось як працювала мова. Ви щось подивилися, знали, що це. Я ніколи не заглиблювався в інтерпретатора, щоб зрозуміти, чому це так, чи проектні рішення, які зробили це так.


Сигіл у php походить від його перл-впливу (на який впливали awkі sh). Сигіл в perl - це трохи більше, ніж просто, $оскільки він може ідентифікувати безліч різних типів:

  • $ скалярний
  • @ список
  • % хеш
  • & кодовий блок
  • * typeglob

Сигіл визначає, яку частину структури таблиці символів ви дивитесь. За кадром, в таблиці символів для foo (доступ до якого здійснюється через *foo- typeglob) є все, що може бути фоном. Існує $foo, @foo, %foo, то формат foo , &foo, то указатель_на_файл Foo, і т.д ...

Це також дозволяє зробити псевдонім однієї змінної до іншої:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Це відбитки foo 1 2- в перл, це для чого насправді сигіли , не те, що ви повинні це робити, а скоріше, щоб це було за кадром, що вони роблять.

Сигілів не стільки для читабельності, скоріше для того, щоб можна було мати $fooі @fooбез зіткнення в просторі імен (порівняйте інші мови, де не може бути обох int foo; int[] foo;)


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

Щось у lex по лінії:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

І тоді ви могли мати такий код

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

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

Однак, працюючи з мовою, визначеною таким чином, я, мабуть, міг її прочитати без проблем.

Деякі люди їх люблять, деякі - ні. На різних форумах проводяться великі святі війни, і це дійсно зводиться до того, наскільки ви їх використали.

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

Це насправді не має значення. Важливо, як сигіли вписуються в мову, якщо ви їх використовуєте чи ні. Ви хочете вміти "123 $foo 456"чи потрібно робити "123 " + foo + " 456"? Саме тут слід прийняти рішення.


1
Інтерполяція рядків, така як "123 $foo 456"не ввімкнена префіксом sigil, і є їй повністю ортогональною.
Esailija

1
Його частина інтерполяції змінних і залежить від того, як розбирається рядок. Сигіли можуть зробити це простіше (це можна зробити іншими способами, як показано Найкращим способом зробити змінну інтерполяцію в JavaScript? Але це не є частиною основної мови. Сигіли, певно, полегшують це писати і розуміти.

1
@MichaelT Ні, той факт, що змінні мають префікси, не робить простішу інтерполяцію легшою чи складнішою. Вони просто 2 абсолютно не пов'язані між собою речі. Для людського читача це міг би бути хорошим вибором використовувати $asdв синтаксисі інтерполяції рядків, якщо $він уже використовувався для змінних префіксів, але це не мало нічого спільного з реальною можливістю здійснення рядкової інтерполяції в першу чергу.
Esailija

2
@Esailija ви могли б описати, як вони не пов’язані між собою? На додаток, від en.wikipedia.org/wiki/Variable_interpolation - "Мови, які підтримують змінну інтерполяцію, включають Perl, PHP, Ruby, Tcl, Groovy та більшість оболонок Unix. На цих мовах змінна інтерполяція виникає лише тоді, коли літеральний рядок є подвійне цитування, але не тоді, коли це одноцитування. Змінні розпізнаються через те, що змінні починаються з sigil (як правило, "$") на цих мовах. "

@MichaelT Символ долара, який використовується у змінних префіксах та рядковій інтерполяції, є абсолютно поверхневим вибором (який має лише аргументи читабельності, нічого спільного з реалізацією, він може бути #використаний, наприклад, у coffeescript. І coffeescript не префіксує змінні з #- адже він взагалі не має префіксів)
Esailija

3

Я не погоджуюсь, що PHP використовує $, щоб відрізняти значення від funcs. Принаймні тому, що PHP має синтаксис подібний С, а funcs () має імена після імені.

Прочитайте цю публікацію про переповнення стека про те, чому $ в PHP.

У багатьох популярних мовах, таких як C, C ++, C #, Java, не використовується $, і ми можемо відрізняти простий var від функції.

У PHP $ допомагає, наприклад, коли ви пишете: echo "var = $ var"

Без $ такий трюк буде неможливим.


+1 ах, що має більше сенсу. Спасибі.
Реакційний

3
Мова, що має сигіли, не має нічого спільного з її інтерполяцією рядків, як у вашому прикладіecho "var = $var"

4
-1. Налагодження синтаксису PHP - не через якесь фактичне обмеження, а через те, що граматичні правила є надзвичайно погано розробленими, якщо вони взагалі розроблені. Ось чому їм потрібні хаки, щоб увімкнути fn()[]де, як з розумною граматикою, яка б вийшла з коробки, навіть не думаючи про це.
Esailija

@svidgen Так. Ви не можете безпечно робити інтерполяцію рядків без певного способу вказувати, яку частину рядка слід зіставити зі змінною. Інші мови закінчуються тим, що я вважаю дратівливим / зайвим багатослів’ям, як, наприклад, формат рядків Python. Однак у PHP є й інші переваги: ​​Руслан Засухін неправильно говорить про те, що функції завжди будуть вказуватися на паролі, оскільки вони також можуть передаватися як посилання.
Ізката

@Izkata Те, як ви використовуєте змінні в мові, не має нічого спільного з синтаксисом інтерполяції рядків. Але це малося на увазі у цій відповіді, отже -1 ...
Ісаїлія

3

Після всіх цих відповідей я хочу дати ще декілька балів Матю Фоскаріні.

  • Зараз ви розглядаєте проблему як "мовний конструктор". Ви намагаєтеся зрозуміти, чому інша мова має ту чи іншу особливість, щоб вибрати, чи використовувати щось на своїй власній мові. Я багато років на цій позиції, тому що розробляю SQL-аналізатор для нашої бази даних Валентина.
  • Раджу поглянути на antlr.org і навіть прочитати книгу від Теренса. У ньому є багато приємних речей для розробників мови.
  • Я досі не погоджуюся з "причинами", викритими іншими відповідями. Вони припускають, що автор PHP вирішив використовувати $, щоб мати можливість використовувати зарезервовані ключові слова та краще відрізнити змінні від не змінних. Я не думаю, що ... хоча довести це може лише його власна історія.
  • Найімовірніше, що вони просто дотримуються перл та більш ранніх мов. Як підкреслює Терренс, більшість мов схожі, особливо в частині LEXER. І, як правило, конструктор нової мови може просто вибрати, яку саме мову він буде розвивати, а потім взяти лексеми з цієї граматики мови. І це зараз слід робити. Не потрібно винаходити з нуля. І я сумнуюсь так само, як це зробили автори PHP.
  • Все інше, про що згадують люди:
    • відрізняти змінні від не змінних
    • слова резерву як імена змінних
    • можливість розміщення змінної всередині рядка
    • може бути іншим (я не великий фахівець з PHP)

є побічними ефектами цього LEXER , оскільки він здатний розпізнати маркер.

Візьмемо для прикладу: у SQL ми використовуємо "", щоб мати можливість використовувати ідентифікатори із зарезервованими словами та навіть ідентифікатори з пробілами "Ім'я", "Назва групи". GROUP - ключове слово. Була проблема - було спеціальне рішення.

PS Дуже хороший коментар від MichaelT.


+1 спасибі за чудове посилання. Я в кінцевому підсумку скористався цим, але ваше посилання виглядає набагато краще. goldparser.org
Реакційний

Дякую також за ваше посилання. Цього золотого аналізатора я ще не бачив. Також виглядає цікаво.
Руслан Засухін

@RuslanZasukhin, якщо ви посилаєтесь на мою відповідь, я ніколи не сказав, що це було наміром розробника вмикати ключові слова. Я лише сказав, що використання ключових слів як імен змінних стає технічно можливим, коли змінні мають префікс із таким символом $. Також "здатність розміщувати змінну всередині рядка" не є тим, що змінні мають префікс подібним символом $. Тобто "123 $foo 456"буде працювати, навіть якщо синтаксис змінної схожий на foo = 3або @foo = 3. Вони не пов’язані між собою.
Esailija

3

... сигіл дозволяє:

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

  • Використовуйте зарезервовані ключові слова або назви функцій як імена змінних . Часом я виявляв, що деякі з цих імен є правильними для змінної (тобто, $countпоки була count()визначена функція), і подякував сигілам за те, що вони дозволили мені їх використовувати.

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

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, що означає краще? В C ++ ми пишемо всі наші змінні без $ і ми їх ідеально і легко розрізняємо. Приклад: {int z = 0; z = 55; z (z); } І в C ++ ми також можемо використовувати ім'я функції, якщо потрібно призначити, наприклад, покажчик на функцію.
Руслан Засухін

@RuslanZasukhin, Комп'ютерні неграмотні, ти когось знаєш? Спробуйте навчити їх С ++, ви будете вражені.
ZJR

Також: Я не думаю, що сигіл завжди повинен бути $знаком. Я пам’ятаю, що знак долара бентежив мене, коли я був дитиною через властиву йому грошову асоціацію. %може бути можливою альтернативою.
ZJR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.