Полный БЕЙСИК

Полный BASIC , иногда известный как Standard BASIC или ANSI BASIC , является международным стандартом, определяющим диалект языка программирования BASIC . Он был разработан группой X3.60 Американского национального института стандартов (ANSI) в партнерстве с европейской ECMA . В нем описывается расширенная версия BASIC со множеством функций, включая структурное программирование , матричную математику , ввод/вывод для обработки файлов и многие другие опции.

Стандартизация BASIC ANSI представляла собой двухэтапный процесс. Первый, реализованный как Minimal BASIC начиная с 1974 года, представлял собой попытку четко определить и стандартизировать исходный язык Dartmouth BASIC , чтобы его можно было правильно реализовать на разных платформах. После его выпуска в конце 1977 года внимание было обращено на Full BASIC, который должен был быть основан на более мощном Structured BASIC, разрабатываемом в Дартмутском колледже . Сложность системы и множество дополнений, предложенных членами комитета по стандартизации, привели к тому, что усилия застопорились, и первый проект стандарта был готов только в 1986 году, то есть с опозданием на четыре года.

Стандарт был ратифицирован 26 июня 1986 г. как ECMA-116. [1] и январь 1987 г. как ANSI X3.113-1987 . Это было полностью проигнорировано; Революция микрокомпьютеров произошла, пока обсуждалась спецификация, и к началу 1980-х годов Microsoft BASIC, работавший на десятках миллионов домашних компьютеров , уже пришел и ушел. Наблюдая за тем, как процесс затягивается, участники из Дартмута приступили к созданию True BASIC на основе частей стандарта, но это не принесло особой пользы. Де-факто стандарты, подобные стандартам Microsoft, доминировали на рынке и легли в основу новых языков, таких как Microsoft Visual Basic , которые включали аналогичные концепции. [ нужна ссылка ]

История [ править ]

Минимальный БЕЙСИК [ править ]

Появление Dartmouth BASIC в 1964 году объединило ряд новых концепций в компьютерной области, включая разделение времени и прямое взаимодействие с пользователем, известное в то время как «разговорный интерфейс». General Electric , поставившая GE 235 мейнфрейм , на котором он работал, использовала модифицированную версию системы Дартмута для создания сервисного бюро , которое в конечном итоге превратилось в GEnie онлайн-сервис . Многие другие компании, особенно Tymshare и CompuServe , быстро внедрили собственные хостинговые службы BASIC, следуя модели Дартмута. [2] [3]

В 1968 году Hewlett-Packard (HP) представила HP 2000 серии миникомпьютеры , которые предлагали те же функции, что и более ранние мейнфреймы, в стоечной системе, которую можно было сконфигурировать в полной форме примерно за 100 000 долларов США (что эквивалентно 876 172 долларам США в 2023 году). . [4] Их HP Time-Shared BASIC имел ряд отличий от Дартмутского, [5] и вскоре они были скопированы другими мини-поставщиками, такими как Data General . Одним из воздержавшихся была Digital Equipment Corporation (DEC), которая не представила BASIC собственной разработки до 1972 года. Эта версия BASIC-PLUS отличалась ни от диалектов HP, ни от диалектов Дартмута. К началу 1970-х годов на рынке использовались три основных диалекта и десятки второстепенных вариаций.

В январе 1974 года под эгидой ANSI сформировалась новая группа для определения единого стандарта BASIC. [6] Команда Дартмута составляла основу группы. Дартмут работал над значительно расширенной версией BASIC, известной как Structured BASIC (SBASIC), которая стала основой ANSI. В то время лишь немногие другие диалекты поддерживали его многочисленные новые функции. Группа решила, что для согласования полного стандарта, основанного на SBASIC, потребуется некоторое время, поэтому работа над ANSI BASIC была разделена на два этапа. Первый, Minimal BASIC , должен был создать стандарт, включающий только самые основные функции, которые потребуются для любой реализации. Даже давно поддерживаемые функции Дартмута, такие как матричная математика, будут исключены. Проект стандарта Minimal BASIC был выпущен в январе 1976 года, окончательный вариант — в июле 1977 года и ратифицирован в декабре того же года. Артур Люрманн , физик из Дартмутского колледжа , который был сторонником BASIC и входил в группу ANSI, позже заявил:

«Первые несколько лет X3J2 были потрачены (оглядываясь назад, некоторые могли бы сказать «впустую») на стандартизацию того, что составляет оригинальный Dartmouth Basic 1964 года... Minimal Basic был скорее игрушкой, чем настоящим языком». [7]

Полный БЕЙСИК [ править ]

