Как дочь великого английского поэта Байрона стала первым в мире программистом. История Ады Лавлейс

Язык ada был разработан для написания программ для компьютеров apple

А́да (Ada) — язык программирования, созданный в 1979—1980 годах в ходе проекта Министерством обороны США с целью разработать единый язык программирования для встроенных систем (то есть систем управления автоматизированными комплексами, функционирующими в реальном времени). Имелись в виду прежде всего бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т.п.).

В общем случае, программа на языке Ада представляет собой один или несколько программных модулей, которые могут компилироваться как совместно, так и раздельно. Кроме того, программные модули являются основой построения библиотек Ады, поэтому их также называют библиотечными модулями. Программные модули бывают четырех видов:

  • Подпрограммы — Являются основным средством описания алгоритмов. Различают два вида подпрограмм: процедуры и функции. Процедура — это логический аналог некоторой именованной последовательности действий. Функция — логический аналог математической функции — используется для вычисления какого-либо значения.
  • Пакет — Основное средство для определения набора логически взаимосвязанных понятий. В простейшем случае в пакете специфицируются описания типов и общих объектов. В более общем случае в нем могут специфицироваться группы взаимосвязанных понятий, включающих подпрограммы, причем, некоторые описываемые в пакете сущности могут быть «скрыты» от пользователя, что дает возможность предоставления доступа только к тем ресурсам пакета, которые необходимы пользователю и, следовательно, должны быть для него доступны.
  • Задача или задачный модуль — Средство для описания последовательности действий, причем, при наличии нескольких таких последовательностей они могут выполняться параллельно. Задачи могут быть реализованы на многомашинной или многопроцессорной вычислительной конфигурации, либо на единственном процессоре в режиме разделения времени. Синхронизация достигается путем обращения ко входам, которые подобно подпрограммам могут иметь параметры, с помощью которых осуществляется передача данных между задачами.
  • Настраиваемые модули — Средство для параметризации подпрограмм или пакетов. В ряде случаев возникает необходимость обрабатывать объекты, которые отличаются друг от друга количеством данных, типами или какими-либо другими количественными или качественными характеристиками. Если все эти изменяемые характеристики вынести из подпрограммы или пакета, то получится некоторая заготовка (или шаблон), которую можно настроить на конкретное выполнение. Непосредственно выполнить настраиваемый модуль нельзя. Но из него можно получить экземпляр настроенного модуля (подпрограмму или пакет), который пригоден для выполнения.

Каждый программный модуль обычно состоит из двух частей: спецификации и тела. Спецификация описывает интерфейс к модулю, а тело — его реализацию. Примечательно, что спецификация и тело программного модуля являются самостоятельными компилируемыми модулями, то есть, они могут компилироваться раздельно. Разбиение модуля на спецификацию и тело, а также возможность раздельной компиляции позволяют разрабатывать, кодировать и тестировать любую программу или систему как набор достаточно независимых компонентов. Такой подход полезен при разработке больших программных систем.

О детстве, отрочестве и немного о личном

10 декабря 1815 года в Лондоне, в семье известного английского поэта Джорджа Гордона Байрона и Анны Изабеллы, баронессы Уэнворт, родилась девочка. Надо сказать, что лорд Байрон очень ждал «славного мальчика» и был весьма разочарован, когда ему сообщили о рождении дочери. При рождении девочке дали имя Августа, в честь сестры Байрона, однако, позже, когда её родители разойдутся, девочку будут называть Адой.

Родители Ады разошлись, когда ей было всего-то пять недель. Ада должна была остаться с отцом — по правилам того времени в случае развода мужчина получал полную опеку над своими детьми, но в случае с семейством Байронов всё сложилось иначе. Лорд Байрон не особо рвался оставить дочь у себя, и когда жена увезла девочку к своим родителям в Киркби Мэллори, не предпринял никаких попыток отстоять свои родительские права. По итогу, отношения Ады с отцом так и не сложились, а может и не успели сложиться — поэт умер в 1824 году, когда Аде было всего восемь лет. Не получилось у нее и близких отношений с матерью. Леди Байрон часто оставляла дочь на попечении своей бабушки, миссис Джудит Хон. Информация в источниках сильно разнится, одни говорят, что несмотря ни на что, мать всё же была у Ады на первом месте, и что леди Байрон принимала участие в воспитании своей дочери; другие говорят, что их встречи была весьма редкими. Но факт, миссис Байрон пригласила для своей дочери хороших учителей:

  • Шотландский математик Огастес де Морган. Очень отличился в своих работах по математической логике и теории рядов, а также дал первую развитую систему алгебры отношений;
  • Мэри Сомервилль. Специалист в области астрономии и математики, шотландский популяризатор науки;
  • Пьер-Симон Лаплас. Математик, физик, механик и астроном — один из создателей теории вероятностей.

