На что указывает for в программном коде. Исходный код
Циклы в C++ — урок 4
Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать циклы на C++, после чего посчитаем сумму всех чисел от 1 до 1000.
Цикл for
Если мы знаем точное количество действий (итераций) цикла, то можем использовать цикл for . Синтаксис его выглядит примерно так:
Итерацией цикла называется один проход этого цикла
Существует частный случай этой записи, который мы сегодня и разберем:
Счетчик цикла — это переменная, в которой хранится количество проходов данного цикла.
Описание синтаксиса
Сначала присваивается первоначальное значение счетчику, после чего ставится точка с запятой.
Затем задается конечное значение счетчика цикла. После того, как значение счетчика достигнет указанного предела, цикл завершится. Снова ставим точку с запятой.
Задаем шаг цикла. Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
Пример кода
Напишем программу, которая будет считать сумму всех чисел от 1 до 1000.
Если мы скомпилируем этот код и запустим программу, то она покажет нам ответ: 500500. Это и есть сумма всех целых чисел от 1 до 1000. Если считать это вручную, понадобится очень много времени и сил. Цикл выполнил всю рутинную работу за нас.
Заметьте, что конечное значение счетчика я задал нестрогим неравенством ( — меньше либо равно), поскольку, если бы я поставил знак меньше, то цикл произвел бы 999 итераций, т.е. на одну меньше, чем требуется. Это довольно важный момент, т.к. здесь новички часто допускают ошибки, особенно при работе с массивами (о них будет рассказано в следующем уроке). Значение шага цикла я задал равное единице. i++ — это тоже самое, что и i = i + 1.
В теле цикла, при каждом проходе программа увеличивает значение переменной sum на i . Еще один очень важный момент — в начале программы я присвоил переменной sum значение нуля. Если бы я этого не сделал, программа вылетела вы в сегфолт. При объявлении переменной без ее инициализации что эта переменная будет хранить «мусор».
Естественно к мусору мы ничего прибавить не можем. Некоторые компиляторы, такие как gcc, инициализирует переменную нулем при ее объявлении.
Цикл while
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do. while. Синтаксис цикла while в C++ выглядит следующим образом.
Данный цикл будет выполняться, пока условие, указанное в круглых скобках является истиной. Решим ту же задачу с помощью цикла while. Хотя здесь мы точно знаем, сколько итераций должен выполнить цикл, очень часто бывают ситуации, когда это значение неизвестно.
Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 1000.
После компиляции программа выдаст результат, аналогичный результату работы предыдущей программы. Но поясним несколько важных моментов. Я задал строгое неравенство в условии цикла и инициализировал счетчик i нулем, так как в цикле while происходит на одну итерацию больше, потому он будет выполняться, до тех пор, пока значение счетчика перестает удовлетворять условию, но данная итерация все равно выполнится. Если бы мы поставили нестрогое неравенство, то цикл бы закончился, когда переменная i стала бы равна 1001 и выполнилось бы на одну итерацию больше.
Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор в лучшем случае выдаст нам ошибку, а в худшем, если программа соберется — сегфолт практически неизбежен.
Затем мы описываем условие цикла — «пока переменная i меньше 1000 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика i увеличивается на единицу внутри цикла.
Когда выполнится 1000 итераций цикла, счетчик станет равным 999 и следующая итерация уже не выполнится, поскольку 1000 не меньше 1000. Выражение sum += i является укороченной записью sum = sum + i .
После окончания выполнения цикла, выводим сообщение с ответом.
Цикл do while
Цикл do while очень похож на цикл while . Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 1000, с применением цикла do while .
Принципиального отличия нет, но если присвоить переменной i значение, большее, чем 1000, то цикл все равно выполнит хотя бы один проход.
Попрактикуйтесь, поэкспериментируйте над собственными примерами задач. Циклы — очень важная вещь, поэтому им стоит уделить побольше внимания. Когда поймете, как работают циклы — можете смело переходить к изучению следующего урока.
Что такое открытый исходный код и почему он важен для криптовалюты и открытого блокчейна
В своей статье Питер Ван Валькенбург, глава отдела исследований Coin Center, член совета директоров Zcash Foundation, объясняет, почему развитие программного обеспечения с открытым исходным кодом важно для построения доверительных отношений и обеспечения безопасности в блокчейн-сетях.
Компьютерный код, лежащий в основе всех крупных криптовалют и проектов открытого блокчейна, разрабатывается как ПО с открытым исходным кодом. Регуляторы и директивные органы, пытающиеся понять, что такое криптовалюты, но не знакомые с таким ПО, могут заблуждаться, считая, что эти системы разрабатываются (и должны разрабатываться) одной или несколькими коммерческими компаниями. Хотя многое известное программное обеспечение действительно разрабатывается подобным образом (например, Windows корпорации Microsoft или RDBMS компании Oracle), с проектами с открытым исходным кодом дела обстоят иначе, и это отличие может и должно формировать общественное мнение. ПО с открытым исходным кодом создаётся в сотрудничестве, бесплатно распространяется, публикуется открыто и развивается в качестве продукта сообщества, а не собственности одной компании или лица. В этом случае нет монополии, нет одной компании или индивидуума, которые бы создавали и продавали ПО, владели бы им. Точно так же, как нет единственной компании, владеющей сетью биткоина, не существует одной-единственной компании, производящей ПО, которое, функционируя на связанных в интернете компьютерах, образует эту сеть. Подобная децентрализация несёт некоторые фундаментальные блага, которые может быть тяжело понять людям, не знакомым с разработкой ПО. Чтобы лучше осознать мощь и характер открытого исходного кода, будет полезно получить некоторое представление об одном особенно успешном образце ПО с открытым исходным кодом. Речь идёт об операционной системе Linux.
Открытый исходный код повсюду
Трудно подсчитать, сколько раз за день вы пользуетесь Linux, ведь именно эта операционная система лежит в основе работы большинства серверов в интернете. Всякий раз, когда вы посещаете Facebook, Google, Pinterest, Википедию и тысячи других крупных сайтов, сервисы, которые предоставляют вам эти (такие разные) сайты, вы имеете дело с компьютерами, которые, скорее всего, работают на операционной системе Linux. Linux можно найти и гораздо ближе; скорее всего, он у вас под рукой. Скажем, операционная система Android-смартфонов основана на Linux. Если у вас есть Chromebook, то вы пользуетесь ноутбуком на основе Linux. Эта операционная система всё чаще используется в телевизорах, термостатах, мультимедийных системах в самолётах, автомобилях и т.д.
Почему это интересно? Потому что Linux — это не продукт одного программиста или даже группы программистов; в отличие от MacOS или Windows, его не разрабатывала одна или даже дюжина корпораций. У Linux есть тысячи соавторов. Как сообщила в 2015 году Linux Foundation (некоммерческая организация, способствующая открытому развитию операционной системы), приблизительно 14 000 разработчиков из более чем 1300 различных компаний внесли вклад в виде фрагментов программного кода. В одном лишь 2015 году в усовершенствовании кода впервые поучаствовали 2355 разработчиков. Таким образом, путём экстраполяции можно подсчитать, что к 2017-му свою лепту внесли приблизительно 18 000 человек, и это число будет расти.
В 1996 году автор книги «Собор и Базар» Эрик Рэймонд написал:
Кто бы мог подумать даже пять лет назад (в 1991 году), что операционная система мирового класса может, словно по волшебству, быть слеплена в единое целое из фрагментов внештатной работы нескольких тысяч разработчиков, разбросанных по всему земному шару и связанных только призрачными нитями интернета?
Преимущества открытого исходного кода
В своей книге Рэймонд рассказывает о том, что открытый исходный код представляет собой революционный метод создания технологий. Linux с тысячами независимых разработчиков, работающих в режиме публичного сотрудничества, служит примером модели открытого исходного кода. Криптовалюты следуют той же модели, но об этом мы поговорим ниже.
Рэймонд выделил несколько преимуществ модели открытого исходного кода. Ключевые в контексте нашей дискуссии — следующие:
- Каждый достойный образец ПО начинается с удовлетворения личного желания разработчика. Мотивацией большинства разработчиков проектов с открытым исходным кодом служит желание лично использовать создаваемые продукты. Они не связаны контрактом, обязывающим их создать что-то для другого; у них есть личная потребность, которую они удовлетворяют. Таким образом, возникает качественно иная мотивация, порождающая детальное знание проблемы.
- Хорошие программисты знают, что писать. Великие знают, что переписывать (и использовать повторно). Когда разработка осуществляется открыто, можно избежать избыточности, и проблематичные, усложнённые или излишние коды можно идентифицировать и упростить.
- Когда вы теряете интерес к программе, то ваш последний долг по отношению к ней состоит в том, чтобы передать её в руки компетентного преемника. Люди приходят в проект с открытым исходным кодом и покидают его в зависимости от своих интересов и компетенции. Никто не застревает в работе над проектами, которые больше не интересны. Появляются свежие головы, предлагающие различные точки зрения на давние проблемы или новые перспективы развития.
- Восприятие пользователей в качестве коллег-разработчиков — самый лёгкий путь к улучшению кода и эффективной отладке ПО. Многие пользователи открытого исходного кода помогают выявлять проблемы и даже предлагают решения. Грань между потребителем и производителем программ с открытым исходным кодом размыта: работа над ПО прозрачна, она ведётся на глазах у публики, и участие в процессе создания доступно всем.
- При наличии достаточно большой базы бета-тестеров и разработчиков практически любая проблема будет быстро квалифицироваться, а её решение наверняка окажется для кого-то очевидным. Этот постулат назван Законом Линуса в честь Линуса Торвальдса, создателя ядра Linux, который долгое время оставался главным разработчиком этой операционной системы. Когда процесс разработки кода носит закрытый характер, разработчики рискуют пропустить слабое место или не заметить определённую ошибку. Разработка в среде опытных пользователей с уникальным видением повышает вероятность выявления и устранения багов, что делает ПО с открытым исходным кодом более безопасным и отказоустойчивым.
Результатом такой разработки становится очень надёжный программный код, созданный пользователями для пользователей. Цель состоит не в том, чтобы создать нечто, обогащающее компанию, которая производит и продаёт продукты, а, скорее, в том, чтобы решить проблему, достаточно распространённую, чтобы большое сообщество талантливых программистов с радостью вносило свой вклад. Люди, лишённые навыков программирования, получают от такой модели огромное благо. Бесплатное ПО словно материализуется из воздуха, им может свободно воспользоваться каждый, и оно получает обновления до тех пор, пока пользователи экспертного уровня тоже заинтересованы в его эксплуатации.
Закон и свободное ПО
Действующее законодательство поддерживает и в некоторых случаях стимулирует разработку программного обеспечения с открытым исходным кодом. Оно, как и всё ПО, защищено авторским правом, но его авторы выпускают код с лицензией, позволяющей каждому использовать и модифицировать его без специфического разрешения или любых выплат авторам (то есть с лицензией, разработанной Массачусетским технологическим институтом — MIT).
Некоторые лицензии включают требования, что производные программного обеспечения должны выпускаться на таких же условиях. Благодаря подобной схеме база открытого исходного кода растёт и распространяется. Это явление известно как лицензия свободного программного обеспечения, или LGPL-3 — меньшая стандартная общественная лицензия.
Открытый исходный код в криптовалютах и токен-проектах
Возможно, Linux — крупнейший и самый важный пример модели открытого исходного кода, но есть и другие. В их число входят все крупные криптовалютные и блокчейн-проекты. Все они создают компьютерные сети, позволяющие участникам достигать согласия относительно совместно используемых данных (блокчейна криптовалюты).
Программное обеспечение, дающее любому участнику возможность соединяться с сетью, называется клиентом, и это ПО с открытым исходным кодом. Зачастую клиентское ПО разрабатывают несколько не связанных между собой участников в качестве простейшей версии сетевого ПО (то есть так называемого reference client), на основе которого можно выстроить программное обеспечение для майнинга, кошелька, биржи или другое совместимое с сетью ПО.
Клиент Bitcoin Core — результат работы более чем 450 независимых разработчиков, которые в общей сложности внесли свой вклад в развитие кода более 15 000 раз. ПО доступно для свободного использования и модификации в соответствии с лицензией свободного программного обеспечения MIT, а вся история разработки доступна для обозрения в публичном репозитории на Github — облачном сервисе, позволяющем любому создать аккаунт, загрузить новый код и отслеживать изменения. Если созданный вами репозиторий открыт для всеобщего обозрения, комментариев и предложений об изменениях, то вам даже не нужно платить за аккаунт Github.
Публичный репозиторий также отслеживает так называемые форки оригинального клиента. Форк создаёт клон изначального ПО, который затем можно модифицировать с той или иной целью, не изменяя изначальное хранилище. Разработчики без ограничений совершают форки для репозитория Bitcoin Core на Github, чтобы создать либо специфические приложения, совместимые с биткоином (например, кошелёк для смартфонов), либо новую криптовалюту, которая перестаёт быть совместимой с сетью биткоина и подразумевает создание новой криптовалютной сети (например, так было с лайткоином или Zcash). На сегодняшний день оригинальный клиент Bitcoin Core пережил форк более 10 000 раз, и появляющиеся новые репозитории демонстрируют, что создание производных продуктов продолжается.
На эфириум сейчас приходится как минимум 121 репозиторий, каждый из которых фокусируется на определённом аспекте проекта (например, языках программирования для написания смарт-контрактов, графических браузерах для взаимодействия конечного пользователя с сетью эфириума, совместимых клиентах для участия в работе сети и т.д.). Есть не менее восьми проектов, направленных на разработку совместимых с эфириумом клиентов, а над наиболее популярными клиентами (go-ethereum и Parity) трудятся сотни независимых разработчиков. Код эфириума и его полная история, как и код, а также история биткоина, доступны для публичного обозрения на Github и в других сетевых хранилищах, и все коды выпускаются в соответствии с лицензией LGPL-3, требующей выпускать все будущие производные разработки с такой же лицензией.
Даже недавние проекты, реализованные по инициативе коммерческих стартапов, демонстрируют приверженность кредо открытого исходного кода. Zcash Company разрабатывает протокол Zcash посредством публичного репозитория. Несколько ведущих разработчиков не работают на компанию, а специально созданная некоммерческая организация призвана следить за тем, чтобы постепенно произошёл переход от разработки, осуществляемой компанией, к разработке силами сообщества. База исходного кода Zcash выпускается с лицензией Массачусетского технологического института. Protocol labs, разработчик Filecoin, намерен создать аналогичную открытую модель и уже протестировал её в своём проекте IPFS, работая с кодом в открытых репозиториях и выпуская его с лицензией MIT.
Почему открытый исходный код важен
Криптовалюты и открытые блокчейны способны обеспечить функционал, который был бы регулируемым, если бы его источником была одна-единственная корпорация. Централизованные эмитенты цифровой валюты, такие как Liberty Reserve или E-gold, представляли собой финансовые сервисы и должны были регистрироваться в Управлении Министерства финансов США по борьбе с финансовыми преступлениями, а также получать лицензию, позволяющую переводить деньги, в каждом штате. Если такие токены будут продвигаться на рынке для привлечения инвесторов, они могут быть приравнены к ценным бумагам, и в таком случае потребуется регистрация в Комиссии по ценным бумагам и биржам США. Эти ограничения имеют смысл, поскольку централизованные сервисы связаны с риском того, что сторона, находящаяся в центре всей схемы, не сможет выполнить свои обещания, адекватно протестировав продукт и сделав его безопасным.
Однако технологии вроде биткоина способны предложить аналогичный функционал, будучи открытыми и никому не принадлежащими сетями. Здесь нет никакой корпорации. К этим сетям присоединяются пользователи, а открытое программное обеспечение стимулирует их стремление к сотрудничеству. В конечном счёте все участники приходят к согласию относительно каждого фрагмента данных, необходимых для создания валюты. Децентрализация держится на двух столпах: открытых механизмах консенсуса и программном обеспечении с открытым исходным кодом. Если бы код не был открытым, то как бы участники (не знакомые друг с другом люди в интернете) сумели бы понять систему, к которой они присоединяются, и довериться ей?
На самом деле токен-проекты, основанные на патентованном коде, могут оказаться просто централизованными сервисами, которые прячутся за профессиональным сленгом и «абракадаброй блокчейна». Однако у «истинных» проектов код, создающий децентрализованную сеть, позволяющий участникам доверять друг другу, иметь общую мотивацию и наказывать мошенников, и сам по себе децентрализован. Его разрабатывают у всех на глазах сотни энтузиастов, он доступен всем в мире для использования и модификации и совершенно независим от корпоративных интересов.
Программный код
Исхо́дный код (также исхо́дный текст) — текст компьютерной программы на каком-либо языке программирования. В обобщённом смысле — любые входные данные для транслятора.
Исходный код либо транслируется в исполняемый код при помощи компилятора, либо исполняется непосредственно по тексту при помощи интерпретатора.
Содержание
Назначение
Исходный код либо используется для получения объектного кода, либо выполняется интерпретатором. Изменения никогда не выполняются над объектным кодом, только над исходным, с последующим повторным преобразованием в объектный.
Другое важное назначение исходного кода — в качестве описания программы. По тексту программы можно восстановить логику её поведения. Для облегчения понимания исходного кода используются комментарии. Существуют также инструментальные средства, позволяющие автоматически получать документацию по исходному коду — т. н. генераторы документации.
Кроме того, исходный код имеет много других применений. Он может использоваться как инструмент обучения; начинающим программистам бывает полезно исследовать существующий исходный код для изучения техники и методологии программирования. Он также используется как инструмент общения между опытными программистами, благодаря своей (идеально) лаконичной и недвусмысленной природе. Совместное использование кода разработчиками часто упоминается как фактор, способствующий улучшению опыта программистов.
Программисты часто переносят исходный код из одного проекта в другой, что носит название повторного использования кода (Software reusability).
Исходный код — важнейший компонент для процесса портирования программного обеспечения на другие платформы. Без исходного кода какой-либо части ПО, портирование либо слишком сложно, либо вообще невозможно.
Организация
Исходный код некоторой части ПО (модуля, компонента) может состоять из одного или нескольких файлов. Код программы не обязательно пишется только на одном языке программирования. Например, часто программы, написанные на языке Си, с целью оптимизации, содержат вставки кода на языке ассемблера. Также возможны ситуации, когда некоторые компоненты или части программы пишутся на различных языках, с последующей сборкой в единый исполняемый модуль при помощи технологии известной как компоновка библиотек (library linking).
Сложное программное обеспечение при сборке требует использования десятков, или даже сотен файлов с исходным кодом. В таких случаях для упрощения сборки обычно используются файлы проектов, содержащие описание зависимостей между файлами с исходным кодом, и описывающие процесс сборки. Эти файлы так же могут содержать и другие параметры компилятора и среды проектирования. Для разных сред проектирования могут применяться разные файлы проекта, причем в некоторых средах эти файлы могут быть в текстовом формате, пригодном для непосредственного редактирования программистом с помощью универсальных текстовых редакторов, в других средах поддерживаются специальные форматы, а создание и изменения файлов производится с помощью специальных инструментальных программ. Файлы проектов обычно включают в понятие «исходный код». В подавляющем большинстве современных языковых сред обязательно используются файлы проектов вне зависимости от сложности прочего исходного кода, входящего в данный проект. Часто под исходным кодом подразумевают и файлы ресурсов, содержащие различные данные, например, графические изображения, нужные для сборки программы.
Для облегчения работы с исходным кодом, для совместной работы над кодом командой программистов, используются системы управления версиями.
Качество
В отличие от человека, для компьютера нет «хорошо написанного» или «плохо написанного» кода. Но то, как написан код, может сильно влиять на процесс сопровождения ПО. О качестве исходного кода можно судить по следующим параметрам:
- читаемость кода (в том числе наличие или отсутствие комментариев к коду;
- лёгкость в поддержке, тестировании, отладке и устранении ошибок, модификации и портировании;
- низкая сложность;
- низкое использование ресурсов — памяти, процессора, дискового пространства;
- отсутствие замечаний, выводимых компилятором;
- отсутствие «мусора» — неиспользуемых переменных, недостижимых блоков кода, ненужных устаревших комментариев и т. д.
Неисполняемый исходный код
Копилефтные лицензии для свободного ПО требуют распространения исходного кода. Эти лицензии часто используются также для работ, не являющихся программами — например, документации, изображений, файлов данных для компьютерных игр.
В таких случаях исходным кодом считается форма данной работы, предпочтительная для её редактирования. В лицензиях, предназначенных не только для ПО, она также может называться версией в «прозрачном формате». Это может быть, например:
- для файла, сжатого с потерей данных — версия без потерь;
- для рендеравекторного изображения или трёхмерной модели — соответственно, векторная версия и модель;
- для изображения текста — такой же текст в текстовом формате;
- для музыки — файл во внутреннем формате музыкального редактора;
- и наконец, сам файл, если он удовлетворяет указанным условиям, либо если более удобной версии просто не существовало.