Я просто слушал эпизод 57 Радио Разработки программного обеспечения (РАСШИФРОВКА СТЕНОГРАММЫ: http://www.se-radio.net/transcript-57-compiletime-metaprogramming) я - только 40 минут в, но я задаюсь вопросом, почему C является языком компиляторов - когда подмножество Схемы, казалось бы, было бы лучшим соответствием? (или некоторый другой HLL) (исключая очевидную причину не желания переписать gcc)
PS первоначально отправила это в LTU http://lambda-the-ultimate.org/node/3754
Я не буду утруждать себя прослушиванием 40 минут радио, чтобы, возможно, лучше понять ваш вопрос, но я бы сказал прямо противоположное. Лишь небольшая часть компиляторов написана на C. У меня сложилось впечатление, что (по крайней мере, там, где это возможно), большинство компиляторов реализованы на языке, который они предназначены для компиляции.
Что ж, одной из причин будет проблема начальной загрузки компилятора на неподдерживаемых архитектурах. Обычно для этого требуется наличие работающего компилятора для этой архитектуры, что обычно означает C. Я помню, как пытался скомпилировать MIT-схему из исходного кода, и меня очень разозлило, что для того, чтобы я смог построить MIT-схему, нужно было установить MIT-схему. схема.
Между прочим, я не уверен, что согласен с вашим предположением ... C определенно кажется наиболее широко используемым языком, но компиляторы других языков (например, схема MIT) часто реализуются на этих языках.
C имеет Flex и Yacc , которые помогают в реализации Frontend (синтаксического анализатора и лексера) компилятора, если я правильно помню, их вывод ограничен кодом c
Чтобы вставить элемент в кучу, его можно поместить в любое место и заменить родительским элементом до тех пор, пока ограничение кучи снова не станет действительным. Swap-with-parent - это операция, которая сохраняет двоичную древовидную структуру кучи нетронутой. Это означает, что куча размером N будет представлена в виде массива N-ячеек, и можно добавить новый элемент за логарифмическое время.
Двоичное дерево поиска может быть представлено в виде массива размером N с использованием той же структуры представления, что и куча (потомки 2n и 2n + 1), но вставка элемента этого пути намного сложнее, поскольку в отличие от ограничения кучи, ограничение двоичного дерева поиска требует выполнения поворотов для извлечения сбалансированного дерева. Таким образом, либо вам удается сохранить дерево N-узлов в массиве N-ячеек по цене выше логарифмической, либо вы тратите пространство, сохраняя дерево в большем массиве (если моя память служит, красное дерево может тратить до 50% вашего массива).
Таким образом, двоичное дерево поиска в массиве интересно только в том случае, если данные внутри являются постоянными. И если это так, то вам не нужна структура кучи (children 2n и 2n + 1): вы можете просто отсортировать свой массив и использовать двоичный поиск .
-121--3266136-Реализация на основе массива полезна, если требуется куча, которая используется в качестве приоритетной очереди в алгоритмах графов. В этом случае элементы в куче являются постоянными, при этом появляется самый верхний элемент и вставляются новые элементы. Удаление верхнего элемента (или min-элемента) требует некоторой повторной балансировки, чтобы снова стать кучой, что может быть сделано так, чтобы массив был достаточно сбалансирован.
Эталоном для этого является алгоритм Голдберга и Тарьяна об эффективном вычислении оптимального сетевого потока в направленных графиках, iirc.
-121--3266138-Многие компиляторы сегодня написаны на языках, отличных от языка C (например, Scheme). Чтобы сделать их портативными, они первоначально генерируют код C в качестве целевого языка.
Не нужно быть языком для компиляторов, но у него есть некоторые преимущества. C доступно практически на всех платформах, и это позволяет легко портировать и загрузить компилятор. C ближе к оборудованию и делает возможным множество оптимизаций, которые будут трудно добиться на других языках. Компилятору легко, написанное в C, чтобы сосуществовать с другими языками, библиотеками и системами, так как большинство из них обеспечивают интерфейс C. Также легко продлить компилятор, поскольку C является эсперанто системных программистов.
Я решил эту проблему, имея две отдельные «установки» затмения. Это не самое красивое решение, но делает свою работу.
Здесь предлагается использовать Общие - > Возможности
, но это, похоже, не существует в 3,5
в первом примере выполняется неявный вызов конструктора копирования
A<bool>(A<bool> const&)
во втором примере. поэтому компилятор должен использовать шаблонный конструктор для создания нового объекта провозглашение
template <typename T2>
A(A<T2>const& val){
cout<<sizeof(val.dummmyField)<<endl;
}
должно прояснить это
-121--4631903-Вероятно, это сочетание факторов: