Будет ли C/C++/Pascal/ и т.д. быть существенно медленнее, если бы это был язык без стеков?

И связанный с этим вопрос: как будут выглядеть трассировки стека / похожие функции отладки в нем?

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

1 ответ

Решение

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

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

Оригинальный язык Фортрана не имел понятия о стеке. Все, что вы могли написать, это одна большая ГЛАВНАЯ программа. Затем оказалось невероятно полезным иметь возможность писать подпрограммы и вызывать их, так что это было добавлено вместе с функциями, которые возвращают значения. Тем не менее, как я обнаружил лично, если у вас есть MAIN для вызова подпрограммы A, и это вызывает B, а затем каким-то образом B снова обнаружит вызов A, угадайте, что? Машина "зависнет в цикле возврата", потому что, когда A попытается вернуться в MAIN, она вместо этого вернется в B, который вернется в A, и так далее. У него не было способа вспомнить больше чем одну вещь, к которой можно вернуться.

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

Это оказалось настолько полезным, что оно было встроено в более поздние языки. Есть разные способы сделать это. До того, как машины начали иметь встроенный стек, языки, подобные PL/1, эффективно создавали стек в виде связанного списка записей активации, которые постоянно выделялись и удалялись. (Не очень эффективно, но это сработало.)

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

Так что, если вы можете сделать это, язык "без стеков" или нет?

Другие вопросы по тегам