Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[4]

проблему для таких устройств - их полную аппаратную несовместимость, что есть машинный код для одной модели телефона или КПК невозможно запустить на остальных типах устройств.

Кстати, учитывая ограниченную производительность процессоров мобильных устройств и малые объемы памяти, использование языка Форт компилируемого в байт-код кажется намного эффективнее, чем использование монстров типа Java. Вот только существуют ли телефоны, для которых есть исходный код их прошивок и простой механизм перепрограммирования, чтобы на практике проверить эффективность использования Форта, зашив вместо стандартной прошивки интерпретатор байт-кода ?

Поскольку интерпретация включает в себя преобразование кода программы в машинный код строчка за строчкой во время исполнения программы, то и Форт, и любой другой компилирующий язык должны работать намного быстрее. Скорость их работы складывается из нескольких компонент. Во-первых, использование стека позволяет сэкономить время на извлечение переменных из памяти, если выполняются операции с числами (стек можно разместить в быстрой кэш-памяти или разместить непосредственно в процессоре). Во-вторых, переход от примитива к примитиву и от слова к слову также занимает очень мало времени. В-третьих, в процессе исполнения программы Форт делает только минимальную проверку ошибок, поэтому не подключаются никакие "скрытые" программы для их обнаружения, например, если вы пытаетесь разделить число на 0. Проверка ошибок целиком возлагается на программиста. Поскольку форт-программа составляется и отлаживается слово за словом, это может при отладке сильно мешать, поэтому проверку ошибок можно предусматривать "по обстоятельствам". Наконец, программируя на Форте, приходится отчетливо представлять себе и учитывать, что и как делает компьютер, поэтому программа получается более эффективной.

Очень малая потребность в памяти, присущая Форту, вызывается применением шитого кода и пресжде всего низкоуровневостью команд языка. В отличие от других интерпретирующих языков не требуется, чтобы код исходной программы всегда находился в памяти. И в отличие от любого компилирующего языка каждый примитив и процедуры, определенные на машинном языке, хранятся в памяти в единственном экземпляре. Большинство же компиляторов добавляют к программе блоки машинного кода примитивов при каждом обращении к ним. Когда компилятор встречает в исходном коде вызов функции, он отыскивает в библиотеке определенные на машинном коде процедуры и размещает их в памяти, поэтому, если функция вызывается несколько раз, то в память будет помещено несколько копий машинного кода процедуры. Интерпретирующий язык с шитым кодом записывает процедуру в память только один раз и делает переход к ней из любого места, где она потребуется. Поэтому форт-программа может занимать в памяти значительно меньше места, чем эквивалентная программа, написанная, скажем, на Фортране. При этом время вызова и возврата из процедуры чаще всего мало, и потеря скорости по сравнению с inline-компиляцией этих процедур незначительна.

Наконец, Форт обладает потрясающей способностью управлять компьютером, поскольку на нем довольно легко определить новые примитивы, т.е. процедуры в машинных кодах, при условии что не используется виртуальная машина и байт-код. Если определение слова начинается с CODE, то все, что следует после этого слова, описывается на языке ассемблера и при ассемблировании превращается в машинный код, который становится частью определения этого слова. Описание вы найдете в гл. 16. Поскольку слова Форта можно легко комбинировать с мнемоникой ассемблера, он обладает мощью ассемблера и удобством языка высокого уровня. Очевидно, что программирование на форт-ассемблере не является обязательным, но приятно сознавать, что такая возможность имеется при необходимости.


2.3 Характеристики языков 2.3.1 Запоминаемость

Первые программы для ЭВМ выглядели как-то вроде:

00110101 11010011 11011001

Программисты вводили их, устанавливая ряды переключателей в положение "вкл."для единиц и "выкл." для нулей. Эти значения были "машинными инструкциями" для ЭВМ, и каждая заставляла ее производить некие элементарные операции типа "переместить содержимое регистра А в регистр Б" или "добавить содержимое регистра В к содержимому регистра А". Это оказалось несколько скучноватым.

Скука - мачеха изобретения, поэтому некоторые умные программисты осознали, что машину и саму можно затставить помочь им. Так они написали программу, которая переводила легкозапоминаемые аббревиатуры в труднозапоминаемые последовательности битов. Новый язык выглядел примерно так:

M0V В,А ADD С,А JNC REC1

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

2.3.2 Мощность языка

Программирование на языке ассемблера характеризуется соответствием "один-в-один" между каждой командой, которую набивает программист, и командой, которую исполняет процессор.

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

Это пожелание было удовлетворено "макроассемблером", более сложным ассемблером, который мог распознавать не только нормальные инструкции, но также специальные имена ("макро"). Для каждого из них макроассемблер транслирует пять или десять машинных команд, представленных этим именем, так, как будто программист написал их все полностью.

2.3.3 Абстрактность

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

X = Y ( 456 / А ) - 2

версия 26 октября 2005 г.ФОРТ


которые сильно похожи на алгебраические. Благодаря языкам высокого уровня инженеры, а не только странноватые бит-жокеи, смогли начать писать программы. BASIC и FORTRAN - примеры высокоуровневых языков. Очевидно, что языки высокого уровня мощнее, чем ассемблеры, поскольку каждая инструкция может компилироваться в десятки машинных команд. Но что более важно, эти языки уничтожают линейное соответствие между исходным текстом и результирующим машинным кодом.

Реальные инструкции зависят от каждого "выражения" в исходном тексте, взятом как единое целое. Операторы вроде + и = сами по себе не имеют смысла. Они - просто часть сложной символики, которая зависит от синтаксиса и позиции оператора в тексте.

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

2.3.4 Управляемость

Большинство компьютеров используют нечто большее, чем просто список инструкций для своей работы. Они также производят проверку различных условий и затем "скачки" в соответствующие части программы в зависимости от результата. Они также производят многократное "зацикливание" на одних и тех же участках кода, обычно контролируя при этом момент выхода из цикла.

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

Рис.1-1. Неструктурированный код, использующий инструкции типа "jump"\ или "GOTO".

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ПРОВЕРКА УСЛОВИЯ

ПЕРЕХОД

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ПЕРЕХОД

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ИНСТРУКЦИЯ

ПРОВЕРКА УСЛОВИЯ

ПЕРЕХОД

ПРОВЕРКА УСЛОВИЯ ПЕРЕХОД



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15]