Отдельные фразы BASIC, которые вводятся с клавиатуры и сразу выполняются ЭВМ

Ввод команды PRINT "HELLO" с клавиатуры в интерпретаторе BASIC и её мгновенное выполнение ЭВМ — классический пример прямого режима (direct mode), который отличает этот язык от компилируемых аналогов. Такой подход позволял пользователям микрокомпьютеров 1980-х (например, Commodore 64, ZX Spectrum или Apple II) тестировать отдельные операторы без написания полноценной программы. Однако не все конструкции BASIC поддерживают прямой ввод: например, операторы FOR-NEXT или DATA-READ требуют предварительной записи в память через номер строки. Рассмотрим, какие именно фразы можно выполнять "на лету", как ЭВМ их обрабатывает, и почему некоторые команды вызывают ошибку SYNTAX ERROR.

Ключевая особенность прямого режима — отсутствие номера строки перед командой. ЭВМ интерпретирует введённый текст как непосредственный запрос на выполнение, а не как часть программы. Это удобно для отладки, но ограничивает функциональность: так, нельзя использовать многстрочные конструкции или операторы, меняющие поток выполнения (например, GOTO без контекста). Далее разберём разрешённые и запрещённые фразы, а также нюансы их ввода на разных платформах.

Какие команды BASIC поддерживают прямой ввод с клавиатуры

Интерпретаторы BASIC (например, Microsoft BASIC, GW-BASIC или Commodore BASIC V2) допускают выполнение однострочных операторов без номера строки. К ним относятся:

  • 📤 Вывод данных: PRINT, ? (сокращение для PRINT), LPRINT (для принтера). Пример: PRINT 2+2 выведет 4.
  • 🧮 Математические операции: любые арифметические выражения, включая функции SIN, COS, SQR. Например: PRINT SQR(16).
  • 🔄 Присваивание переменных: LET A=5 (или просто A=5). Переменная сохраняется в памяти до выключения питания.
  • 🎵 Управление звуком/графикой: SOUND, PLOT, DRAW (зависит от платформы). Например, на ZX Spectrum: BEEP 1,10.
  • 📊 Системные команды: LOAD, SAVE, RUN, NEW, CLS (очистка экрана).

Важно: команды должны быть самодостаточными. Например, GOTO 10 в прямом режиме вызовет ошибку, так как отсутствует строка 10 в памяти. Аналогично, FOR I=1 TO 10 без NEXT I приведёт к SYNTAX ERROR.

Почему некоторые фразы BASIC не работают в прямом режиме

ЭВМ отказывается выполнять команды без номера строки по трём основным причинам:

  1. Требуется контекст программы: операторы GOTO, GOSUB, RETURN, IF-THEN (с переходом) нуждаются в существующих метках или строках кода. Например, IF A=1 THEN PRINT "OK" сработает, а IF A=1 THEN GOTO 100 — нет.
  2. Многострочные конструкции: FOR-NEXT, DATA-READ нельзя разорвать. Даже если ввести FOR I=1 TO 5, ЭВМ ожидает NEXT I в той же строке.
  3. Ограничения интерпретатора: некоторые диалекты BASIC (например, Atari BASIC) блокируют прямые команды для операторов ввода-вывода в файлы (OPEN, CLOSE).

Критическое исключение: на MSX BASIC команда DEF FN (определение функции) требует номера строки, даже если синтаксически выглядит как однострочная конструкция. Попытка ввести её без номера приведёт к ILLEGAL FUNCTION CALL.

📊 Какой BASIC-интерпретатор вы используете?
GW-BASIC
Commodore BASIC
MSX BASIC
Другой (напишите в комментариях)

Примеры прямого ввода: что будет выполняться, а что нет

КомандаРезультат в прямом режимеПричина
PRINT "HELLO"Выведет HELLOСамодостаточный оператор вывода.
A=5: PRINT AВыведет 5Присваивание и вывод в одной строке разрешён.
FOR I=1 TO 3SYNTAX ERRORОтсутствует NEXT I.
GOTO 10UNDEFINED STATEMENTНет строки 10 в памяти.
LOAD "GAME"Загрузит программу с носителяСистемная команда, не требует контекста.

Обратите внимание: на ZX Spectrum команда CLEAR в прямом режиме сбросит все переменные, а на Commodore 64 — только очистит экран (эквивалент CLS). Это связано с различиями в реализации BASIC разных производителей.

Ошибки при прямом вводе: как их избежать

Типичные ошибки возникают из-за непонимания ограничений прямого режима. Рассмотрим самые распространённые:

  • 🚫 Пропущенный номер строки: попытка ввести 10 PRINT "OK" как прямую команду приведёт к SYNTAX ERROR — интерпретатор воспримет 10 как часть выражения, а не как адрес.
  • 🔢 Незакрытые кавычки: PRINT "HELLO (без закрывающей кавычки) вызовет SYNTAX ERROR или зависание ЭВМ.
  • 🔄 Циклы без тела: FOR I=1 TO 10: NEXT I сработает, но FOR I=1 TO 10 — нет.
  • 📂 Команды работы с файлами: OPEN "FILE" без последующего CLOSE может заблокировать ресурсы системы.
⚠️ Внимание: На Apple II прямая команда CALL -151 (вызов монитора) может привести к потере данных, если в памяти есть несохранённая программа. Всегда сохраняйте работу перед экспериментами с низкоуровневыми вызовами.

1. Убедитесь, что команда не требует номера строки

2. Проверьте закрытие всех кавычек и скобок

3. Избегайте операторов перехода (GOTO, GOSUB) без контекста

4. Сохраните текущую программу, если экспериментируете с системными командами-->

Особенности прямого ввода на разных платформах

Реализации BASIC варьируются в зависимости от ЭВМ. Вот ключевые различия:

  • 🖥️ Commodore 64/128: Поддерживает прямые команды для управления SPRITES (например, POKE 53269,1 включает спрайт 0). Команда SYS позволяет вызывать машинный код.
  • 🍎 Apple II: Прямой ввод CALL используется для вызова подпрограмм монитора. Например, CALL 768 очищает экран.
  • 💻 MSX: Команда VDP в прямом режиме позволяет управлять видеопроцессором (например, VDP(0)=2 меняет цвет границы).
  • 🎮 ZX Spectrum: Прямой ввод RANDOMIZE USR 16384 запускает машинный код по адресу 16384 (используется для загрузки игр).

На IBM PC с GW-BASIC прямые команды часто используются для тестирования графических режимов. Например, SCREEN 2 переключает в режим 640×200, но после этого все последующие команды (включая PRINT) будут выводить графику, а не текст.

Как вернуть текстовый режим после SCREEN 2 в GW-BASIC?

Введите SCREEN 0 — это сбросит видеорежим к стандартному текстовому (40×25 или 80×25 в зависимости от настроек). Если экран стал нечитаемым, перезагрузите ЭВМ (Ctrl+Alt+Del на IBM PC).

Практические применения прямого ввода BASIC

Прямой режим полезен для:

  1. Отладки программ: проверки значений переменных (PRINT A) или тестирования математических выражений.
  2. Быстрых расчётов: BASIC можно использовать как калькулятор. Например, PRINT 100*(1.1^5) посчитает проценты по вкладу.
  3. Управления аппаратными средствами: на Commodore 64 команда POKE 53280,0 отключает звук.
  4. Обхода ограничений ОС: на Apple II CALL -936 перезагружает систему без потери данных в памяти.

Пример использования для диагностики: если программа на ZX Spectrum выдаёт 2 NUMBER TOO BIG, можно в прямом режиме проверить границы переменных командой PRINT 2^31-1 (максимальное целое число).

⚠️ Внимание: Прямой ввод команд POKE или CALL с неверными адресами может привести к зависанию ЭВМ или повреждению данных. Всегда проверяйте адреса по документации к вашей модели.

Как сохранить результаты прямого ввода

Переменные и результаты, полученные в прямом режиме, хранятся в памяти ЭВМ до выключения питания или команды NEW. Чтобы их сохранить:

  • 💾 На ленту/диск: используйте SAVE "VARIABLES" (на Commodore 64) или BSAVE (на MSX).
  • 📝 В программу: введите LIST, скопируйте вывод на бумагу, затем создайте новую программу с нужными строками.
  • 🔢 Экспорт данных: на IBM PC можно перенаправить вывод в файл: OPEN "O",1,"DATA.TXT": PRINT#1, "RESULT=";A: CLOSE 1.

На ZX Spectrum для сохранения переменных придётся вручную записать их значения в программу. Например:

10 LET A=5

20 LET B$="HELLO"

30 SAVE "DATA" LINE 10

FAQ: Частые вопросы о прямом вводе BASIC

Можно ли в прямом режиме использовать INPUT для ввода данных?

Да, но только если команда самодостаточна. Например, INPUT "ВВЕДИТЕ ЧИСЛО";A сработает, а INPUT A: IF A>10 THEN PRINT "БОЛЬШОЕ" — нет (требуется номер строки для IF).

Почему после LOAD в прямом режиме программа не запускается?

Команда LOAD только загружает программу в память. Чтобы её выполнить, нужно ввести RUN (или RUN 10, если стартовая строка не 1).

Как очистить память от переменных, созданных в прямом режиме?

Введите NEW (на большинстве платформ) или CLEAR (на ZX Spectrum). Это удалит все переменные и программы.

Можно ли в прямом режиме использовать DATA и READ?

Нет. Эти операторы требуют контекста программы с номерами строк. Попытка ввести DATA 1,2,3 без номера строки приведёт к ошибке.

Как узнать, какие переменные сохранены в памяти после прямого ввода?

На большинстве платформ нет прямой команды для списка переменных. Можно вывести их вручную: PRINT A,B$,C(1). На Commodore 64 поможет утилита MONITOR (вызов по SYS 64802).