Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура_ЭВМ.doc
Скачиваний:
1
Добавлен:
31.07.2019
Размер:
827.39 Кб
Скачать

Новая область применения

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

  • APL: возможно самый необычный из существующих языков. Там используются не команды, а операторы, напоминающие математические символы, нет циклов, управления данными. APL — язык диалога, позволяющий вести подсчеты — довольно серьезные. Правда мне неизвестен ни один физик или математик, программирующий на APL.

  • LISP, Prolog: При программировании на С или Pascal вы вводите алгоритм. В LISP и Prolog все по-другому, они основаны на правилах: вводятся факты и связи и программа сама отыскивает решение проблемы. В восьмидесятых, когда ИИ был в моде, этим языкам предсказывали большое будущее, но это не сбылось.

  • Непривычная концепция: В центре внимания FORTH находился стек в роли памяти, в PEARL это было управление в реальном времени, а в OCCAM возможность запускать программу на нескольких компьютерах одновременно. Эти концепции ограничены различными условиями. Из-за маленькой памяти и медленных процессоров FORTH был популярен, однако его концепция отличается от всех остальных языков. PEARL был популярен, так как в распоряжении пользователей было не так много машинного времени, и укрепился в задачах управления, но не дальше. Сегодня PEARL заменяется С. OCCAM был тесно связан с семейством процессоров — транспьютерами T212, 414 и T800 компании Inmos и другие поставщики его не переняли.

  • Возможность легкого изучения: BASIC в этом превосходит всех. Однако многие используют BASIC как ступеньку к изучению других языков программирования. Ему просто недостает синтаксических элементов, которые есть в других языках.

Причины нераспространения концепций

Большинство творений неизвестно миру и большинству программистов. Вам знакомы SNOBOL или Pilot? Но есть видные примеры языков, которые не прижились:

Вы изобретаете новый язык — вместо того, чтобы улучшить старый

В 1970-71 годах возникли С и Pascal — два структурных языка программирования с различными притязаниями. Pascal как легкочитаемый язык для обучения и С как близкий к «железу» язык «Суперассемблера». Разработчик Pascal Николас Вирт создал язык Modula — на основе концепции, по которой видимыми снаружи были только модули с важной информацией, а потом объектно-ориентированный язык Oberon. В противовес ему был поставлен С++ — как объектно-ориентированное расширение С, позволившее программистам медленно перейти на эту концепцию, без перехода на другой язык. Modula и Oberon вдохновили другие языки, но сами не прижились. В сравнении с этим компания Borland, использовавшая концепции Modula и C++ в Pascal, стала с ним достаточно успешной.

Ваш язык слишком громоздкий

PL/1 и ADA это два языка, которые в свое время, когда они только появились, были достаточно мощными и обширными — это ограничивало их участие большими системами и многие программисты опасались перехода на них. Когда их запускали на маленькие системы, то другие языки переняли концепцию и причин вводить эти больше не было. PL/1 сегодня практически исчез. ADA используется в военных и воздушных/космических областях и изучается в университетах — потому что каждый язык является какой-либо частью ADA.

Ваша концепция слишком радикальна

Smalltalk это объектно-ориентированный язык, а именно он ориентирован только на объекты. В нем нет простых переменных. Smalltalk революционный язык, но существует мало «революционеров». Многие языки переняли объектную концепцию, но Smalltalk остался малораспространенным.

Почему программисты так здорово спорят

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

FORTRAN: язык-«динозавр», но достаточно хорош для вычислений;

COBOL: не язык программирования, а нечто для ученых-экономистов, хорошо знающих английский;

C: идеален для программистов, которые слишком глупы для ассемблера и четко читаемых программ и не понимают APL;

С++: для программистов на С, которые хотят заниматься объектно-ориентированным программированием, но не могут;

Pascal: для фанатиков порядка;

LISP: также забавен без скобок, как Бойс без шляпы;

BASIC: Спагетти-код для начинающих;

APL: понятен только математикам и физикам.

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

Это чисто физиологическая проблема: человек сразу видит недостатки нового языка, элементов нового языка, которые действительно новы, не так много. Если человек доволен старым языком, то он просто не хочет переходить на новый. И постоянно находит причины, по которым новый язык плохой. Даже в случае с языками, которые могут все, такими как ADA или C++ — тогда они просто слишком общие…

