Язык для обучения и язык для работы

Традиционно изучение программирования начинается с простого, регулярно построенного языка, такого как Паскаль. В результате образуется разрыв между сферами образования и промышленности: языки, ориентированные на обучение, практически не используются при создании реальных программ, и, наоборот, средства разработки индустриальных систем явно непригодны для целей обучения. Поэтому, чтобы приступить к практической работе, начинающий программист, как правило, должен перейти с «учебного» языка на «промышленный». Облегчить этот переход призван разрабатываемый компанией «МедиаЛингва:Компиляторы» комплекс программных средств, учебных материалов и методик, направленных на поддержку освоения языка Си++. Рабочее название комплекса — С11; к настоящему времени уже реализован компилятор Си++, и компания начала его распространение (см. «Мир ПК», № 3/99, с. 125. — Прим. ред.).

Недостатки Си++ общеизвестны, но все же в мировом масштабе это практически единственный инструмент, адекватный современным задачам проектирования, разработки и сопровождения больших и сложных программных комплексов (рядом с ним можно поставить только язык Ада 95, популярность которого значительно меньше). Системы, реализованные на Си++, будут работать по крайней мере до середины будущего столетия, а значит, сохранится и необходимость в его изучении.

Какой Си++ нам нужен

В целом С11 — это традиционная «система программирования на Си++»: компилятор, библиотеки, среда разроботки с редактором, отладчиком, диспетчером проектов и т. д.

То, что система является учебной, не означает, что она «ненастоящая»: компилятор полностью реализует принятый в сентябре 1998 г. стандарт ISO/IEC 14882. В действительности, как мы считаем, ни на каком ограниченном подмножестве Си++ полноценное обучение ему невозможно: без шаблонов вы не познакомите ученика с парадигмой обобщенного программирования (кроме того, на них основаны многие библиотечные функции), изъятие исключительных ситуаций сделает непонятными принципы безопасного программирования и т. д.

А вот схема выполнения программ в C11 отличается от традиционной. Компилятор в соответствии со стандартом производит полный комплекс семантических проверок, но генерирует не объектный код, а промежуточное представление (ПП), содержащее всю информацию об исходной программе. Оно затем интерпретируется с помощью специального компонента, который можно назвать виртуальной машиной Си++. Это сделано не для простоты (генератор кода для Си++ не сложнее виртуальной машины), а для того, чтобы обеспечить необходимый начинающему программисту диагностический сервис. Режим интерпретации позволяет выполнять такие динамические проверки, которые крайне затруднительны или вообще невозможны при выполнении сгенерированного объектного кода.

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

В состав комплекса планируется включить ряд «учебных» прикладных библиотек, помогающих освоить объектно-ориентированный подход и приобрести навыки работы с библиотеками. Библиотека, обеспечивающая графический интерфейс пользователя, сыграет роль своеобразного «переходника» между API операционной системы Windows и программой: без него ученикам пришлось бы одновременно с языком осваивать еще и системные API, которые очень непросты.

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

Почему нужно переводить

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

Замечу, что служебные слова на русской основе поддерживались в первых отечественных компиляторах Алгола-60 и Фортрана. Отечественные реализации Алгола-68 (их было по крайней мере две) также включали русскоязычные версии служебных слов, что, между прочим, допускал и стандарт этого языка. В свое время осуществлялся (правда, к сожалению, остался незавершенным) широкомасштабный проект по созданию семейства языков, основанных на Аде, — опять-таки полностью локализованных. Наконец, в Новосибирске был реализован компилятор PL/I для «Эльбрусов» с русскими версиями служебных слов. На русской основе часто создавались и создаются разного рода специализированные языки, такие как встроенный язык пакета «1С:Предприятие».

Взгляните на пример: фрагмент программы выглядит пусть и непривычно, но вполне наглядно и «разумно». Если же использовать кириллические идентификаторы (которые, как уже говорилось, мы должны были разрешить, поскольку таково требование стандарта) в сочетании с английскими служебными словами, образуется довольно неприятная смесь «французского с нижегородским». Так что, сказав «а», естественно сказать и «б».

Фрагмент программы на С++ с русскими ключевыми словами

   шаблон<цел Размер, тип Тип>
   класс СТЕК   {
       Тип* Массив;
       цел Вершина;
   всем:
       // Конструктор и деструктор
       СТЕК () : Вершина (0), Массив  (создать Тип [ Размер ] )  {  }
      ~СТЕК ()  { удалить  [ ]  Массив; }
      

       //  Операции над стеком   пуст в_стек  (Тип& элем )  { Массив [Вершина ++]=элем;  }      Тип& из_стека ( пуст )  { возврат Массив [ - - Вершина ] ; }   лог стек_пуст  (  )  { возврат Вершина==0 ;  }   .   .   . }  ;

Как нужно переводить

С предлагаемым для системы С11 вариантом перевода служебных слов Си++ можно ознакомиться на Web-странице www.medialingua.ru/products /tecnolo/cfront/keywords.htm. Насколько он удачен (и насколько удачна идея в целом), покажет время; мы с благодарностью примем любые замечания.

Перечислим основные принципы, которых мы придерживались при переводе.

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

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

Об авторе

Евгений Зуев — технический директор ЗАО «МедиаЛингва:Компиляторы» (www.medialingua.ru). E-mail: info@mlc.ru