Почему C является языком компиляторов - когда подмножество Схемы, казалось бы, было бы лучшим соответствием?

Я просто слушал эпизод 57 Радио Разработки программного обеспечения (РАСШИФРОВКА СТЕНОГРАММЫ: http://www.se-radio.net/transcript-57-compiletime-metaprogramming) я - только 40 минут в, но я задаюсь вопросом, почему C является языком компиляторов - когда подмножество Схемы, казалось бы, было бы лучшим соответствием? (или некоторый другой HLL) (исключая очевидную причину не желания переписать gcc)

PS первоначально отправила это в LTU http://lambda-the-ultimate.org/node/3754

5
задан 2 revs 8 January 2010 в 20:07
поделиться

6 ответов

Я не буду утруждать себя прослушиванием 40 минут радио, чтобы, возможно, лучше понять ваш вопрос, но я бы сказал прямо противоположное. Лишь небольшая часть компиляторов написана на C. У меня сложилось впечатление, что (по крайней мере, там, где это возможно), большинство компиляторов реализованы на языке, который они предназначены для компиляции.

12
ответ дан 18 December 2019 в 06:11
поделиться

Что ж, одной из причин будет проблема начальной загрузки компилятора на неподдерживаемых архитектурах. Обычно для этого требуется наличие работающего компилятора для этой архитектуры, что обычно означает C. Я помню, как пытался скомпилировать MIT-схему из исходного кода, и меня очень разозлило, что для того, чтобы я смог построить MIT-схему, нужно было установить MIT-схему. схема.

Между прочим, я не уверен, что согласен с вашим предположением ... C определенно кажется наиболее широко используемым языком, но компиляторы других языков (например, схема MIT) часто реализуются на этих языках.

3
ответ дан 18 December 2019 в 06:11
поделиться

C имеет Flex и Yacc , которые помогают в реализации Frontend (синтаксического анализатора и лексера) компилятора, если я правильно помню, их вывод ограничен кодом c

1
ответ дан 18 December 2019 в 06:11
поделиться

Чтобы вставить элемент в кучу, его можно поместить в любое место и заменить родительским элементом до тех пор, пока ограничение кучи снова не станет действительным. 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 в качестве целевого языка.

1
ответ дан 18 December 2019 в 06:11
поделиться

Не нужно быть языком для компиляторов, но у него есть некоторые преимущества. C доступно практически на всех платформах, и это позволяет легко портировать и загрузить компилятор. C ближе к оборудованию и делает возможным множество оптимизаций, которые будут трудно добиться на других языках. Компилятору легко, написанное в C, чтобы сосуществовать с другими языками, библиотеками и системами, так как большинство из них обеспечивают интерфейс C. Также легко продлить компилятор, поскольку C является эсперанто системных программистов.

6
ответ дан 18 December 2019 в 06:11
поделиться

Я решил эту проблему, имея две отдельные «установки» затмения. Это не самое красивое решение, но делает свою работу.

Здесь предлагается использовать Общие - > Возможности , но это, похоже, не существует в 3,5

-121--2964785-

в первом примере выполняется неявный вызов конструктора копирования

A<bool>(A<bool> const&)

во втором примере. поэтому компилятор должен использовать шаблонный конструктор для создания нового объекта провозглашение

 template <typename T2>
A(A<T2>const& val){
    cout<<sizeof(val.dummmyField)<<endl;
}

должно прояснить это

-121--4631903-

Вероятно, это сочетание факторов:

  1. Компиляторы C доступны практически для каждой платформы, что упрощает построение нового компилятора для нового языка.
  2. История: C является очень популярным языком, поэтому имеет смысл, что много проектов находится в C (независимо от проекта).
  3. Схема, а именно, очень непопулярно (по сравнению с C).
3
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: