Чи є причина, що крапкою з двокрапкою було обрано замість іншого символу?
Я хочу знати історію цього рішення, і сподіваюся, що відповіді призведуть до розуміння, яке може вплинути на майбутні рішення.
Чи є причина, що крапкою з двокрапкою було обрано замість іншого символу?
Я хочу знати історію цього рішення, і сподіваюся, що відповіді призведуть до розуміння, яке може вплинути на майбутні рішення.
Відповіді:
Англійською мовою крапка з комою використовується, наприклад, для розділення елементів у списку виписок
Вона побачила трьох чоловіків: Джеймі, який родом з Нової Зеландії; Джон, син молочника; і Джордж, проклятий вид людини.
Під час програмування ви розділяєте ряд висловлювань і використовуєте повну зупинку, можна легко сплутати десяткову точку. Використання крапки з комою забезпечує простий метод розбору роздільних висловлювань окремих програм, залишаючись близьким до нормальної англійської пунктуації.
Редагувати, щоб додати
У перші дні, коли пам'ять була дорогою, обробка була повільною, і були розроблені перші мови програмування, виникла потреба розділити програму на окремі оператори для обробки. Деякі мови вимагали, щоб кожне висловлення було розміщено на рядку, щоб повернення перевезення могло діяти як розділовий елемент заяви. Інші мови дозволяють більш вільний формат макета тексту, і тому потрібен певний символ розділення. Цей символ був обраний крапкою з комою, швидше за все, через схожість його використання в англійській мові (це, мабуть, припущення; мене в той час не було) і, оскільки він не створював конфлікту з іншими розділовими знаками знаки та символи, необхідні для математичних чи інших синтаксичних цілей.
Ще раз редагування
Потреба в деякому символі термінатора повертається до вимог розбору мовного тексту. Ранні компілятори були написані мовою складання або, в деяких випадках, безпосередньо вручну виготовлені інструкції щодо двійкових машин. Наявність спеціального символу, який визначив кінець висловлювання та розмежував шматок тексту, який обробляється, робить обробку набагато легшою. Як я вже говорив вище, інші мови використовували повернення або кронштейни. Альбол, Паскаль, Ада, BCPL, B, C, PL / M та інші сімейства мов, як правило, використовують крапку з комою. Щодо того, хто вперше застосував саме цей персонаж, я не згадуюсь досить далеко в історії, щоб згадати. Її вибір і прийняття має ідеальний сенс як
Як остаточне зауваження, я вважаю, що на ці відповіді та коментарі було витрачено більше часу, ніж було витрачено на рішення про використання крапки з комою для завершення висловлювання при розробці першої мови, яка використовувала його таким чином.
Багато мов використовують синтаксис, який моделюється після C (який моделювався після B - спасибі @Crollster). Як видно в коментарях, існує довгий ланцюжок таких мов ... B був натхненний PL / I, якому передував ALGOL при використанні ;
як роздільника.
Оскільки в C термінатор заяви є ;
, ці мови відповідають тому.
Що стосується того, чому він був вибраний термінатором тверджень на C - можливо, через його використання англійською мовою "для позначення взаємозалежних тверджень" .
C також був винайдений на PDP-11 в той час, коли для набору символів був доступний обмежений об'єм пам'яті, тому винахідникам мов довелося працювати в рамках цих обмежень.
FORTRAN використовував повернення каретки для окреслення заяв. Період використання COBOL LISP нічого не використовував, покладаючись на дужки у всьому. ALGOL була першою мовою, яка використовувала крапку з комою для розділення висловлювань. PASCAL слідував за результатами ALGOL, використовуючи крапку з комою, щоб розділити заяви.
PL / Я використав крапку з комою для завершення операторів. Є різниця, і це легко помітити в PASCAL. Ада переслідувала позицію PL / I в цьому пункті, а не на ALGOL.
Точка з комою як роздільник виразів чи термінатор швидко сприйняла спільнота інформатики як корисну нотацію, і, наскільки я знаю, кожна наступна структурована блоком мова слідувала за результатами ALGOL і використовувала крапку з комою для розділення або припинення висловлювань.
Мені говорили багато років тому, що BCPL використовував як крапку з комою І повернення каретки як роздільники / термінатори операторів, але я ніколи не використовував мову і не можу це перевірити. У якийсь момент використання повернення перевезення для відокремлення або припинення заяв було відхилено від нащадків BCPL. BCPL породив B, B породив C, C породив C ++, Java, D і цілу низку речей, значно менш продуманих, ніж PASCAL і Ada.
Чому б не будь-який інший символ?
Кілька мов використовували інші символи - натомість у старих версіях BASIC використовується двокрапка.
Однак, ігноруючи нечисленні винятки, я думаю, що це дві основні причини. Перше - ви просто шукаєте щось однозначне. У типовому аналізаторі, якщо ви зіткнулися з достатньо серйозною помилкою, що не можете продовжити розбір поточного оператора, зазвичай намагаєтеся повернути парсер в синхронізацію, просто пропустивши вперед до термінатора оператора і повторно запустивши парсер з початок наступного твердження. Для цього потрібно щось, що зазвичай не зустрічається ніде в коді, і крапка з комою є символом, який не має іншого іншого значення, тому досить легко присвятити це цілі.
Друга причина дещо схожа, але більше спрямована на людей, які читають / використовують код. Знову ж таки, це повертається до того, що фактичний символ, який ви використовуєте, не має великого значення. Існує значна перевага в читанні, яку можна отримати від використання символу, який ваш читач звик бачити з певною метою, коли і якщо це можливо. Це не означає, що C - це один досконалий синтаксис, і все інше повинно слідувати йому по-рабськи, але це означає, що достатньо людей знайоме з таким стилем синтаксису, що розпливчасто схожа мова набирає багато (і втрачає дуже мало), слідуючи приблизно такий самий синтаксис, де це можливо.
Зауважу, що це дуже схоже на розробку майже будь-якої іншої програми. Якщо я напишу програму, яка використовує якісь вікна, я спробую просто використовувати власні функції цільової платформи. Багато рішень, які втілюють в собі, будуть значною мірою довільними, і їх можна зробити по-різному без значної втрати функціональності, але однаково, зміна їх без істотного збільшення функціональності просто збиває з пантелику користувачів, не виконуючи нічого корисного. Ті ж основні принципи поширюються і на те, "що повинно припиняти (або розділяти) твердження мовою?" як "як має виглядати смуга прокрутки" або "як повинен працювати елемент управління деревом?" У всіх цих випадках рішення здебільшого довільне, а рівномірність забезпечує істотну користь сама по собі.
Додам, що так само відбувається на багатьох мовах, саме так, як більшість з нас настільки звикли до програмування, що мало хто думає про це. Чому всі використовують "+" для позначення додавання або "-" для позначення віднімання? Оскільки форма символу не має великого значення, але всі, хто погоджується застосувати одне і те ж значення до кожного символу, мають велике значення.
Точка з комою була спочатку запропонована в Algol 60 як роздільник тверджень , а не як термінатор.
До Algol 60 єдиною існуючою мовою програмування на високому рівні була Fortran, яка вимагала, щоб кожне твердження було окремим рядком. Виписки, що охоплюють кілька рядків, як do-петлі, вважалися диваком, і вони розглядалися як "блоки заяв".
Дизайнери Algol 60 зрозуміли, що для операторів потрібна ієрархічна структура (тоді ще, цикли дописів, виписки з справи тощо), і вони можуть вкладатись одна в одну. Отже, ідея кожного висловлювання, що знаходиться в окремому рядку, вже не мала сенсу. Послідовний склад висловлювань форми S1; S2; ...; Sn , можливо , укладені в почати - кінець дужка були названі складними заяви , і вписуватися в ієрархічну структуру звітності , передбачений Algol 60. Отже, точка з коми явно констатація роздільник , а НЕ термінатор.
Це породило проблеми на практиці. Algol 60 також мав "порожню заяву", яку позначали нічого не написавши. Отже, можна написати « почати S1; кінець », де крапка з комою з’являється так, ніби вона закінчується S1. Але компілятор Algol 60 справді розглядав це як роздільник між S1 та невидимим порожнім висловом, що слідує за ним. Ці тонкощі були небагато для практичних програмістів. Використовуючись для лінійно-орієнтованих мов, таких як Assembly і Fortran, вони дійсно вважали крапку з комою як термінатор для висловлювань. Коли програми виписувалися, зазвичай в кінці висловлювань ставиться крапка з комою:
a [i]: = 0; i: = i + 1
і крапка з комою дійсно виглядала як термінатор для першого твердження. Якби програмісти розглядали крапку з комою як термінатор, тоді таке твердження дало б помилку синтаксису:
якщо я> 0, то a [i]: = 0; ще a [i]: = 1;
оскільки крапка з комою закінчується "якщо", і, отже, "else" стає звисаючим. Програмісти були ретельно розгублені.
Отже, PL / I, що був наступником IBM у лінійно-орієнтованому Fortran, вирішив зробити крапку з комою термінатором операторів, а не роздільником. Програмісти були задоволені таким вибором. Більшість мов програмування дотримувалися відповідності. (Паскаль протистояв тренду, але його наступниця Ада відмовилася від нього.)
[Примітка додано: у статті Вікіпедії про порівняння мов програмування є приємна таблиця, яка резюмує крапку з комою в різних мовах програмування.]
Це майже чиста здогадка, але дивлячись на стандартну клавіатуру QWERTY, обмежену значеннями ASCII, природними символами було б припинення / розділення.!?,:; і повернення вагона. з них!?: слід негайно дискваліфікувати за прийняття декількох ключів, а завершення операції буде дуже поширеною справою. Періоди будуть дискваліфіковані, тому що їх легко плутати з десятковими крапками, що зробить їх зайвим ускладненням, щоб бути термінатором, враховуючи обмежений простір початкових комп'ютерів. повернення каретки буде дискваліфіковано після того, як рядки коду можуть бути довшими, ніж ті, що можуть бути показані в одному рядку на екрані, тому складніше буде читати програму, коли рядки доводиться прокручувати по горизонталі, або потрібні додаткові символи для створення продовження в наступному рядку, який знову додає складності. це листя, і; як варіанти, з них, використовується набагато частіше в письмовій формі порівняно з; тому крапка з комою вибирається тому, що її простіше набрати, менше заплутати, оскільки вона додає значення символу з обмеженим значенням і менш складна, оскільки особливих випадків насправді не існує при його використанні.
Точку з комою було обрано тому, що він був найкращим персонажем, заснованим на ліні та простоті.
Це багато в чому довільний вибір. Деякі мови зробили інший вибір. COBOL припиняє висловлювання з .
символом. FORTRAN, BASIC і Python зазвичай припиняють оператори з новими рядками (зі спеціальним синтаксисом для багаторядкових операторів). А Лісп дужками твердить свої дужки.
Основна причина ;
, настільки популярна, як роздільник / термінатор висловлювань, полягає в тому, що більшість сучасних популярних мов засновані на ALGOL , який використовував цю конвенцію.
замість іншого символу?
Який ще символ ви могли обрати?
Символи ASCII # $ @ [] ^ _ `{|} ~ не завжди були присутні у ранніх кодуваннях символів, як ISO 646 .
Символи ()*+-/<=>
зазвичай використовуються як математичні оператори і створюють двозначності розбору, якщо їх використовувати як термінатори операторів.
product = a * b * // If '*' were a statement terminator,
c * d * // Are there two factors, or four?
Подібні проблеми стосуються '
і "
, які зазвичай використовуються як роздільники рядків; ,
, який зазвичай використовується для розділення аргументів функції і .
, який зазвичай використовується як десяткова крапка (або як роздільник у подібних конструкціях some_struct.some_field
).
Це листя !%&:;?
.
Вибір !
або, ?
ймовірно, не спричинив би технічних труднощів, але їхні англійські значення додадуть програмі неправильний настрій.
print(x)? # Yes, you should.
# It's an IMPERATIVE language; stop questioning my commands.
print(x)! # OK! You don't have to shout!
&
Буде більш розумним вибором в якості роздільника операторів (НЕ термінатор), тому що
do_thing_a() &
do_thing_b()
можна прочитати як команду виконувати завдання A, а потім робити B. Але більшість мов з &
оператором використовують її як логічну або побітну І замість цього.
%
Знак може викликати плутанину в заявах , як interest_rate = 2.99%
(що б встановити змінну 2.99
замість очікуваного 0.0299
). Звичайно, добре відомий математичний сенс %
не зупиняв C використовувати його як оператор, що залишився.
Так що листя :
і ;
.
:
є розумним вибором, і він дійсно використовується як внутрішньорядковий роздільник тверджень у більшості діалектів BASIC.
Але ;
є граматика англійської мови на боці; його можна використовувати для відокремлення пропозицій у межах речення.
Замість того, щоб намагатися відповісти на ваше заголовкове запитання, я думаю, що краще зосередитись на вашому неявному питанні:
Я хочу знати історію цього рішення, і сподіваюся, що відповіді призведуть до розуміння, яке може вплинути на майбутні рішення в розробці та реалізації мов програмування.
Якщо ви хочете дізнатися про історію розробки та впровадження мови програмування та отримати більш глибоке розуміння процесу, то розгляд конференцій з історії мов програмування - це дуже гарне місце для початку. (Я думаю, що вам потрібно буде членство в ОСБ, щоб мати доступ до судового розгляду.)
Чому заяви на багатьох мовах програмування закінчуються крапкою з комою? Чи є причина, що крапкою з двокрапкою було обрано замість іншого символу?
Вважаючи заголовок питання як приклад питання, на який ви можете спробувати відповісти, прочитавши доповідь про HOPL, я хотів би запропонувати наступний момент: люди, які розробляють нову мову програмування, зазвичай роблять це, оскільки вважають ті, які вони знають зламаний / дефіцитний якось. Їх нова мова, з одного боку, покликана виправити цей недолік. З іншого боку, мовні дизайнери також будуть копіювати елементи дизайну з інших мов, які вони вважають гарними, або вони просто не змінюють тих елементів, з якими у них не виникло проблем.
Тим більше, що остання частина важлива: замість того, щоб намагатися з’ясувати, яка мова програмування коли-небудь була першою, яка використовувала крапки з комою як термінатори, і чому багато інших мов програмування скопіювали це, ви, ймовірно, дізнаєтесь більше, переглянувши мови, які не копіювали це. Наприклад, в той час як Smalltalk займає багато натхнення від Симула, це було НЕскопіюйте його синтаксис і, зокрема, його використання крапками з комою як термінаторами тверджень. Він змінив термінатори (дійсно роздільники) на повну зупинку і використовує крапку з комою для чогось іншого. І навпаки, перша мова, яка коли-небудь використовувала крапку з комою як термінатор висловлювань, можливо, мала причину змінити це від того, що використовувалося в мовах, які були раніше. Можливо також, що це була перша мова, яка запровадила всю концепцію термінатора висловлювань (або робила це незалежно від інших мов), і крапка з комою була використана з якоїсь причини, яка зараз втрачається часом. (Я підозрюю, що саме так і тут, тому що жоден з інших відповідей не зміг розкопати цитату від людини, яка представила крапку з комою, а не запропонував доопрацювати припущення про те, чому крапка з комою була гарним вибором.) Але перезавантажити точка, Я думаю, ви дізнаєтесь більше, вивчивши, чому мовні дизайнери змінили речі, а не чому їх копіювали / зберігали. Коли люди змінюють речі, вони зазвичай хочуть або повинні пояснити зміну, але вони цього не роблять, коли копіюють або зберігають те саме, бо "чому ми б це змінили? це просто так! »
Це про видимість.
Ранні розділювачі заяв були "." як у COBOL і на новій лінії, повернення вагона у FORTRAN.
КР виявився обмежуючим тим, що утрудняє обробку заяви через кілька рядків.
Повна зупинка викликала цікавішу проблему. Коли ви читаєте англійський текст, ваш мозок обробляє повні зупинки на підсвідомому рівні, ви усвідомлюєте, що пропозиція закінчилася, і ви можете зробити паузу для дихання, але ви насправді цього не помічаєте. що сигналізувало про це. Також у багатьох шрифтах "." - це найменший можливий символ, який іноді відображається як один піксель. Відсутні або зайві періоди стали найпоширенішою причиною помилок у програмах COBOL.
Таким чином, навчаючись на ранніх помилках, ALGOL вибирає конкретний термінатор, який би дозволяв заяві переходити через кілька рядків, і вибирав той, який був помітний і легко помічений людськими читачами. Напівколона є великою і досить незвичною в загальній англійській мові, щоб не піддаватися обробці підсвідомо.
Я розумів, що його було обрано тому, що була потреба в явному термінальному констататорі, відмінному від перевезення-повернення / нової лінії. Ще за часів екранів з 80 стовпцями фактично маючи єдиний рядок перенесення коду в декілька рядків було досить поширеним, що використання \ r або \ n для термінатора оператора не буде працювати.
Точки з комою були просто зручними, оскільки вони не використовуються в логічних / математичних висловлюваннях. Таким чином, вони суттєво не суперечать фактичному змісту заяв.
Особисто я вважаю, що продовження використання крапки з комою разом зі стильовими вимогами до утримання ліній нижче 80 символів є відверто дурним та анахронічним. Такі мови, як python, широко продемонстрували, що ви можете легко зрозуміти, стисліше коду легше без них. Крім того, якщо у вас є проблеми з лініями, що перевищують 80 символів, вам потрібен великий монітор.
Ось два питання: Чому ALGOL отримав крапку з комою та чому інші мови пішли за ним.
На перше питання тут вже багато відповідей.
Як другий варіант, ALGOL дуже широко використовувався як псевдокодова мова для написання алгоритмів. Так, крапки з комою незабаром стали природними для користувачів різних мов. І природно їх брали за молодші мови.
Я можу помилятися, але я думаю, що це має щось спільне з тим, що в багатьох асемблерах крапка з комою використовується для початку коментаря, як правило, розміщується після інструкції. Все після a ;
було коментарем, і вже не частиною самої інструкції.
Тоді виникає потреба скасувати інструкції, коли ви вводите їх у перекладачі. Короткі інструкції (наприклад, математичні вирази) можна закінчити, просто натиснувши клавішу Enter, сказавши інтерпретатору, що вираз готовий до обчислення, і він дав результат. Але іноді хотілося ввести кілька рядків коду для інструкції, тому одним із способів досягти цього було використання якогось спеціального символу як термінатора інструкції, а не залежно від клавіші Enter. Таким чином, користувач міг одночасно ввести більше рядків коду, оскільки Enter ще не надіслав його інтерпретатору. Тільки коли інтерпретатор знайшов символ, що закінчується, у рядку, введеному з Enter, він остаточно виконає його та обчислить його результат.
Тепер поєднайте ці дві речі разом, і крапка з комою виявиться очевидним вибором для символу, що закінчується: він повідомляє, де закінчується частина інструкції і починається частина коментаря, тож коли інтерпретатор стикається з нею в рядку, він знає, що вона може спалахнути всі рядки виразу, які він забув до цих пір, і виконувати його, тому що інструкція щойно закінчилася, зараз ми в коментарі (ну, принаймні, до кінця цього рядка, тому що наступний рядок почнеться в коді режим знову, починаючи новий вираз / інструкцію).
Це, звичайно, передбачає, що справді крапка з комою була використана для коментарів людиною, яка придумала цю ідею повторного використання її як термінаторів інструкцій. Як би це був будь-який інший символ, ми могли б закінчитися іншим термінатором інструкцій.
Inb4: Ні, це не історичний виклад. Я не маю жодних доказів того, що це фактичний спосіб створення крапки з комою. Просто я думаю, що це могло статися.
Більшість мов взяли напівкрапку, тому що вона вже широко використовувалась для цієї мети і зміна не мала сенсу.
І, розглядаючи перші мови, щоб зробити цей вибір, вам доведеться розглянути, які є альтернативи. Створюючи мову, ви хочете, щоб потрібні символи були доступні, а набори символів у цей час були закодовані на 6 біт, часто з деякими зарезервованими шаблонами, часто з деякими символами, не чітко визначеними (для подальшого виникнення цього, подумайте про національні варіанти ISO-646 - американський варіант добре відомий під назвою ASCII - які використовують повторно коди для "загальних" символів, таких як [
, #
або $
, і бачать ефект у контексті, де є лише половина більшої кількості кодових позицій доступні, а літери та цифри зберігають більше половини цих).
Мабуть, не було іншого символу, який би міг інтуїтивно використовуватися як роздільник висловлювань ( .
мабуть, це єдиний серйозний претендент на ці критерії) і не вводив труднощів із лексінгом або синтаксичним розбором у той час, коли теорія розбору та лексики ще розроблялася ( .
зараз не викликає сумнівів через його використання в реальній кількості).
Ще одна причина використання крапки з комою - це один із символів, якого ми не потребуємо і не використовуємо частіше.
Припустимо, ми використовуємо його частіше як ім'я змінної або якусь річ, і якщо крапка з комою використовувалася б як ключове слово або як оператор, це було б конфліктом символів для компілятора, тому важливо було використовувати символ, який не є часто використовується в кодуванні.
Я вважаю, що мови програмування в стилі C зробили його популярним, і тоді автори нових мов програмування не хотіли винаходити колесо, і вони продовжували його використовувати до цього часу.