Многие, увы слишком многие, программисты на вопрос «С чего начинается выполнение программы на C или C++?» издают обиженный вопль. «Дескать что за детские вопросы? Уже в старшей группе детского сада все знают. что точкой входа является функция main . » И ответ это в корне неверный. Точнее, очень часто путают понятия точки входа в программу и начала выполнения. И из-за этого периодически попадают в забавные ситуации, в которых даже отладчик не всегда может помочь. Вот и посмотрим. что же у нас в программе происходит до вызова функции main.
Надеюсь, что не открою Америку, сказав, что реальное выполнение любой программы начинается с кода загрузчика. Этот код чаще всего писан на Assembler и сильно зависит от операционной системы, компилятора, и массы других параметров. Но в любом случае — его задача провести предварительную инициализацию и настройку программы.
И только когда эта работа выполнена, загрузчик из своего кода вызывает функцию main. То есть, до вызова функции main в программе происходит много чего интересного. И если на каком-то предварительном этапе возникнет ошибка, то вызова функции main мы не получим вовсе. И будем долго ломать голову над тем, что же пошло не так. Не вижу в данной статье смысла глубоко лезть в загрузчик.
Программа — С чего начинается театр
Ограничимся только тем высокоуровневым кодом, который написали мы сами. Есть ли возможность написанным самим программистом кодом убить загрузчик так, чтобы он никогда не смог дойти до вызова функции main ? И на этот вопрос существует только один ответ — «Запросто!». Неучет этой возможности и приводит к очень интересным эффектам.
В данной статье мы рассмотрим самый распространенный случай — инициализацию глобальных переменных. Занимается этой операцией загрузчик, и естественно, она должна быть выполнена ДО вызова функции main . Если мы заносим в переменные какие-либо константные значения. особых проблем не возникает. Но, при инициализации переменных вполне допустимо и выполнение кода. Естественно, в таком случае написанный нами код будет выполнен ДО вызова main ! А любом коде могут быть ошибки. Вот так мы и можем убить программу до ее официального первого вздоха.
Первый, предельно грубый пример:
int g_dVar = 0;
int g_Test = 10 / g_dVar;
Как видно, инициализация глабальной переменной g_Test требует выполнения определенного кода. Как видно, в данном случае попытка ее инициализации приведет к делению на 0. И программа благополучно скончается, не дожив до функции main . Данный пример написан на С++, но и для чистого C картина будет аналогичной. В реальной жизни цепочка инициализации бывает значительно сложнее. Соответственно, намного сложнее поймать ошибки такого типа. Чаще всего это имеет место быть не с математическими операциями, как в примере, а в случае некорректной работы с указателями.
Посмотрим на пример номер 2:
int foo(void);
int g_dVar = foo();
int g_Test = 10 / g_dVar;
int foo(void)
По первому впечатлению он похож на первый, однако, тут есть одно существенное отличие. Оно состоит в том, что при инициализации глобальной переменной вызывается уже не одна строчка кода, а целая наша собственная функция. Причем, если пример специально упрощен, то в реальной жизни необходимо учитывать следующее:
КАК НАЧИНАЕТСЯ ПРОГРАММА ЭКО?
- Функция foo естественно будет заметно сложнее, чем в приведенном примере.
- Такая функция может возвращать результат, проверяя значительное количество условий, в том числе — определяемых динамически И вот тут и срабатывает один из стереотипов. Если эта функция реально может быть вызвана из разных мест программы, ее автор может на автомате предполагать, что все условия уже определены. так как функция main уже стартовала. А при инициализации глобальных переменных это условие не выполнено. Отсюда — высокая вероятность некорректной работы такой функции.
Конечно, глобальные переменные есть зло. И в программе на C++ обычно есть возможность полностью избежать их использования. А вот в программе на чистом C обычно такой возможности нет.
В приведенных примерах допущена максимально грубая ошибка. В данном случае возникнет неперхватываемое исключение и при запуске под отладчиком мы это скорее всего увидим (исключение — при написании кода для встраиваемых систем на базе микроконтроллеров).
А теперь давайте попробуем на секунду представить, что вызываемая функция может угодить в бесконечный цикл. Или зависнет на ожидании какого-либо события. Вот тогда-то у нас и станет все совсем интересно. Никаких исключений не возникает, все с виду чинно и благородно. Только вот до функции main мы так никогда и не дойдем.
Для многих не слишком опытных программистов это ситуация шоковая, так как ошибка потенциально могла возникнуть и непосредственно в коде загрузчика. Это часто бывает, когда пишется программа для микроконтроллера. Малейшая ошибка в выборе загрузчика для конкретной версии МК может привести к такому же результату.
Ну и в качестве вишенки на торте — никто не требует, чтобы функции foo не создавала дополнительных потоков. А каждый поток, как известно имеет свою функцию, в которой тоже что-то может пойти не так.
В общем — мы можем незаметно для себя вызвать огромный пласт кода, который будет выполняться до входа в функцию main . Теоретически возможно выполнить всю программу, так и не зайдя эту функцию.
Данные примеры показывают, что есть огромное различие между понятиями «точка входа» и «начало выполнения» программы. Точка входа означает всего-навсего адрес функции, которую вызовет загрузчик после завершения всех подготовительных операций. А вот написанный нами код может начать выполняться на значительно более ранних этапах работы загрузчика. В приведенных примерах это этап инициализации глобальных переменных.
В данной статье мы кратко рассмотрели проблемы, возникающие при процедурном подходе. Однако, не стоит думать, что оъектно-ориентированный подход не имеет своих собственных ловушек. В следующей статье мы рассмотрим как умереть молодым не дожив до вызова main в C++.
Источник: dzen.ru
С чего начинается программа?
Что вы знаете о написании программ? Людям, которые вплотную этим не занимались, деятельность сия кажется неким волшебством, но это далеко не так. Немного знаний и опыта из области программирования могут пригодиться каждому. Так что же именно может быть полезно вам, дорогой читатель?
igor.stevanovic, Shutterstock.com
Без сомнения, это умение строить алгоритмы и читать их как открытую книгу. Также будет весьма кстати навык находить оригинальные, полезные идеи.
Для многих людей и, кстати, профессионалов своего дела, создавать приложения — это хобби и работа единовременно. И это огромный плюс, когда между словами «увлечение» и «работа» можно поставить знак равенства, не так ли?
Часть первая. Ищем идею.
Так с чего же начинается создание программного обеспечения (ПО)?
А начинается всё с идеи. Идея может быть ваша или чужая. Если она чужая, то это называется техническим заданием (ТЗ), а вы выступаете в качестве исполнителя. Со вторым вариантом всё просто — нет необходимости искать оригинальную концепцию, а вот самостоятельный поиск очень интересен в плане развития творческого потенциала.
Начать поиск можно с обычного составления списка возможных вариантов, пусть даже некоторые из них будут немного «безумными».
Когда список уже достаточно длинный, можно приступать к отсеиванию тех пунктов, которые уже кем-либо воплощены в жизнь, при этом важно отдельно выделить яркие, но уже существующие, они могут пригодиться позже, ведь из «двух колес, рамы и руля может и велосипед выйти».
Если в вашем списке после исключения уже реализованных идей не осталось пунктов, не отчаивайтесь. Можно повторить всё от заполнения списка до исключения уже существующего, либо обратиться к списку ярких, «велосипедных» идей и подумать над различными сочетаниями, которые, в свою очередь, способны стать уникальным проектом, аналогов которому просто нет. Как говорится, и Рим не сразу строился.
Часть вторая. Составляем алгоритм.
Немного теории. Что есть алгоритм? Алгоритм — это набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное число действий.
Примеры алгоритмов запросто можно найти вокруг себя. Это и программа телепередач, и смена времён года, и приготовление еды, и даже поход в магазин. Иногда алгоритмы просты, иногда сложны, нелинейны и имеют множество условий, в общем, «удовольствие» в разнообразии.
Итак, представим, что вы разыскали то, что будет нужно людям, определились с задачей. Что же делать дальше? Ответ прост — разбить задачу на части, определить последовательность исполнения каждой. Если какую-либо из частей можно разбить на более мелкие подзадачи, то это надо сделать.
Когда алгоритм обдуман и записан, то для более четкого представления можно составить и первичную блок-схему. Графическое описание в связке с последовательностью действий покажет перспективу и предоставит возможность пересмотреть некоторые детали, что порой очень важно.
Часть третья. Создаём.
Способ первый — выбрать язык программирования и самостоятельно приступить к разработке. Как говорится, алгоритм готов, схемы нарисованы — начинаем творить денно и нощно.
Способ второй — находим профессионала, заключаем договор, платим деньги и получаем результат.
Как видите, всё вполне выполнимо. Удачных вам идей и свершений!
Источник: www.shkolazhizni.ru
Управление разработкой ПО. Как начать разработку программного продукта? Технология разработки ПО для веб-проекта
Давайте рассмотрим такой вопрос – с чего начинается разработка программного продукта.
- Первое, что нужно сделать, это проработать концепцию проекта, что он должно включать общее понятие проекта, что это за проект и для чего он нужен. Нужно четко поставить цель этого проекта, какую он несет цель для бизнеса. Итак, первый момент – определить, что это за проект и для чего он, если говорить простыми словами.
- Во-вторых, нужно определить функционал проекта, вы обозначаете модули, которые должны быть в этом проекте и роли людей, которые будут управлять этим проектом. Например, если говорить о какой-то автоматизированной системе продаж CRM, то роли здесь могут быть: продажник, менеджер по отделу продаж, супервизор, админ и так далее. То есть вы можете какие-то роли придумать и обозначить их функции.
- Третий момент зависит от того, кто составляет концепцию. Речь идет об определении сложных моментов. Если концепцию составляет заказчик, то ему сложно определить такие моменты, или разработчик и тогда здесь все проще.
После того, как мы определили концепцию трех пунктов, далее на основании этого мы составляем ТЗ и макеты. Еще один момент, который можно включить перед созданием ТЗ – это заполнение типовых анкет, которые позволяют выявить полезную информацию о заказчике. Заказчик заполняет анкеты, а дальше вы пишите ТЗ (курс как написать техническое задание).
ТЗ нужно создавать совместно с заказчиком в таком режиме, что разработчик предлагает идеи решения конкретных функций, а заказчик согласует.
Таким образом на выходе мы получаем документ спецификации всей системы, то есть набор требований по системе, плюс макеты с описаниями каждой страницы. Это в идеале. Хотя бы сделать макеты на основные блоки. Макеты хороши тем, что вы общаетесь с заказчиком на одном языке, вы говорите на языке графики, на языке браузера, то есть как будет выглядеть в браузере эта система. Мы в данном случае говорим о веб-разработке, но это может быть форма windows или разработка под айфон на телефоне.
Дальше определяется бюджет проекта, идет примерная оценка проекта и примерная оценка бюджета проекта. Вы не можете точно сказать, какой будет бюджет, вы можете только более-менее точно говорить за каждый этап. Но точную оценку проекта вы дать не можете, поэтому вы даете примерную оценку проекта и точную оценку первого этапа, это вы уже можете оценить.
Дальше начинается разработка проекта, его первый этап, и операционная деятельность разработки.
Отдельно хотелось бы упомянуть о создании плана. После ТЗ вы должны сделать план проекта. Вы разбиваете проект на этапы, согласуете все этапы с клиентом. Вначале вы определяете самую основную функциональность, которая больше всего нужна клиенту, на дальний этап относите все то, что менее важно.
И определяются примерные сроки на каждый этап, чтобы клиент представлял, когда это будет. Естественно, это будут примерные сроки, потому что могут вноситься изменения в ходе проекта, клиент может внести изменения, которые значительно увеличат сроки, это уже зависит от него.
Вот так примерно выглядят первые три шага проекта: концепция, ТЗ и планирование.
Рекомендуем вам изучение курса о создании программного продукта. Это небольшое руководство для руководителей проектов, продукт менеджеров, в котором мы раскрываем основные вопросы становления своего программного проекта.
- Демонстрация компонентов Falcon Space
- Смотреть демо веб-платформы Falcon Space
- Подпишись на наш видеоканал в Youtube
Источник: web-automation.ru