2012-04-08 12 views
0

И связанный с этим вопрос: как в нем будут выглядеть следы/аналогичные функции отладки?Будет ли C/C++/Pascal/etc. быть значительно медленнее, если бы это был бесуровневый язык?

И, пожалуйста, извините меня, если это глупый вопрос, но я мало знаю о низкоуровневом программировании. Я знаю, что большинство процессоров имеют инструкции, относящиеся к стеку, но правильно ли оптимизированный язык без стеков будет намного медленнее?

+1

Языки C, C++ и Pascal сами по себе не содержат стека, у них нет прямых конструкций программирования, связанных с стеком. Это целевой машинный язык x86, который создается компилятором, который использует операции стека. – buc

+0

Нет, эти языки имеют вызовы подпрограмм на основе стека. Я не вижу, как любой из них можно считать без штабелирования. Тем не менее, компилятор Watcom C использовал регистры в качестве вершины своего стека, просто чтобы сделать вызовы/возврат быстрее. – shawnhcorey

+4

@shawnhcorey: только реализации имеют это; ни стандарты C, ни C++ не требуют реализации на основе стека. – Mat

ответ

3

Короткий ответ: если ваша проблема требует стека, то встроенная в язык/аппаратное обеспечение, вероятно, будет намного быстрее, чем вы могли бы написать.

Давайте подумаем, что «бессобый язык» будет be.

Исходный язык Fortran не имел понятия стека. Все, что вы могли написать, было одной большой основной программой. Тогда было обнаружено невероятно полезным, чтобы иметь возможность писать подпрограммы и называть их, чтобы они были добавлены вместе с функциями, возвращающими значения. Однако, поскольку я лично обнаружил, что у вас есть MAIN, вызывайте подпрограмму A, и это вызывает B, а затем каким-то образом B снова вызовет A снова, угадайте, что? Машина «зависает в обратном цикле», потому что, когда A попытается вернуться к MAIN, вместо этого она вернется в B, которая вернется к A и так далее. У него не было возможности вспомнить больше чем одну вещь, чтобы вернуться.

Так что для некоторых проблем в этом Fortran вы не смогли решить проблему, не написав свой собственный стек. То есть у вас будет массив и целочисленная переменная, отслеживающая, что делать дальше, индексируя в этот массив, , и вы закончите тем, что впоследствии стало называться «push» и «pop», ,

Было установлено, что это так полезно, оно было построено на более поздних языках. Существуют различные способы сделать это. Прежде чем машины начали иметь встроенный стек, такие языки, как PL/1, могли бы эффективно создавать стек в виде связанного списка записей активации, которые постоянно выделяются и удаляются. (Не очень эффективно, но это сработало.)

Итак, если ваш язык не имеет стека, и вы пытаетесь решить определенные проблемы, вам придется вырезать свой собственный стек из живого языка, потому что проблема просто требует Это. Примером такой проблемы является прохождение дерева по глубине.

Итак, если вы можете это сделать, это язык «без штанов» или нет?

+0

Итак, нет никаких хороших альтернатив стеку выполнения? Как насчет [Stackless Python] (http://www.stackless.com/)? – Llamageddon

+1

@Asmageddon: Я уверен, что это означает, что каждый «поток» имеет свой собственный стек, реализованный как структура списка, не обязательно используя стек машины. Вот как обычно реализуется параллелизм. Каждый параллельный процесс, или поток, или то, что вы называете его, имеет свою собственную вещь, изоморфную стеку. –

 Смежные вопросы

  • Нет связанных вопросов^_^