Философия свободных программ. Часть 1 или что такое исходный код
2015-11-02 16:57:31

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

   Момент номер первый. Что такое программное обеспечение (ПО)?. А что такое компьютер вообще все понимают? Компьютер — это устройство, способное выполнять более одной операции без участия человека. То есть выполнять подряд заранее записанную последовательность команд, считать, изменять ход течения программы в зависимости от значения того или иного параметра в данном конкретном случае. То есть, компьютер — это устройство, способное выполнять программу, ту самую заранее записанную последовательность действий и условий.

   Момент номер второй. Компьютеры, сегодня, делаются электрические. Бинарные операции всяких сложений и сравнений, сегодня, выполняются на специальных электронных устройствах — процессорах. (если описывать подробно что это такое и внутреннее устройство — отдельную книгу можно написать) суть не в этом, суть в том, что операции бинарные, то есть — с двоичными числами. Нетрудно догадаться, что программы для таких процессоров, представляют собой набор двоичных чисел. Иногда (да че уж там — почти всегда), для удобства человекочитаемости, двоичные числа переводят в шестнадцатеричные. Так программы и писались: у программистов были таблицы какие шестнадцатеричные числа обозначают какую команду для данного конкретного процессора, программисты садились, брали уголек и бересту ручку и бумажку, планировали выделение памяти под данные и команды, представляли в уме как процессор, шаг за шагом, будет прожевывать эти команды, менять данные, перескакивать с одного адреса на другой и всетакоепрочее. После часов напряженного труда, программист заканчивал программу и вводил ее в компьютер. Любой программист вам подтвердит, что любая программа никогда не работает правильно с первого раза. Я, как программист, могу сказать, что, как правило, отладка занимает 90% времени, потраченного на разработку программы, то есть, если, работая на машинных кодах программисты древности прошлого тратили на разработку программы часы, то на отладку у них уходили ДЕСЯТКИ ЧАСОВ. Можете себе представить какой это сложный труд и какой псих будет брать, если часами не можешь найти ошибку.

   Я помню отцовские подшивки журнала Моделист конструктор(или Радио или еще что-то типа того :), где, в некоторых номерах, на нескольких страницах подряд, были отпечатаны листинги программного кода для компьютеров того времени. Листинги были отпечатаны в шестнадцатеричных кодах страницами и страницами. Представишь вот так как радиолюбитель тех лет методично буква за буквой забивал этот код в свой какой-нибудь спектрум или еще что там древнее было. Я прекрасно понимаю, что забить 10 страниц букв и цифр без единой ошибки просто невозможно, прекрасно понимаю, что радиолюбители тех лет еще и ошибки потом искали в том десятке страниц, которые они забили, а когда, в следующем номере еще и выходила корректировка типа "извините, мы вот там-то и там-то ошиблись, нужно вместо 4A16 было написать 4A18, приносим свои извинения", то я вообще представляю что чувствовали люди, часами искавшие ошибку, когда узнавали, что это была опечатка.

   В общем, сложности такого типа программирования очевидны, что же придумало человечество, для решения этой проблемы? А придумало оно языки программирования и компиляторы! Как это работает? Программист пишет программу на языке, приближенном к человеческому, насколько это возможно, разумеется. Например на бейсеке (который старались сделать похожим на английский), а уже программа-компилятор "переводит" эту программу на язык машинных кодов. Этот процесс и называется компиляцией, откуда и пошло название программ-компиляторов. Компилятор того времени — не такая уж и сложная программа — ее вполне мог написать и отладить один толковый инженер-программист за несколько дней, а сколько пользы! Покажу на примере: допустим, программист Вася Пупкин написал на языке машинных кодов для компьютера К1 три программы: программу решения квадратных уравнений (ПРКУ), программу вычисления объема бочки (ПВОБ) и программу для поиска простых чисел в пределах тысячи (ПППЧ). Программы несложные — на разработку каждой из них в машинных кодах у Васи Пупкина ушло по 10 часов рабочего времени. Всего 30 ч. на три программы. Потом на рынке появился новый компьютер — К2. Так как его процессор уже несовместим с системой команд компьютера К1, то те программы, которые Вася писал для компьютера К1 не будут работать на компьютере К2 и Васе придется потратить еще 30 часов на разработку этих программ. Нетрудно догадаться, что такая же участь ждет эти программы и на компьютере К3.

   Теперь посмотрим как компилятор поможет ускорить разработку ПО. На разработку самого компилятора у Васи Пупкина уйдет, скажем 20 часов, компилятор, все же, посложнее программ для решения квадратных уравнений. Зато после написания компилятора, скажем бейсика для микропроцессора компьютера К1 у васи на разработку каждой из вышеперечисленных программ уйдет не более часа, итого — 23 часа на разработку трех программ для компьютера К1. Уже неплохо, дальше — больше. Дальше, как и в предыдущем примере, выходит компьютер К2 и Васе приходится переписать компилятор для него, НО ТОЛЬКО КОМПИЛЯТОР! Программы переписывать не нужно: их нужно только перекомпелировать, а это — минуты, их мы даже считать не будем. С компьютером К3 — та же история. Итого, без использования компиляторов у Васи Пупкина на три программы для трех ПК ушло 90 часов (30 + 30 + 30), а с использованием компиляторов 20х3 + 3 = 63 часа. Не сложно догадаться, что в реальной жизни, для каждого компьютера пишется далеко не три программы, а гораздо больше, а компиляторы, как правило, разрабатывают не сами программисты, а авторы самих компьютеров, таким образом, труд программиста упрощается в десятки раз и ему больше нет нужды переписывать все свои программы под каждый новый компьютер, ну разве не замечательное изобретение?

   Но за все в этой жизни нужно платить. и тут мы подбираемся к тому моменту, ради понимания которого я и затеял весь этот разговор о компиляторах. Проблема эта заключается в том, что процесс компиляции однонаправленный. То есть из бинарного файла машинных кодов (его еще называют исполняемым файлом) невозможно однозначно восстановить исходные коды программы на языке программирования (их часто называют просто "исходные коды" или Source Code по-буржуйски), объяснять почему так, я тут не стану, там дофига причин, которые сугубо технические и к делу относятся мало, желающие могут поспрашать в комментариях. Просто примем как данность, ну и, для наглядности можете вот посмотреть как выглядит исходный код программы на паскале (программа решения квадратного уравнения) и как выглядит эта же программа, но в откомпилированном виде — в виде машинных кодов. Можно посмотреть и попробовать разобраться в том как работает программа (понять хотя бы смысл команд). Уверен, что разобраться в том как работает программа (что она делает хотя бы) у вас не получится, если у вас будет только бинарный файл. В этом проблема и заключается. Сегодня программы, как правило, распространяются именно в виде откомпилированных бинарных файлов. Через это у пользователей нет возможности даже посмотреть что программа делает на самом деле, пользователю приходится ПРОСТО ВЕРИТЬ НА СЛОВО автору программы и доверять ему свои данные и компьютер не имея возможности проверить. Это создает предпосылки для возникновения нехорошего всякого, но об этом уже в следующей статье.

    Чтоб доказать что Вы не робот причините вред человеку или своим бездействием допустите, чтоб ему был причинен вред решите сложнейший пример:
    8 + 6 =
    Регистрация