BASIC instinct, или Cтарые коды на новый лад
АрхивМногие программисты начинали с языка BASIC (Beginner’s All purpose Symbolic Instruction Code). Он был хорош простыми мнемоническими обозначениями операций, близкими к записи алгебраических выражений, и интуитивно понятной структурой программного кода. Но BASIC уже давно отправлен на свалку компьютерной истории.
Многие программисты начинали с языка BASIC (Beginner’s All purpose Symbolic Instruction Code). Он был хорош простыми мнемоническими обозначениями операций, близкими к записи алгебраических выражений, и интуитивно понятной структурой программного кода. Но BASIC уже давно отправлен на свалку компьютерной истории.
Сейчас - в век объектно-ориентированного программирования - ему на смену пришел Visual Basic, который, однако, заметно прибавив в функциональности, утерял очевидную простоту и, что самое главное в процессе обучения, – легкость достижения результата. То есть рисовать красивые окружности и делать мультики на нем уже не так просто, как, скажем, на Yamaha MSX-BASIC или БК-0010/11. Тем не менее задача обучения начинающих программированию никуда не делась, и необходимо новое средство для заманивания очередных рабов ЭВМ.
Джон Швартц из компании Morrison Schwartz (она разрабатывает софт и оказывает консалтинговые услуги; Джон - бывший руководитель проектов в Microsoft) предлагает свою альтернативу – Kid’s Programming Language (KPL). По его словам, язык позволяет легко и с удовольствием разобраться в принципах программирования даже тем, для кого всю жизнь это было китайской грамотой. Отметим, что хотя KPL основан на платформе .NET[Правда, разработчики обещают разработать дистрибутив и для других, отличных от Windows платформ, однако сейчас вам потребуется установленный .NET Framework V1.1 с первым пакетом обновлений], он бесплатен и любой желающий может скачать его дистрибутив с официального сайта разработчиков. Более того, тем, кто хотел бы использовать этот язык в своем учебном заведении, но не имеет возможности скачать одиннадцатимегабайтный файл из Интернета, компания предлагает выслать его на компакт-диске (почтовые расходы не компенсируются). Желающие могут помочь разработчикам в переводе дистрибутива на родной язык, а также поделиться примерами своих самых удачных программ.
Развлечение?
Эффективность обучения обеспечивается прежде всего тем, что KPL специально разрабатывался с уклоном в "развлекательное" программирование. То есть в него изначально заложены средства создания игр с графикой и звуком. Однако, по утверждению разработчиков, он хорош не только для этого, в его составе имеются все необходимые математические операции, а функциональность вполне соответствует уровню современных языков программирования (хотя, разумеется, он лишен такой математической библиотеки, каковая есть, например, у Delphi). Однако создатели KPL уверены, что игровая составляющая позволяет быстрее добиться результатов, нежели сухое изучение алгоритмов и синтаксиса команд.
Надо отметить, что незамысловатое оформление сайта намекает на факультативность этого проекта для компании, однако, судя по конференции, энтузиазма у Джона еще предостаточно.
Будучи сконцентрирован на визуализации, язык позволяет наглядно отобразить и результат работы алгебраических операций, и создать обычный мультик из серии картинок, и нарисовать трехмерную конструкцию с текстурами. Кстати "прозрачное" использование возможностей DirectX - одно из главных достоинств языка, которое может пригодиться и для серьезных математических задач: иной раз визуализация результата расчетов даже важнее точности. Характерно, что библиотека примеров KPL-программ, идущая вместе с дистрибутивом, в основном состоит из небольших игр, наподобие тех, в которые мы играли на БК-0011. Некоторые из них заодно помогут подтянуть произношение (английское) или пополнить разговорный словарь (английский и испанский).
Русского языка, конечно, не хватает.
Или программирование?
Надо признать, что над интерфейсом среды разработки авторы поработали на славу. В первую очередь это касается быстроты и эффективности обучения. Поначалу оболочка может показаться спартанской: на панель в виде кнопок вынесены лишь самые важные команды (работа с файлом программы, кнопка запуска, кнопка проверки текста программы и др.), но для новичков (особенно для детей, зачастую не имеющих опыта работы с компьютером) - это лучший вариант! Ведь если неподготовленному пользователю вывалить на экран все доступные возможности - он неминуемо среди них заплутает. Заслуживает упоминания и способ "погружения" в язык. Большинство самоучителей построено по принципу "начнем с типов данных, закончим перечислением стандартных методов". Весь мой преподавательский опыт восстает против этого! Человек, обучающийся программированию, в первую очередь спросит: "Как мне сделать то-то и то-то (нарисовать окружность, создать двигающуюся фигурку, вывести на экран текст)?" А вовсе не "Каким образом здесь объявляются переменные?.." Потому и процесс обучения языку должен быть построен по принципу: от постановки занимательной задачи - к средствам ее реализации.
И, наверное, главное отличие KPL от "взрослых" языков состоит именно в ориентации на этот метод обучения (то есть пакет предназначен не для разработки приложений, а для обучения программированию как виду деятельности). Поэтому после установки KPL пользователю предлагается пара десятков обучающих программ, называющихся в соответствии с той функцией, которой они учат: "Нажимающиеся Кнопки", "Прыгающие Мячики", "Прозрачность Спрайтов", "Рекурсия", "Мандельброт"[Бенуа Мандельброт (Benoit Mandelbrot) - американский ученый польского происхождения, автор теории фракталов] и другие. Таким образом очень легко освоить основные приемы написания кода, попутно, как бы между прочим, изучая "скучные" правила программирования и синтаксис языка.
Из приятных мелочей отметим автоматически появляющуюся при наведении мышкой подсказку (tooltip) с синтаксисом команды, что позволяет быстро понять программу-пример или исправить ошибку в собственном коде. Еще - автоматическую проверку синтаксиса (аналогично проверке грамматики в офисных пакетах) в виде подчеркивания красной волнистой линией слов с ошибками, в том числе необъявленные переменные или неправильно указанные параметры вызываемых методов.
Если мы взглянем на простенькую программу, приведенную во врезке, может возникнуть вопрос: чем же KPL отличается от Visual BASIC? Во-первых, странно было бы отказываться от удачного принципа построения языка, проверенного временем. А во-вторых, как мы уже говорили, он бесплатен. Кроме того, KPL привнес и кое-что новое: он позволяет работать напрямую с полярными координатами, многомерными массивами, co спрайтами[Спрайт - небольшое двухмерное изображение. Любопытно, что этим значением слово "sprite" (англ. "эльф", "фея") обязано студии Диснея. Так стали называть способ ускорения анимации персонажей: персонаж рисовался на прозрачной пленке, которая потом накладывалась на сцену]; в отличие от предка, в нем требуется определять переменные и типы заранее (что, на мой взгляд, очень полезно). Наконец, одна из главных его особенностей - ориентация на работу с графикой и звуком. Вспомните хотя бы известную игру "Сапер", уместившуюся вместе со всеми комментариями всего в пятьсот строчек кода.
Таким образом, не заостряя внимания на технических особенностях взаимодействия с экраном и звуковой картой, можно сконцентрироваться на овладении основными принципами современного программирования (циклы, функции, структуры данных), легко достигая ощутимых результатов практически сразу. И здесь я соглашусь с разработчиками: наверное, это самое главное на начальном этапе обучения (когда важно даже не научить, а заинтересовать), после чего намного легче перейти к понятиям объект, класс, рекурсия и пр. И последнее - уже реализованы трансляторы с этого забавного языка-игрушки на серьезные C# и VB.NET.
Конечно, Кid’s Programming Language не является "р-р-революционным" прорывом в высокоуровневом программировании, но будучи по сути своеобразным "клоном" Visual BASIC, он тем не менее вносит качественные изменения в процесс обучения[А если учесть стоимость ПО, то и количественные (цена русской версии Visual Basic .NET для школ составляет около $4 на один ПК ежегодно)], которые нельзя не признать значительными.
Как известно, лучше один раз увидеть программу, чем сто раз услышать про язык программирования, на котором она написана. Ниже приведен листинг программы, переводящей полярные координаты в декартовы (X,Y) и отображающей результат функции R=sin(X) в виде спиралей в окошке.
Program PolarCoordinates
// Эта структура хранит результат перевода координат
Structure CartesianPoint
X As Decimal
Y As Decimal
End Structure
// Хранит полярные координаты точки
Structure PolarPoint
R As Decimal // расстояние от центра
Theta As Decimal // угол поворота вектора
End Structure
Define maxX As Int // максимальный размер рисунка
Define maxY As Int
Define plotColor As Int = 96 // цвет рисунка
// На вход этой функции передается структура с полярными координатами точки, а на выходе мы получаем структуру с декартовыми координатами точки.
Function GetCartesian(p As PolarPoint) As CartesianPoint
Define c As CartesianPoint
c.X = p.R * Cos(p.Theta) c.Y = p.R * Sin(p.Theta)
Return c // возвращаем значение функции
End Function
// Рисует точку на экране
Method PlotPolarPoint(p As PolarPoint)
Define c As CartesianPoint
Pen(False) // при перемещении линия не рисуется
c = GetCartesian(p)
// Передвигаем «виртуальный карандаш»
MoveTo(c.X * maxX, c.Y * maxY)
Color(plotColor) // устанавливаем цвет линии
Pen(True) // «опускаем» виртуальный карандаш
Circle(1, True) // радиус = 1, закрашенная (true)
End Method
// Этот метод очищает экран и рисует систему координат
Method InitScreen()
maxX = ScreenWidth() / 2
maxY = ScreenHeight() / 2 // рисуем горизонтальную линию
DrawLine(-1 * maxX, 0, maxX, 0) // и вертикальную линию
DrawLine(0, -1 * maxY, 0, maxY)
End Method
// Это текст основной программы,
// мы рисуем график функции R= f(Theta)
Method Main()
SetAlgebraCoordinates()
InitScreen()
Define i As Decimal
Define p As PolarPoint
For i = 1 To 50 * 10000 // задаем цикл
p.Theta = i / 10000
//Главная формула, по которой мы рисуем график
p.R = Sin(8 * p.Theta)
PlotPolarPoint(p)
Next
End Method
End Program