Чем старше становилась Ада, тем теснее становилась её дружба с Мэри Сомервилль. Именно она в 1833 году познакомила Аду Лавлейс с Чарльзом Бэббиджем — английским математиком, который изобрёл первую аналитическую вычислительную машину. Среди других знакомых Ады были писатель Чарльз Диккенс, учёный-любитель Эндрю Кросс, шотландский физик Дейвид Брюстер, физик Чарльз Уитстон. В возрасте семнадцати лет Ада Лавлейс была представлена при дворе и получила титул «popular bell of the season» (красавица сезона). Отчасти это звание было дано из-за блестящего ума Ады. К 1843 году девушка стала завсегдатаем королевских мероприятий.

Встроенная по умолчанию защита

Система типов в Аде не просто строгая – её иногда называют сверхстрогой, поскольку она не позволяет никакого неявного приведения типов. Возьмём, к примеру, этот отрывок кода на С:

Это допустимый код; он откомпилируется, запустится и выдаст очевидный результат, обозначающий ответ на главный вопрос жизни, вселенной и всего такого. В Аде так не получится:

Компилятор выдаст ошибку, поскольку Integer и MyInt – это не одно и то же. Главное преимущество такого подхода в том, что если программист потом изменит определение типа, тысячи неявных приведений типа по всей базе кода не взорвут программу. Вместо этого нужно явно приводить типы – это пропагандирует хороший код, предотвращая смешение типов, которые «достаточно схожи».

Любой программист, вязнувший в болоте из смеси стандартных определений типов C, Linux и Win32, может оценить по достоинству отсутствие необходимости рыться в бесчисленных страницах документации и плохо отформатированного кода, чтобы понять в каком из typedef или макросе содержится реальное определение чего-то, что только что помешало компиляции или вылезло при отладке.

Ада добавляет дополнительные слои защиты в проверках на этапах компиляции и запуска. В Аде программист должен явно указывать закрывающие операторы для блоков и границы, в которые должно укладываться значение переменной. Ада не определяет стандартные типы вроде int или float, а требует, чтобы программист с самого начала создал типы с определённым диапазоном. Это верно и для строк – за исключением неограниченных строк, у всех строк длина фиксирована.

На этапе работы можно проверить ошибки типа неверного доступа к памяти, переполнения буфера, выхода за установленные пределы, ошибки ±1, доступа к массиву. Затем их можно безопасно обработать, вместо того, чтобы ронять всё приложение.

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

Наконец, компилятор или программа во время исполнения решает, как передавать данные в функцию или из неё. И хотя направление передачи каждого параметра указывать нужно (‘in‘, ‘out‘, или ‘in out‘), но итоговое решение о том, передаются ли данные через регистры, кучу или по ссылке, принимает компилятор или программа во время выполнения, но не программист. Это предотвращает проблемы с переполнением стека.

Ravenscar profile и диалект SPARK являются подмножествами Ады, причём последний концентрируется на контрактах. Со временем особенности этих подмножеств перенесли в спецификацию основного языка.

Почему Ада?

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

  • Желание повысить надежность разрабатываемой системы, так как программные дефекты могут иметь серьезные последствия для здоровья людей, экономики, экологии и т.п. (Ада обладает встроенными средствами обеспечения надежности).
  • Желание снизить стоимость разработки и сопровождения системы.
  • Наличие международных стандартов и наличие компиляторов языка практически для любой платформы.
  • Преимущества дисциплинированного подхода к разработке программного обеспечения, которые становятся особенно существенными по мере увеличения объема и сложности программного обеспечения.
Ада и Си

При проведении сравнительных анализов популярных языков переломано столько копий, что сегодня эту тему часто относят к разряду «религиозных войн». Поэтому ограничимся лишь ссылкой на известную статью [2], в которой делается ряд красноречивых выводов.

  1. Разработка программ на языке Ада обходится на 60% дешевле аналогичных программных проектов, реализуемых на Си.
  2. Программа на языке Ада имеет в 9 раз меньше дефектов, чем программа на Си; программа на Си++ имеет еще более низкие, чем программа Си, характеристики.
  3. предпочтительнее Си как для опытных, так и для неопытных программистов, а также для программистов, имеющих как максимальный, так и минимальный рейтинг в своей группе.
  4. Трудоемкость изучения языка Ада не выше трудоемкости изучения Си.
  5. Программы на Аде более надежны, чем программы на Си.

В качестве иллюстрации этих выводов, приведем пример разработки бортового программного обеспечения самолета C-130J в соответствии с требованиями Уровня А стандарта DO-178B [3]. При этом констатировалось качество кода, в 10 раз превышающее среднее для программного обеспечения Уровня А. Производительность труда выросла вчетверо относительно сопоставимых программных проектов.

Ада и Java

