Почему большинство высокоуровневых языков медленно работают

Последние пару месяцев мне часто задают этот вопрос, поэтому я решил ответить на него статьей. Причин, по которым большинство высокоуровневых языков программирования медленно работают, обычно две: На самом деле, обе причины сводятся к одной — в таких языках происходит большое количество выделений памяти. Следует уточнить, что я говорю в первую очередь о клиентских приложениях, где важна локальная скорость выполнения. Если приложение тратит 99,9% времени на ожидание ответа по сети, вряд ли важно, насколько медленным является язык, проблема оптимизации сетевого взаимодействия будет важнее. Я возьму в качестве примера C# по двум причинам: во-первых, это высокоуровневый язык, который я часто использую последнее время, и во-вторых, если бы я взял Java, фанаты C# могли бы возразить, что использование value-типов в C# избавляет от большинства проблем (это не так). Кроме того, я буду исходить из предположения, что пишется идиоматичный код, в одном стиле со стандартными библиотеками и с учетом принятых соглашений.