Идеальный язык программирования — это такая же недостижимая мечта, как и идеальная жизнь. Но стремление к совершенству приводит к появлению вещей, которые делают нашу жизнь лучше. Скептики могут увидеть в этом изобретение очередного велосипеда. Но и это не бывает напрасным: если очередной велосипед не стал лучше прежнего, то сам процесс улучшает изобретателей. Велосипед может быть забыт и выкинут, а вот изобретатели приобретут инженерный опыт.
Программирующая Программа — первый компилятор
Основоположником информатики в СССР, в частности раздела автоматизации программирования, является Алексей Андреевич Ляпунов, первым предложивший рассматривать программу как последовательность чередующихся этапов, на которых выполняется некая обработка данных. Этап Ляпунов предложил назвать оператором, а схемой счета — совокупность операторов и логических условий. Схема и совокупность спецификаций каждого оператора — это программа. Взгляд на программу в таком ключе стал революционным и сразу лег в основу первых трансляторов (компиляторов) или программирующих программ, как их тогда называли.
М. Р. Шура-Бура, А. А. Ляпунов, С. С. Камынин
Первым в мире транслятором языка высокого уровня является ПП (Программирующая Программа), он же ПП-1, успешно испытанный в 1954 году. Транслятор ПП-2 (1955 год, 4 в мире транслятор) уже был оптимизирующим и содержал собственный загрузчик и отладчик, библиотеку стандартных процедур.
Первыми программами, принадлежащими системному программному обеспечению, были трансляторы — ассемблеры и автокоды на Западе, программирующие программы (ПП) у нас.
Сотрудники отдела программирования исследовали реализуемость операторных схем и определили основные типы операторов, соответствующие решаемым задачам: Ai — арифметические операторы, Pi — логические операторы, управляющие счетом, Fi — операторы переадресации, позволяющие переходить к следующему значению индекса.
Первые отечественные трансляторы носили мнемоническое название программирующих программ. В основе входного языка каждой из программирующих программ лежал общий концептуальный базис, фиксирующий типы операторов и общую идею их спецификации. Унификация языков не ставилась как практическая задача.
Типы операторов соответствовали подавляющему большинству решаемых тогда задач, а именно — вычислительным задачам. Выделялись арифметические операторы Аi, ведущие вычисление по формулам, логические операторы Рi, осуществляющие управление счетом, операторы переадресации Fi, позволяющие переходить к следующему значению индекса (и обратные им операторы восстановления), все же неарифметические вычисления объединялись в так называемые нестандартные операторы Hi, для которых спецификацией был их машинный код. Специального подъязыка описания данных, зачатки которого появились в более поздних ФОРТРАНе и Алголе, не существовало.
Программирующая программа ПП-1 являлась одним из первых в мировой практике трансляторов и, по-видимому, имела самый высокий уровень входного языка.
Программирующая программа ПП-2, была создана под руководством М. Р.Шура-Буры в 1955 году для машины Стрела-1, основывалась на ПП-1 как прототипе. В ПП-2 были усовершенствованы алгоритмы трансляции и было уделено заметное внимание оптимизации программ — экономии выражений, оптимальному сочетанию переадресации и восстановления (иначе говоря, наилучшей реализации вычисления индексных выражений), оптимальному отведению памяти для так называемых рабочих ячеек. Это был, по-видимому, первый оптимизирующий транслятор.
Стрела-1. Принцип взаимодействия узлов ЭВМ
ПП для БЭСМ развивала входной язык программирующих программ. Она объединяла схему и спецификацию операторов в одном тексте, был введен первый структурный оператор — оператор цикла (соответствующий современным циклам с параметром).
ПП-2 послужила идейной основой двух проектов — ПП для Стрелы 4 и ПП для Стрелы 7. Первая из них представляла собой зачаток настоящей системы программирования: помимо собственно транслятора она содержала систему сборки модулей и некоторые средства отладки. Транслятор получал такие фрагменты объектной программы, которые потом назовут модулями, а система сборки создавала программу из оттранслированных модулей и библиотечных программ.
В ПП для Стрелы 3 был реализован ряд идей — табличный подход к синтаксическому анализу, оптимальное (по числу рабочих переменных) программирование арифметических выражений. Был изобретен метод хеширования, который применялся к экономии арифметических выражений.
С трансляции начиналось не только системное, но и теоретическое программирование. Именно работы по входным языкам (операторным схемам) и трансляторам (программирующим программам) послужили толчком к созданию первой математической модели программ — схемам Янова.
В конце пятидесятых прошлого столетия развивался и подход к автоматизации программирования с помощью библиотек стандартных программ. Были разработаны — стандартная составляющая программа — ССП ( осуществляла статическую загрузку и связывание стандартных программ из достаточно обширной библиотеки), интерпретирующая система (ИС), ИС-2 уже реализовывала некоторые функции будущих операционных систем, осуществляя динамическое связывание, подкачку и смену используемых подпрограмм, причем все это делалось с небольшими накладными расходами и весьма скромными запросами на память. Высокая эффективность ИС-2 и хорошо продуманный интерфейс с основной программой сделали ее (как и положено операционной системе) неотъемлемой частью комплекта поставки ЭВМ.
Не смотря на все свои достоинства, программирующие программы широкого практического использования не имели:
даже при их наличии почти во всем множестве архитектур, существовавшем в стране, доля программирования непосредственно в машинном языке была преобладающей. Переход к современному стилю программирования на языках программирования высокого уровня был осуществлен благодаря созданию первых алголовских трансляторов. Произошло так, что первая тройка отечественных алголовских трансляторов, созданная для наиболее массовой тогда ЭВМ М-20, различалась по своим потребительским возможностям так, что своей совокупностью они удовлетворяли практически все категории пользователей.
Появление системного программирования поставило задачу создания адекватных языков программирования. Все языки, появившиеся к началу 60 годов — Фортран, Кобол, Алгол-60 и другие, — не учитывали этой области программистской деятельности, и алголовские системы, будучи достаточно большими программными системами, писались еще в машинных кодах вручную. Адекватные языки нужны были не только для трансляторов, но и для всей возникающей области системного программирования: начали появляться и другие языковые процессоры, и первые операционные системы, и информационные системы — все то, что потом назовут базовым программным обеспечением.
Алгол
А. А. Берс, А. Ф. Рар «Становление Новосибирской школы программирования. Мозаика воспоминаний»:
Что на меня в Алголе 68 произвело наибольшее впечатление? Во-первых, это был первый язык, в котором был очень богатый список средств описания типов, и можно очень четко и формально описать структуры с вариантами и скомбинировать с массивами и т.д., и т.п., и все что по этому поводу проделывалось. Во-вторых, там был прекрасный механизм приведений, который позволял достаточно глубоко пользоваться описанными типами для того, чтоб перебрасывать по ним значения. И конечно, сама двухэтажная грамматика. И тут уже у меня возникло желание воспользоваться этим для того, чтобы делать хороший русский перевод.
Вообще в Алголе 68 была великолепно выдержана структура языка: словесные эквиваленты символов, закрывающие скобки для условных конструкций (например: пока глушков в цк в киеве будет процветать кц все ), выбирающие предложения, параллельные фразы, хорошо проведенная борьба с побочными эффектами, хотя в языке они не запрещались.
Как любил говаривать ван Вейнгаарден: «не пишите такие программы» и «ёсли у вас есть язык, то на нем надо уметь выражаться».
Да, еще одна замечательная вещь, которая там была — это выдача значения почти любой конструкцией, что позволяло широко пользоваться суперпозицией при построении выражений. Важно осознать тот факт, что значение, которое выражение выдает — однократно неповторимо и уникально и что оно может использоваться только двумя разными способами. Либо ты его подхватишь суперпозицией, либо должен спрятать как состояние объекта. В первом случае этому значению не надо давать обозначение, тогда его использование как бы от тебя скрыто. Потому что само это значение увидеть нельзя, и оно ничем не названо. С другой стороны, если ты его ничем не подхватишь, то оно исчезнет.
Сейчас в объектных языках всё очень хорошо: вы должны с помощью этого значения привести объект в определенное состояние. Приведя, вы можете из этого состояния вычитывать это значение столько раз, сколько вам надо, и получите, что оно обозначало. То есть вот эта композитная программа очень красиво позволяла писать синтаксические выражения, очень связного характера. И поскольку языки программирования всегда тащили за собой английский жаргон, причем не язык, а именно жаргон… Тут еще одна вещь была, на мой взгляд, существенной — это работа над созданием русских национальных вариантов Алгола 68. Ершов и я, мы стремились к тому, чтобы все можно написать и без латинских букв, чтобы программы можно было бы практически читать вслух, — вещь недоступная для предыдущих языков. А синтаксис вообще удалось перевести как математический стих — все правила сохранили, и мнемонический смысл, и точную форму.
И, в общем, язык получился довольно стройный. Но сложности ему добавляло, на мой взгляд, стандартное вступление. Это был еще более свернуто написанный программный текст с дополнительными надстройками макросного характера.
Единственный отечественный язык программирования, получивший общемировую известность, это язык Рефал. Однако распространённость этого языка мала. Первая версия Рефала была создана в 1966 году Валентином Турчиным в качестве метаязыка для описания семантики других языков. Впоследствии, в результате появления достаточно эффективных реализаций на ЭВМ, он стал находить практическое использование в качестве языка программирования. В настоящее время основными диалектами языка являются Рефал-2 (1970-е), Рефал-5 (1985) и Рефал+ (1990), отличающиеся друг от друга деталями синтаксиса и набором дополнительных средств, расширяющих первоначальный вариант.
Язык программирования Рефал
Рефал — язык манипулирования символьными объектами, такими как текстами, формулами, программами и т.п. Программа на Рефале состоит из функций, которые могут определяться друг через друга — рекурсивно. Отсюда и название: алгоритмический язык рекурсивных функций. Помимо описания семантики алгоритмических языков, он нашел и другие, не менее важные применения. В первую очередь это машинное выполнение громоздких аналитических выкладок в теоретической физике и прикладной математике, интерпретация и компиляция языков программирования, машинное доказательство теорем, моделирование целенаправленного поведения и т.п.
Общим для всех этих применений является то, что мы заставляем машину совершать сложные преобразования над объектами, определенными в некоторых формализованных языках (алгоритмические языки, язык алгебры, язык исчисления предикатов и т.д.).
Рефал — язык бестиповый. В его основе лежит понятие объектного выражения как универсального типа данных. Все аргументы и результаты всех функций являются объектными выражениями.
Объектное выражение определяется таким образом, что операция конкатенации делается неявной, скрытой. Точнее сказать, что конкатенация на уровне значений выражается конкатенацией на уровне имен. Это свойство вытекает из основной цели Рефала как метаязыка для описания различных языковых объектов. Оно придает особую выразительную силу и остальным средствам языка, таким как образцы и результатные выражения.
Образцы — мощное изобразительное средство. Они в сжатой и наглядной форме обеспечивают как запись условий на вид аргумента, так и разбиение аргумента на составные части. Язык образцов Рефала лишен каких-либо «упрощающих» ограничений, свойственных другим языкам, что делает его очень простым для освоения и использования.
Язык определения функций Рефала, основанный на понятиях образца и результатного выражения чрезвычайно прост и компактен. Его минимальная версия получила название Базисный Рефал. Диалект Базисного рефала под названием Рефал-2 был реализован на многих типах отечественных ЭВМ и долгое время играл роль де-факто стандарта языка Рефал.
Язык Рефал-5 содержит Базисный Рефал в качестве подмножества. Расширения языка Рефал-5 качественно меняют стиль программирования.
В настоящее время существует две реализации языка Рефал-5: одна выполнена Д. Турчиным, другая — Н. Кондратьевым и Арк. Климовым. Обе имеют практически один и тот же входной язык, но отличаются рядом особенностей реализации. Вторая известна также под названием Рефал-6, однако следует помнить, что это название не языка, а его реализации.
Был также разработан язык Рефал Плюс, в отличии от Рефал-5 доведенный до концептуальной полноты (расширение рефала средствами обработки неуспехов).
1997 год. Рефал прочно занимает свою нишу, не опасаясь никаких конкурентов. Например, он успешно используется физиками Обнинска, многими математическими центрами в России. Одно из основных применений Рефал – разработка трансляторов с языков программирования, когда сам Рефал используется как метаязык. В ИПМ на нем был очень быстро написан высокоэффективный транслятор Cern Fortran.
Рефал не обошли вниманием и военные. Современная боевая техника нередко требует модификации средств разработки, делая их адекватными растущим возможностям электроники, и Рефал поддерживает создание быстро совершенствующихся узкоспециализированных языков программирования. Одна из интересных областей, в которой применяется Рефал, – искусственный интеллект (ИИ). В ИИ Рефал используется и в качестве конечного средства разработчика, и как инструмент для создания языков представления знаний, ориентированных на конкретные области применения в ИИ. Одним из фундаментальных направлений, позволяющих эффективно использовать мощь Рефал, является анализ естественных языков. С помощью Рефал созданы лингвистические процессоры, экспертные системы.
Язык программирования Алмо
Язык системного программирования (машинно-ориентированный язык), задумывался как язык-посредник при трансляции с различных языков. Для каждой аппаратной платформы достаточно было написать транслятор Алмо — и появлялась возможность работать с множеством языков программирования, которые имели трансляцию в Алмо. Были созданы реализации языка для основных отечественных машин того времени (М-20, БЭСМ-6, Минск 2, Урал 11) и трансляторы с Алгола-60 и ФОРТРАНа в Алмо, причем все трансляторы также были написаны на Алмо и “раскручены” на всех этих машинах. Язык Алмо имел в своей основе некоторую абстрактную машину, отражавшую особенность существовавшего тогда класса машин, и в этом отношении Алмо-подход предвосхищал появившиеся позже Р-код, М-код и прочие подобные подходы. Машинная ориентированность явно прослеживалась в языке — регистровые объекты, постфиксная запись выражений, оперирование с битами машинных слов и т.д.
Система программирования Сигма
Г. Г. Степанов:
… название языка — Сигма — неожиданно очень удачно стало соответствовать сути разработанного языка, которую можно описать как «Символьный Генератор и Макроассемблер».
Всего в истории языка Сигма было три его реализации: на М-20, на БЭСМ-б и на самом языке Сигма. Первая, конечно самая памятная, т.к. это была мол первая работа в области системного программирования (да и вообще первая работа). Вторая была выполнена на лучшей, по моему мнению, отечественной машине БЭСМ-6. Третья опиралась на вторую, была раскручена сама через себя и могла генерировать программы как для БЭСМ-6, так и для СМ-4 и ЕС ЭВМ.
Сигма — СИмвольный Генератор и МАкроассемблер — обладал двумя важными и в то время новыми особенностями. Синтаксически ограничиваемый макросами, ондопускал генеральную линию создания программ — подстановку описанных макросов. Язык содержал средства формального описания конкретной архитектуры: была разработана система параметров, в терминах которой фиксировалось представление языка для конкретной ЭВМ. Таким образом, общая Сигма-программа вместе с описанием архитектуры ЭВМ транслировалась на данную ЭВМ. Параметрами архитектуры были длина слова, представление значений типов в машинном слове и т.п., так и правила заполнения шаблонов машинных команд.
Универсальный машинно-ориентированный язык программирования Эпсилон
Элементарный Преобразователь СИмвоЛьнОй иНформации — считался исключительно простым языком. Переменные в нем не имели типа и не описывались, идентификатор переменной просто обозначал содержимое ячейки, отведенной для этой переменной. Константы в языке могли быть либо натуральными числами, либо восьмеричными числами, либо — наборами двоичных цифр. Выражения были только двуместные; арифметические выражения обращались со значениями операндов, как с представлениями натуральных чисел; были еще поразрядные операции, операции сдвига и операция извлечения адреса данного объекта (позволяющая программисту управлять до некоторой степени распределением памяти). Объектами языка были так называемые списки (упакованные массивы) и слова (умещающиеся в одном машинном слове последовательности элементов разной длины). Программист мог задать двоичную кодировку для символа или множество двоичных кодировок для класса символов. Существовали переходы на метку условные и безусловные а также процедуры, замкнутые и открытые.
Законным оператором языка была машинная команда представленная в восьмеричном виде. Именно в таком виде должны были осуществляться операции ввода-вывода. Используемые программой таблицы хранились как помеченные последовательности машинных команд; совместив в памяти такую последовательность с некоторым описанным списком, программист мог использовать для выбора элемента таблицы механизм выборки элемента списка.
А. Ф. Рар:
Заявленной целью разработчиков языка было предоставить удобный рабочий инструмент системным программистам…
Мы стремились достичь разумного компромисса между такими требованиями, как простота и удобство языковых средств, простота трансляции и возможность получения эффективной программы…
Отладка эта состояла в классической раскрутке ( bootstrapping ): Эпсилон-текст транслятора я пропускал через написанный вручную Эпсилон-транслятор, а получившийся новый транслятор проверял на нормальных Эпсилон-программах. Раскрутка эта дала заодно ответ на… вопрос: «[насколько] программы, полученные путем Эпсилон-трансляции, проигрывают по сравнению с программами, написанными вручную?» Оказалось… всего в 1,35 раза.
Система программирования Бета
Проект Бета был основан на предположении о конвергенции основных алгоритмических языков, как и методов трансляции и оптимизации. Первоначально основными входными языками считались Алгол 68 и ПЛ/1. Язык Паскаль появился на свет одновременно с началом работ над проектом Бета и вскоре был включен в список его входных языков как основной входной язык «пробной реализации» БЕТА-системы.
Центральным звеном проекта Бета был Внутренний язык, который должен был стать единым языком-посредником в БЕТА-системе «наибольшим общим делителем» входных языков и «наименьшим общим кратным» выходных машин. Кроме этой своей роли промежуточного языка, позволяющего уменьшить число путей в схеме m -языковой n -машинной трансляции с m * n до m + n, внутренний язык должен был также явиться средой оптимизирующих преобразований, т.е. он еще должен был быть достаточно богат, чтобы на нем было возможно представить результаты оптимизации; например, экономию совпадающих подвыражений в операторе a [ i, j, k ] := b [ i, j, k ] + c [ i, j, k ].
Одновременно предполагалось опробовать слишком много новшеств: многоязычие на входе, многомашинность на выходе; новые языки (например при начале работ существовали только неполные экспериментальные трансляторы с Алгола 68) и новые методы оптимизации для новых прикладных областей — и всё это в рамках научно-исследовательского института, полупроизводственная работа силами сотрудников, ориентированны на получение научных результатов.
Автокод МВК Эльбрус — Эль-76
Из книги В.М. Пентковского об автокоде «Эльбрус».
В советское время не стеснялись программировать на русском
Изначально этот язык был назван — автокод Эльбрус, затем был переименован в Эль-76. Несмотря на то, что Эль-76 является языком достаточно высокого уровня, есть основание называть его «автокодом». Эльбрус просто не имел языка более низкого уровня, т.е. «ассемблера». Т.е. язык минимального уровня Эльбрус — это Эль-76, остальные языки уже строились над ним. Это — замечательная иллюстрация высокого научного и инженерного уровня отечественных ИТ в то время.
Эль-76 — язык программирования, использующий русскую лексику. Разработан в середине 70-х годов в СССР. Эль-76 предназначен для многомашинных вычислительных комплексов типа «Эльбрус». Объединяет в себе особенности машинного языка, непосредственно управляющего работой устройств ЭВМ, и изобразительные средства языка высокого уровня (во многом аналогично Алголу-68). Эль-76 поддерживает методику структурного программирования, т.е. композиции программы из процедур, линейных последовательностей операторов, циклов, альтернативных сочленений с выбором альтернативы по условию или по номеру альтернативы и параллельно выполняемых ветвей. Язык имеет специальные средства описания поведения программы в особых случаях — т.н. ситуации и структурные переходы. Основной особенностью Эль-76 является возможность хранения в памяти ЭВМ информации о типе переменной величины вместе с ее значением и ее изменения в ходе выполнения программы.
Рапира
Язык программирования Рапира — один из двух входных языков учебной системы программирования, входящей в состав интегрированной программной среды «Школьница». Рапира представляет собой концентрическое семейство языков с последовательно расширяемым набором возможностей. Каждый концентр можно рассматривать как замкнутый язык-оболочку.
Если интересно (и если есть время):
1.1. Рапира является диалоговым языком высокого уровня, предназначенным для обучения программированию и решения на ЭВМ небольших прикладных задач. Язык ориентирован в первую очередь на школьников среднего и старшего возраста (11-17 лет), но может использоваться и другими категориями пользователей.
1.2. Рапира, наряду с Робиком, является входным языком системы программирования «Школьница». Как и для языка Робик, операции надпрограммного уровня в Рапире выполняются системными средствами, не относящимися к языку.
1.3. Первая версия Рапиры была разработана в 1978-1979 годах и использовалась в учебной работе со школьниками и студентами. В ходе разработки системы «Школьница» язык был полностью переработан.
1.4. Рапира представляет собой концентрическое семейство языков с последовательно расширяемым набором возможностей. Каждый концентр можно рассматривать как замкнутый язык-оболочку.
В этом документе приводится краткое описание основных особенностей внешнего концентра канонической (школьной) версии Рапиры.
1.5. В качестве базового этнического языка для Рапиры выбран русский язык. В процессе реализации языка на инструментальной ЭВМ была разработана также английская версия. Ведутся работы над эстонской и грузинской версиями. Возможно создание версий на основе других языков.
2. Лексика и общая структура программы
2.1. Лексическая структура Рапиры почти не отличается от лексики Робика, описанной в документе 3533847.00058-01¤35¤02. В Рапире различаются те же лексические единицы: целые и дробные числа, тексты, слова, специальные символы. Форма этих лексем традиционна. Основные отличия Рапиры от Робика заключаются в следующем:
1. Допускается запись дробных чисел в экспоненциальной форме, например, 156.65E12 означает 156,65x1012.
2. Унарные + и — рассматриваются не как составные части лексемы, а как операции.
3. В Рапире используется в несколько раз больше специальных символов, в том числе — составных, чем в Робике
2.2. Общая структура программы и порядок исполнения отдельных предписаний на Робике и Рапире имеют много общего. Программа на Рапире — это последовательность директив, процедурных блоков и описаний имен. Порядок работы с директивами и процедурными блоками такой же, как и в Робике.
2.3. В отличие от Робика, допускается произвольное расположение предписаний по строкам (можно записывать несколько предписаний на одной строке и распределять одно предписание на несколько строк). Пробелы и переводы строк могут использоваться в любых местах программы, но не внутри лексем (внутри текстов можно использовать синтаксически значимые пробелы). Между двумя лексемами, не различающимися контекстно, обязателен по крайней мере один пробел или перевод строки.
Комментарий в Рапире заключается в специальные скобки. Комментарий синтаксически эквивалентен пробелу и может быть вставлен между любыми двумя лексемами.
3. Имена и выражения
3.1. Рапира является частично-типизированным языком. Каждое имя, используемое в программе или в процедурном блоке, может быть описано с указанием типа. Тип имени определяет виды значений, которые могут быть присвоены этому имени. Если имя не описано или описано без указания типа, оно по умолчанию относится к универсальному типу. Такому имени можно присваивать значения любых видов.
В диалоговой версии Рапиры описание имен используются в качестве отладочного средства. Предполагается, что в пакетной версии описания должны быть обязательными.
Область действия описаний охватывает главную программу, тот процедурный блок, в котором имя описано, и все вызываемые из него процедуры и функции, в которых не описаны совпадающие с ним по написанию локальные имена и формальные параметры. Таким образом, описания одновременно определяют локализацию имен.
Описания имен и указания типов в Рапире не обязательны, поэтому для оперативного решения небольших задач ее можно использовать в качестве бестипового языка.
3.2. В Рапире различаются следующие виды значений имен:
- целые числа
- дробные числа
- тексты
- множества
- кортежи
- процедуры
- функции
- файлы
- модули
- рисунки
- кадры
- таблицы
- пустое значение
3.3. Пустое значение имеют все имена отличные от стандартных, которым в данной программе не было присвоено значений. В системе предусмотрено защищенное стандартное имя ПУСТО, которое всегда имеет пустое значение.
3.4. Над любыми парами имен в Рапире определена операция сравнения ТИПА, результат которой — ИСТИНА, если объявленные типы имен совпадают и ЛОЖЬ в противном случае.
Над любыми парами значений (выражений) определена операция сравнения ВИДА, результат которой — ИСТИНА, если виды значений этих выражений совпадают.
3.5. Над числами в Рапире определены следующие операции:
унарные арифметические: + и -;
бинарные арифметические: +, -, *, /, // (деление нацело), ** (возведение в степень);
операции сравнения: =, /=, <=, >=, <, >
Все операции имеют обычный математический смысл; допускается сравнение целых и дробных чисел на равенство: условие 35 = 35.0 считается истинным.
3.6. Над текстами определены следующие операции:
+ — конкатенация (слияние текстов), например,
«вело» + «сипед» = «велосипед»;
ИЗ — проверка принадлежности символа тексту, например, условие
«м» ИЗ «микроскоп» истинно;
[] — выборка (взятие символа из текста по индексу), например,
«велосипед»[5] = «с»;
[:] — вырезка (выделение участка текста по начальному и конечному индексам), например,
«крокодил»[2:4] = «рок»;
# — мощность (унарная операция, определяющая число символов в тексте), например,
#«самолет» = 7.
=, /= — сравнение текстов.
В операциях вырезки и выборки в качестве индексов могут использоваться любые выражения, значениями которых являются натуральные числа, не превосходящие мощности соответствующего текста. Левый индекс в вырезке не должен превосходить правого.
Эти две операции могут встречаться как слева, так и справа от знака присваивания, позволяя в последнем случае редактировать тексты. Длина текста при редактировании не может изменяться: подставляемый текст должен иметь такую же длину, как заменяемый участок. Например, после присваиваний:
«крокодил» -> Зверь; «ош» -> Зверь[2:3];
имя Зверь получит значение «кошкодил». Присваивания
«кош» -> Зверь[2:3]; «а» -> Зверь[2:3];
являются недопустимыми из-за несовпадения длин заменяющего и заменяемого участков текста.
3.7. Составные структуры данных в диалоговой версии Рапиры представлены множествами, записями и кортежами. Каждая из этих структур может содержать произвольное число элементов. Элементом структуры может быть любой объект языка, независимо от вида.
В пакетной версии допускаются типизированные варианты этих конструкций: все элементы множеств и кортежей должны иметь один и тот же тип, а в записях каждый элемент должен иметь определенный тип.
Множество рассматривается как неупорядоченная совокупность попарно различных элементов. Доступ к отдельному элементу множества невозможен. Разрешены только проверка принадлежности элемента множеству, операции над всем множеством и последовательный перебор его элементов при помощи специальной формы цикла.
Запись рассматривается как неупорядоченная совокупность именованных полей. Доступ к элементу записи возможен только через название поля.
Кортеж рассматривается как упорядоченная совокупность произвольных элементов. Доступ к элементу кортежа возможен по индексу.
Эта операция позволяет построить новую структуру из произвольного количества элементов, представленных значениями выражений. Для формирования нужной структуры необходимо перечислить через запятую все выражения, значения которых должны стать элементами структуры, и заключить их в специальные скобки, форма которых определяется видом структуры. Простые угловые скобки < > определяют формирование кортежа, фигурные скобки { } или (* *) — формирование множества, специальные скобки <$ $> — формирование записи. Кроме того, при формировании записи перед каждый элементом должно быть указано название поля, отделяемое от элементов двоеточием.
Например, выражение < 2, «поиск», 5.3, A > определяет формирование кортежа из четырех элементов: числа 2, текста «поиск», числа 5.3 и значения имени A. Выражение { 2, «слово», 2, 2 } определяет формирование множества из двух элементов: числа 2 и текста «слово». Выражение <$ Имя:«Сергей», Фамилия:«Иванов», Год_рождения:1950 $> определяет формирование записи из трех полей: Имя, Фамилия и Год_рождения.
3.9. Для всех структур определены следующие операции:
ИЗ — проверка принадлежности;
# — определение мощности (числа элементов);
= и /= — сравнение на равенство и неравенство.
Необходимо отметить, что две записи с различной структурой полей считаются принадлежащими к различным видам.
Два множества считаются равными, если они состоят из одних и тех же элементов, независимо от порядка их записи, например,
(* 1, 5, 5, <1, 2>, 1, *) = (* 5, <1, 2>, 1, *)
Два кортежа считаются равными, если они состоят из одних и тех же элементов, расположенных в том же порядке, например:
<1, 5, <1, 2» = <1, 2+3, <1, 1+1»
<1,2,3> /= <3,2,1>
Две записи с одинаковой структурой полей считаются равными, если одноименные поля имеют одинаковые значения, например:
<$ Имя:«Сергей», Фамилия:«Иванов» $> =
<$ Фамилия:«Иванов», Имя:«Сергей» $>
<$ Номер:5, Скорость:10 $> /= <$ Тип:5, Высота:10 $>
3.10. Кроме операций, перечисленных в п.п.3.4, 3.6 и 3.9, над множествами определены операции объединения (+), пересечения (*) и разности (-), имеющие обычный математический смысл.
Аналогично, над кортежами определены такие же операции, как и над текстами, при этом для вложенных кортежей допускается многократная индексация; выражения А[2][3] и А[2, 3] являются семантически эквивалентными и определяют третий элемент кортежа, являющегося вторым элементом кортежа А.
Над записями, кроме общих операций, определена только выборка элемента по названию поля. Например, выражение Х.Адрес определяет значения поля Адрес в записи, являющейся значением имени Х.
Как и для кортежей, выборка может использоваться с обеих сторон от знака присваивания. Для вложенных записей определена многократная выборка, например: Х.Адрес.Квартира.
3.11. Над процедурами и функциями как над значениями имен кроме общих операций, перечисленных в п.5.3.4, определена операция вызова, синтаксис которой описывается диаграммой 5.
3.12. Для других видов значений операции в Рапире не определены. Действия над такими значениями осуществляются при помощи специальных предписаний или процедур.
Сведения о работе с файлами и модулями в Рапире приведены в разделе 7. Работа с рисунками и кадрами осуществляется средствами графической системы «Шпага», входящей в состав системы «Школьница». Таблицы как вид значений предусмотрены только для экстравертивной версии Рапиры и здесь рассматриваться не будут. Семантика пустого значения такая же, как в языке Робик.
3.13. В Рапире, как и в Робике, предусмотрена защита имен. Частичная или полная защита может быть установлена и снята пользователем при помощи соответствующих разновидностей предписаний ВКЛЮЧИТЬ и ВЫКЛЮЧИТЬ, синтаксис которых описан диаграммой 6. Некоторые имена, например, имена процедур и функций во время их исполнения и имя переменной цикла внутри тела этого цикла, имеют абсолютную защиту, которая не может быть снята средствами, доступными пользователю.
3.14. Синтаксис выражения в Рапире описывается диаграммой 7. Как следует из диаграммы, выражение — это последовательность соединенных знаками бинарных операций констант, формирователей, простых имен и выражений в скобках, перед каждым из которых может стоять один или несколько знаков унарных операций, а после — произвольная последовательность операций выборки, вырезки и вызова.
Таким образом, структура выражения в целом традиционна для языков высокого уровня.
3.15. В Рапире приняты следующие приоритеты операций:
1. Выражения в скобках и составляющие выражения в формирователях;
2. Формирование структур;
3. Вычисление фактических параметров функций и индексных выражений;
4. Выборки, вырезки, вызовы функций;
5. Унарные операции;
6. Возведение в степень;
7. Операции *, /, // (умножение, пересечение, деление, деление нацело);
8. Бинарные + и — (сложение, конкатенация, объединение, разность множеств).
Описанный порядок в целом соответствует принятому в математике, за тем исключением, что пересечение множеств (*) получило в Рапире более высокий приоритет чем объединение (+).
3.16. Синтаксис условия в Рапире описывается диаграммой 8. Термин «условие» соответствует термину «логическое выражение», используемому в других языках. В Рапире логические значения не могут присваиваться именам, поэтому логические выражения допускаются только в определенных контекстах, например, в цикле ПОКА и в предписаниях ветвления.
Такое выделение логических выражений введено в язык из методических соображений, чтобы подчеркнуть их семантические отличия от выражений других типов.
Операции сравнения и логические связки, используемые в условиях, имеют традиционную семантику.
Приоритеты операций в условиях:
1. Условия в скобках и выражения, входящие в состав условий;
2. Операции сравнения и проверки принадлежности;
3. НЕ;
4. И;
5. ИЛИ.
4. Присваивание, ввод и вывод
4.1. Синтаксис предписаний присваивания, ввода и вывода в языке Рапира описывается диаграммами 9-11. Семантика этих предписаний почти не отличается от семантики аналогичных предписаний в языке Робик. Поэтому здесь перечисляются только основные различия между указанными предписаниями в этих языках.
4.2. При сравнении синтаксиса предписаний необходимо учитывать, что несмотря на внешнее сходство структура выражений в Рапире гораздо богаче, чем в Робике, поэтому предписания присваивания и вывода в Рапире позволяют выполнять разнообразные операции над данными различных видов, что в Робике может быть сделано только с применением специализированных исполнителей.
4.3. Предписание вывода в Рапире позволяет выводить не только простые (числа, тексты), но и составные значения (множества, кортежи, записи). Форма вывода совпадает с видом соответствующих формирователей в языке. Аналогично, в режиме ввода данных могут быть введены составные значения.
При выводе текстов и при их вводе в режиме ВВОД ТЕКСТА окаймляющие кавычки не указываются. Тексты, вводимые в составе структуры и вводимые в режиме ВВОД ДАННЫХ, окаймляются кавычками.
Если режим ввода не указан, по умолчанию предполагается ВВОД ТЕКСТА.
4.4. Вывод любых значений может производиться с указанием формата: после выводимого выражения через двоеточие указывается число отведенных позиций. Для дробных чисел возможно задание двойного формата: указывается еще и число знаков в дробной части числа. Если значение не умещается в отведенном числе позиций, то оно выводится в свободном формате.
4.5. В соответствии с концентрической структурой Рапиры переключение ввода и вывода на другие устройства может быть выполнено различными способами. Наряду с разовым переключением, осуществляемым так же, как в Робике, при помощи указания нужного режима в заголовке предписания (например: ВЫВОД НА БУМАГУ: А, В;), в Рапире возможно переключение всей выводимой или вводимой информации на одно или несколько устройств или файлов. Для этого применяется соответствующая форма предписаний ВКЛЮЧИТЬ и ВЫКЛЮЧИТЬ.
Например: ВКЛЮЧИТЬ ВЫВОД НА БУМАГУ;
5. Управляющие конструкции Рапиры
5.1. К числу управляющих конструкций Рапиры относятся три разновидности ветвления: ЕСЛИ, ВЫБОР-ИЗ, четыре разновидности цикла: ПОКА, ПОВТОР, ДЛЯ-ИЗ и ДЛЯ-ОТ, средства описания и вызова функций и процедур и предписание ВЫХОД для выхода из процедур.
В этом параграфе рассматриваются предписания ветвления и цикла, работа с процедурами и функциями обсуждается в следующем параграфе.
Синтаксис перечисленных конструкций описывается диаграммами 5, 12-15. Как видно на диаграммах, все эти предписания имеют рамочную структуру, что позволяет указывать в теле цикла и в альтернативах ветвления произвольное число предписаний без применения искусственных средств для их объединения.
5.2. Семантика простого ветвления (условного предписания) ЕСЛИ-ТО-ИНАЧЕ вполне традиционна.
Пример:
ЕСЛИ А > В ТО
5 -> А; ВЫВОД: В;
ИНАЧЕ
5 -> В; ВЫВОД: А;
ВСЕ;
5.3. Как видно на диаграмме 12, предписание множественного ветвления (ВЫБОР-ИЗ) состоит из произвольного числа альтернатив, каждая из которых представлена условием, за которым следует одно или несколько предписаний, разделенных точкой с запятой. Условие отделяется от предписаний двоеточием, альтернативы разделяются знаком |. В конце может стоять конструкция ИНАЧЕ.
Предписание исполняется так. Последовательно, в порядке записи альтернатив, проверяются указанные в них условия. Если одно из них оказалось истинным, выполняются предписания от соответствующего двоеточия до ближайшего разделителя альтернатив (|), слова ИНАЧЕ или ВСЕ. После этого исполнение предписания заканчивается. Если ни одно условие не было истинным, выполняются предписания между ИНАЧЕ и ВСЕ (если слово ИНАЧЕ использовано). Таким образом, в любом случае выполняется не более одной из предусмотренных альтернатив.
Пример:
ВЫБОР ИЗ
Ветер <= 3: ВЫВОД: «слабо» |
Ветер <= 7: ВЫВОД: «умеренно» |
Ветер <= 70: ВЫВОД: «Тревога !»
ИНАЧЕ ВЫВОД: «Неверно задана скорость»
ВСЕ;
5.4. Вторая разновидность предписания ВЫБОР исполняется в таком же порядке, но проверяемое условие имеет вид: b0 = ba, где
b0 — значение переключательного выражения, записанного между словами ВЫБОР и ИЗ,
ba — выражение, записанное в альтернативе (перед двоеточием). Таких выражений может быть несколько (через запятую).
Значение переключательного выражения вычисляется один раз в начале исполнения предписания. В остальном семантика этого предписания соответствует п.5.3.
Пример:
ВЫБОР Оценка ИЗ
5: ВЫВОД: «отлично» |
4: ВЫВОД: «хорошо» |
3: ВЫВОД: «средне» |
1,2: ВЫВОД: «плохо» |
ИНАЧЕ ВЫВОД: «ошибка»
ВСЕ;
5.5. Цикл ПОКА (диаграмма 13) имеет традиционную семантику: вначале проверяется условие, указанное в заголовке цикла. Если оно истинно, выполняются все предписания от знака :: (читается «повторять») до слова ВСЕ (тело цикла). Затем вновь проверяется условие и т.д. Если при очередной проверке условие оказалось ложным, исполнение предписания завершается. Если оно было ложным при первой же проверке, то тело цикла не исполняется ни разу.
Пример:
1 -> X;
ПОКА X<10 :: ВЫВОД: 2**X; X+1->X ВСЕ;
5.6. Цикл ПОВТОР позволяет выполнить некоторый набор предписаний заданное число раз. Он выполняется следующим образом. Вначале вычисляется значение выражения, указанного в заголовке цикла. Оно должно быть неотрицательным целым числом, иначе выдается сообщение об ошибке. Затем тело цикла исполняется указанное число раз.
Пример:
1 -> X;
ПОВТОР 10 РАЗ :: ВЫВОД: 2**X; X+1->X ВСЕ;
5.7. Цикл ДЛЯ-ОТ соответствует традиционному для большинства языков циклу типа прогрессии. Имя, указанное после слова ДЛЯ, является переменной цикла, выражение после слова ОТ определяет начальное значение, выражение после слова ДО — конечное значение, после слова ШАГ указывается шаг приращения. Если шаг не указан, он принимается равным единице. Значения всех трех выражений должны быть числами (целыми или дробными). Семантика цикла традиционна. Переменная цикла в теле цикла имеет абсолютную защиту. После окончания цикла она имеет пустое значение.
Пример:
ДЛЯ X ОТ 1 ДО 10 :: ВЫВОД: 2**X ВСЕ;
5.8. Цикл ДЛЯ-ИЗ предназначен для обработки текстов и составных структур, а также файлов соответствующих видов. При исполнении этого предписания переменная цикла поочередно принимает значения каждого элемента соответствующей структуры или файла (или каждого символа текста), после чего исполняется тело цикла. Как и в цикле ДЛЯ-ОТ переменная цикла в теле этого цикла имеет абсолютную защиту, а после его завершения получает пустое значение. Выражение, указанное в заголовке цикла после слова ИЗ, вычисляется один раз перед началом работы цикла.
Пример — подсчет количества букв «А» в тексте с именем Книга:
0 -> Сч;
ДЛЯ Буква ИЗ Книга :: ЕСЛИ Буква=«А» ТО Сч+1->Сч ВСЕ ВСЕ;
ВЫВОД: «В тексте Книга », Сч, " букв <А>";
6. Процедуры и функции
6.1. Синтаксическая структура, а также порядок описания и вызова функций и процедур в Рапире и Робике очень близки. Поэтому в этом параграфе перечисляются только отличия процедурного аппарата Рапиры от аналогичного аппарата Робика.
6.2. Как и в Робике, процедурный блок в Рапире является основной единицей локализации имен и хранения программного текста. В дополнение к этому он приобретает свойства основной единицы области действия описаний. Как видно на диаграммах 14-15, при описании формальных параметров и локальных имен в Рапире, в отличие от Робика можно указывать тип.
6.3. В заголовках процедур можно указывать способ передачи каждого из параметров. В Рапире используется три разновидности параметров, различающиеся по способу передачи: входные, выходные и возвратные. Эти способы обозначаются символами =>, <= и <=> соответственно. Если формальный параметр описан как входной, то соответствующий фактический параметр может быть любым выражением. Фактические параметры, соответствующие двум другим разновидностям формальных, могут быть только именами.
Входные параметры передаются по значению: в момент вызова процедуры значение фактического параметра вычисляется и присваивается соответствующему формальному, на который после этого устанавливается полная защита. Для функций в Рапире, а также для всех видов процедурных блоков в Робике этот способ является единственно возможным.
Выходные параметры обрабатываются следующим образом. При вызове процедуры такой формальный параметр получает значение ПУСТО. После завершения работы процедуры значение формального параметра присваивается соответствующему фактическому.
Возвратный параметр сочетает свойства входного и выходного: при вызове значение фактического параметра присваивается формальному, а после завершения работы процедуры — наоборот.
6.4. Исполнение функции или процедуры в языке Рапира может быть приостановлено при помощи предписания СТОП (с выходом в специальный режим диалога) или прервано при помощи предписания ВЫХОД.
В режиме приостановки процедуры пользователь может выполнить любое предписание Рапиры, причем все имена сохраняют смысл и значение, которое они имели в момент приостановки. После этого выполнение процедуры может быть продолжено при помощи директивы ПУСК или прекращено при помощи предписания ВЫХОД, использованного в качестве директивы.
6.5. Вызов функции и процедуры в Рапире рассматривается как операция над процедурным значением. Поэтому вызываемая процедура может быть вычислена как значение некоторого выражения непосредственно перед вызовом. Например, предписание
<A, B, C>[X](2, 3);
позволяет вызвать одну из трех процедур A, B и C, в зависимости от значения имени X, которое должно быть целым числом от 1 до 3. Каждая из процедур должна быть описана с двумя входными параметрами.
6.6. Как в Робике, так и в Рапире, допускаются рекурсивные вызовы функций и процедур. В обоих языках описание и редактирование процедур осуществляется при помощи одних и тех же системных средств.
7. Файлы и модули
7.1. Работа системы «Школьница» протекает в операционной среде, основную часть которой составляет система файлов, хранящихся в долговременном запоминающем устройстве с произвольным доступом.
С точки зрения пользователя, файл — это объект языка, значение которого хранится в ДЗУ и сохраняется при выключении или перевызове системы. Каждому виду значений, используемому в Рапире, соответствует своя разновидность файлов с таким же названием. Кроме того, в Рапире предусмотрены виды файлов, не имеющие прямых аналогов среди «внутренних» объектов языка: двоичные файлы и специальные файлы других входных языков системы «Школьница», к которым возможен доступ из Рапиры.
7.2. В соответствии с концентрической структурой языка Рапира, работа с файлами может осуществляться несколькими различными способами, последовательно вводимыми на различных концентрических уровнях языка.
1. Всякий объект языка, включая процедуры, может быть целиком скопирован из оперативной памяти во внешнюю или наоборот с помощью предписаний ВЫВОД В ДВУ и ВВОД ИЗ ДВУ (диаграммы 10-11).
2. Символьный или графический ввод и вывод может быть переключен на определенный файл при помощи предписаний ВКЛЮЧИТЬ ВЫВОД В ФАЙЛ и ВКЛЮЧИТЬ ВВОД ИЗ ФАЙЛА (диаграмма 6). Однократный обмен с файлом может быть организован с помощью предписаний ВВОД ИЗ ФАЙЛА и ВЫВОД В ФАЙЛ (диаграммы 10-11).
3. Последовательная поэлементная обработка файлов, соответствующих структурным видам значений Рапиры, может быть организована с помощью предписаний ДЛЯ-ИЗ ФАЙЛА (диаграмма 13). В этом случае с точки зрения пользователя файл загружается в ОЗУ и обрабатывается поэлементно.
4. Организация традиционных операций с текстовыми файлами (открытие и закрытие, настройка на позицию, возврат к началу и т.д.) осуществляется при помощи специальных предписаний и псевдо-процедур.
5. Управление файловой системой может осуществляться в процессе диалога с текстовым редактором системы «Школьница», используемым, в частности, для описания и редактирования процедур и функций Рапира. При помощи этого же редактора могут создаваться и редактироваться текстовые файлы.
6. Просмотр каталога файлов может быть выполнен и вне редактора, при помощи соответствующей системной директивы.
7.3. Файлы системы «Школьница» объединены в модули. Модуль — это совокупность файлов различных видов, в том числе — описаний функций и процедур, которые имеют общий набор глобальных переменных.
Создание модуля осуществляется системными средствами, не определяемыми описанием языка Рапира. При этом среди глобальных переменных пакета могут быть описаны закрытые переменные, недоступные пользователю, что позволяет использовать модули для организации расслоенной структуры больших программ.
8. Некоторые отладочные средства языка Рапира
8.1. Характерной чертой современных интровертивных языков является наличие большого количества отладочных средств, предназначенных для диалогового использования. Умение пользоваться такими средствами необходимо формировать на этапе обучения программированию, поэтому в Рапире предусмотрена широкая гамма отладочных возможностей и конструкций. В этом параграфе перечисляются важнейшие из них.
8.2. В процессе диалоговой работы может быть включена трассировка вызовов процедур и трассировка присваиваний (прокрутка). Включение и выключение этих механизмов осуществляется при помощи соответствующей разновидности предписаний ВКЛЮЧИТЬ и ВЫКЛЮЧИТЬ (диаграмма 6).
8.3. В языке предусмотрена возможность организовать проверку утверждений о программе, записанных в виде условий на языке Рапира. Такая проверка осуществляется с помощью предписания КОНТРОЛЬ, синтаксис которого описывается диаграммой 15. Если при исполнении этого предписания условие оказывается ложным, формируется выход по ошибке.
8.4. Наряду с контрольными точками в Рапире можно описать набор условий — инвариантов, проверка которых будет выполняться при каждом присваивании. Включение нового инварианта осуществляется по предписанию ВКЛЮЧИТЬ КОНТРОЛЬ, а выключение — по предписанию ВЫКЛЮЧИТЬ КОНТРОЛЬ. Если при некотором присваивании хотя бы один инвариант оказался ложным, формируется выход по ошибке.
8.5. Обработка ошибок и прерываний в Рапире является программируемой. При возникновении ошибки или прерывания система формирует обращение к стандартной функции, которая осуществляет обработку исключительной ситуации. Эта функция доступна пользователю, что позволяет ему описать на Рапире свою функцию для обработки исключительных ситуаций.
8.6. В число отладочных средств входят и некоторые конструкции и механизмы Рапиры, описанные в предыдущих разделах, в частности:
1. Режим приостановки процедур;
2. Контроль типов имен (для диалоговой версии);
3. Защита имен по записи.
8.7. Отладочные средства, перечисленные в пунктах 8.2-8.4, а также проверка типов имен функционируют только в отладочном режиме, включаемом при помощи предписания ВКЛЮЧИТЬ ОТЛАДКУ
Язык Ада
Четырнадцатая линия парижского метрополитена. Поезд, в котором нет кабины машиниста. Движение поездов на этой линии полностью управляется Ада-программой. ТАНТК им. Г. М. Бериева — самолетов-амфибия с бортовым программным обеспечением на базе языка Ада.
Ада предоставляет высокоуровневые средства программирования асинхронных процессов и является единственным языком, который без всяких оговорок можно назвать модульным. Применяется для разработки небольших и средних программ с тем же успехом, как и современные клоны Си, Паскаля, Бейсика и Java.
Язык этот назвали в честь Августы Ады Лавлейс – женщины, которая считается первым программистом на Земле.
Ада – мертвый язык, на нем сейчас никто не программирует. В действительности, Ада уверенно занимает нишу больших встроенных систем с повышенными требованиями к надежности. По сравнению с «коробочными» продуктами для Windows, такие системы не так заметны, поскольку либо существуют в одном экземпляре (какой смысл тиражировать программу, управляющую движением поездов метро), или распространяются как часть системы, в которую они встроены (бортовое программное обеспечение).
Ада – язык, предназначенный исключительно для военных применений. Ада действительно была разработана при участии Министерства обороны США, однако отсутствуют какие-либо технические, административные или иные причины, препятствующие использованию Ады для разработки гражданских систем. Количество «гражданских» проектов, основанных на этом языке, сегодня сопоставимо с количеством «военных» проектов.
Ада – слишком большой и сложный язык, для того чтобы использовать его в небольшом проекте. Объем и сложность всех современных индустриальных языков практически одинаковы, и чтобы убедиться в этом, достаточно просто сравнить объем их описаний. Этот миф восходит к началу 80-х годов, когда Аду сопоставляли с Паскалем, Фортраном 77 или Бейсиком.
Программистов, знающих Аду, мало, изучение языка с нуля требует чрезмерных усилий и времени. На самом же деле, настоящую трудность представляет отыскание специалистов, понимающих специфику встроенных систем и способных создавать качественные программы для них. Так, например, компания BAE, один из активных пользователей языка Ада, не требует от кандидатов знания этого языка; вместо этого ищутся люди, знакомые со встроенными системами и процессами создания программного обеспечения индустриального качества. После найма таких людей требуется всего две недели для обучения их языку Ада.
Наш личный опыт показывает, что программистам, знакомым с той или иной разновидностью Паскаля, требуется всего несколько дней, чтобы начать разрабатывать несложные программы на Аде.
Существующие Ада-технологии неэффективны; и трансляторы, и порождаемый ими код, отличаются низкой производительностью. Этот миф также восходит к первой половине 80-х годов, когда появились первые реализации Ады, фактически всего лишь доказывавшие «теорему существования Ада-транслятора, соответствующего стандарту». Достаточно провести ряд несложных экспериментов, запрограммировав некоторую модельную задачку на Аде, Паскале и Си/Си++, и сравнив (при сопоставимых параметрах компиляторов) затем скорость компиляции, объем порождаемого кода и скорость его выполнения, чтобы убедиться, что какой-либо специфической неэффективности, свойственной Аде, просто не существует. Можно также отметить, что система программирования GNAT при объеме исходных текстов более 40 Мбайт, на 90% реализована на Аде, и построение ее из исходных текстов (в его ходе она трижды сама себя компилирует) на современном ПК занимает не более получаса.
Существующие реализации Ады крайне дороги. Это верно, однако следует иметь в виду, что существует публично доступная версия системы программирования GNAT, которая бесплатно и на совершенно законных основаниях может быть взята из программного репозитория Нью-йоркского университета вместе с исходными текстами
История создания языков программирования в нашей стране не исчерпывается перечисленным.Много интересных разработок на сегодняшний день можно считать «мёртвыми». Эти языки уходили вместе с техникой, в которой они «жили».
Вот перечень трансляторов сделанных в СССР (видимо неполный):
- Ada
- Algol-60
- Algol-68
- C
- CLU
- Forth
- Fortran (для Эльбрусов сделали 2 компилятора)
- Lisp
- Modula-2
- Pascal
- PL/I
- SETL
- Simula-67
- Snobol-4
Автор: ua-hosting.company