Обсуждение:Стек вызовов

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Название. Другие варианты ?[править код]

По мне, статья названа неудачно («стек вызовов» — дословный перевод английского «call stack») — стек AFAIK никто так не называет (за исключением переводов руководств всевозможных отладчиков). Я вижу такие варианты названий:

  • Машинный стек (наиболее удачный IMHO)
  • Системный стек (как-то не очень)
  • Аппаратный стек (существуют и другие аппаратные стеки, например стек сопроцессора)

Возражения, варианты ? Grain 13:41, 26 декабря 2006 (UTC)[ответить]

Как на счёт «Стек программы»? --valodzka 13:53, 26 декабря 2006 (UTC)
хмм … на уровне процессора нет понятия «программы» (разве что, в противопоставлении обработчику прерывания), в многозадачной среде есть «задачи», каждая со своим стеком, но это немного другое … Grain 16:25, 26 декабря 2006 (UTC)[ответить]
«Стек вызовов» или «стек программы» дают в гугле парядка полутысячи результатов, в то время как «Машинный стек» ~100, «Системный стек» ~300. —valodzka 08:09, 27 декабря 2006 (UTC)
«Cтек программы» — нонсенс. Пресловутые же тысячи «Cтека вызовов» — туча мануалов всевозможных отладчиков, дословный перевод английского «Call stack», а тут, все-таки нужен русский термин, а не дословный перевод. Grain 16:51, 17 июня 2008 (UTC)[ответить]
дык где его возьмёшь этот термин, если 90% в программировании - калька с английского.//Berserkerus 21:09, 17 июня 2008 (UTC)[ответить]

Название стека CPU[править код]

Перенесено со страницы Википедия:Форум/Общий.

Мне вот интересно, тут есть программисты пишушие/писавшие на ассемблере (без разницы на каком) ? А интересуюсь я вот почему. Здесь в Википедии есть статья о стеке, вот только ее название — Стек вызовов кажется мне недоразумением и нуждается в замене. Вопрос только в том на что (см. обсуждение статьи) ?

Такого русского термина, AFAIK, не существует в принципе — на моей памяти, стек процессора всегда назывался просто «стек» и никак иначе. Это же недоразумение, «Стек вызовов» — дословный перевод английского термина «Call Stack» (хотелось бы русский термин, ибо русской школе программистов не один и не пять лет) а также название окна бэктрейса (тот же перевод, да и бэктрейс и стек — немного разные вещи) в отладчике в Delphi/Builder или VC.

Мнения ? (выслушаю все разумные ТЗ, но мнения неспециалистов в ассемблере, при всем уважении, интересуют меньше).

Гугл для этого случая не очень полезен (слишком уж много всяких стеков), но можно, например, посчитать сколько статей со словами «указатель стека», включают термин «стек вызовов». Для Яндекса это 14 из 119 (тыс. статей) то есть 12 % Grain 19:04, 17 июня 2008 (UTC)[ответить]