Затем группа обратила свое внимание на Full BASIC. К этому времени революция микрокомпьютеров была в самом разгаре, и на рынок выходили миллионы машин, работающих под управлением Microsoft BASIC или аналогичного BASIC. [а] Несмотря на это, никто из участников не был продавцом или поставщиком микрокомпьютеров. Вместо этого участниками остались мэйнфреймов поставщики , такие как IBM , Control Data и General Electric , миникомпьютеров поставщики , такие как Digital Equipment Corporation (DEC), Data General и Wang Laboratories , а также другие очень крупные компании, такие как 3M , American Express и Kodak . [9]

Эти усилия сразу же столкнулись с эффектом второй системы , поскольку каждый участник начал добавлять свой собственный список «обязательных» функций. Некоторые хотели, чтобы язык продолжил традицию использования в образовательных целях на небольших машинах, и хотели иметь простой язык с лишь элементарной поддержкой файлов и аналогичными функциями. Другие были пользователями мэйнфреймов , которые хотели поддерживать загружаемые модульные программы и другие расширенные функции программирования, чтобы конкурировать с такими языками, как COBOL или FORTRAN, предлагая при этом улучшенные возможности манипулирования строками . Третью группу в первую очередь интересовали бизнес-приложения, особенно европейских пользователей, где BASIC стал основным бизнес-языком, и они требовали, чтобы система включала в себя обширную обработку файлов и десятичную математику, не страдающую от проблем с округлением. [10]

Джон Г. Кемени и Томас Э. Курц , первоначальные разработчики BASIC и члены группы ANSI, критически отнеслись к этому процессу. В статье 1982 года Курц написал о том, как даже, казалось бы, незначительные проблемы превратились в серьезные противоречия. Он использовал пример OPTION BASE заявление. Когда массивы были впервые добавлены в BASIC, они начинались с индекса 1, так что DIM A(3) составил массив с тремя слотами: 1, 2 и 3. В некоторых случаях индекс 0 более естественен, поэтому OPTION BASE 0 был добавлен в более поздних версиях Дартмутского кода, поэтому одно и то же определение будет иметь четыре слота, от 0 до 3. Во время Minimal постоянно велись споры о том, какой должна быть база по умолчанию, и в конце концов был выбран 0. Пять лет спустя, во время работы Full, было решено, что массивы могут определять любую нижнюю границу, используя новый синтаксис: DIM YEAR(1970 TO 1990). Это устранило спрос на OPTION BASE 0 и было принято решение снова изменить значение по умолчанию на 1. [11]

Первоначально группа X3.60 планировала подготовить первый экземпляр технического обзора летом 1982 года, который осенью будет отправлен в комитет ANSI X3. В течение этого периода будет разослан предлагаемый стандарт, и будут приняты комментарии общественности. Окончательный проект будет отправлен обратно в X3 в 1983 году для ратификации в том же году. [12] Это оказалось довольно оптимистичным. Первый проект был выпущен только в январе 1985 года. [1] и окончательный проект 1986 г. для ратификации в январе 1987 г. [13] За это время стандарт стал настолько большим, что в конечном итоге был разделен на основной модуль и пять дополнительных дополнений, которые включали сложную обработку файлов, поддержку вычислений в реальном времени, фиксированную десятичную математику, дополнительные команды редактирования и даже независимый от платформы модуль. графический модуль. [14]

Результат подвергся критике в период общественного обсуждения. Один рецензент отметил, что он стал настолько большим, что «полученный язык по сложности может соперничать с любым современным языком программирования» и что «соответствие всему стандарту можно сравнить с самыми существенными проектами компиляторов, когда-либо предпринимавшихся». [15] Далее описывается, например, что существует не менее пяти различных способов описания подпрограммы: три для определения максимальной длины строки и два способа для определения массива. [16] Касаясь вопроса границ массива, отмечается, что комитет согласился с тем, что принятое решение было «недопустимым», и планировал исправить его «позже». [17]

Нет никаких доказательств того, что кто-либо из участников действительно создал соответствующую версию после выпуска стандарта, и любое упоминание о продолжающихся усилиях быстро исчезает. С 1987 года о стандарте упоминается только то, что он существует и что True BASIC включает в себя некоторые из его функций. MS Кроме того, поскольку к этому моменту миллионы микросхем использовали некоторые варианты фактического стандарта , новый стандарт ANSI рассматривался как нестандартное решение. [18] Во многом первоначальный успех BASIC на микроплатформах заключался в том, что он позволял вводить программы из печатного исходного кода , но к середине 1980-х годов это было заменено приложениями в термоусадочной упаковке , и потребность в BASIC как системе распространения отпала. [19] Что касается больших систем, первоначальное использование в качестве языка обучения все чаще заменялось Паскалем , поскольку внешние проблемы, которые должен был решить BASIC, такие как интерактивность и онлайн-редактирование, теперь были доступны в большинстве систем. [20]

Настоящий БЕЙСИК [ править ]

Процесс стандартизации был настолько медленным, что даже автор Structured BASIC в конце концов отказался от него. Стивена Гарланда попросили подготовить серию тестов Совета колледжей для старшеклассников, и вместо этого он написал их на языке Паскаль . Это было несколько спорно, учитывая, что многие широко используемые компьютеры, такие как Commodore 64 и TRS-80, не имели полной реализации Паскаля. Луерман критически отнесся к этим усилиям, предложив более общий курс, который можно было бы применить к большему количеству студентов. [21]

Дартмутским участникам группы ANSI стало ясно, что у этих усилий нет надежды на завершение в какой-либо разумный период времени. Они отказались от проекта и основали новую компанию, чтобы вывести на рынок свою версию языка под названием True BASIC . True BASIC объединил в себе многие особенности основного стандарта, но также внес ряд собственных изменений. Среди наиболее примечательных было то, что нумерация строк теперь стала необязательной. Этот язык не был принят хорошо: во многих обзорах выражались те же опасения по поводу раздувания функций, которые были высказаны в отношении стандарта Full BASIC. Джерри Пурнель назвал это «безумием». [22] а Джон Дворжак назвал это «печальным» и «обреченным на провал». [23]

Описание [ править ]

Редактирование программы [ править ]

Как и предыдущие версии BASIC, Full BASIC был разработан для работы в среде строкового редактора и поэтому использует номера строк для обозначения отдельных строк или диапазонов строк, которые необходимо редактировать или удалять. Номера строк могли варьироваться от 1 до 50 000, в отличие от Minimal, который был от 0 до 9999. Это означало, что допустимые программы Minimal, использующие строку 0, были недействительны в Full. Логические строки имели длину не менее 132 символов. Логические строки можно было расширить на несколько физических строк, используя «символ продолжения», амперсанд. К сожалению, в качестве оператора конкатенации строк также был выбран амперсанд, что усложнило парсер. [24]

Включены дополнительные команды редактирования. RENUMBER и DELETE, которые к тому времени были распространены на новых диалектах микрокомпьютеров. Новая концепция была EXTRACT, который копировал диапазон строк в новый файл и удалял их из исходной программы, позволяя извлечь их в подпрограмму. [25] Затем их можно было бы вызвать с помощью CHAIN команда. CHAIN также может включать необязательный WITH за которым следовал список параметров, и в этом случае ожидалось, что он вернет значение в переменной с тем же именем, что и программа (см. «Структура» ниже). [26]

Базовый функционал [ править ]

Многие из часто используемых ключевых слов, встречающихся в минимальном или других диалектах, остались; PRINT, INPUT, DATA и READ например. В эти команды было внесено множество мелких изменений. Например, во время редактирования ключевые слова можно вводить в верхнем или нижнем регистре или в любой комбинации. Как и раньше, они обычно отображались в верхнем регистре, тогда как новым соглашением было использование змеиного регистра для многосимвольных имен переменных. [27]

Дартмутский Бейсик представил REM заявление для встроенных комментариев, и это было повсеместно поддержано на других диалектах. Многие диалекты также добавили краткую форму, чаще всего с использованием одинарной кавычки, ', как это видно в Microsoft BASIC. Для Полного выбрали восклицательный знак, ! на эту роль, [28] хотя, похоже, нет причин не использовать одинарную кавычку, поскольку она иначе не используется - например, строки не допускают разделителей в одинарные кавычки. [29] Более спорное изменение заключалось в том, что LET Ключевое слово теперь требовалось для всех присваиваний, чтобы упростить анализ, тогда как на любом другом диалекте LET было необязательным. Сюда входил Minimal, поэтому любой минимальный код, использующий этот ярлык, был несовместим с Full. [30]

Помимо относительно небольшого набора из 23 ключевых слов и 11 функций из Minimal, Full добавил десятки собственных, в общей сложности 176 ключевых слов (определяющих 161 отдельное понятие), 38 математических функций и 14 строковых функций, если были включены все расширения. [31] Простой список ключевых слов, разбитый на три колонки, занимает две страницы стандартного документа. [32]

Структура [ править ]

Основное различие между Full и Minimal заключалось в добавлении конструкций блочно-ориентированного структурированного программирования. В Minimal и большинстве интерпретаторов BASIC программа логически состояла из независимых строк кода, и можно было начать выполнение в любой момент, GOTOввод любого номера строки. Единственным исключением из этого правила было FOR...NEXT цикл, в котором все строки от FOR до NEXT логически считались одним блоком кода. Ветвление в блок FOR или выход из него может привести к странному поведению, обычно зависящему от реализации, но обычно к некоторой форме ошибки, например «NEXT Without FOR». [33]

В режиме Full ветвление на блок FOR...NEXT не допускается, равно как и ветвление без использования EXIT заявление. Реализации должны были проверять такие утверждения и запрещать их, например, находя случаи, когда нужно закодировать GOTOзациклился. Проверка такого кода затруднена в интерпретаторе, который обычно проверяет программу построчно; проверка наличия ветвей в блоке из другого кода программы обычно требует анализа всей программы, например, компилятора. [16]

В полной версии некоторые существующие ключевые слова были расширены и добавлены другие, чтобы обеспечить дополнительные структуры блоков. Примечательна была многолинейность IF...THEN...ELSE...END IF, что позволяло запускать несколько строк кода, если условие было выполнено или не выполнено. SELECT...CASE...CASE ELSE...END SELECT был добавлен для построения деревьев решений, [34] который раньше был бы реализован с использованием ON...GOTO или несколько IFs, чтобы выбрать строку для запуска. FOR...NEXT петли остались такими же, как и в Minimal, но появился новый DO...LOOP был добавлен с лучшими протестированными DO WHILE...LOOP и дно проверено DO...LOOP UNTIL... сорта. Теперь из всех циклов можно безопасно выйти с помощью EXIT FOR и EXIT DO команды. [35]

Помимо этих изменений в структурах блоков, Full также добавил ключевые слова для определения процедур, функций и программных блоков. Программы в целом теперь открывались с необязательной PROGRAM ключевое слово, за которым следует имя программы, и заканчивается, как и раньше, END. Подпрограммы могут быть построены с помощью SUB...END SUB и позвонил с помощью CALL name. Многострочные функции были созданы с помощью FUNCTION...END FUNCTION и не объявил тип возвращаемого значения, поскольку он был частью имени — имена строковых функций заканчивались знаком доллара. Возвращаемое значение было предоставлено путем присвоения переменной того же имени, что и функция, например, функция с именем «DOIT» будет содержать строку типа LET DOIT=1. Функции могли вызывать другие функции и самих себя, а это означало, что язык был естественно рекурсивным . [36] Full также сохранил прежний стиль однострочных определений функций с использованием DEF ключевое слово, но удалено требование, чтобы имя функции начиналось с «FN». Например, DEF AVERAGE(X,Y)=(X+Y)/2. [37]

В предыдущих версиях BASIC не существовало понятия области видимости и все переменные были глобальными . Этого недостаточно для создания больших модульных программ, поскольку один раздел кода может быть написан с использованием общих имен переменных, например I и может изменить значение этой переменной. Поскольку переменная является глобальной, она сохраняет измененное значение при возврате к исходному коду. Ключевой концепцией структурного программирования является локальная переменная , которая хранит свое значение отдельно от других переменных с тем же именем в других местах составной программы. Поскольку в BASIC не было концепции области действия, многие программы полагались на глобальное поведение и использовали переменные для передачи информации в подпрограммы и из них. Чтобы реализовать обе концепции в новом языке, Full BASIC добавил EXTERNAL ключевое слово, которое можно добавить в функцию или подпрограмму и сделать любые переменные внутри локальными. [38] Поскольку программы BASIC обычно размещают подпрограммы в конце исходного кода программы, DECLARE Ключевое слово было добавлено для предоставления форвардных объявлений . [39]

Типы данных и переменные [ править ]

В полной версии BASIC появились длинные имена переменных, наконец-то освободившись от однобуквенных или буквенно-цифровых имен прошлого. Он установил новый предел в 31 символ. Небольшим недостатком этого изменения было то, что между ключевыми словами должны были быть пробелы, тогда как в большинстве более ранних версий пробелы можно было оставлять без пробелов. Это произошло потому, что в однобуквенных именах строка типа FORS=1TOA может быть проанализирован как «FORS», который не может быть переменной в двухбуквенной разновидности BASIC. В полном объеме это нужно будет набрать FOR S=1 TO A потому что «FORS» — допустимое имя переменной. [40] Как и в более ранних версиях BASIC, типы данных в Full обозначались суффиксами в имени переменной. Minimal избежал этой проблемы, используя только числовые переменные, но Full также включал строки, обозначаемые, например, знаком доллара. A$. [27]

Полный BASIC требовал десятичной математики для реализации системы с плавающей запятой по умолчанию . Поскольку это не всегда поддерживалось аппаратным обеспечением, особенно на мини- и микроконтроллерах, было также добавлено OPTION ARITHMETIC NATIVE что указывает на то, что математические вычисления должны выполняться с использованием системной реализации с плавающей запятой по умолчанию, какой бы она ни была. Его можно вернуть в режим BCD с помощью OPTION ARITHMETIC DECIMAL. Это дополнение к опции математики с фиксированной точкой, если она установлена. В остальном числовые и строковые переменные работали так же, как и в других BASIC. [41]

Новым дополнением стало математическое расширение с фиксированной точкой, которое позволяло переменным иметь заданную точность. Это было включено с помощью команды OPTIONAL ARITHMETIC FIXED[б] за которым следует звездочка и спецификатор формата, например, OPTION ARITHMETIC FIXED*8.2 установит для всех числовых переменных точность 8 цифр и два знака после запятой. Такое объявление должно быть помещено перед любым математическим кодом в остальной части программы. [43] Более того, любая отдельная переменная может быть определена индивидуально, используя что-то вроде DECLARE NUMERIC*8.2 A, B. [44]

Большинство BASIC поддерживают создание переменных массива с использованием DIM ключевое слово, например, DIM A(5), B(2,2) определяет два массива: одномерный A и двумерный (матрица) B. В Full BASIC нижняя граница любого массива обычно равна 1, поэтому в этом случае переменная A имеет пять «слотов» с номерами от 1 до 5. . С использованием OPTION BASE 0 выше этого объявления будет добавлен еще один слот с индексом 0. [45] В Full также добавлена ​​новая система, позволяющая напрямую указывать нижнюю и верхнюю границы с помощью TO ключевое слово, например, DIM A(100 TO 200) что создает одномерный массив из 101 слота. [45] Чтобы еще больше запутать дело, DECLARE NUMERIC также может использоваться для создания массивов; те же размеры, что и в последнем примере, можно создать с помощью DECLARE NUMERIC A(100 TO 200). [16]

Математика, логика и матрицы [ править ]

В список поддерживаемых математических операторов вошли все операторы Minimal, +, -, *, / и ^. [46] Новый MOD Функция возвращает остаток целочисленного деления. Расширен список логических операторов, AND, OR и NOT был удален из Minimal и теперь добавлен заново, а также были добавлены альтернативные формы операторов сравнения, =<, => и ><. [31]

Список основных встроенных функций остался таким же, как и в предыдущих версиях BASIC, включая распространенные примеры, такие как SQR или ABS. Функции триггера были расширены и теперь включают ASIN, ACOS, ATN, COT, CSC и SEC. Новый ANGLE функция возвращала угол между началом координат и заданной точкой X,Y. BASIC обычно рассчитывает углы в радианах, но OPTION ANGLE DEGREES преобразует все параметры и выходные данные в градусы, и система выставляет PI функция, которая использовалась в этих преобразованиях и в других местах. [47]

В Dartmouth BASIC матричные операции были введены относительно рано в его развитии, и они были частью Full. Они перегружают существующие математические функции, поэтому можно умножить два массива, используя MAT A=A*B или умножьте содержимое массива на скаляр, если параметр B не является массивом. В систему также добавлено несколько функций только для массивов, в том числе ZERто, INVэр и DETискоренить, среди прочего. Добавление матричной математики также требует изменения существующих ключевых слов, таких как PRINT и INPUT, которые выводят или вводят несколько элементов по мере необходимости для заполнения параметра массива. [48]

Матрицы могут быть изменены как часть MAT INPUT указав новые границы, например MAT INPUT A(3.3). Общее количество элементов в новых измерениях должно быть равно или меньше исходного. DIM, поэтому в этом примере, если исходное определение было DIM A(2,2), ввод приведет к ошибке. [49]

Струны [ править ]

Ранние версии Dartmouth BASIC не включали строковые переменные или манипуляции, единственными строками в программе были константы, такие как PRINT "HELLO, WORLD!". В версии 4 1968 года были добавлены строковые переменные и единый метод для управления ими. CHANGE, который преобразовывал строки в массив, содержащий ASCII значения символов , и из него. Например, CHANGE "HELLO, WORLD!" TO A создаст массив значений в A, где A(0) равно 72, десятичному значению ASCII для «H». Это затрудняло манипуляции со строками: например, чтобы извлечь «HELLO» из «HELLO, WORLD!», нужно было:

10 A$="HELLO, WORLD!"
20 DIM A(25), B(5)
30 CHANGE A$ TO A
40 FOR I=1 TO 5
50 B(I)=A(I)
60 NEXT I
70 CHANGE B TO B$

Многие диалекты BASIC добавили свои собственные методы выполнения более полезных манипуляций со строками, чтобы избежать таких осложнений. Для Full BASIC комитет выбрал вариант концепции, представленной HP, «нарезка строк». Эта концепция рассматривает строку как массив символов и может получить к ним доступ, используя подобную массиву спецификацию, известную как «срез» . Чтобы полностью извлечь «HELLO» из «HELLO, WORLD», можно использовать B$=A$(1:5). Концепция аналогична концепции CHANGE, но этот метод выдает результаты, которые сами по себе являются строками, а не числовыми значениями, поэтому можно PRINT B$ произнести «ПРИВЕТ». Одно существенное различие между подходом Full и предыдущими подходами, такими как HP, заключается в том, что он использовал другой синтаксис для нарезки, тогда как более ранние системы использовали синтаксис массива. Например, в HP эквивалентная строка: B$=A$(1,5). Поскольку это тот же синтаксис, что и при доступе к массиву, HP (и аналогичные компании) обычно не допускали строковых массивов. [50] тогда как это было разрешено в полном объеме. [51]

Этот подход следует противопоставить решению, выбранному DEC, — использованию функций, возвращающих новые строки, LEFT$, MID$ и RIGHT$. Это решение было выбрано Microsoft, когда они писали свой BASIC для PDP-10 . Преобразование между ними может быть подвержено ошибкам, чтобы выполнить эквивалент RIGHT$(n), Полный будет использовать DEF Right$(A$, n) = A$(Len(A$)-n+l). [37]

Ввод/вывод [ править ]

Еще одной областью внимания Full BASIC был ввод/вывод (I/O). Единственным вводом-выводом Minimal BASIC был INPUT и PRINT команды и возможность жесткого кодирования данных с помощью DATA заявления и READ это. Добавлены почти все практические диалекты. OPEN и CLOSE для создания «канала», который затем использовался для ссылки на этот конкретный файл или устройство.

INPUT теперь включен дополнительный PROMPT, за которым следует строка, двоеточие, а затем входные переменные, например INPUT PROMPT "What is your age? " : A. [52] К этому времени почти все BASIC включали аналогичную функцию без слова PROMPT и используя существующую точку с запятой в качестве разделителя печати вместо двоеточия, например, в MS BASIC та же строка будет выглядеть так: INPUT "What is your age? "; A. Кроме того, Full также добавил новый TIMEOUT и ELAPSED ключевые слова: INPUT TIMEOUT 30, ELAPSED T, PROMPT "What is your age? ": A, который продолжит выполнение через 30 секунд, даже если пользователь ничего не введет, и поместит затраченное время, возможно, 30 секунд, в переменную T. Для систем, в которых отсутствуют часы (что в то время не было редкостью), T будет всегда возвращайте -1. [53]

PRINTing был аналогичным образом расширен за счет необязательного USING заявление, которое уже появилось в ряде реализаций. USING обычно за ним следовала строка формата с использованием числовых знаков, звездочек и знаков процентов для обозначения десятичных знаков. Строку формата можно поместить в строковую переменную, а затем на нее ссылаться, или можно использовать необязательную отдельную строку, содержащую IMAGE : можно обращаться по номеру строки. [54] [с] В Full также добавлены новые команды для установки области печати. SET MARGIN и SET ZONEWIDTH. [55] Текущие значения этих различных настроек (и других) можно вернуть с помощью ASK. Например, SET MARGIN 10 с последующим ASK MARGIN J установил бы J на ​​30. [56]

Полная поддержка файловых операций с OPEN и CLOSE и номер канала с префиксом цифрового знака, например, OPEN #3: NAME "afile". Затем данные можно записать с помощью INPUT и PRINT или READ и новый WRITE. [57] Включены дополнительные команды обработки файлов. ERASE и REWRITE, и все эти команды имели множество опций и режимов. Во многом это произошло из-за различных типов физических устройств, которые все еще были распространены в конце 1970-х годов. магнитной ленте можно было получить только последовательный доступ, поэтому новый стандарт предлагал варианты Например, к SEQUENTIAL или STREAMи т. д. Список опций, их взаимодействий и ограничений занимает много страниц стандарта. [58] Например, можно PRINT в файл DISPLAY типа, но не INTERNAL тип, который требовал WRITE. [59]

Обработка исключений и отладка [ править ]

Как и многие BASIC того времени, Full добавил TRACE ON команда, которая будет распечатывать номера строк во время выполнения программы. Он также может перенаправить печать номеров строк на другое устройство или файл, используя TRACE ON TO #3, где #3 — ранее открытый канал. Он также добавил DEBUG ON и связанные с этим BREAK оператор, последний из которых вызовет исключение, если отладка была ранее включена. Статус отладки был ограничен конкретной программой, поэтому его можно было, например, включить в одной программе и выключить в подпрограмме. [60]

Кроме того, в Full добавлены настоящие обработчики исключений, основанные на WHEN EXCEPTION...END WHEN блокировать. Было два способа использовать это, если блок кода начинался с WHEN EXCEPTION IN следующий код выполнялся как блок, и любое исключение внутри него приводило к переходу к USE раздел, который работает аналогично ELSE. Его также можно использовать, определив отдельный блок, подобный подпрограмме, используя HANDLER name который затем будет вызываться по имени, используя WHEN EXCEPTION USE name. [61] Код может проверить, какое исключение произошло, используя метапеременные. EXTYPE или EXTEXT$, ни то, ни другое не требовало ASK. RETRY вышел из обработчика ошибок и вернулся к строке ошибки, при этом CONTINUE можно использовать в основном коде, чтобы игнорировать ошибки даже внутри WHEN блоки. [62]

Графика [ править ]

Примерно в то же время, когда разрабатывалась Full, параллельно предпринимались усилия по определению системы графического ядра , или GKS. Это предлагалось как один из дополнительных модулей в версии Full. Это добавило десятки специальных ключевых слов, таких как LINE STYLE и WINDOW с синтаксисом, который не соответствует синтаксису других модулей стандарта. Например, CLIP команда включила обрезку к текущему видовому экрану, чтобы элементы, нарисованные за его границами, не были видны; это приняло строковое значение вместо логического значения, CLIP "On". [63] Было добавлено несколько распространенных команд модификации изображений: SHIFT, SCALE, ROTATE и SHEAR. [64]

Поскольку изображения часто состоят из общих элементов, Full добавил новый PICTURE блочная структура, которая в остальном похожа на SUB и вызывается с помощью DRAW скорее, чем CALL. [65] Разница в том, что вывод блока изображений можно изменить с помощью модификации, используя WITH. Например, если кто-то определил PICTURE CIRCLE что создавало круг радиуса один, можно было нарисовать круг меньшего размера и переместить его в сторону с помощью DRAW CIRCLE WITH SHIFT(2) * SCALE(.4). [65]

В реальном времени [ править ]

Модуль реального времени Full добавил концепцию «параллельных секций» через PARACT ключевое слово. Они выглядели как подпрограммы (и изображения), но имели ряд дополнительных ключевых слов, управляющих их вызовом. Например, можно определить код, который будет реагировать на EVENT а затем запустить его, выдав команду MESSAGE в другом месте кода. Сообщения могут вызывать несколько обработчиков, используя метод SHARED концепция портов. [66]

Система также позволяла подключать эти блоки и объекты к внешнему коду, который создавал бы эти сообщения. Например, можно было бы иметь код, ожидающий на устройстве, которое периодически создавало текстовый вывод, а затем автоматически вызывался бы соответствующий обработчик, когда был доступен новый текст. Поскольку фактические данные с таких устройств, как правило, состоят из нескольких частей, а не являются чем-то простым, например, строкой или числом, в библиотеку реального времени также добавлена ​​возможность определять STRUCTUREs, которые затем можно было бы прочитать или записать как атомарную единицу. [67] Затем они были прочитаны и записаны с использованием IN FROM и OUT TO команды, [68] или если данные были SHARED, в остальном аналогично GET FROM и PUT TO. [69]

Хотя многие программы реального времени можно смоделировать как систему, просто реагирующую на внешние события, сама программа также часто публикует эти события. Для этого Full добавил START команда и связанная с ней WAIT который приостанавливает выполнение для данного DELAY (количество секунд) или TIME (явное время суток) или до тех пор, пока EVENT был замечен. [70]

ECMA против ANSI [ править ]

Стандарты ECMA и ANSI разрабатывались не совместно, а параллельно, хотя и с перекрывающимся членством в комитетах. И наоборот, рабочая группа ISO для BASIC не разработала собственный стандарт, а вместо этого планировала принять стандарт ECMA или ANSI. [71]

Независимо от ANSI комитет ECMA, ответственный за стандарт BASIC, разделил его на две части: ECMA BASIC-1 и ECMA BASIC-2. BASIC-1 включал в себя часть системы манипулирования файлами, но отсутствовал обработку исключений, тогда как BASIC-2 добавил полный набор файловых команд, фиксированную десятичную математику и систему обработки исключений. [1] Кроме того, в BASIC-1 все основные ключевые слова, такие как PRINT были зарезервированными словами, которые упрощали синтаксический анализатор, тогда как в BASIC-2 они следовали шаблону ANSI и могли использоваться в созданных пользователем подпрограммах и функциях. [1]

Рабочая группа ISO изначально планировала использовать стандарт ECMA. Столкнувшись с проблемой двух разных стандартов-кандидатов, в сентябре 1987 года было поручено разработать единый международный стандарт, объединяющий их. Это было достигнуто путем указания, что соответствие любому стандарту может быть заявлено как соответствие стандарту ISO. [71]

Примечания [ править ]

  1. В статье 1984 года Луерман подсчитал, что таких машин насчитывается 10 миллионов. [8]
  2. ^ OPTIONAL ключевые слова не встречаются в примерах стандартного документа. [42] но требуется.
  3. ^ IMAGE работает так же, как FORMAT делает на ФОРТРАНЕ.

Ссылки [ править ]

Цитаты [ править ]

  1. Перейти обратно: Перейти обратно: а б с д ECMA 1986 , с. я.
  2. ^ Маккракен, Гарри (29 апреля 2014 г.). «Пятьдесят лет BASIC, языка программирования, сделавшего компьютеры персональными» . Время .
  3. ^ «IBM против всего мира: вот как оно есть» . Компьютерный мир . 5 декабря 1973 года.
  4. ^ Лейбсон, Стив (2017). «HP: случайно созданная компьютерная компания» . HP9825.COM .
  5. ^ «Описание процессора Hewlett-Packard 2100, 1972 г.» (PDF) . Проверено 18 августа 2020 г.
  6. ^ ECMA 1978 , с. iii.
  7. ^ Люрманн 1984 , с. 173.
  8. ^ Люрманн 1984 , с. 152.
  9. ^ Стандарт 1987 , стр. i, ii.
  10. ^ Курц 1982 , стр. 182, 186.
  11. ^ Курц 1982 , с. 214.
  12. ^ Курц 1982 , стр. 188.
  13. ^ Стандарт 1987 , с. я.
  14. ^ Курц 1982 , с. 190.
  15. ^ Гюнтерот 1983 , с. 51.
  16. Перейти обратно: Перейти обратно: а б с Гюнтерот 1983 , с. 52.
  17. ^ Гюнтерот 1983 , с. 53.
  18. ^ «Точки зрения» . ПК Маг . 29 сентября 1987 г. с. 15.
  19. ^ Беллис, Мэри (26 января 2019 г.). «История языка программирования BASIC» .
  20. ^ МакГрегор, Джей-Джей; Ватт, АХ (октябрь 1981 г.). «Правила PASCAL в порядке?: Сравнение PASCAL и BASIC как языков для обучения новичков программированию» . Математический вестник . 65 (433): 171–182. дои : 10.2307/3617129 . JSTOR   3617129 . S2CID   64737920 .
  21. ^ Мейс 1982 , стр. 29.
  22. ^ Пурнель 1985 , с. 366.
  23. ^ Дворжак 1984 , с. 88.
  24. ^ Гюнтерот 1983 , с. 54.
  25. ^ Стандарт 1987 , с. 272.
  26. ^ Стандарт 1987 , с. 106.
  27. Перейти обратно: Перейти обратно: а б Стандарт 1987 , с. 31.
  28. ^ Стандарт 1987 , с. 29.
  29. ^ Стандарт 1987 , с. 50.
  30. ^ Курц 1982 , с. 196.
  31. Перейти обратно: Перейти обратно: а б Гюнтерот 1983 , с. 55.
  32. ^ Стандарт 1987 , стр. 17–19.
  33. ^ «Далее без For» . Сборка Майкрософт . 13 сентября 2021 г.
  34. ^ Стандарт 1987 , с. 87.
  35. ^ Стандарт 1987 , с. 84.
  36. ^ Стандарт 1987 , стр. 94, 95.
  37. Перейти обратно: Перейти обратно: а б Стандарт 1987 , с. 94.
  38. ^ Стандарт 1987 , стр. 94–100.
  39. ^ Стандарт 1987 , с. 105.
  40. ^ Курц 1982 , с. 192.
  41. ^ Стандарт 1987 , с. 49.
  42. ^ Стандарт 1987 , с. 263.
  43. ^ Стандарт 1987 , с. 262.
  44. ^ Стандарт 1987 , с. 265.
  45. Перейти обратно: Перейти обратно: а б Стандарт 1987 , с. 66.
  46. ^ Стандарт 1987 , с. 37.
  47. ^ Гюнтерот 1983 , с. 49.
  48. ^ Гюнтерот 1983 , с. 70.
  49. ^ Гюнтерот 1983 , с. 71.
  50. ^ Брэннон, Чарльз (апрель 1981 г.). «Строковые массивы в Atari BASIC». Вычислите! . п. 103.
  51. ^ Стандарт 1987 , с. 74.
  52. ^ Стандарт 1987 , с. 111.
  53. ^ Стандарт 1987 , стр. 111, 112.
  54. ^ Стандарт 1987 , с. 123.
  55. ^ Стандарт 1987 , с. 164.
  56. ^ Стандарт 1987 , с. 151.
  57. ^ Стандарт 1987 , с. 142.
  58. ^ Стандарт 1987 , стр. 141–154.
  59. ^ Стандарт 1987 , с. 144.
  60. ^ Стандарт 1987 , с. 195.
  61. ^ Стандарт 1987 , стр. 187–188.
  62. ^ Стандарт 1987 , с. 188.
  63. ^ Стандарт 1987 , с. 199.
  64. ^ Стандарт 1987 , с. 230.
  65. Перейти обратно: Перейти обратно: а б Стандарт 1987 , с. 229.
  66. ^ Стандарт 1987 , с. 239.
  67. ^ Стандарт 1987 , стр. 239–240.
  68. ^ Стандарт 1987 , с. 248.
  69. ^ Стандарт 1987 , с. 250.
  70. ^ Стандарт 1987 , с. 244.
  71. Перейти обратно: Перейти обратно: а б Курц 1994 , с. 478.

Библиография [ править ]

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]

  • Decimal BASIC — относительно полная реализация Full BASIC и его графических модулей.