Удивит ли вас, если я скажу, что BASIC все еще не утратил свою актуальность? Помимо того, что этот язык явился прародителем современных домашних вычислительных систем, он все еще остается жизнеспособным даже вне кругов ретро-энтузиастов. Предлагаем окунуться в краткий обзор истории его становления, начиная с азов и заканчивая современными реализациями.
Истоки языка
Еще не так давно BASIC был общепринятым языком домашних компьютерных систем. Причем это не всегда был один и тот же BASIC. Его команды и синтаксис отличались в зависимости от модели ПК, которой он оснащался, будь то Commodore, Atari, Texas Instruments, Sinclair или другие. К счастью, большая часть диалектов проистекала из наиболее популярной реализации, а именно Microsoft BASIC.
Корнями BASIC уходит в академическую сферу, где он изначально создавался как язык, который был бы удобен как для профильных студентов, так и для тех, кто обучался вне традиционных областей STEM (Науки, Технологии, Инженерии и Математики). Унаследовав ряд свойств от популярных языков 60-х годов, таких как FORTRAN и ALGOL, он получил широкое распространение в школьных системах разделения времени. Даже IBM приняли участие в его развитии, выпустив в 1973 году более совершенную версию VS-BASIC. Когда в 70-х годах начали появляться микрокомпьютеры, которые были невелики и одновременно доступны по цене, то вполне естественным для них стало использование именно BASIC.
Преимущество интеграции этого языка в подобные системы было очевидным и заключалось не только в том, что он уже был знаком многим потенциальным покупателям компьютеров, но также и в его возможности выполнять программы без предварительной компиляции. Это было большим плюсом, потому что компиляция требует приличного объема ОЗУ и хранилища, а этими характеристиками микрокомпьютеры тех лет похвастаться явно не могли. Вместо компилирования исходного кода интерпретаторы BASIC преобразовывали и выполняли код построчно, теряя таким образом скорость в угоду гибкости и пониженному потреблению ресурсов.
При включении микрокомпьютера, как правило, прямо из встроенного ПЗУ загружался именно интерпретатор, а не полноценная операционная система. Из его оболочки можно было использовать аппаратное обеспечение, писать и загружать программы BASIC, а также записывать их на пленку или диск. Помимо этого, пользователь мог выполнять как имеющийся код, так и скомпилированные программы и даже вводить их прямо из листингов, которые печатались в журналах. При этом относительная согласованность между реализациями BASIC для разных домашних ПК обеспечивала отличную портативность.
Но это было тогда, а что сейчас? Используют ли этот язык сегодня?
BASIC + джойстик = веселуха
Для начала предлагаю получше рассмотреть принцип действия этого языка. В качестве очень простого, но в то же время забавного, примера его использования мы разберем приложение для Commodore 64, которое перемещает по экрану стрелку, выводя при этом на дисплей ее координаты. В качестве устройства ввода используется джойстик, подключенный ко второму порту. В качестве ПО выступает Commodore BASIC 2.0, являющийся диалектом Microsoft BASIC.
10 S=2: X=150: Y=150: V=53248: GOTO 100
15 J=PEEK(56320): IF J=127 THEN 15
20 IF J=111 THEN POKE 56322,255:END
25 IF J=123 THEN X=X-S
30 IF J=119 THEN X=X+S
35 IF J=125 THEN Y=Y+S
40 IF J=126 THEN Y=Y-S
45 IF J=122 THEN Y=Y-S
50 IF J=118 THEN Y=Y-S
55 IF J=117 THEN Y=Y-S
60 IF J=121 THEN Y=Y-S
65 IF X=>252 THEN X=10
70 IF X=<10 THEN X=252 75 IF Y>254 THEN Y=44
80 IF Y<44 THEN Y=254
85 PRINT CHR$(147);CHR$(158);CHR$(17);"X-POS:";X;" Y-POS";Y
90 POKE V,X:POKE V+1,Y: GOTO 15
100 FOR Z=832 TO 853 : POKE Z,0: NEXT Z
105 FOR Z=832 TO 853 STEP 3: READ J: POKE Z,J: NEXT Z
110 POKE V+21,1: POKE V+39,7: POKE V+33,0: POKE V+29,1
115 POKE 56322,224: POKE 2040,13: GOTO 85
120 DATA 240, 224, 224, 144, 8, 4, 2, 1
Каждая строка вводится как есть, включая ее номер. Завершив написание кода, переходим на следующую строку, вводим
RUN
и жмем “Return” (или “Enter”, зависит от клавиатуры). При условии, что все было введено верно, код будет выполнен, и на экране мы увидим:В этой потрясной игре мы перемещаем стрелку по экрану с помощью джойстика
Так что же в реальности делает код? Как и в любой программе BASIC, он начинает выполнение с первой строки, в данном случае 10. Здесь определяется несколько переменных, после чего с помощью команды GOTO происходит переход к строке 100. В цикле FOR мы выполняем POKE (то есть производим запись в аппаратный регистр) и повторяем это еще в нескольких адресах, обновляя тем самым дисплей на его изначальную конфигурацию. Здесь команда READ используется для считывания констант, определяемых DATA.
Многие из этих адресов памяти напрямую обращаются к видео адаптеру (в C64 это VIC-II). Когда мы используем PEEK на строке 15, происходит считывание содержимого адреса памяти 56322, который соответствует текущим входным значениям на втором порту джойстика. После этого мы проверяем состояние каждого входа с помощью этих значений битов и нужным образом подстраиваем стрелку (строка 90) вместе с ее координатами (строка 85).
Посвященная этой программе страница C64 Wiki включает побитовую версию сравнения. Она должна выполняться чуть быстрее ввиду меньшего количества строк кода. Однако по перемещению стрелки на экране заметить это будет сложно.
Здесь важно подчеркнуть, что реализации BASIC на различных микрокомпьютерах подразумевали бы выполнение POKE и PEEK для разных адресов памяти, в связи с отличиями в конфигурации системы каждого компьютера. Некоторые реализации также предоставляли команды, привязанные к конкретной системе ПК, что стало более актуальным по мере роста их графических и аудио возможностей.
Интерпретация против компиляции
Знакомая многим картинка: QuickBasic IDE
Интерпретируемая природа BASIC на большинстве компьютеров была как преимуществом, так и недостатком одновременно. С одной стороны, он был очень гибок и позволял просто запускать программы, а также быстро их изменять, не требуя длительных циклов компиляции (как минимум на процессоре Z80 или 6502 с частотой < 10МГц). С другой стороны, ошибки в коде оставались незамеченными вплоть до момента выполнения программы интерпретатором. А это вело к такому же веселью при разработке, что и современные скрипты JS и Python, где код будет отлично выполняться, пока интерпретатор внезапно не выдаст сообщение об ошибке (это если повезет).
В случае BASIC данный казус обычно проявлялся в виде
“ Syntax error on line <....>”
. При этом прогон того же кода через компилятор все эти ошибки бы выявил. Такая особенность интерпретируемых программ означала, что эффективность легкого распространения кода в виде листингов в компьютерных журналах и справочных руководствах определялась качеством печати и навыками самого вводящего этот код программиста. К счастью, на C64 и аналогичных системах исправление ошибочно введенных строк реализовывалось очень легко. Достаточно было ввести ее повторно, нажать “Return”, и интерпретатор производил обновление. BASIC сегодня
Хотелось бы сказать, что все отлично, но сегодня уже никто не достает из кладовых тот старый C64, чтобы на досуге написать программу BASIC. За исключением, конечно, увлеченных любителей винтажных систем. И все же стоит заметить, что жизнь BASIC не закончилась с эпохой Commodore и Atari, и позже в Microsoft были разработаны его обновленные версии Visual Basic, Visual Basic for Applications (VBA) и VB.NET. На последнем можно писать VB-код для среды выполнения .NET.
PureBasic Visual Designer
Помимо этого, в 2008 году Microsoft выпустили Small Basic, нацеленный на начинающих программистов, например студентов, ранее использовавших визуальный язык программирования вроде Scratch. Причем его не стоит путать со SmallBasic, являющимся открытым (под стандартной общественной лицензией) диалектом BASIC с сопутствующими интерпретаторами для современных платформ.
Диалекты BASIC также можно встретить во многих графических и программируемых калькуляторах от Yi, HP, Casio и других производителей, хотя многие из этих диалектов не совместимы напрямую с изначальным стандартом BASIC (ISO/IEC 10279:1991). В процессе своего развития этот язык перешел от обязательной нумерации строк к перемещению по коду с помощью меток, а также обрел новые техники программирования. Эти изменения были введены в его обновленную версию QuickBasic в 1985 году и остаются актуальными по сей день.
Среди других реализаций можно выделить коммерческий PureBasic от Fantaisie Software, который предоставляет IDE и компилятор для ряда целевых платформ. TrueBasic, в свою очередь, является современным пакетом инструментов, включающим IDE, чей синтаксис больше приближен к FORTRAN. Разработан же он был самими создателями оригинального языка – Darthmouth BASIC.
Что касается современных открытых интерпретаторов и компиляторов BASIC, то к ним относится Chipmunk Basic, восходящий еще ко времени Apple Macintosh, а также GW-BASIC от Microsoft, чей код был раскрыт не так давно. Кроме того, вокруг этого языка сформирована здоровая OSS-экосистема. Если же ничто из этого вас не тронет, то еще есть Tiny BASIC, использующий синтаксис в форме Бэкуса-Наура, как описано в первом выпуске “Dr. Dobb’s journal” 1976 года. Несколько лет назад один из авторов Hackaday, Том Нарди, описал свой опыт переноса своего старого QuickBasic-проекта 90-х годов в современный формат с помощью QB64.
Подходящее применение
Становится очевидным, что BASIC не просто жив, но еще и повседневно используется в коммерческих формах, бесчисленных открытых проектах и деятельном сообществе увлекающихся ретро-компьютерами людей. Это конечно спорное заявление, но он по-прежнему годится в качестве языка для освоения программирования. Кроме того, благодаря более низким системным требованиям BASIC отлично подходит для создания встраиваемых приложений, что обычно делается на MicroPython и подобных языках. К примеру, несколько лет назад мы писали о микроконтроллере ARM, который поставлялся с интерпретатором BASIC на борту.
На GitHub также можно найти проекты, подобные UBASIC PLUS, который предназначен для STM32F0 и требует всего 8Кб ОЗУ и 64Кб флэш-памяти. Еще один проект для ARM и PIC32 (а также для DOS и Windows) – это MMBasic, требующий 94Кб флэш и минимум 16Кб ОЗУ.
BASIC развивался в эпоху, когда у домашних ПК было меньше памяти и хранилища, чем у сегодняшних микроконтроллеров за $5. В связи с этим он оказывается прекрасным нетребовательным к ресурсам языком для случаев, когда нужно использовать интерпретируемые скрипты, а не скомпилированные двоичные файлы, и избавляет от необходимости приобретать микроконтроллер с большим объемом ОЗУ и флэш-памяти.
А пользуетесь ли вы, дорогой читатель, какой-либо формой BASIC сегодня?
Если да, поделитесь в комментариях своим опытом и советами для тех, кто может заинтересоваться этим языком, будь то на настольном ПК, винтажных-системах или встроенных.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Используете ли вы какой-либо диалект BASIC и как часто?
-
7,1%Регулярно2
-
7,1%Иногда в качестве хобби2
-
50,0%Использовал когда-то…14
-
7,1%Не знал о нем до прочтения статьи2
-
28,6%Нет8