Хорошим тестом на ефективність перекладу компілятора є самокомпіляція: скільки часу потрібно для компіляції даному компілятору? Для C ++ потрібно дуже багато часу (години?). Для порівняння, компілятор Pascal / Modula-2 / Oberon склав би менше ніж одну секунду на сучасній машині [1].
Go надихнувся цими мовами, але деякі основні причини такої ефективності включають:
Чітко визначений синтаксис, який є математично здоровим, для ефективного сканування та аналізу.
Безпечна для типу та статично складена мова, яка використовує окрему компіляцію із залежністю та перевіркою типів через межі модулів, щоб уникнути зайвого повторного читання файлів заголовків та перекомпіляції інших модулів - на відміну від незалежної компіляції, як у C / C ++, де такі перехресні модульні перевірки не виконуються компілятором (звідси необхідність перечитувати всі ці файли заголовків знову і знову, навіть для простої однорядкової програми "привіт світ").
Ефективна реалізація компілятора (наприклад, однопрохідний, рекурсивно-низхідний розбір згори вниз) - що, звичайно, дуже допомагає пунктам 1 і 2 вище.
Ці принципи вже були відомі та повністю реалізовані у 1970-х та 1980-х роках у таких мовах, як Mesa, Ada, Modula-2 / Oberon та декілька інших, і лише зараз (у 2010-х роках) знаходять дорогу до сучасних мов, таких як Go (Google) , Swift (Apple), C # (Microsoft) та кілька інших.
Будемо сподіватися, що це скоро стане нормою, а не винятком. Щоб потрапити туди, потрібно статися дві речі:
По-перше, постачальники програмних платформ, такі як Google, Microsoft та Apple, повинні почати, заохочуючи розробників додатків використовувати нову методологію компіляції, дозволяючи їм повторно використовувати існуючу базу коду. Це те, що Apple зараз намагається зробити з мовою програмування Swift, яка може співіснувати з Objective-C (оскільки вона використовує те саме середовище виконання).
По-друге, самі програмні платформи з часом повинні бути перезаписані з часом, використовуючи ці принципи, одночасно переробляючи ієрархію модулів, щоб зробити їх менш монолітними. Це, звичайно, завдання мамонта і, можливо, може зайняти кращу частину десятиліття (якщо вони досить сміливі, щоб насправді це зробити - що я зовсім не впевнений у випадку Google).
У будь-якому випадку, саме платформа рухає мовою, а не навпаки.
Список літератури:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , сторінка 6: "Компілятор збирається за приблизно 3 секунди". Ця цитата - це недорога плата розвитку Xilinx Spartan-3 FPGA, яка працює на тактовій частоті 25 МГц і має 1 Мбайт основної пам'яті. З цього можна легко екстраполювати на «менше 1 секунди» для сучасного процесора, що працює на тактовій частоті набагато вище 1 ГГц та декількох ГБ основної пам’яті (тобто на кілька порядків потужніший, ніж плата Xilinx Spartan-3 FPGA), навіть при врахуванні швидкості вводу / виводу. Вже в 1990 році, коли Oberon був запущений на 25 МГц процесорі NS32X32 з 2-4 Мбайт основної пам'яті, компілятор склав себе всього за кілька секунд. Поняття насправді чекатищоб компілятор закінчив цикл компіляції, програмістам Oberon ще тоді було невідомо. Для типових програм завжди потрібно було більше часу, щоб вийняти палець з кнопки миші, яка запустила команду компіляції, ніж чекати, коли компілятор завершить компіляцію, щойно запустилася. Це було справді миттєвим задоволенням, з майже нульовим часом очікування. А якість виробленого коду, навіть не завжди повністю нарівні з найкращими компіляторами, наявними тоді, була надзвичайно хорошою для більшості завдань і цілком прийнятною в цілому.