Хотя и не принадлежу с славному клану программистов на ассемблере (увы), а всего лишь только к программистам работающим на языках не ниже С, замечу уважаемому автору, что для того, чтобы понимать, что такое стек и работать с ним ассемблер знать совсем не обязательно. Понятия "стек вызовов" или "программный стек" используются. То что программисты между собой это называют просто "стек" еще ни о чём не говорит. Они клавиатуру, допустим, называют "клавой", дык и что, переименовывать теперь на этом основании? Если интересы человека не ограничены ассемблером, для него одно слово "стек" будет иметь много других смыслов, что совершенно естественно. Поэтому, настоящее название считаю вполне адекватным. Хацкер 19:28, 17 июня 2008 (UTC)[ответить]
спасибо за ТЗ, мне тоже жаль. Речь идет о термине, а не о понимании явления и не о жаргоне - покажите мне хоть в одной исконно русской книге об ассемблере пресловутый "стек вызовов". Grain 20:07, 17 июня 2008 (UTC)[ответить]
А покажите мне, будьте любезны, хоть одну книгу по кулинарии, где соль называлась бы хлоридом натрия. Если бы у нас была Ассемблеропедия, тогда другое дело, но тут универсальная энциклопедия, а в стате пишется именно о стеке вызовов, а не о стеке вобщем. Хацкер 21:27, 17 июня 2008 (UTC)[ответить]
Если опускаться до кулинарных ассоциаций, то покажите мне кулинарную книгу, где эта соль, называется каким-нибудь инородным термином, скажем "белая соль". Ваш "стек вызовов" - столь же инородный и надуманный термин, поэтому использование его в энциклопедии я считаю плохой идеей (по той же причине, почему никто не называет монитор дисплеем). Кстати, судя по тому что вы аппелируете к абстрактному понятию стека, вы, видимо, не читали обсуждения на которое я давал ссылку, ибо переименвания в "Стек" я не предлагал. Grain 06:14, 18 июня 2008 (UTC)[ответить]
термин не надуманный и не ЕГО. это калька с английского, и таких общепринятых калек = мильён!//Berserkerus 10:35, 18 июня 2008 (UTC)[ответить]
угу, вариант. Причем видимо недавняя калька ... и премерзкая, на мой взгляд. Паскаль угробит этот мир ... Grain 13:13, 18 июня 2008 (UTC)[ответить]
не понял при чём тут паскаль. учитывая ситуацию с российской микроэлектроникой - естественно недавняя.//Berserkerus 22:24, 18 июня 2008 (UTC)[ответить]
паскаль исключительно к слову ... просто ноги этой кальки, по моему, растут из перевода интерфейса отладчиков IDE. Grain 08:33, 19 июня 2008 (UTC)[ответить]
Ну прочитал. Там вы другое говорите. Ну да ладно. «машинный стек» vs. «стек вызовов» («программный стек»)? Так или иначе в литературе по программирванию (по программированию вообще, а не только по асемблеру и доках по железу) «стек вызовов» преобладает [1], откуда он там взялся, это уже дело десятое. А вот вам и программный стек: [2]. Кстати, замечу, книга именно по ассемблеру. Хацкер 11:03, 18 июня 2008 (UTC)[ответить]
Я бы сказал что в этой литературе преобладают переводы и литература об отладчиках языков высокого уровня, которые я считаю потенциально неправильными. Что же до приведенного фрагмента с "программным" стеком, то это отличный пример неверного применения терминов автором или переводчиком, потому что обычно "программный" означает "реализованный с помощью программы" в противоположность "аппаратному". Grain 13:13, 18 июня 2008 (UTC)[ответить]
  • вообще-то есть разные процессоры, с разными стеками, бывает реализованными даже в отдельной памяти (как например стек в FPU i 387). по моему есть аппаратно-отдельный «стек вызовов».... кажется в микроконтроллерах встречается... надо поискать... при необходимости могу сделать такой процессор на ПЛИСке :))) //Berserkerus 19:38, 17 июня 2008 (UTC)[ответить]
FPU != CPU, и это стек данных. В большинстве универсальных CPU системный стек (используемый для возврата из подпрограмм и прерываний) реализован примерно одинаково, с небольшими различиями (например, в направлении роста стека, его расположении в памяти и т.п.). Единственный известный мне процессор с иной организацией возврата из процедуры - PowerPC. Ну и, разумеется, мало ли что можно сделать на ПЛМ ... хотя о процессорах на их базе я еще не слышал Grain 20:07, 17 июня 2008 (UTC)[ответить]
ну вот про смешной контроллер со стеком вызовов на 2 вызова:)//Berserkerus 21:01, 17 июня 2008 (UTC)[ответить]
здесь хоть стек есть, пусть крохотный и не в памяти (это же специализированный CPU), в PowerPC, так просто регистр адреса возврата ... речь же не об этом, а о русской терминологии, которой данная статья прояснить не может (но! даже здесь нет ни единого "call stack"). Grain 06:14, 18 июня 2008 (UTC)[ответить]
да, "call stack" довольно редок, ибо имхо он звучит неблагозвучно в английском. в тоже время термин существует, имеет конкретный смысл. других более популярных или ещё более академически правильных названий не припомню. ну и что что специализированный CPU, он же есть, и он не редкий.//Berserkerus 08:03, 18 июня 2008 (UTC)[ответить]
  • На нескольких асмах программировал, но термин «стек вызовов» в памяти не отложился. Везде вроде просто «стек». UPD. Посмотрел документацию на русском языке (то что есть под рукой) на несколько микроконтроллеров семейства PIC - в тех, где есть возможность программной работы со стеком (PUSH, POP) он называется «стек», там где нет возможности (стек задействуется автоматически при вызовах) - «аппаратный стек». --Art-top 06:48, 18 июня 2008 (UTC)[ответить]
  • Уважаемые участники, заранее прошу прощения, но удержацца не могу. Только без обид, ладно?
