Повернемось до початкового рядка: "Як мова, чий компілятор написаний на C, коли-небудь може бути швидшим, ніж C?"
Я думаю, що це справді мало на меті сказати: як програма, написана на Джулії, серцевина якої написана на С, може бути швидшою, ніж програма, написана на С? Зокрема, як програма "мандель", написана в Джулії, може працювати у 87% часу виконання еквівалентної програми "мандель", написаної на C?
Трактат Бабу - єдина правильна відповідь на це питання поки що. Усі інші відповіді поки що більш-менш відповідають на інші запитання. Проблема з текстом бабу полягає в тому, що теоретичний опис "Що таке компілятор" довгий у кількох абзацах написано так, що оригінальний плакат, ймовірно, матиме проблеми з розумінням. Той, хто сприймає поняття, на які посилаються слова "семантичний", "денотаційно", "реалізація", "обчислюваний" тощо, вже знатиме відповідь на питання.
Найпростіша відповідь полягає в тому, що ні код C, ні код Джулії не виконуються безпосередньо машиною. Обидва повинні бути переведені, і цей процес перекладу вводить багато способів, щоб виконуваний машинний код міг бути повільнішим або швидшим, але все-таки давати однаковий кінцевий результат. І С, і Юлія роблять компіляцію, що означає серію перекладів на іншу форму. Зазвичай текстовий файл, прочитаний людиною, перекладається на деяке внутрішнє представлення, а потім виписується у вигляді послідовності інструкцій, які комп'ютер може зрозуміти безпосередньо. З деякими мовами є більше, ніж це, а Джулія - одна з них - у неї є компілятор "JIT", що означає, що весь процес перекладу не повинен відбуватися відразу для всієї програми. Але кінцевим результатом для будь-якої мови є машинний код, який не потребує подальшого перекладу, код, який можна надіслати безпосередньо до процесора, щоб змусити його щось робити. Зрештою, ЦЕ "обчислення", і існує не один спосіб сказати ЦП, як отримати потрібну відповідь.
Можна було б уявити мову програмування, яка має і оператор "плюс", і "множити", і іншу мову, яка має лише "плюс". Якщо для ваших обчислень потрібне множення, одна мова буде "повільнішою", оскільки, звичайно, процесор може робити обидві безпосередньо, але якщо у вас немає ніякого способу висловити необхідність множення 5 * 5, вам залишається написати "5 + 5 + 5 + 5 + 5 ". Останні знадобиться більше часу, щоб дійти до тієї самої відповіді. Імовірно, щось таке відбувається з Джулією; можливо, мова дозволяє програмісту заявити бажану мету обчислити набір Мандельброта таким чином, що неможливо безпосередньо виразити C.
Процесор, який використовується для еталону, був вказаний як процесор Xeon E7-8850 2,00 ГГц. Тест C використовував компілятор gcc 4.8.2 для створення інструкцій для цього процесора, тоді як Julia використовує структуру компілятора LLVM. Можливо, що резервний сервер gcc (частина, яка виробляє машинний код для певної архітектури процесора) певним чином не є настільки розширеною, як резервний файл LLVM. Це може змінити продуктивність. Також відбувається багато іншого - компілятор може "оптимізувати", можливо, видаючи інструкції в іншому порядку, ніж визначено програмістом, або навіть взагалі не робити деякі речі, якщо він може проаналізувати код і визначити, що вони не необхідний для отримання правильної відповіді. І програміст, можливо, написав частину програми С таким чином, що робить це повільним, але хіба '
Все це - способи сказати: існує багато способів написання машинного коду для обчислення набору Мандельброта, і мова, якою ви користуєтесь, має великий вплив на те, як цей машинний код записується. Чим більше ви розумієте про компіляцію, набори інструкцій, кеші тощо, тим краще будете оснащені, щоб отримати бажані результати. Основним результатом результатів, які цитують Юлію, є те, що жодна мова чи інструмент не найкращий у всьому. Насправді найкращий коефіцієнт швидкості у всьому графіку був для Java!