Адмиралы и Грейс

Тема в разделе "WASM.ARTICLES", создана пользователем aa_dav, 11 дек 2023.

  1. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Вернёмся еще на немного в доисторическую эпоху динозавров от ЭВМ.
    Я уже давно обращал внимание на странный синтаксис арифметики в древних языках программирования — например ABAP от SAP/R3, где складываются числа вот такой многобуквенной конструкцией:
    Код (Text):
    1.  
    2. ADD x WITH y TO z
    3.  
    т.е., выражаясь современным языком: z=x+y.
    Или вот пример на языке COBOL: http://www.csis.ul.ie/cobol/examples/Accept/Multiplier.htm
    Код (Text):
    1.  
    2. MULTIPLY Num1 BY Num2 GIVING Result.
    3.  
    Оказалось, что у вопроса любопытная история и за ним стоит поистине эпическая фигура монументальной компьютерной леди — Невероятной Грейс.
    Грейс Хоппер — мало того, что женщина, но и программист первого в мире компилятора языка программирования.
    [​IMG]
    Грейс с детства была такой любознательной, что в возрасте семи лет разобрала семь будильников пытаясь понять как они работают. Эта тяга к знаниям вела её сквозь всю жизнь и в 1949–ом году привела к одной из первых полноценных ЭВМ — компьютеру UNIVAC.

    Архитектура UNIVAC довольно необычна даже для 60–х годов.

    Хотя слово в этой ЭВМ состояло из 72 бит, но машина применяла десятичное кодирование чисел. Каждое слово трактовалось как строка из 12 шестибитных символов (буквы, цифры, знаки препинания), а если в ячейке хранилось число то оно хранилось как 12 цифр в этой же самой кодировке (цифры кодировались начиная с символа с кодом 3). Однако еще первый символ отводился весь под знак и таким образом в эффективном числе было 11 значащих цифр. Машинные инструкции занимали 6 символов слова — в каждом слове помещалось поэтому две инструкции (они назывались левая и правая) при этом три первых символа означали обычно человекочитаемый код инструкции, а последние три символа чаще всего содержали цифры ссылающиеся на ячейку памяти с которой инструкция (однооперандная) работала — таким образом получилась, что в юниваке было 1000 ячеек памяти максимально.

    Забавно, что если, например, в инструкцию сложения загнать число состоящее не из символов десятичных цифр, то сумматор большую часть символов просто выплёвывал без изменения, хотя пара символов трактовались как числа выше девятки.

    Такое отношение к данным сильно отразится на линейке компиляторов, которые Грейс разработает на этой ЭВМ и ляжет в основу системы определения данных языка COBOL, который на 95% по словам самой Хоппер и будет состоять из её разработок.
    В COBOL данные описываются так: http://www.csis.ul.ie/cobol/course/DataDeclaration.htm
    После имени переменной идёт ключевое слово PIC и далее задаётся как бы посимвольная маска того что в переменной находится из следующих символов:
    Код (Text):
    1.  
    2. 9 — цифра числа
    3. X — любой символ
    4. A — символы от A до Z плюс пробел
    5. V — место где находится десятичная точка (сама точка не хранится)
    6. S — знак, может находится только в начале
    7.  
    Кроме того в круглых скобках можно записать число повторений символа слева для краткости.
    Таким образом аббревиатура S9(6)V9(3) означает число со знаком с шестью цифрами до запятой и тремя цифрами после запятой.

    Думаю понятно, что такой подход явно продиктован внутренним устройством UNIVAC.

    Но вернёмся к Грейс Хоппер — под руководством этой женщины был выпущен первый в мире компилятор, названный A–0. Далее он претерпел цепочку изменений A–1, A–2, A–3 и B–0.
    Любопытно, что программы на A–3 состояли из нумерованных строк, как в Basic 1.x, но при этом еще номера строк должны были быть окружены круглыми скобками и было доступно максимум 2 символа, таким образом официально в этом языке программы не могли превышать ста строк кода, которые еще размещались на перфокартах и каждая потому не могла быть длиннее 80 символов.
    Насколько я понял в линейке A–X Хоппер использовала математическую нотацию — x+sin(y) и так далее. Но как раз с B–0, известном еще как FLOW–MATIC происходит еще одна "революция сознания" — математическая нотация уступает место "человекочитаемому коду".
    Грейс становится еще и изобретателем концепции "natural language programming", т.е. программирования на понятном человеку языке.
    Между прочим смена буквы "A" на "B" в B–0 происходит слова "business" — бизнес, в то время как изначальная "A" означала "arithmetic" — арифметический язык (надо ли напоминать, что упомянутый в самом начале SAP/R3 — это как раз на 100% business?).
    Как уже отмечено выше в дальнейшем B–0 ляжет в основание языка COBOL, который до сих пор имеет огромное легаси в банковской сфере. Вообще это моё небольшое исследование родилось из замечания одного хорошего знакомого программиста, что у его компании появился клиент которому нужен обмен данными в формате чисел как раз из COBOL.

    Так вот, далее процитирую саму Грейс Хоппер из английской википедии:

    "I used to be a mathematics professor. At that time I found there were a certain number of students who could not learn mathematics. I then was charged with the job of making it easy for businessmen to use our computers. I found it was not a question of whether they could learn mathematics or not, but whether they would.... They said, ‘Throw those symbols out — I do not know what they mean, I have not time to learn symbols.’ I suggest a reply to those who would like data processing people to use mathematical symbols that they make them first attempt to teach those symbols to vice–presidents or a colonel or admiral. I assure you that I tried it."

    мой перевод:

    "Когда то я работала профессором математики. В то время я обнаружила, что некоторое количество студентов не могли обучиться математике. Далее мне поручили работу по упрощению применения компьютеров для бизнесменов. Тут уже я обнаружила, что не стоит вопрос смогут они обучиться математике или нет. Вопрос стоит в том будут ли они вообще её изучать.... Они говорили 'выкиньте эти символы отсюда, я не знаю что они означают и у меня нет времени заучивать символы'. Заранее отвечу тем, кто считает, что людям в обработке данных надо использовать математические символы — попробуйте сперва обучить тому что эти символы значат вице–президентов, полковников или адмиралов. Уверяю вас — я пыталась."

    Так вот откуда растут ноги у этих самых ADD x TO y — от вице–президентов и адмиралов с которыми Невероятная Грейс так и не смогла справится, что пришлось изобретать новое направление в языках программирования. :)
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Отличная гипотеза -) И вполне правдоподобно. Воякам ваще не свойственно долго думать (не ко всем воякам относится но таки да)
     
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    вообще-то малёхо странно всё это.. банковские работники уж точно дружат с арифметикой, а в военке целые направления, где без математики, скажем так, немного сложновато (арта, бомбометание, навигация..). потом та же ада тоже создавалась для военки. скорей всего она захотела поэкспериментировать и байку затем выдала для отвода глаз :)
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Мне это тоже сперва показалось дико, но подумав, я решил, что нельзя списывать со счетов эпоху - flow-matic разработан в середине 50-х годов прошлого века и по видимому грамотность была совсем совсем не так распространена и привычна как сейчас. И скорее всего типичная инструкция/шпаргалка для бухгалтера действительно описывала процесс извлечения НДС словами, а не формулами, что надо доходы просуммировать, вычесть расходы и потом умножать-делить. Академический стиль был не настолько вживлён в жизнь чтобы общаться с девушками которые обсчитывали гросс-бухи на счётах языком формул. И это касалось всего.
    И когда глядишь на то, как выглядел вычислительный центр с дорогостоящим оборудованием 100 лет назад, то явственно чувствуется, что реальность была осязаемо другой:
    [​IMG]
    Сейчас же уже десятки лет сызмальства детей в школах учат императивным языкам программирования и это всё уже реально неактуально и даже в чём то противоестественно.
     
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    aa_dav, не могу согласится, что публика в те времена была такой уж безграмотной - вот кто сейчас быстро сможет посчитать на счётах, чертить в ручную и пользоваться логарифмической линейкой??? потом, если мы возьмём бум инженерной деятельности, то он во многом был без компов (даже в западных странах). 1ые цифровые компы стали появляться в 4оых, к 70ым стали широко использоваться.. а к 2000ым уже сильно просела инженерная деятельность и сий факт замаскировали ростом игровых компов. в начале же выч техники все прогеры были сугубо инженерами, тч графоманство кобола уж никак невозможно записать на то, что те ребята не могли понять мат запись.
     
  6. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    На счёт мат. формул, у меня с этим не очень, и я люблю нотацию бейсика или др. ЯП. Т.е. когда формула сразу описывается на понятном ЯП. Ну а кобол это конечно дичь, хотя тогда это казалось нормально, вон калькуляторы в смысле дизайн, не сразу появился обще принятый, в какой-то момент РПН мог бы стать доминирующий если бы это изучали в школах.
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    кобол казался нормальным лишь очень ограниченному кругу извращенцев, но (конечно) по-своему уникальный яп :)
     
  8. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    На счёт этого кобола, а с чего взяли что это высокоуровневый ЯП? Что ассемблер, что этот ваш кобол: add eax,666 vs ADD 666 WITH a TO a
    Ну и хрееееньььь, я лучше на ассме буду кодить, хоть проекты на 100 млн строк чем этим. Ну что с них с пиндосов взять.
     
    Mikl___ и UbIvItS нравится это.
  9. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    А тут, кстати, есть еще вот какая фишка - после сабжевой заметки я давно уже покопался в том а что такое были эти "компиляторы" как говорилось изначально.
    Так вот первые из них были вовсе не компиляторами. Поэтому есть продолжение заметки вот такое:

    Как мы помним из рассказа выше - первые версии того что она называла компилятором назывались A-0, A-1, A-2 и A-3 в порядке совершенствования.
    Похоже что A-0 и A-1 не особо вышли из застенок лаборатории, поэтому первые публикации которые можно прочитать касаются уже A-2: http://bitsavers.trailing-edge.com/pdf/computersAndAutomation/195510.pdf (начиная с 15-ой страницы, англ.)
    Так вот - оказывается, что этот язык не очень то и компилятор, а скорее виртуальный ассемблер для виртуальной машины.
    Напомню еще раз что за машиной являлся сам UNIVAC - это была машина память которой состояла из тысячи 72-битных слов которые на машинном уровне разделялись на 12 шестибитных алфавитно-цифровых символа.
    Вообще само понятие "машинного слова" как именно "слова" судя по всему возникло как раз на этой первой американской полноценной ЭВМ - ибо ячейки памяти её действительно по факту являлись 12-буквенными словами.
    Даже числа представлялись как просто последовательности символов цифр в кодировке этой машины (символ нуля имел код 3, далее по нарастающей и сразу следом - буквы и некоторые знаки препинания) занимающих всё слово.
    Машинные инструкции состояли из 6 символов каждая, таким образом в одном слове их помещалось две - первую называли "левой", а вторую - "правой". Выполнялись они просто по очереди.
    Первые три символа отводились под код инструкции, а вторые три - под номер ячейки памяти, откуда и возникало ограничение в 1000 ячеек памяти у UNIVAC.
    Еще раз напоминаю, что нумерация осуществлялась сильно избыточно трактуя номер ячейки как алфавитно-цифровое представление в памяти в котором использовались только коды цифр, алфавитная же информация не имела смысла и по сути биты памяти не использовались рационально.
    Типичная последовательность инструкций для сложения двух ячеек памяти с номерами 111 и 222 выглядит примерно так:
    L00111 A00222
    ; первая (левая) инструкция в слове L00 загружает в аккумулятор содержимое ячейки 111
    ; (L от LOAD, остальные два символа триады кода инструкции добиты нулями)
    ; вторая - (ADD) - складывает аккумулятор с ячейкой 222
    S00333 ...... ; сохраняем аккумулятор в ячейку 333
    Я тут использовал не настоящие коды UNIVAC - просто для понимания общей концепции.
    В реальности буквы другие, но принцип такой.
    И вот приходит Грейс и делает компилятор A-0/1/2.
    Что из себя представляет A-2 на деле - это виртуальный ассемблер в котором каждое слово UNIVAC представляет собой одну длинную 12-символьную инструкцию.
    За счёт расширения длины инструкций они несут больше полезной нагрузки.
    Например почти все арифметические инструкции трёхоперандные - в них указываются три номера ячеек памяти для как бы A = B & C, где & это операция.
    Например сложение ячеек памяти выглядит так:
    AA0111222333
    Здесь первая буква A означает, что операция принадлежит к категории "Arithmetic" (арифметика), вторая буква A - что это операция "Add" сложения, последующий ноль просто добивает код операции до длины три и далее идут 3 номера ячеек памяти - сумма первых двух будет помещена в третью.
    Другой пример:
    TS0111000222
    T - класс тригонометрических процедур
    S - Sinus (Синус)
    все нули - просто добивка незначащих разрядов нулями
    В итоге в ячейку памяти с адресом 222 помещается синус от значения в ячейке памяти 111
    Этот ассемблер не знает еще меток - номера ячеек памяти программист должен был помнить сам.
    Все его упрощения - это лучшая систематизация операций по классам и трёхадресная система адресации.
    После прогонки через транслятор эти инструкции превращались в вызовы процедур нативного кода на UNIVAC.
    Таким образом A-0/1/2 это предтечи языков программирования - виртуальные ассемблеры.
    Версия A-2 получила побочное название ARITH-MATIC и по сути была больше похожа на библиотеку математических процедур с удобным, но ассемблероподобным синтаксисом их вызова - программирование на этом было подобно программированию на голых машинных кодах без меток и прочих удобств так привычных современному программисту.

    Но в A-3 происходит резкое усложнение концепций - эта штука как раз уже начинает походить на традиционный ЯВУ с математической нотацией и имеет брендовое название MATH-MATIC:
    Код (Text):
    1.  
    2. (2)  TYPE-IN ALPHA .
    3. (2A) READ A B C SERVO 4 STORAGE A IF SENTINEL JUMP TO SENTENCE 8 .
    4. (3)  READ D F SERVO 5 .
    5. (4)  VARY Y 1 (0.1) 3 SENTENCE 5 THRU 6 .
    6. (5)  X1 = (7*103*Y*A*SIN ALPHA)3 / (B POW D+C POW E) .
    7. (6)  WRITE AND EDIT A Y D E X1 SERVO 6 .
    8. (7)  JUMP TO SENTENCE 2A .
    9. (8)  CLOSE-INPUT AND REWIND SENTENCE 3 .
    10. (9)  CLOSE-OUTPUT SENTENCE 6 .
    11. (10) READ F G H N SERVO 4 STORAGE A IF SENTINEL JUMP TO SENTENCE 20 .
    12. (11) EXECUTE SENTENCE 3 .
    13. (12) X2 = (3 ROOT (E-G)+LOG (D+N)) / (F2.6*EXP H) .
    14. (13) WRITE EDIT F D F X2 SERVO 6 .
    15. (16) JUMP TO SENTENCE 10 .
    16. (20) STOP .
    17.  
    (код с вики)

    Таким образом совершенно верно замечание выше - мы действительно имеем плавную эволюцию от неудобного и многословного машинного кода UNIVAC к упрощению кода с помощью "виртуального ассемблера" где библиотечные процедуры типа SIN или TAN выглядели как просто инструкции виртуальной машины и только потом по настоящему к человекочитаемому коду с математическими формулами.
    И действительно сделать тут шаг в сторону "business модели" где вместо математических закорючек пишется словами конкретное действие ADD A TO B RESULT IN C было даже проще, чем парсить формулы.
     
  10. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    эти мат "закорючки" как-то сильно проще: "c = a + b" == 5 значащих символов + несколько пробелов и символ-разделитель. кобол же чудовищен как для прогера, так и для машины - такое графоманство попросту избыточно, даже хелоу ворлд в реферат превращается//
    Код (Text):
    1. IDENTIFICATION DIVISION.
    2. PROGRAM-ID. IDSAMPLE.
    3. ENVIRONMENT DIVISION.
    4. PROCEDURE DIVISION.
    5.     DISPLAY 'HELLO WORLD'.
    6.     STOP RUN.
     
  11. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Как видно код на A-3 тоже пестрит штуками типа "CLOSE-INPUT AND REWIND SENTENCE 3", т.е. он не проще в плане вот этих "сетапов для операций ввода-вывода".
    А речь про арифметику - на вики той же в статье про MATH-MATIC можно так же увидеть, что транслируется он не напрямую в машкоды UNIVAC, а в... A-2, т.е. виртуальный трёхадресный ассемблер разработанный Грейс ранее.
    И вот тут действительно происходит резкое упрощение в B-0: ADD x WITH y TO z действительно просто и естественно транслируется в трёхадресную инструкцию одноимённую A-2 и не требует разбора приоритетов, сохранений промежуточных результатов выражения и прочего - это реально проще транслировать в разы. Собственно тут видно как переплетаются все эти штуки в одну продолжительную серию мозговых штурмов и как новые концепции возникали по ходу внедрения предыдущих концепций.
     
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243