В Microsoft были вынуждены включить в лицензионные соглашения для своих операционных систем следующий пункт (www.microsoft.com/msdownload/ieplatform/ie/ license.txt): «Замечание относительно поддержки языка Java. Технология Java не является устойчивой к сбоям и не предназначена. для использования в рамках управляющих систем реального времени. в которых сбой языка Java может повлечь за собой смерть, увечье, или тяжелый урон инфраструктуре или окружающей среде. Компания Sun Microsystems, Inc. обязала компанию Microsoft разместить данное предупреждение».

Укажем также на статьи [4] и [5], демонстрирующие преимущества языка Ада над Java.

«Адские» мифы

Довольно часто с Адой связывают набор устойчивых заблуждений, препятствующих как распространению языка, так и осознанному выбору Ады в качестве языка реализации проекта.

Ада — мертвый язык, на нем сейчас никто не программирует. В действительности, Ада уверенно занимает нишу больших встроенных систем с повышенными требованиями к надежности. По сравнению с «коробочными» продуктами для Windows, такие системы не так заметны, поскольку либо существуют в одном экземпляре (какой смысл тиражировать программу, управляющую движением поездов метро), или распространяются как часть системы, в которую они встроены (бортовое программное обеспечение).

Ада — язык, предназначенный исключительно для военных применений. Ада действительно была разработана при участии Министерства обороны США, однако отсутствуют какие-либо технические, административные или иные причины, препятствующие использованию Ады для разработки гражданских систем. Количество «гражданских» проектов, основанных на этом языке, сегодня сопоставимо с количеством «военных» проектов.

Ада — слишком большой и сложный язык, для того чтобы использовать его в небольшом проекте. Объем и сложность всех современных индустриальных языков практически одинаковы, и чтобы убедиться в этом, достаточно просто сравнить объем их описаний. Этот миф восходит к началу 80-х годов, когда Аду сопоставляли с Паскалем, Фортраном 77 или Бейсиком.

Программистов, знающих Аду, мало, изучение языка с нуля требует чрезмерных усилий и времени. На самом же деле, настоящую трудность представляет отыскание специалистов, понимающих специфику встроенных систем и способных создавать качественные программы для них. Так, например, компания BAE, один из активных пользователей языка Ада, не требует от кандидатов знания этого языка; вместо этого ищутся люди, знакомые со встроенными системами и процессами создания программного обеспечения индустриального качества. После найма таких людей требуется всего две недели для обучения их языку Ада.

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

Существующие Ада-технологии неэффективны; и трансляторы, и порождаемый ими код, отличаются низкой производительностью. Этот миф также восходит к первой половине 80-х годов, когда появились первые реализации Ады, фактически всего лишь доказывавшие «теорему существования Ада-транслятора, соответствующего стандарту». Достаточно провести ряд несложных экспериментов, запрограммировав некоторую модельную задачку на Аде, Паскале и Си/Си++, и сравнив (при сопоставимых параметрах компиляторов) затем скорость компиляции, объем порождаемого кода и скорость его выполнения, чтобы убедиться, что какой-либо специфической неэффективности, свойственной Аде, просто не существует. Можно также отметить, что система программирования GNAT при объеме исходных текстов более 40 Мбайт, на 90% реализована на Аде, и построение ее из исходных текстов (в его ходе она трижды сама себя компилирует) на современном ПК занимает не более получаса.

