Это старая версия документа!
Тезис пионера советской информатики академика А.П. Ершова “Программирование — вторая грамотность” не потерял своей актуальности и в наши дни. Более того, быстрое развитие высоких технологий в мире и в России увеличивает спрос на ИТ-специалистов высшей квалификации.
Однако в школьной информатике сегодня наблюдается определенный отход от направления, заданного А.П. Ершовым, подмена программирования курсом ИКТ. А там, где программирование все же преподается, нередко используются либо безнадежно устаревшие языки и среды, либо неимоверно тяжеловесные коммерческие системы.
Автор семейства языков профессор Н.Вирт говорит: “Как профессионалы в информатике, мы обязаны поднять свои голоса против традиции, приравнявшей компьютерную грамотность к знанию темных деталей языка программирования, используемого в индустрии.
Конечной целью образования должно быть искусство конструктивного мышления. Именно в таком контексте становится важным наличие хорошо спроектированного языка программирования …хороший дизайн должен быть в центре нашего преподавания. Но как нам учить образцовому дизайну с помощью инструментов и языков, которые делают нас посмешищем? К нашему сожалению, индустрия программирования сделала не много, чтобы помочь нам, преподавателям, преодолеть наши трудности” [1].
Происходящий сегодня перевод российских школ на свободное ПО дает еще один повод серьезно подумать о том, что взять на перспективу в качестве бесплатной современной учебной среды для преподавания основ алгоритмизации и программирования. К сожалению, российские разработчики трансляторов пока ничего достойного в этом плане не предлагают. Придется обратиться к мировому опыту. Однако и здесь, как справедливо отмечает Н.Вирт, тоже негусто. Но по крайней мере одно удачное решение уверенно можно назвать. Это язык Компонентный Паскаль (Component Pascal) и среда его реализации Блэкбокс (BlackBox Component Builder) швейцарской фирмы Oberon Microsystems [2]. Среда идеально подходит для сквозного курса программирования, начиная со средних классов школы и заканчивая средними курсами университетов. Распространяется бесплатно вместе с исходными текстами.
Среда не требует установки, допускает модификацию, дополнение, расширение и полную перекомпиляцию. Работает под управлением Windows 95’XP и Linux с эмулятором Wine. Ведутся работы по полному переносу среды на платформу Linux.
Российские специалисты приняли активное участие в развитии и русификации среды [3]. Дополнительные удобства для преподавания предоставляет серия подсистем под общим названием Info21 Ф.В. Ткачева.
Разработана облегченная, школьная версия Блэкбокса. Ее основное отличие заключается в отсутствии некоторых подсистем, использование которых в школе не представляется возможным. И включено три полезных, на наш взгляд, подсистемы, не входящих в базовую поставку: инструментальная панель с пиктограммами, исполнитель “черепашка” и просмотрщик файлов. Кроме того, внесен ряд изменений в настройки для обеспечения большего удобства начинающим пользователям. Имеется русскоязычная документация, меню, диалоговые формы и сообщения компилятора. В архивированном виде среда занимает всего около 5 Мб.
Новосибирской фирмой Excelsior разработан профессиональный оптимизирующий компилятор XDS языков Modula-2/Oberon-2, с 2005 года ставший бесплатным и полноценно работающий на платформах Windows и Linux (https://www.excelsior.ru/products/xds).
Язык Component Pascal представляет собой немного дополненный Oberon-2. Для подавляющего большинства школьных учебных примеров исходные тексты программ на этих языках идентичны.
В сети Интернет есть несколько сайтов, на которых размещены обсуждаемые материалы:
— Блэкбокс можно скачать с сайта разработчиков: https://blackbox.oberon.org;
— сайт общественного проекта, посвященного обновлению основ преподавания программирования в школах и вузах: https://informatika-21.ru/. Здесь можно найти версии Блэкбокса для школ и для вузов, статьи ученых и преподавателей, адреса коллег;
— сайт поддержки Блэкбокса в России (г. Орел) https://www.oberoncore.ru и форум для вопросов и обсуждений https://forum.oberoncore.ru;
— коллекция алгоритмов и программных компонентов: https://www.zinnamturm.eu
В школьной версии Блэкбокса представлена новая реализация известного исполнителя “черепашка”, выполненная на Компонентном Паскале. Программа управления черепашкой пишется полностью на нем же, что принципиально отличается от подхода, принятого в “ЛогоМирах”. Это является большим преимуществом ввиду острой нехватки учебных часов, выделяемых на изучение азов алгоритмизации, поскольку при переходе от работы с исполнителем к изучению “настоящего”, более абстрактного программирования ученикам не придется осваивать новый язык и среду разработки. Кроме того, учащиеся становятся в силах сами расширять ассортимент команд черепашки, что существенно повышает интерес к занятиям.
Покажем основные особенности Компонентного Паскаля в сравнении с Turbo Pascal.
Все ключевые слова пишутся в верхнем регистре (большими буквами). Большие и маленькие (прописные и строчные) буквы везде различаются, т.е. в именах переменных, констант, типов, процедур и модулей. Например, INTEGER и Integer — это разные имена.
Оператор присваивания ничем не отличается. Основные алгоритмические конструкции изменились мало и стали удобнее. При написании блочных операторов больше не требуется ключевое слово begin.
Turbo Pascal | Компонентный Паскаль |
---|---|
if ... then begin ... end else begin ... end | IF ... THEN ELSE END |
while ... do begin ... end | WHILE ... DO ... END |
for i := 1 to 10 do begin ... end | FOR I := 1 TO 10 DO ... END |
Появилась возможность соединять несколько IF-ов в цепочку с помощью ELSIF:
IF … THEN … ELSIF … THEN … ELSIF … THEN … ELSE … END
В цикле FOR появилась возможность указывать величину шага, отличную от единицы, с помощью ключевого слова BY:
FOR i := 0 TO -10 BY -2 DO … END.
Цикл REPEAT … UNTIL не изменился.
Основные типы и их диапазоны:
Тип | Диапазон значений |
---|---|
BOOLEAN | FALSE … TRUE |
CHAR | 0X .. 0FFFFX |
BYTE | -128 .. 127 |
INTEGER | -2147483648 .. -2147483647 |
LONGINT | -9223372036854775808 .. -9223372036854775807 |
REAL | -1.797693134862316E+308 … 1.797693134862316E+308, INF |
SET | подмножество из 0 .. 31 |
Способ объявления переменных не изменился:
VAR a, b: REAL; i, k: INTEGER; ch: CHAR;
Работа с массивами изменилась, но незначительно. Первый элемент массива всегда имеет индекс 0. При объявлении массива указывается не диапазон индексов, а количество элементов:
VAR d: ARRAY 20 OF INTEGER;
Для определения длины массива в программе используется стандартная процедура LEN(d). Например, чтобы обнулить массив d, можно воспользоваться следующим циклом:
FOR i := 0 TO LEN(d)-1 DO d[i]:= 0 END;
или
i := 0; WHILE i < LEN(d) DO d[i]:= 0; INC(i) END;
Для объявления двухмерного массива используется конструкция следующего вида:
VAR table: ARRAY 3, 15 OF INTEGER;
или
VAR table: ARRAY 3 OF ARRAY 15 OF INTEGER;
Узнать размер многомерного массива по любому измерению можно так:
i := LEN(table, 0); (* i = 3, число строк в массиве table *)
k := LEN(table, 1); (* k = 15, число столбцов в массиве table *)
Компонентный Паскаль корректно работает с многомерными динамическими массивами. Динамический массив объявляется с помощью указателя:
VAR a: POINTER TO ARRAY OF INTEGER; VAR b: POINTER TO ARRAY OF ARRAY OF REAL;
Непосредственно перед использованием массива его необходимо разместить в памяти специальным оператором, указывая нужный в данный момент размер:
NEW(a, n); NEW(b, x, y);
В остальном приемы работы с динамическими и статическими массивами совпадают, в том числе производится автоматический контроль выхода индексов за границы.
При объявлении функций не используется ключевое слово function, вместо этого процедурам разрешено возвращать значение с помощью оператора RETURN.
Turbo Pascal | Компонентный Паскаль |
---|---|
function sqr (a: real):nreal; begin sqr := a*a end; | PROCEDURE Sqr (a: REAL): REAL; BEGIN RETURN a*a END Sqr; |
Обратите внимание, что имя процедуры должно быть повторено после завершающего END.
Строительными блоками программ являются модули, пришедшие на смену unit’ам. Модуль — это единица компиляции и загрузки/выгрузки, расположенная, как правило, в отдельном файле. Общий вид исходного текста модуля покажем на примере:
MODULE МоиПример; IMPORT In, L := StdLog; PROCEDURE Делать*; VAR x, n: INTEGER; a: ARRAY 25 OF INTEGER; BEGIN In.Open; In.Int(n); IF n < LEN(a) THEN FOR x := 0 TO n – 1 DO In.Int(a[x]) END; FOR x := n - 1 TO 0 BY -1 DO L.Int(a[x]) END ELSE L.String("Слишком большое n."); L.Ln END END Делать; END МоиПример.