Также нельзя скрыть то, что в каждом языке есть элементы, которые нравятся конкретному программисту. Автор, например, перешел от BASIC к Pascal и ему понравились хорошо читаемые программы, разделение объявления переменных и самого кода. С напротив, кажется ему продуктом программистов, которым лень писать. Повсюду фигурные скобки и операторы, которые надо сначала надо расположить в уме. Другое считают именно это качество С замечательным — в основном потому, что так можно писать практически нечитаемую программу (многие программисты видят это как важный «художественный» элемент, позволяющий увековечить себя в хитрой программе).

Поэтому неудивительно, что часто новые языки программирования опираются на старые и существуют целые деревья, объединяющие различные типы языков. Совершенно точно никогда не будет существовать одного единственного языка программирования и каждый использующийся сейчас имеет право на существование — они укрепились вопреки многим другим.

Ассемблер

Основные инструкции языка

LEA (Load Effective Address) - Загрузка эффективного адреса

BT (Bit Test) - Проверка битов

BTC (Bit Test and Complement) - Проверка бита с его инверсией

BTR (Bit Test and Reset) - Проверка бита с его сбросом в 0

BTS (Bit Test and Set) - Проверка бита с его установкой в 1

RCL (Rotate operand through Carry flag Left) - Циклический сдвиг операнда влево через флаг переноса CF

RCR (Rotate operand through Carry flag Right) - Циклический сдвиг операнда вправо через флаг переноса СF

STC (Set Carry Flag) - Установка флага переноса в 1

CLC (CLear Carry flag) - Сброс флага переноса в 0

CMC (CoMplement Carry flag) - Инвертирование флага переноса

CLD (CLear Direction flag) - Сброс флага направления

STD (SeT Direction Flag) - Установка флага направления в 1

IDIV (Integer DIVide) - Деление целочисленное со знаком

IMUL (Integer MULtiply) - Умножение целочисленное со знаком

NEG (NEGate operand) - Изменить знак операнда

MOVSX (MOVe and Sign eXtension) - Пересылка со знаковым расширением

ENTER (setup parameter block for ENTERing procedure) - Устанавливает границы в стеке для локальных переменных процедуры.

LEAVE (LEAVE from procedure) - Выход из процедуры, использующей ENTER Удаляет из стека область локальных переменных, выделенную командой enter.

PUSHAD (PUSH All general Double word registers onto stack) - Размещение в стеке регистров общего назначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi, edi.

POPAD (POP All general Double word registers from the stack) - Извлечение всех регистров общего назначения из стека (порядок обратный предыдущей команде edi, esi ..).

PUSHFD (PUSH eFlags Double word register onto stack) - Размещение в стеке содержимого регистра флагов eflags.

POPFD (POP eFlags Double word register from the stack) - Извлечение расширенного регистра флагов из стека

LOOP (LOOP control by register ecx) - управление циклом по ecx loop метка

LOOPE/LOOPZ (LOOP control by register ecx not equal 0 and ZF=1)

LOOPNE/LOOPNZ (LOOP control by register ecx not equal 0 and ZF=0) - Управление циклом по ecx c учетом значения флага ZF

REP/REPE/REPZ/REPNE/REPNZ (REPeat string operation) -rep опкод

CMPS/CMPSB/CMPSW/CMPSD (CoMPare String Byte/Word/Double word operands) - Сравнение строк байтов/слов/двойных слов

SCAS/SCASB/SCASW/SCASD - Сканирование строки байтов/слов/двойных слов

LODS/LODSB/LODSW/LODSD (LOad String Byte/Word/Double word operands) - Сохраняет элемент цепочки в al/ax/eax.

STOS/STOSB/STOSW/STOSD (Store String Byte/Word/Double word operands) - Записывает al/ax/eax в данную цепочку (обратная операция - LODS/..).

MOVS/MOVSB/MOVSW/MOVSD (MOVe String Byte/Word/Double word) - Выполняет пересылку строк байтов/слов/двойных слов

SETcc (byte SET on condition) - Установка байта по условию

CMPXCHG (CoMPare and eXCHanGe) - Сравнение и обмен

XLAT/XLATB (transLATe Byte from table) - Преобразование байта

IN (INput operand from port) - Ввод операнда из порта

OUT (OUT operand to port) - Вывод операнда в порт

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]