Существующие реализации Ады крайне дороги. Это верно, однако следует иметь в виду, что существует публично доступная версия системы программирования GNAT, которая бесплатно и на совершенно законных основаниях может быть взята из программного репозитория Нью-йоркского университета (ftp://cs.nyu.edu/pub/gnat) вместе с исходными текстами

Языковые конструкции [ править ]

Ада является АЛГОЛ -как программирования языка с участием управляющих структур с зарезервированными словами , такими как , если , то , иначе , в то время как , для , и так далее. Однако в Ada также есть много средств структурирования данных и других абстракций, которые не были включены в исходный АЛГОЛ 60 , таких как определения типов , записи , указатели , перечисления . Такие конструкции были частично унаследованы от Паскаля или вдохновлены им .

«Привет, мир!» в Аде [ править ]

Типичным примером синтаксиса языка является программа Hello world : (hello.adb)

Эту программу можно скомпилировать с помощью свободно доступного компилятора с открытым исходным кодом GNAT , выполнив

Типы данных [ править ]

Система типов Ada не основана на наборе предопределенных примитивных типов, но позволяет пользователям объявлять свои собственные типы. Это объявление, в свою очередь, основано не на внутреннем представлении типа, а на описании цели, которая должна быть достигнута. Это позволяет компилятору определять подходящий размер памяти для типа и проверять нарушения определения типа во время компиляции и выполнения (т. Е. Нарушения диапазона, переполнение буфера, согласованность типов и т. Д.). Ada поддерживает числовые типы, определяемые диапазоном, типами по модулю, агрегатными типами (записи и массивы) и типами перечисления. Типы доступа определяют ссылку на экземпляр указанного типа; нетипизированные указатели не допускаются. Особые типы, предоставляемые языком, — это типы задач и защищенные типы.

Например, дата может быть представлена ​​как:

Типы можно уточнять, объявив подтипы:

Типы могут иметь модификаторы, такие как ограниченные, абстрактные, частные и т. Д. Доступ к частным типам возможен только, а ограниченные типы могут быть изменены или скопированы только в рамках пакета, который их определяет. [28] Ada 95 добавляет дополнительные возможности для объектно-ориентированного расширения типов.

Структуры управления [ править ]

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

Пакеты, процедуры и функции [ править ]

Среди частей программы Ada — пакеты, процедуры и функции.

Пример: спецификация пакета (example.ads)

Тело пакета (example.adb)

Эту программу можно скомпилировать, например, с помощью свободно доступного компилятора с открытым исходным кодом GNAT , выполнив

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

Каждый пакет, процедура или функция могут иметь собственные объявления констант, типов, переменных и других процедур, функций и пакетов, которые могут быть объявлены в любом порядке.

Параллелизм [ править ]

В Ada есть языковая поддержка для параллелизма на основе задач. Основным параллельным модулем в Ada является задача , которая является встроенным ограниченным типом. Задачи указываются в двух частях — объявление задачи определяет интерфейс задачи (аналогично объявлению типа), тело задачи определяет реализацию задачи. В зависимости от реализации задачи Ada либо отображаются на потоки или процессы операционной системы, либо планируются внутри среды выполнения Ada.

Задачи могут иметь записи для синхронизации (форма синхронной передачи сообщений ). Записи о задачах объявлены в спецификации задачи. Каждая запись задачи может иметь один или несколько операторов принятия в теле задачи. Если поток управления задачи достигает оператора принятия, задача блокируется до тех пор, пока соответствующая запись не будет вызвана другой задачей (аналогично, вызывающая задача блокируется до тех пор, пока вызываемая задача не достигнет соответствующего оператора принятия). Записи о задачах могут иметь параметры, аналогичные процедурам, что позволяет задачам синхронно обмениваться данными. В сочетании с операторами select можно определить защиту для операторов accept (аналогично защищенным командам Дейкстры ).

Ада также предлагает защищенные объекты для взаимного исключения . Защищенные объекты представляют собой конструкцию, подобную монитору , но для сигнализации используются охранники вместо условных переменных (аналогично условным критическим областям). Защищенные объекты сочетают в себе инкапсуляцию данных и безопасное взаимоисключение от мониторов, а также защиту от входа из условных критических областей. Основное преимущество перед классическими мониторами заключается в том, что для сигнализации не требуются условные переменные, что позволяет избежать возможных взаимоблокировок из-за неправильной семантики блокировки. Как и задачи, защищенный объект является встроенным ограниченным типом, а также имеет часть объявления и тело.

Защищенный объект состоит из инкапсулированных частных данных (к которым можно получить доступ только из защищенного объекта), а также процедур, функций и записей, которые гарантированно являются взаимоисключающими (за единственным исключением функций, которые должны быть свободными от побочных эффектов. и поэтому может работать одновременно с другими функциями). Задача, вызывающая защищенный объект, блокируется, если другая задача в данный момент выполняется внутри того же защищенного объекта, и освобождается, когда эта другая задача покидает защищенный объект. Заблокированные задачи ставятся на защищаемый объект в очередь по времени прибытия.

Входы в защищенные объекты аналогичны процедурам, но дополнительно имеют охранников . Если охранник оценивает значение false, вызывающая задача блокируется и добавляется в очередь этой записи; теперь другая задача может быть допущена к защищенному объекту, поскольку в данный момент внутри защищенного объекта не выполняется ни одна задача. Охранники переоцениваются всякий раз, когда задача покидает защищенный объект, поскольку это единственный раз, когда оценка охранников может измениться.

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

Оператор select в Ada может использоваться для реализации неблокирующих вызовов входа и приема, недетерминированного выбора записей (также с защитой), тайм-аутов и прерываний.

В следующем примере показаны некоторые концепции параллельного программирования в Ada.

Прагмы [ править ]

Прагма — это директива компилятора, которая передает информацию компилятору, чтобы разрешить определенные операции над скомпилированным выводом. [29] Некоторые прагмы встроены в язык [30], а другие зависят от реализации.

Примерами общего использования прагм компилятора могут быть отключение определенных функций, таких как проверка типа во время выполнения или проверка границ индекса массива, или указание компилятору вставить объектный код вместо вызова функции (как C / C ++ делает со встроенными функциями ).

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector