Парадигма | императивный ( процедурный ) |
---|---|
Разработано | Пол Тензар и Ричард Бломм [1] |
Разработчик | Пол Тенцар и Иллинойсский университет в Урбане-Шампейне |
Впервые появился | 1969 ( 1969 ) |
Дисциплина набора текста | никто |
Основные внедрения | |
РЕПЕТИТОР, Микро-РЕПЕТИТОР | |
Под влиянием | |
TenCORE, USE ( системы Regency ) |
TUTOR , также известный как PLATO Author Language , — это язык программирования , разработанный для использования в системе PLATO в Иллинойсском университете в Урбане-Шампейне примерно с 1965 года. TUTOR был изначально разработан Полом Тенцаром для использования в обучении с помощью компьютера (CAI) и обучении под управлением компьютера (CMI) (в компьютерных программах, называемых «уроками») и имеет множество функций для этой цели. Например, TUTOR имеет мощные команды для анализа и оценки ответов, графику и функции для упрощения обработки записей студентов и статистики инструкторами. Гибкость TUTOR в сочетании с вычислительной мощностью PLATO (работавшего на том, что считалось суперкомпьютером в 1972 году) также сделала его пригодным для создания игр — включая авиасимуляторы, военные игры, многопользовательские ролевые игры в стиле подземелий, карточные игры, словесные игры и игры-уроки по медицине, такие как Bugs and Drugs ( BND ). TUTOR продолжает существовать и сегодня как язык программирования для системы Cyber1 PLATO [2] , которая использует большую часть исходного кода PLATO 1980-х годов и имеет около 5000 пользователей по состоянию на июнь 2020 года.
TUTOR изначально разрабатывался как язык специального назначения для разработки учебных уроков, и его эволюция в язык программирования общего назначения была незапланированной. Название TUTOR впервые было применено к языку программирования системы PLATO в последние дни Платона III. Первая документация языка под этим названием, по-видимому, была Avner, Richard Allen; Tenczar, Paul (январь 1969), The TUTOR Manual. Отчет CERL X-4
Статья Teaching the Translation of Russian by Computer [3] дает снимок TUTOR незадолго до того, как PLATO IV начал работать. Основные элементы языка присутствовали, но команды давались в верхнем регистре, и вместо использования общего механизма поддержка альтернативных наборов символов осуществлялась через специальные имена команд, такие как WRUSS
«писать, используя русский набор символов».
В 1970-х годах разработчики TUTOR воспользовались тем фактом, что весь корпус программ TUTOR хранился в сети на одной и той же компьютерной системе. Всякий раз, когда им требовалось изменить язык, они запускали программное обеспечение для конвертации корпуса кода TUTOR, чтобы пересмотреть весь существующий код и привести его в соответствие с внесенными ими изменениями. [4] В результате, как только разрабатывались новые версии TUTOR, поддержание совместимости с версией PLATO могло быть очень сложным. [5]
Control Data Corporation (CDC) к 1981 году в значительной степени исключила название TUTOR из своей документации PLATO. Они называли сам язык PLATO Author Language . Однако фраза TUTOR file или даже TUTOR lesson file сохранилась как название типа файла, используемого для хранения текста, написанного на PLATO Author Language. [6]
Урок TUTOR состоит из последовательности модулей , где каждый модуль начинается с представления информации, а переход от одного модуля к другому зависит от правильного ответа на один или несколько вопросов. Как и в параграфах COBOL , управление может войти в модуль TUTOR из предыдущего модуля и выйти в следующий, но модули также могут вызываться как подпрограммы с помощью команд do
или join
.
Вот пример единицы: [7]
единица математикив 205написать Ответьте на эти проблемы 3 + 3 = 4 × 3 =стрелка 413ответ 6стрелка 613ответ 12
Из этого примера сразу становится очевидным несколько вещей.
write
команде выше, тег может состоять из нескольких строк. Строки продолжения либо пустые, либо имеют начальную табуляцию.Что может быть неочевидно, так это структура управления, подразумеваемая в этом блоке. arrow
Команда отмечает вход в блок судейства . Эта структура управления является одной из уникальных особенностей TUTOR.
TUTOR содержал ряд уникальных особенностей. Следующий список не предназначен для замены руководства TUTOR, а просто выделяет наиболее интересные, инновационные и иногда запутанные особенности языка.
Блок оценки в TUTOR — это структура управления, которая начинается с arrow
команды и заканчивается следующей командой arrow
, endarrow
или unit
. arrow
Команда также запрашивает ввод, при этом специальный символ стрелки (напоминающий «▷») отображается в качестве подсказки в указанных координатах экрана. По сути, блок оценки можно рассматривать как структуру управления возвратом, в которой ученик может сделать несколько попыток ответить на вопрос, пока правильный ответ не позволит двигаться вперед.
Каждый блок оценки состоит из последовательности команд сопоставления с образцом , каждая из которых вводит (возможно, пустой) блок команд, которые должны быть выполнены, если этот образец совпадает. Две наиболее распространенные команды сопоставления с образцом были answer
и wrong
. Они имели идентичную семантику сопоставления с образцом, за исключением того, что answer
оценивали ответ студента как правильный, если он совпадал, в то время как wrong
оценивали ответ студента как неправильный.
Поля тегов в командах answer
и wrong
состояли из списков необязательных, обязательных и альтернативных слов. рассмотрим следующий пример: [8]
ответ <это, есть, это, фигура, многоугольник> (правый, rt) (треугольник, треугольный)
Это будет соответствовать таким ответам, как «это прямоугольный треугольник» или «это треугольная фигура» или просто «rt triangle». Это не будет соответствовать «sort of triangular», потому что слова «sort of» не указаны как игнорируемые, и это не будет соответствовать «triangle, right?», потому что порядок неправильный.
Подсистема сопоставления шаблонов распознавала орфографические ошибки, поэтому слова «triangel» или «triangl» соответствовали бы образцу примера. Автор урока мог использовать specs
команду, чтобы задать, насколько педантичной была система в отношении орфографических ошибок.
Алгоритмы сопоставления шаблонов, используемые различными реализациями TUTOR, различались в деталях, но обычно каждое слово во входном тексте и каждое слово в шаблоне преобразовывались в битовые векторы . Чтобы увидеть, соответствует ли слово, введенное студентом, слову шаблона, расстояние Хэмминга между двумя битовыми векторами использовалось в качестве меры степени различия между словами. Битовые векторы обычно имели длину 60 или 64 бита с полями для присутствия буквы, присутствия пары букв и первой буквы. В результате количество единичных битов в исключающем или двух таких битовых векторах приблизительно соответствовало степени фонетического различия между соответствующими словами. [9]
Все ранние представления структуры управления блока оценки TUTOR были запутанными. Однако в современных терминах блок оценки можно описать как итеративную структуру управления , которая завершается, когда ввод студента оценивается как правильный. Тело этой структуры управления состоит из ряда случаев , каждый из которых вводится командой сопоставления с образцом, такой как answer
или wrong
. Все выходные данные, созданные телом цикла оценки в предыдущем цикле, стираются с экрана перед следующим циклом.
Рассмотрим этот пример: [10]
неправильно <это, есть,а> квадратв 1501написать У квадрата четыре стороны.
В случае, если студент вводит «квадрат» или «квадрат», ответ считается неверным, и текст «У квадрата четыре стороны.» выводится, начиная со строки 15 столбца 1 на экране. Этот вывод остается на экране до тех пор, пока студент не начнет вводить новый ответ, после чего он стирается, чтобы можно было вычислить ответ на новый ответ. Механизм, с помощью которого экран дисплея возвращается в предыдущее состояние, варьируется от реализации к реализации. Ранние реализации работали путем переключения терминала в режим стирания и повторного выполнения всего случая, который совпал. Некоторые более поздние реализации буферизовали вывод, произведенный во время оценки, чтобы этот вывод можно было стереть.
Команда join
была уникальной формой вызова подпрограммы. Она была определена как эквивалентная текстовой подстановке тела объединенного блока вместо самой команды объединения. [11] Таким образом, объединенный блок мог содержать часть блока оценки. Таким образом, хотя блок оценки концептуально является итератором, охватывающим ряд случаев , этот блок может быть произвольно разбит на подпрограммы. (Альтернативный вызов подпрограммы, do
команда, соответствовала обычной семантике, связанной с вызовами подпрограмм в других языках программирования.)
Студенческий терминал PLATO IV [12] имел плазменную панель размером 512 на 512 пикселей с аппаратной поддержкой построения точек , рисования линий и отображения текста. Каждый пиксель на терминале PLATO IV был либо оранжевым, либо черным. Терминал CDC PLATO V использовал монохромную черно-белую ЭЛТ для эмуляции плазменной панели. Встроенный набор символов имел 4 набора по 63 символа, каждый размером 8 на 16 пикселей, половина из них были фиксированными, половина — программируемыми. Язык Tutor обеспечивал полную поддержку этого терминала.
Существовало две системы координат [13]
Следующий пример иллюстрирует некоторые команды рисования Tutor. [14]
рисовать 1812;1852;пропустить;1844;1544круг 16,344,288рисовать 1837;1537;1535;1633;1833
Обратите внимание на использование точек с запятой для разделения последовательных координат в draw
команде. Это позволяет однозначно использовать точные координаты, разделенные запятыми. Обычно команда draw соединяет последовательные точки с сегментами линий, но, поместив skip
тег, draw
можно заставить команду концептуально поднять перо.
Теги в circle
команде дают радиус и точные координаты центра. Дополнительные теги могут указывать начальные и конечные углы для частичных окружностей.
Составление команд рисования вручную затруднительно, поэтому к 1974 году в систему PLATO был включен графический редактор для автоматизации этой работы. [15] Он мог работать только с командами рисования с постоянными координатами.
Следующий пример иллюстрирует некоторые инструменты рендеринга текста Tutor. [16]
название блокаразмер 9,5 $$ текст в 9,5 раз больше обычного размераповернуть на 45 $$ текст повернут на 45 градусовв 2519писать латыньразмер 0 $$ вернуться к обычному письмуповорот 0в 3125писать Уроки по Глаголам
Текст, отрисованный с нулевым размером и нулевым вращением, использовал встроенное аппаратное обеспечение для отрисовки символов терминала PLATO, в то время как отрисовка с ненулевым размером и вращением выполнялась с помощью линейных сегментов и, следовательно, значительно медленнее из-за скорости канала связи с терминалом.
Помимо уникальных механизмов оценки ответов, первоначальный набор управляющих структур TUTOR был довольно скудным. В середине 1970-х годов этот недостаток был устранен путем введения блоков if
, endif
с необязательными elseif
и else
разделами. Семантика этих управляющих структур была обычной, но синтаксис унаследовал обязательный отступ языка Tutor, предвосхищая отступ Python и добавляя уникальный непустой символ отступа, чтобы отличать отступ от строк продолжения.
Это проиллюстрировано в следующем примере: [17]
если n8<4. написать первую ветку. расчет n9⇐34иначеесли n8=4. написать вторую ветку. сделайте что-нибудьеще. написать ветку по умолчанию. если n8>6. . написать специальную ветку. конец_фэндиф
( Стрелка назначения в calc
операторе отображается неправильно в некоторых браузерах. Она похожа на <=, но выглядит как один символ. На клавиатуре PLATO IV для нее была отдельная клавиша.)
Тот же синтаксис использовался для loop
, endloop
блоков с семантикой, сопоставимой с циклами while в обычных языках программирования. Это проиллюстрировано в следующем примере [18]
петля n8<10. писать в цикле. суб1 n8повторная петля n8≥5. запись все еще в цикле. сделайте что-нибудьвыходной контур n8<3. запись все еще в циклеконечный циклписать вне цикла
Обратите внимание, что команды reloop
and outloop
в некоторой степени аналогичны операторам continue
and break
языков, основанных на C , за исключением того, что они должны располагаться на уровне отступа изменяемого ими цикла, и у них есть тег условия, который указывает, когда должна произойти указанная передача управления. Это делает конструкцию более мощной, чем в других языках, поскольку любая строка внутреннего цикла может завершить или перезапустить несколько внешних циклов одним оператором.
Синтаксис выражений TUTOR не оглядывался на синтаксис FORTRAN и не ограничивался плохо разработанными наборами символов той эпохи. Например, набор символов PLATO IV включал управляющие символы для нижнего и верхнего индекса , а TUTOR использовал их для возведения в степень. Рассмотрим эту команду [19]
круг (41 2 +72,6 2 ) 1/2 ,100,200
Набор символов также включал общепринятые символы для умножения и деления, ×
и ÷
, но в более радикальном отходе от соглашений, установленных FORTRAN, он допускал неявное умножение, поэтому выражения (4+7)(3+6)
и были допустимыми, со значениями 99 и 15,9 соответственно (op cit). Эта функция рассматривалась как существенная. Когда студенты вводили числовой ответ на вопрос, они могли использовать операторы и переменные и стандартную алгебраическую нотацию, а программа использовала команду TUTOR "compute" для компиляции и запуска формулы и проверки того, что она численно эквивалентна (или находится в пределах ошибки округления с плавающей точкой) правильному ответу.3.4+5(23-3)/2
Язык включал предопределенную константу, названную греческой буквой пи (π), с соответствующим значением, которое можно было использовать в вычислениях. Таким образом, выражение можно было использовать для вычисления площади круга, используя встроенную константу π, неявное умножение и возведение в степень, обозначенные верхним индексом.πr2
В TUTOR сравнение с плавающей точкой x=y
определялось как истинное, если x
и y
были приблизительно равны. [20] Это упрощало жизнь для математически наивных разработчиков учебных уроков, но иногда вызывало головную боль у разработчиков численно сложного кода, поскольку было возможно, что x<y
и x≥y
могли быть истинными одновременно. [21]
Как язык авторства, TUTOR начинался с минимальными ресурсами памяти и только с самыми грубыми инструментами для манипулирования ими. Каждый пользовательский процесс имел частный сегмент данных из 150 переменных, и можно было присоединять общие блоки , что позволяло осуществлять межпользовательское взаимодействие через общую память.
В системе PLATO IV слова были 60-битными, в соответствии с семейством компьютеров CDC 6600. Некоторые более поздние реализации изменили это до 64 бит. [22]
Частная область памяти каждого процесса состояла из 150 слов каждое, называемых переменными ученика; значения этих переменных были постоянными, следуя за отдельным пользователем от сеанса к сеансу. Они были адресованы как n1
through, n150
когда использовались для хранения целочисленных значений, или как v1
through v150
, когда использовались для хранения значений с плавающей точкой. [23]
Урок TUTOR мог присоединить один регион общей памяти объемом до 1500 слов с помощью common
команды. Каждый урок мог иметь неименованный временный общий блок, содержащий переменные, общие для всех пользователей этого урока. Такие блоки создавались, когда урок начинал использоваться, и освобождались, когда урок становился неактивным. Напротив, именованные общие блоки были связаны с блоком урока (файлом на диске). Общая память адресуется как nc1
through nc1500
(для целых чисел) или vc1
through vc1500
(для чисел с плавающей точкой). [24]
Если 150 переменных ученика было недостаточно, урок мог использовать storage
команду для создания дополнительного сегмента частной памяти объемом до 1000 слов. Этот сегмент существовал только в пространстве подкачки, но его можно было сопоставить с переменными ученика или общими переменными. Например [25]
общий 1000хранение 75stoload vc1001,1,75
nc1
В этом примере to определяется nc1000
как общий безымянный общий блок, тогда как nc1001
to nc1075
— это частное хранилище.
Команда Tutor define
была очень похожа на директиву препроцессора C. Это был единственный способ связать мнемонические имена с переменными. Программист должен был статически выделять память и присваивать имена переменным. Рассмотрим следующий пример: [26]#define
определить мои имена первый=v1, второй =v2 результат=v3
Это создает набор определений, именованных mynames
определением трех переменных с плавающей точкой. Пользователям было рекомендовано, что " нигде в вашем уроке не должно быть никаких v3 или v26, кроме как в define
самом операторе . Поместите все ваши определения в самом начале урока, где у вас будет готовая ссылка на то, какие переменные вы используете". [27]
Функции можно определить с помощью семантики макроподстановки, как на этой иллюстрации: [28]
определить cotan(a)=cos(a)/sin(a)
В отличие от C, исходные правила области действия TUTOR были чистым "определением перед использованием" без каких-либо положений для локальных определений. Таким образом, формальный параметр, a
использованный выше, не должен иметь никакого предыдущего определения.
Позже, в ходе разработки TUTOR, с введением множественных именованных наборов определений, программисту был предоставлен явный контроль над тем, какие наборы определений были в силе в данный момент. Например, define purge, setname
он мог бы отбросить все определения в именованном наборе. [29]
Первоначальные инструменты TUTOR для работы с текстом были основаны на командах для определенных текстовых операций, например, pack
для помещения упакованной строки символов в последовательные переменные в памяти, search
для поиска одной строки внутри другой и move
для перемещения строки из памяти в память. [30] К 1975 году были добавлены более общие инструменты для массивов целых чисел и упакованных массивов. Например: [31]
определить сегмент, имя=начальная переменная, число бит на байт, с массив, имя(размер)=начальная переменная массив, имя (число строк, число столбцов)=начальная переменная
Сегментированные массивы , определяемые ключевым словом segment
, были сопоставимы с упакованными массивами в Pascal . Размер байта и то, должны ли элементы массива рассматриваться как знаковые или беззнаковые, полностью контролировались пользователем. Произвольные манипуляции с текстом можно было выполнять, устанавливая размер байта равным машинному размеру байта, 6 бит в реализациях с использованием display code , 8 бит в некоторых более поздних реализациях ASCII и расширенного ASCII . Обратите внимание на отсутствие какой-либо спецификации размерности массива для сегментированных массивов.
Общий механизм передачи параметров был добавлен в TUTOR в начале эпохи PLATO IV. Например: [32]
определить радиус=v1,x=v2,y=v3единица измерения варьируетсясделать полукруг(100,150,300)сделать полукруг(50)*единица полуокружности(радиус, x,y)радиус окружности, x,y,0,180нарисовать x-радиус, y;x+радиус, y
Обратите внимание, что формальные параметры, перечисленные в списке аргументов команды unit
, являются просто определенными именами для статически выделенных глобальных переменных. Семантика передачи параметров была указана как эквивалентная назначению во время передачи управления целевому устройству, и если фактические параметры были опущены, как во второй do
команде выше, эффект заключался в том, чтобы оставить предыдущие значения соответствующих формальных параметров неизменными.
Локальные переменные были добавлены в TUTOR где-то около 1980 года. Авторы уроков, желающие использовать локальные переменные, должны были использовать lvars
команду для объявления размера буфера, используемого для локальных переменных, до 128 слов. [33] После этого блок, использующий локальные переменные, мог начинаться следующим образом: [34]
единица какая-то ИМЯ1,ИМЯ2,ИМЯ3(РАЗМЕР) ИМЯ4=КОНСТАНТА плавающий:ИМЯ5,ИМЯ6,ИМЯ7(РАЗМЕР) целое число, ЧИСЛО БИТОВ:ИМЯ8,ИМЯ9 целое число, ЧИСЛО БИТОВ, со знаком: ИМЯ10 целое число:ИМЯ11
Строки продолжения команды, unit
приведенной выше, считаются строками неявной define
команды с локальной областью действия . Обычные определения в терминах переменных студента, такие как n150
могут использоваться в таком локальном define
, но формы, показанные здесь, все автоматически связывают имена с позициями в блоке памяти, выделенном командой lvars
. Доступная документация TUTOR не обсуждает, как выделяются локальные переменные.
Существовало значительное семейство языков, связанных с TUTOR, каждое из которых было похоже на исходный язык TUTOR, но имело отличия. В частности, TUTOR был компонентом системы (система компьютерного образования PLATO), которая работала на определенном оборудовании мэйнфрейма CDC. Для эффективности в TUTOR были некоторые аппаратно-зависимые элементы (например, переменные, которые были 60-битными словами, которые можно было использовать как массивы из 60 бит или как 10 шестибитных символов и т. д.). Кроме того, TUTOR был разработан до появления графического пользовательского интерфейса (GUI) для Windows.
Язык microTutor был разработан в проекте PLATO в UIUC, чтобы разрешить запуск частей урока на терминалах, содержащих микрокомпьютеры, с подключением к коду TUTOR, работающему на мэйнфрейме. Диалект microTutor также был языком программирования системы Cluster, разработанной в UIUC и лицензированной TDK в Японии; система Cluster состояла из небольшой группы терминалов, подключенных к мини-компьютеру, который обеспечивал хранение и компиляцию. Tencore Language Authoring System является производной от TUTOR, разработанной Полом Тенцаром для ПК и продаваемой Computer Teaching Corporation. cT был производной от TUTOR и microTutor, разработанной в Carnegie Mellon, которая позволяла программам запускаться без изменений в оконных графических средах на системах Windows, Mac и Unix/Linux.
Эмулятор терминала Pterm, разработанный Cyber1, поддерживает язык microTutor, начиная с версии 6. [35] [36]