Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2009-12-27 21:12:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:История, Компутерщина

JOVIAL
Как я уже говорил, ответ к моей позавчерашней загадке - JOVIAL:

Jules' Own Version of IAL (IAL - International Algebraic Language - раннее название для Algol-58, послужившего отправной точкой для разработчиков языка). Пожалуй, один из первых языков программирования, позволяющий нормально работать с железом. Собственно и делался он для программирования SAC Communication and Control System (SACCS): напрограммировавшись при разработке SAGE (SemiAutomatic Ground Environment) на ассемблере, Jules Schwartz и компания в 1959 году решили придумать что-то получше. Характер задачи оказал решающее влияние на язык: поскольку он делался для программирования большой интерактивной и распределенной системы реального времени, то им пришлось во-первых принимать во внимание вопросы эффективности и низкоуровневого программирования, и, в отличие от тогдашнего mainstream'a (тогда языки были в основном специализированными - для коммерческих задач, для вычислительных etc) не замыкаться в отдельной области.

Получилось в общем неплохо, а для того времени - очень хорошо. Когда я читал описание, я с тоской вспоминал те времена, когда приходилось программировать на Фортране - в смысле, насколько бы все было проще и лучше. Реализован язык был очень быстро - первые компиляторы появились в 1960 году, а в 1961 JOVIAL уже был реализован на себе самом (вероятно второй в истории компилятор, написанный методом раскрутки - первым был NELIAC). С практическим применением, несмотря на неотлаженность и медленность компилятора, тоже все оказалось довольно хорошо и с тех пор в USAF очень любят JOVIAL и до сих пор его используют.

Забавно происхождение названия: в предварительных проработках язык фигурировал как OVIAL (Our Version of IAL). Когда дело подошло к более формальной разработке, граждане озадачились тем, что название вызывает нездоровые ассоциации, и что надо бы облагородить звучание. Облагораживать решили при помощи добавления буквы J в начало и оставалось только придумать, что бы это могло значить. В порядке хохмы была предложена вышеприведенная расшифровка, после чего, ничего не решив, публика разъехалась по домам. А спустя некоторое время Jules Shwartz обнаружил, что название уже вписано в разнообразные контракты и техзадания и менять уже себе дороже.


Чем язык интересен:

Он будучи "широко известен в узких кругах" оказал несомненное влияние на развитие языков программирования:"Официально" оно признано только в Coral66 и Ada, но imho несомненно еще в нескольких языках (что забавно - в Wiki очень много написано про его военную карьеру, но ни слова не сказано о том, чем он собственно говоря, замечателен):

Во-первых - в Pascal - перечислимые типы, диапазоны и модификатор packed - прямое заимствование, записи с вариантами, думаю, тоже попытка адаптировать интересные, хотя и кривоватые записи JOVIAL.

В PL/I влияние тоже очевидно - система типов до степени смешения напоминает JOVIAL-овскую, хотя enum-ы и диапазоны они выкинули, зато остальное цветет буйным цветом - в том числе "атрибутная" форма описания типов.

Ну и несомненно и сильно влияние JOVIAL на Ada: что скорее всего связано с происхождение обоих языков: Довольно естественно, что DoD при формулировке требований не хотел расставаться с уже имеющимися вкусностями и более или менее все возможности JOVIAL переехали в техзадание на Ada.


Теперь собственно про сам язык:

Излагаю я по опубликованной в 1963 году в CACM спецификации языка (версия 1973 года уже куда более наворочена). Примеры в основном взяты оттуда же.

Во-первых - обещанные enum'ы

Пример я уже показывал:

 ITEM RUNWAY'CONDITION S V(OK) V(WET) V(ICY) V(SNOW) V(BLOCKED)$

ITEM - это ключевое слово, обозначающее объявление переменной, RUNWAY'CONDITION - имя переменной ("'" был просто буквой, которую можно было использовать для повышения удобочитаемости имен). S - тип переменной - перечисление (сокращение от Status). Далее идут значения. $ обозначает конец объявления.

Использовать это можно было примерно так:

IF RUNWAY'CONDITION EQ V(OK)$ ...

Диапазоны

При описании переменных можно было специфицировать диапазон их значений:
ITEM CEILING U 0..511$
Беззнаковое с диапазоном значений 0..511 (диапазон можно было специфицировать и для дробных чисел и с плавающей точкой тоже). Проверка не выполнялась, описание фигурировало как своего рода комментарий и hint компилятору.

Другие типы данных

Целых в языке строго говоря не было - были знаковые и беззнаковые числа с фиксированной двоичной точкой (привет от PL/I и Ada), еще был такой курьезнейший, но в условиях тех времен весьма практичный тип: "сдвоенные" (Dual) числа с фиксированной точкой. Характеризовались добавлением модификатора D. Смысл состоял в том, что в тогдашних машинах слова были весьма длинные - и в одной слово вполне можно было впихнуть два значения не слишком большой разрядности. Dual значения и содержали пару чисел, а арифметика etc выполнялась одновременно над соответствующими компонентами пар (в случае, например, сложения Dual значения с обычным обычное "раздваивалось"). Вещь кривоватая, но практичная. Недавно оно к нам вернулось в виде разнообразных MMX :)

Таблицы и layouts

Как известно, авторы большинства ранних языков при попытках придумать структуры изобретали нечто весьма экзотическое. JOVIAL не исключение. Его создатели почему-то решили, что структуры такая хорошая вещь, что их обязательно должно быть много и потому они обязательно должны образовывать массив. В результате получилось нечто странное под названием "таблицы" (tables).

Таблица - это массив структур. Описывается довольно прямолинейно:

TABLE AIRBASE'WEATHER R 85 S D$
  ITEM REPORT'HOUR    A 5 U 0..23$
  ITEM REPORT'MINUTE  A 6 U 0..59$
  ...
  ITEM RUNWAY'CONDITION S V(OK) V(WET) V(ICY) V(SNOW) V(BLOCKED)$  
  ...
END
Атрибут A nnn задает количество бит в значении. Атрибут R 85 задает то, что таблица имеет фиксированный размер 85 элементов (есть еще V max-size - таблицы "переменного" размера: то есть резервируется все равно "по максимуму", но при таблице хранится счетчик элементов.

Более забавны два других атрибута:

Атрибут D задает способ упаковки: он может принимать три значения: Dense, Medium и No. N означает, что каждое поле в таблице занимает отдельное слово/группу слов, D означает, что поля упаковываются как можно плотнее, M - что поля упаковываются на границы "естественных" подполей слов (полуслова etc - в зависимости от архитектуры) - на современных архитектурах примерным аналогом M будет отказ от выравнивания полей на границы слов (атрибут можно задавать и индивидуально для полей).

Аттрибут S - это атрибут, управляющий расположением таблицы. Значения у него два: Serial и Parallel. Пожалуй, единственный атрибут, оправдывающий превращение структуры в массив. Он определяет как располагать поля в памяти: S подразумевает привычный нам последовательное расположение "запись за записью". А вот P пожалуй не имеет аналогов: он означает, что сначала идет массив из всех первых полей структуры, потом - из всех вторых, и так далее (на самом деле даже хитрее - если несколько последовательных полей влезают в одно слово, они все-таки размещаются вместе, и очередной массив набирается уже из таких n-ок. Вещь странноватая, но в случае необходимости заниматься оптимизацией представления данных весьма полезная.

Еще одна фишка состоит в возможности указывать точное расположение полей в записях:

ITEM KEY A 6 U 3 12$
Поле KEY (шириной 6 бит) располагается в 3-ем слове начиная с 12-го бита. Кажется мелочью, но все, кто программировал низкоуровневые железки, фичу заценят.

Оператор DEFINE

В отличие от подавляющего большинства создателей языков тех времен, авторам JOVIAL'a таки пришла в голову идея, что выписывать по много раз одни и те же списки атрибутов неудобно и несопровождабельно и что с этим что-то надо делать. Идея для тех времен наверное отличалась новизной и оригинальностью: это был макрооператор DEFINE без параметров (в J73 он уже обзаведется параметрами):
DEFINE RUNWAY'CONDITION'VALUES "V(OK) V(WET) V(ICY) V(SNOW) V(BLOCKED)"$
В пояснениях, думаю, не нуждается.

Оператор TEST

Видимо, первое явление Христа бурому медведю оператора continue народу имело место тоже в JOVIAL. Там это называлось оператор TEST и имело ровно тот самый смысл. Кроме прочего, тамошний TEST позволял специфицировать на какой именно уровень следует выходить - просто путем указания переменной-параметра соответствующего цикла:
FOR I = 1,1,100$
BEGIN
   FOR J=I,1,100$
   BEGIN
     IF I+J EQ 150$ TEST I$
   END
END
Странное ключевое слово, выбранное для этого оператора, объясняется тем, что имеется в виду "переход на проверку условия выполнения следующей итерации цикла"

Мелочь, а приятно: оператор итерации по элементам таблицы (как бы массива):

FOR I = ALL (BASES)$ ... 
Тут все понятно.

Прикольный оператор ==

Смешной довольно - выполняет exchange значений по обе стороны оператора:

Работа с битовыми/байтовыми полям

Вещь, которой почему-то с тех пор практически нигде не было: с одной стороны, эмулируется она, конечно, несложно (хотя, когда битовое поле пересекает границы слова - не так уж и несложно), с другой - настолько обычна, что причины ее отсутствия непонятны, да и в смысле эффективности скорее всего встроенная конструкция может быть реализована лучше:

Итак: есть конструкция

BIT ($index-of-first-bit [, index-of-last-bit]$)

Обозначает ровно то самое. Может быть и получателем в операторе присваивания. Если значение занимает несколько слов, диапазон может пересекать границу слова. Например:

BIT($0,6$)(COLUMN) = BIT($0,6$)(COLUMN) + (I - 2)

Теперь еще раз напомню, что дело происходит во времена, когда у машин слова длинные, а единицей адресации является слово. Термин "байт" уже в ходу - но в смысле, что скажем 37-разрядное слово содержит 6 6-битных байтов: байт - это стандартная для данной машины группа битов в слове, которая используется для хранения символа. В некоторых архитектурах работа с байтами поддерживалась аппаратно, в некоторых все делалось руками. Потому кроме BIT есть модификатор BYTE с аналогичной семантикой, только он манипулирует не битами, а байтами.

Для комплекта отмечу еще модификаторы MANT и CHAR, которые "вырезают" из вещественного числа мантиссу и характеристику. Пример из спеки: преобразование плавающего числа в представление с фиксированной точкой:

MANT (BETA) * 2 ** CHAR (BETA)

Ассемблерные вставки

Опять же - сделано было довольно забавно: Был оператор DIRECT список-команд JOVIAL, внутри которого можно было вставлять набор команд ассемблера. Для доступа к переменным была псевдокоманда ASSIGN, которая позволяла пересылать данные между переменными программы и регистром-аккумулятором. Мелочь - но опять-же - очень нужная в реальной жизни даже сейчас.

Дальнейшее развитие

Как уже говорилось - в 73 году вышел стандарт языка: там уже DEFINE обзавелся параметрами, завелась условная компиляция, появились указатели и динамическое управление памятью etc etc. Но это уже не очень интересно, поскольку к тому времени новизна этих фич уже подутратилась.

Тем не менее - JOVIAL imho заслуживает всяческого внимания хотя бы уже за то, что именно он, а не C, является первым универсальным языком, на котором действительно можно писать программы не испытывая необходимости постоянно фиксить нештатные ситуации ассемблерными вставками или совсем уж низкоуровневым хакерством с битиками и адресами.



(Добавить комментарий)


[info]qwerty
2009-12-27 22:28 (ссылка)
А не хочешь ли ты сделать полезное дело - поизлагать историю языков программирования (возможно, в некоторых разрезах) студентам?

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2009-12-27 22:58 (ссылка)
Да можно - а в каком контексте?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-27 23:30 (ссылка)
Например, на м-м с/с или с/к для старших курсов организовать. Авось, приживется и начнет само жить раньше, чем надоест.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-27 23:38 (ссылка)
А кто делать будет - мы же тогда на четверых это устраивали. А сейчас все вроде, кроме меня и разбежались. Ну [info]senormouse@lj еще есть....

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-27 23:51 (ссылка)
Компанией, конечно, интереснее, но я в свое время в одиночку 2-3 интересных мне с/к и с/с вел и не переутомился. В данном конкретном мероприятии по естественным причинам я могу поучаствовать в обсуждениях, а лично максимум пару раз в год. Технически, наверно, могу регулярно поучаствовать удаленно, но практически не пробовал и потому опасаюсь.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-27 23:55 (ссылка)
Можно (и вероятно даже правильно) начать с другого - c подборки текстов вроде того, который я про Jovial сделал - и несложно и если у меня под рукой будут скажем тексты про Self и прочие "твои" языки - то и рассказывать будет куда проще.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-28 00:11 (ссылка)
С этим проблем нет, но хорошо бы еще обсудить, в каких разрезах это излагать - как историю языков, идей, людей или некоторого винегрета из перечисленного.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-28 03:54 (ссылка)
Я бы для начала сделал бы акцент на языки: типа составить расписание и раз в 1-2 месяца выдвать по продукту. Как раз к осеннему семестру будет уже база....

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-28 04:49 (ссылка)
Ну, давай. Часов в стандартном полугодовом с/к, если не ошибаюсь, 32. За один раз имеет смысл рассказывать либо об одном, либо о связанных языках. Про какие будем рассказывать? Если про Смолток, то нужны как минимум Алгол-60 (к нему естественным образом 68 и Виртовское семейство), Лого, Симула-67 (к ней, видимо, Бета), собственно Смолток и Селф. Вкратце придется упоминать Васик, графическое междумордие, сборку мусора и динамическую компиляцию.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-28 17:45 (ссылка)
Алгол видимо идет в комплекте с Фордрянью, Algol-58 (он довольно другой) и JOVIAL как раз. Ну и Pascal и ко.

Симула с Бетой идут отдельно - возможно еще с O'Caml (точнее его объектной моделью).

Есть еще Cecil который как-то одновременно рифмуется и с объектностью и с Haskell.

Реально я думаю, что есть смысл не торопить события а попробовать поописывать интересные языки в примерно этом стиле. А там видно будет, как скомпоновать и стоит ли.

Из ОО я бы взялся за Симулу, Бету, O'Caml (который правда вряд ли стоит описывать кроме как "для комеплекта" - в силу общеизвестности) и может за Cecil.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-29 07:56 (ссылка)
Про ОО: если из исторической корректности (мероприятие же вроде про историю) этим термином называть то, что делали те, кого называют его создателями (А.Кэя с компанией), то, боюсь, это совсем другое. А именно - соорудить объектный вычислитель (виртуальный или в железе), к нему язык программирования уровня бэйсика, насквозь интерактивную среду программирования и хачить, хачить, хачить... Бета и ОКамл к такой объектности отношения не имеют. Бета - она про блочность. ОКамл - про внесение благородных элементов в умеренный контекст.

Про неописание ОКамла: поскольку цель показать появление и развитие идей и их взаимное влияние, то исключать нужно те языки, которые ничего существенно нового своим появлением в картину не внесли.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-31 12:30 (ссылка)
Ocaml как раз внес: единственный, кажется, статически типизированный язык в котором OO-subtyping структурный, а не декларативный.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-31 12:38 (ссылка)
Ну да, так и зачем его исключать? То, что он сейчас довольно активно используется, не повод - те, кто его пользует, вряд ли особенно задумываются о его месте в картине.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-31 14:17 (ссылка)
Я вот думаю, про А-60 писать или нет - с одной стороны вроде бы надо, да и фички там смешные есть, с другой - ...

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-31 14:48 (ссылка)
А в A-58 были все способы передачи параметров и локальные массивы с границами, определенными во внешних блоках?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-31 15:00 (ссылка)
Нет - с параметрами там вообще смешно было - они делились на входные и выходные: PROC p (a,b,c=d,e,f);...

То, что до = - входные, после - выходные. В Jovial перехало, хотя в J73 уже полный зоопарк включая copy-in-copy-out

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-31 15:06 (ссылка)
Тогда, очевидно, без 60 не обойтись - иначе не понятно, из чего выросла виртуальность в Симуле 67.

(Ответить) (Уровень выше)


[info]qwerty
2009-12-31 15:03 (ссылка)
Охренеть - Aлгол-58 теперь и в медицинском словаре. Скоро нас всех вылечат.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-31 15:11 (ссылка)
Гм. А вики утверждает, что B дожил до начала 90-х - и что в 87 даже какой-то MUD на нем написали...

(Ответить) (Уровень выше)


[info]qwerty
2009-12-31 12:45 (ссылка)
Кстати, про BCPL - B - C будем или нет?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-31 15:00 (ссылка)
Надо бы. Еще и про CPL можно.

(Ответить) (Уровень выше)


[info]qwerty
2009-12-28 07:59 (ссылка)
Потом, естественно, нужен Фортран, блевотный Кобол, Снобол, лавровый Лисп, пачка функциональщины, АПЛ, ПЛ/1 и Ц. Опционально Форт (к нему, видимо, Постскрипт). Фортресс на десерт к Фортрану, АПЛ и функциональщине.

Кстати, если делать с/с, вместо произведения текстов самим нужно снабдить исходными материалами студентов и задавать тон процессу.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-12-28 17:36 (ссылка)
c/c тут делать малополезно. Слишком непривычный материал.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2009-12-29 07:43 (ссылка)
В принципе, для 4-5 курсов делается и с/с - сначала личным примером показываешь, чего хочется, потом приглядываешь, чтобы не выродилось в хрень. Но мне тоже с/к больше хочется.

(Ответить) (Уровень выше)


[info]qwerty
2009-12-29 14:05 (ссылка)
Кстати, не недооцениваешь ли ты требуемое количество продукта? Академических часов в полугодовом с/к таки оказалось 36, приведенного выше текста в хорошем темпе без вопросов из зала достаточно этак минут на 30, ну максимум на академический час. Чудится мне, что в предположении, что нас двое, нужно либо доиться в 2-4 раза чаще, либо ждать не к осени. Это с учетом того, что в процессе можно и нужно дописывать.

(Ответить) (Уровень выше)


[info]vkni
2009-12-27 22:48 (ссылка)
Большое спасибо за рассказ. Очень интересно.

(Ответить)


[info]steinkrauz.livejournal.com
2009-12-28 00:24 (ссылка)
Спасибо, хороший рассказ. В очередной раз напомнил о том, как беден мир промышленного IA/win32 кодера.

И если последуете просьбе тов. qwerty, не забывайте, пожалуйста, и сюда материалы дублировать.

(Ответить)