Компиляторы Oberon занимают особое место в истории программирования благодаря уникальному подходу, простоте и эффективности. В течение длительного времени ходили разговоры и цитаты, которые утверждали, что код, сгенерированный компиляторами Oberon, сопоставим по производительности с кодом, сгенерированным оптимизирующими компиляторами C. Одной из наиболее известных цитат является утверждение о том, что неоптимизирующие компиляторы Oberon генерируют код, который во многих случаях равен по эффективности оптимизированному коду C-компиляторов. Однако современные эмпирические исследования и сравнительный анализ показывают, что эта точка зрения весьма спорна и зачастую вводит в заблуждение. Важно понимать причины таких разногласий и какое влияние на восприятие производительности оказывает выбор тестовых программ и условий измерений.
Историческое контекстуальное объяснение заключается в работах 90-х годов, когда Oberon-компиляторы, в частности версия OP2, демонстрировали на некоторых архитектурах производительность, сопоставимую с исходными версиями C-компиляторов. В книге Mössenböck и исследованиях Brandis и коллег приводились доводы, что Oberon-код может быть быстрее необработанного C-кода и близок к уровню оптимизированных C-исполняемых файлов. Казалось бы, это мощное свидетельство качественного и эффективного компилятора. Однако эти выводы базировались на использовании устаревшего и часто критикуемого синтетического бенчмарка Dhrystone, который не отражает современные реалии программирования и недостаточно полно оценивает качество компиляции и оптимизацию. Использование Dhrystone для оценки производительности компилятора и процессора имеет ряд недостатков.
Он предназначался для оценки общей производительности систем вычислений, преимущественно для целочисленной арифметики. В структуре бенчмарка отсутствуют сложные структуры данных, операции с плавающей запятой, не используются современные парадигмы оптимизации и многопоточности. Более того, некоторые из операций и контрольных структур в Dhrystone могут искажать результаты, демонстрируя нелогичные ускорения на некоторых платформах. Поэтому делать глобальные выводы о производительности компилятора исключительно на основе таких тестов крайне рискованно. Современные методики оценки качества компиляторов и их эффективности в свете развития аппаратного обеспечения и языков программирования требуют более комплексного подхода.
Проект Are-we-fast-yet, разработанный в последние годы, представляет собой набор микро- и макробенчмарков, которые учитывают разные аспекты программного кода. Эти тесты более реалистичны, отражают современные паттерны программинга, использование памяти и оптимизацию, а также способны охватить широкий спектр архитектур и языков. Последние исследования и портирование набора Are-we-fast-yet на язык Oberon 90 позволили проверить производительность Oberon-компиляторов в условиях, максимально приближенных к реальному миру. Анализ на современных машинах различных конфигураций показал, что компиляция Oberon действительно даёт исполняемый код, кто немного быстрее неоптимизированных версий современных компиляторов GCC. Но при этом он значительно уступает по производительности оптимизированным версиям компилятора C.
Интересная деталь заключается в дополнительном влиянии проверок времени выполнения, таких как индексные проверки в Oberon. При их отключении производительность немного увеличивается, но отрыв от оптимизированного C кода остается значительным. Это значит, что прежние утверждения о почти паритете производительности не выдерживают современной проверки и анализа. Также стоит учитывать развитие искусственных ограничений и условий эксперимента. К примеру, в некоторых исследованиях использовались компиляторы GCC последних поколений с поддержкой наборов инструкций, которые исторически отсутствовали в устройство тех лет.
Для точного сравнения и исключения искажающих факторов эксперименты были проведены с использованием различных опций компиляции, истинно соответствующих эпохе на процессорах с разным набором инструкций. В итоге было зафиксировано, что применение более ограниченных наборов инструкций лишь незначительно влияет на производительность и не меняет общей картины превосходства оптимизирующих современный компилятор C систем. Исследование также выявило, что оптимизации минимального уровня («-O1») по скорости близки к результатам максимально оптимизированного кода («-O2»). Это говорит о том, что современным компиляторам достаточно некоторых базовых оптимизаций для существенного повышения эффективности кода. При этом Oberon-компиляторы, изначально предназначенные для лёгкости реализации и простоты поддержки, не включают подобных степеней оптимизации, что напрямую сказывается на конечной производительности.
Даже сравнение производительности между 32-битными и 64-битными процессорами выявило вопреки распространённым ожиданиям сравнительно скромный выигрыш в производительности – около 18%. Это демонстрирует, насколько тонко и сложно измерять реальные достижения по скорости, и подчёркивает необходимость комплексного и честного подхода к анализу. Все эти факты вызывают переосмысление широко цитируемых утверждений о превосходстве Oberon-компиляторов. Традиционные высказывания и мемы, гласящие, что компиляторы Wirth достигают 80% производительности оптимизирующих решений при существенном упрощении архитектуры и кода компилятора, являются скорее маркетинговыми или иллюзорными. Они не подтверждаются подробными и всесторонними эмпирическими исследованиями.
На практике это важно для разработчиков, исследователей и энтузиастов программирования. Очевидно, что выбор компилятора должен опираться на объективные данные, актуальные тесты и реальные потребности проекта, а не на устаревшие или противоречивые утверждения. Oberon сохраняет важность как пример чистоты дизайна языков и систем программирования, однако в вопросах производительности он уступает современным оптимизирующим компиляторам, что является вполне ожидаемым. Таким образом, анализ старых и современных данных свидетельствует, что легендарная цитата о производительности Oberon-компиляторов — скорее пример искажения фактов и неполного понимания контекста. Напротив, реальный взгляд на ситуацию продемонстрировал важность использования современных, релевантных методов тестирования и осознания ограничений применяемых бенчмарков.
Будущее оценки компиляторов — за комплексными наборами тестов и прозрачным анализом, опирающимся на реальные технологии и современные требования.