Эпиграф: Я валяюс пад сталом, мне дурно, у меня истерика, вопсчем, я в шоке и ужасе.
Я пишу на разных ассемблерах 20 лет, поэтому кой-што знаю по этой теме. Сразу вынужден заметить, что огромное количество переводных книг по асму переводят не ассемблерщики, а переводчики с техническим уклоном. В последние лет 10 таких книг всё больше и, соответственно, ошибок в них становится всё больше. К тому же следует учесть «благотворное» влияние концепции объектно-ориентированного программирования.
В указанной статье «всё смешалось – кони, люди». Такое впечатление, что писал студент 2-го курса, очень больно ударенный пыльным мешком ООП.
Понятие «стек» описывает только два случая:
  1. Собственно стек
  2. Динамический тип данных языка высокого уровня
Со вторым случаем всё просто: в памяти выделяется место под элемент данных (инфа + указатель), значение переменной «Указатель стека» записывается в поле «Указатель» этого элемента, в переменную «Указатель стека» записывается адрес памяти расположения нового элемента. Таким образом имеем данные, организованные по принципу цепи, – доступ к конкретному элементу возможен только через соседний элемент.
Теперь о собственно стеке. Для простоты объяснения и в силу преобладающего распространения возьму ассемблер семейства Intel x86, конкретно i8088.
В оперативной памяти выделяется область под сегмент стека, адрес которого хранится в регистре SS. Текущее значение адреса вершины стека находится в регистре SP. Абсолютный адрес вершины стека равен SS*16+SP. Команды PUSH / POP заносят/вынимают данные различного типа из стека и автоматически увеличивают/уменьшают значение SP. Причём доступ к стеку возможен не только через вершину, но и в «ручном режиме»: изменив значение SS/SP или вычислив адрес и непосредственно, напрямую обратиться по этому адресу.
И больше никаких других стеков не существует.
Другое дело, что стек можно использовать по разному:
  1. Хранение данных
  2. Передача содержимого сегментного регистра в другой сегментный регистр или из одной ячейки памяти в другую
  3. Хранение адреса возврата из процедуры
  4. Передача данных в процедуру и обратно
Использование каких бы то ни было дополнительных слов в пару к слову стек неправомочно, ибо стек – это специальная область в оперативной памяти, в которую можно записать всё что угодно. Однако, следует учесть возможность использования нескольких сегментов под стек. Можно, например, организовать отдельный сегмент стека под некоторый тип данных и использовать этот сегмент стека для преобразования данных. Например, можно засунуть в стек очень длинное BCD десятичное число и вытаскивать из стека любую цифру. А можно, например, изменив адрес возврата, из процедуры вернуться не в точку вызова, а куда-нибудь в другое место.
Вопсчем, все эти безграмотные «стеки вызовов» или «программные стеки» появились из-за упрощения обучения программированию, чтобы не нагружать «бедных студентов», изучающих ООП. Типа, а на хрена понимать как оно там работает, если это щаз не надо? Да и надо ли будет когда-нть? Вот и плодятся гигабайтные программы, сжирающие всю доступную память. Если «стек вызовов» ещё как-то можно понять о чём речь идёт, то «программный стек» – это полный идиотизм.
Раз уж были упомянуты специализированные, неширокопрофильные микроконтроллеры «со стеком вызовов на 2 вызова», замечу, что это не стек. Да, микроконтроллер PIC16C5X семейства PIC16 (8-bit fully static, EPROM/ROM-based CMOS microcontrollers) имеет «Two-level deep hardware stack», но это на самом деле не стек. Производитель для краткости назвал это стеком, но правильнее было бы назвать «Регистр двойного размера хранения адреса возврата из процедуры» или как-нибудь «Call Back Register», поскольку работа с ним осуществляется как с обычным регистром. Однако, поскольку в этом камне отсутствует полноценный стек и перепутать не с чем, то таки да, можно и стеком назвать. Очень сильно «апкоцанным», урезанным по самое не балуйся и расположенном не в оперативной памяти, а в кристалле ядра.
Упомянутый сопроцессор i80387 не использует какого-то особого стека. Это всё тот же некий сегмент в оперативной памяти.
Эпилог.
Если есть желание узнать как оно там на самом деле на аппаратном уровне, советую забыть про книжки по ООП, языкам высокого уровня и обратиться к документации по архитектуре микроконтроллеров. Начать лучше всего с ассемблера i8088, как базовой модели современных камней.
Ещё раз прошу простить мою резкость. // wilder 14:25, 19 июня 2008 (UTC)[ответить]
«Регистр двойного размера хранения адреса возврата из процедуры» :)) стек - это LIFO буфер и всё. А "Причём доступ к стеку возможен не только через вершину, но и в «ручном режиме»" в общем случае - неправда.//Berserkerus 15:26, 19 июня 2008 (UTC)[ответить]
  1. рад встретить единомышленника в плане возмущения «технической» литературой последнего времени и «терминами», которые она порождает.
  2. о недостатках текущей статьи хотелось бы услышать поподробнее, ибо по большому счету последние ее редакции мои (и у меня еще есть идеи по дальнейшему ее совершенствованию), и я, вроде как, нахожусь в теме, потому что сам пишу ассемблером под разные процессоры и отнюдь не в ООП.
  3. Статья, на сколько я понимаю, изначально описывает стек процессора в академическом ключе (то есть с точки зрения информатики, а не ООП, как вы подумали), как абстрактный элемент вычислительной системы и название (которое мне также не нравится) должно однозначно определять назначение данного вида стеков (как информационных объектов) и исключать неоднозначность с другими типами стековых объектов (стеков вычислений, FIFO-стеков и т. п.). В этом ключе я бы предпочел видеть «стек возвратов», а не «стек вызовов», но первый термин существует только в Форте. Практическая реализация (как и использование) стека в процессорах и микроконтроллерах также должна быть частью статьи (и если она перерастет ее, то потребует выделения в отдельную статью).
  4. Да, в большинстве процессоров и микроконтроллеров (если в подстчетах учитывать их распространенность), стек реализуется поинтером на вершину стека в памяти, но это не позволяет говорить, что другие схемы реализации стека возвратов «нельзя называть стеком». В приведенном выше контроллере стек хоть и на два адреса, но это все-таки стек (хотя я разделяю мнение что это до смешного МАЛО, мало даже стекового регистра возвратов на 16 адресов PowerPC), однако такие реализации вполне в духе идеологии RISC, и я вполне допускаю что где-то и организация стека и работа с ним может быть полностью отдана на откуп программе (то есть вызов подпрограммы в виде sub r15, 4; mov [r15], ip; mov ip, subaddr; add r15, 4; с возвратом mov ip, [r15]) ради достижения бо́льшей производительности системы. А на крохотных системах, где оперативная память 128—256 байт и в ней же находятся регистры процессора, и крохотные стеки выполняют свои функции.
  5. Также, позвольте вас поправить, стек FPU x87, все-таки является стеком в общем смысле, хоть он и кольцевой и используется для вычислений, ну и находится он, разумеется, отнюдь не в оперативной памяти.
  6. И да, «программный стек» это нонсенс (если только речь не идет о полностью программной реализации).
Grain 06:40, 20 июня 2008 (UTC)[ответить]
  • Стек - структура данных. Она не имеет никакого отношения к "динамическому" языку или "языку высокого уровня". Стек - всего лишь соглашение о порядке доступа к данным. Он может быть реализован как в форме списка, так и в форме массива с индексным указателем (собственно, так реализован стек вызовов). И разумеется, его можно реализовать практически на любом языке программирования, или напрямую в машинных кодах (что вам мешает организовать ещё десяток стеков используя ячейки памяти в качестве указателей на хвост/голову стека?). Соответственно, "стек вызовов" это отдельное явление (кстати, вовсе не обязательное в Фон-Неймановской архитектуре), а "стек" как структура данных это совсем другое. От того, что в определённой (маленькой) области знаний стек вызовов сокращают до "стек", это не становится основным значением. #!George Shuklin 09:07, 25 июня 2008 (UTC)[ответить]

Картинка в разделе "Использование"[править код]

Иллюстрация дезинформирует: неужели в ассемблере стек используется исключительно для сохранения регистров и адресов возврата? На картинке слева есть параметры и локальные переменные. А в стеке справа они куда делись??

Обратите внимание на название картинки: "Типичный случай использование стека языком высокого уровня на примере вызова процедуры с аргументами «A, B, C» (с соглашениями вызова Паскаля) в сравнении с языком ассемблера" Что сравнивается-то? Явно не функционально эквивалентная ассемблерная программа.

Еще неплохо показать направление роста стека. А указатель стека делает что-то странное. Точнее, он указывает на первую свободную ячейку. В каких-то архитектурах это так? Если да, то пардон. В интел-архитектурах точно иначе (после команд push, call и т.д. регистр sp/esp указывает на последний занятый элемент).

Картинку предлагается удалить или переработать. Ivladak 18:58, 3 июня 2011 (UTC)[ответить]