Что такое программный код в информатике. Что такое программный код, применение, ошибки
 
» »

Что такое программный код в информатике. Что такое программный код, применение, ошибки

04.11.2019

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

Вам понадобится

  • - компьютер
  • - автоматический определитель языка
  • - в случае определения языка собственными силами - источники с описанием различных языков.

Инструкция

У вас есть несколько вариантов. Вы можете обратиться к специалисту с тем, чтобы он определил язык текста. Вы можете попробовать сами определить язык. Но на день самый быстрый способ определить язык для тех, у кого есть Интернет – это автоматический определитель .

Для быстрого способа используйте автоматический определитель языка, который иногда называют guesser. Сегодня разработаны различные определители языка, которыми можно воспользоваться бесплатно. В основном, определители языка отличаются количеством языков, которые они распознают, и словарной базой в каждом языке .

Определитель работает по следующей схеме. Он разбивает текст, который вы ввели в соответствующее поле, на слова. Слова сравниваются с теми, что находятся в базе определителя. Затем он подсчитывает количество совпадений слов разных языков и показывает результат – наиболее подходящие язык или языки (их может быть несколько).

Обратите внимание

Полученный результат не может гарантировать 100%-ого качества. И автоматический определитель языка честно вам об этом скажет, указав вероятность правильного ответа.

Для того, чтобы при проверке текста получить грамотный ответ и быть уверенным в нем, пользуйтесь некоторыми правилами работы.
1) Минимальное количество слов для определения – не менее 20-и. Однако помните, чем больше вы напишите предложений, тем больше вероятность правильного определения языка.
2) Используйте несколько программ-определителей.
3) Если есть возможность, выберите ту часть текста, по которой определение будет самым эффективным.
4) Если есть возможность, проверьте текст и исправьте ошибки.

Источники:

  • http://mrtranslate.ru/guessers.php

Необходимость иметь собственный сайт на сегодня испытывают многие компании, а также частные лица, поэтому так востребована информация на тему разработки и продвижения интернет-проектов. Многих интересует вопрос — как самостоятельно создать сайт, программный код для которого является подобием фундамента для дома? Попробуем разобраться в этом вопросе, углубившись в тему веб-разработки.

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

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

Сперва HTML и CSS

Основой веб-документа является код, написанный на языке разметки HTML. Язык разметки не стоит путать с языком программирования, а в чем собственно заключается разница подробно написано . В принципе, с помощью набора команд, который предлагает для разработчика сайта HTML, можно задавать все необходимые параметры статичного веб-документа — расположение элементов (блочная разметка), заголовки, абзацы, таблицы, изображения и т.д. А с помощью CSS, специальной надстройки для HTML, можно позиционировать все перечисленные объекты разметки, менять их стиль — цвет, размер, формат и т.п.

Потом JavaScript

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

И наконец PHP

В случае, когда требуется написание сложных и объемных кодов, например для форумов или гостевых книг, программисты обращаются за помощью к серверным языкам программирования, и в частности к . Коды PHP выполняются на стороне сервера, поэтому их работа может быть несколько замедлена, поскольку зависит от скорости соединения с удаленным компьютером и степени его загруженности. С помощью PHP и команд SQL (специальный язык запросов к реляционной базе данных) можно организовать взаимодействие сайта с базами данных и создавать интерактивные интернет-проекты – форумы, интернет-магазины, доски объявлений, различные каталоги и т.д.

Основа сайта — программный код was last modified: Март 3rd, 2016 by Admin

Теперь, когда вы понимаете концепцию программирования, мы рассмотрим исходный код – его главные составляющие и принципы работы с ними.

Эта статья в цикл статей о разработке для начинающих, .

Часть 2 – Исходный код

Многие языки программирования поставляются со множеством библиотек. Они обычно называются SDK (комплекты разработки программного обеспечения). Загружаются вместе с компилятором для дальнейшего создания технологий, приложений и проектов. Также существуют фреймворки , созданные, чтобы облегчить разработку проекта и объединить его различные составляющие.

Некоторые идентификаторы в комплекте с выбранным языком не могут использоваться в качестве идентификатора пользователя. Примером является слово string в Java. Такие идентификаторы вместе с ключевыми словами называются Зарезервированными Словами . Они также являются особыми.

Все ключевые слова являются зарезервированными. Также слова, которые вы выбираете, должны иметь смысл для тех, кто впервые их видит.

Основные типы данных

Исходный код – сосредоточение разных типов даннх: числа (3, 5.7, -100, 3.142) и символы (M, A). В некоторых языках программирования числа разбиваются на подтипы, такие как integers (целые числа).

Целые числа могут быть знаковыми и беззнаковыми , большими и малыми. Последние фактически зависят от объема памяти, зарезервированного для таких чисел. Есть числа с десятичными частями, обычно называемые double и float , в зависимости от языка, который вы изучаете.

Также существуют логические типы данных boolean , которые имеют значение true или false .

Сложные типы данных

Указанные выше типы известны как элементарные, первичные или базовые. Мы можем создавать более сложные типы данных из приведенных базовых.

Массив (Array ) – это простейшая форма сложного типа. Строка (String ) – это массив символов. Мы не можем обойтись без этих данных и часто используем их при написании кода.

Комбинация символов – это строка . Чтобы использовать аналогию, строка для компьютера означает, что слово принадлежит человеку. Слово «термометр» состоит из 9 символов – мы просто называем это строкой символов. Обработка строк – это обширная тема, которая должна изучаться каждым начинающим программистом.

Сложные типы данных поставляются с большинством языков программирования, которые используются. Есть и другие, такие как системы классов. Это явление также известно как объектно-ориентированное программирование (ООП ).

Переменные

Переменные – это просто имена областей памяти. Иногда нужно сохранить данные в исходном коде в месте, откуда их можно вызвать, чтобы использовать. Обычно это место памяти, которое резервирует компилятор/интерпретатор. Нам нужно дать имя этим ячейкам памяти, чтобы потом их вспомнить. Рассмотрим фрагмент кода Python ниже:

pet_name = "Hippo" print pet_name

pet_name = "Hippo"

print pet_name

pet_name – пример переменной, и тип данных, хранящихся в pet_name , является строкой, что делает переменную строковой. Существуют также числовые. Таким образом, переменные классифицируются по типам данных.

Константы

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

Существуют строго типизированные языки программирования , в которых каждая переменная должна быть определенного типа. Выбрав тип один раз, вы больше не сможете его изменить. Java – хороший пример такого ЯП.

Другие же не предоставляют эти функции. Они являются свободно типизированными или динамическими языками программирования . Пример – Python.

Вот как объявить постоянное значение в JavaScript:

JavaScript

const petName = "Hippo"

const petName = "Hippo"

Литералы

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

В приведенном выше фрагменте слово «Hippo» является строковым литералом. Это всегда будет «Hippo», пока вы не отредактируете исходный код. Когда вы научитесь кодить, узнаете, как управлять литералами таким образом, чтобы оставлять неизменной большую часть кода.

Пунктуация/Символы

В большинстве написанных программ вы найдете различные знаки препинания в зависимости от выбранного языка программирования. Например, в Java используется больше знаков препинания, чем в Python.

Основные знаки включают в себя запятую (, ), точку с запятой (; ), двоеточие (: ), фигурные скобки ({} ), обычные круглые скобки (() ), квадратные скобки (), кавычки («» или » ), вертикальную черту (| ), слэш (\ ), точку (. ), знак вопроса (? ), карет (^ ) и процент (% ).

Добро пожаловать в мир программирования, где знаки препинания – ваши лучшие друзья. Скоро вы обнаружите, что в коде их всегда очень много.

Операторы

Шансы, что вы будете писать исходный код для выполнения какой-нибудь операции, крайне высоки. Любые языки программирования, которые мы используем, включают в себя множество операторов. Среди применяемых выделяют сложение (+ ), деление (/ ) умножение (* ), вычитание () и знак больше (> ).

Операторы обычно классифицируются следующим образом:

  1. Операторы присваивания . Они иногда истолковываются как equals , что неправильно. Равенство используется для сравнения двух значений. А вот оператор присваивания присваивает значение переменной, например pet_name = ‘Hippo’
  2. Арифметические операторы . Состоят из операторов для выполнения арифметических задач, таких как сложение и вычитание. Некоторые языки программирования предоставляют арифметические операторы, когда другие могут их не иметь в своем арсенале. Например, оператор модуля/остатка (% ) возвращает остаточное значение в операциях деления.
  3. Реляционные операторы . Используются для сравнения значений. Они включают в себя больше, меньше, равно, не равно. Их представление также зависит от того, какой язык программирования вы изучаете. Для некоторых ЯП не равно – это <> , для других же – != или !== .
  4. Логические операторы . Применяются для произведения логических операций. Обычно используемыми логическими операторами являются и , или , нет . Некоторые языки представляют эти операторы в виде специальных символов. Например, && для представления логического и , || – для или , и ! – для нет . Логические значения принято оценивать с помощью булевых значений true или false .

Комментарии

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

Компилятор игнорирует строки кода, которые являются комментариями.

Объявление комментариев разное для разных языков. Например, # используется для ввода комментариев в языке Python.

Вот пример комментария в Python:

# фрагмент программы для вычисления фибоначчи из N чисел

Java

// рекурсивная реализация Factorial import java.util.Scanner; class RecursiveFactorial { public static void main(String args) { Scanner input=new Scanner(System.in); System.out.print("Find the Factorial of: "); int num=input.nextInt(); System.out.println("Factorial of "+num+" = "+fact(num)); } static long fact(int n) { if(n < 2) return 1; return n * fact(n-1); } }

Есть мириады способов написать плохой код. К счастью, чтобы подняться до уровня качественного кода, достаточно следовать 15 правилам. Их соблюдение не сделает из вас мастера, но позволит убедительно имитировать его.

Правило 1. Следуйте стандартам оформления кода.

У каждого языка программирования есть свой стандарт оформления кода, который говорит, как надо делать отступы, где ставить пробелы и скобки, как называть объекты, как комментировать код и т.д.

Например, в этом куске кода в соответствии со стандартом есть 12 ошибок:

For(i=0 ;i

Изучайте стандарт внимательно, учите основы наизусть, следуйте правилам как заповедям, и ваши программы станут лучше, чем большинство, написанные выпускниками вузов.

Многие организации подстраивают стандарты под свои специфические нужды. Например, Google разработал стандарты для более чем 12 языков программирования. Они хорошо продуманы, так что изучите их , если вам нужна помощь в программировании под Google. Стандарты даже включают в себя настройки редактора, которые помогут вам соблюдать стиль, и специальные инструменты, верифицирующие ваш код на соответствию этому стилю. Используйте их.

Правило 2. Давайте наглядные имена.

Ограниченные медленными, неуклюжими телетайпами, программисты в древности использовали контракты для имён переменных и процедур, чтобы сэкономить время, стуки по клавишам, чернила и бумагу. Эта культура присутствует в некоторых сообществах ради сохранения обратной совместимости. Возьмите, например, ломающую язык функцию C wcscspn (wide character string complement span). Но такой подход неприменим в современном коде.

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

Гораздо важнее то, чтобы вы долго и хорошо думали перед тем, как что-то назвать. Является ли имя точным? Имели ли вы ввиду highestPrice заместо bestPrice? Достаточно ли специфично имя, дабы избежать его использования в других контекстах для схожих по смыслу объектов? Не лучше ли назвать метод getBestPrice заместо getBest? Подходит ли оно лучше других схожих имён? Если у вас есть метод ReadEventLog, вам не стоит называть другой NetErrorLogRead. Если вы называете функцию, описывает ли её название возвращаемое значение?

В заключение, несколько простых правил именования. Имена классов и типов должны быть существительными. Название метода должно содержать глагол. Если метод определяет, является ли какая-то информация об объекте истинной или ложной, его имя должно начинаться с «is». Методы, которые возвращают свойства объектов, должны начинаться с «get», а устанавливающие значения свойств - «set».

Правило 3. Комментируйте и документируйте.

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

Вдобавок, убедитесь, что для вашего приложения или библиотеки есть руководство, объясняющее, что ваш код делает, определяющий его зависимости и предоставляющий инструкции для сборки, тестирования, установки и использования. Документ должен быть коротким и удобным; просто README-файла часто достаточно.

Правило 4. Не повторяйтесь.

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

  • Создание справочников API из комментариев, используя Javadoc и Doxygen.
  • Автоматическая генерация Unit-тестов на основе аннотаций или соглашений об именовании.
  • Генерация PDF и HTML из одного размеченного источника.
  • Получение структуры классов из базы данных (или наоборот).

Правило 5. Проверяйте на ошибки и реагируйте на них.

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

Правило 6. Разделяйте код на короткие, обособленные части.

Каждый метод, функция или блок кода должн умещаться в обычном экранном окне (25-50 строк). Если получилось длиннее, разделите на более короткие куски. Даже внутри метода разделяйте длинный код на блоки, суть которых вы можете описать в комментарии в начале каждого блока.

Более того, каждый класс, модуль, файл или процесс должен выполнять определённый род задач. Если часть кода выполняет совершенно разнородные задачи, то разделите его соответственно.

Правило 7. Используйте API фреймворков и сторонние библиотеки.

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

Правило 8. Не переусердствуйте с проектированием.

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

Правило 9. Будьте последовательны.

Делайте одинаковые вещи одинаковым образом. Если вы разрабатываете метод, функциональность которого похожа на функциональность уже существующего, то используйте похожее имя, похожий порядок параметров и схожую структура тела. То же самое относится и к классам. Создавайте похожие поля и методы, делайте им похожие интерфейсы, и сопоставляйте новые имена уже существующим в похожих классах.

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

Правило 10. Избегайте проблем с безопасностью.

Современный код редко работает изолированно. У него есть неизбежный риск стать мишенью атак. Они необязательно должны приходить из интернета; атака может происходить через входные данные вашего приложения. В зависимости от вашего языка программирования и предметной области, вам возможно стоит побеспокоиться о переполнении буфера, кросс-сайтовых сценариях, SQL-инъекциях и прочих подобных проблемах. Изучите эти проблемы, и избегайте их в коде. Это не сложно.

Правило 11. Используйте эффективные структуры данных и алгоритмы.

Простой код часто легче сопровождать, чем такой же, но изменённый ради эффективности. К счастью, вы можете совмещать сопровождаемость и эффективность, используя структуры данных и алгоритмы, которые даёт ваш фреймворк. Используйте map, set, vector и алгоритмы, которые работают с ними. Благодаря этому ваш код станет чище, быстрее, более масштабируемым и более экономным с памятью. Например, если вы сохраните тысячу значений в отсортированном множестве, то операция пересечения найдёт общие элементы с другим множеством за такое же число операций, а не за миллион сравнений.

Правило 12. Используйте Unit-тесты.

Сложность современного ПО делает его установку дороже, а тестирование труднее. Продуктивным подходом будет сопровождение каждого куска кода тестами, которые проверяют корректность его работы. Этот подход упрощает отладку, т.к. он позволяет обнаружить ошибки раньше. Unit-тестирование необходимо, когда вы программируете на языках с динамической типизацией, как Python и JavaScript, потому что они отлавливают любые ошибки только на этапе исполнения, в то время как языки со статической типизацией наподобие Java, C# и C++ могут поймать часть из них во время компиляции. Unit-тестирование также позволяет рефакторить код уверенно. Вы можете использовать XUnit для упрощения написания тестов и автоматизации их запуска.

Правило 13. Сохраняйте код портируемым.

Если у вас нет особой причины, не используйте функциональность, доступную только на определённой платформе. Не полагайтесь на то, что определённые типы данных (как integer, указатели и временные метки) будут иметь конкретную длину (например, 32 бита), потому что этот параметр отличается на разных платформах. Храните сообщения программы отдельно от кода и на зашивайте параметры, соответствующие определённой культуре (например, разделители дробной и целой части или формат даты). Соглашения нужны для того, чтобы код мог запускаться в разных странах, так что сделайте локализацию настолько безболезненной, насколько это возможно.

Правило 14. Делайте свой код собираемым.

Простая команда должна собирать ваш код в форму, готовую к распространению. Команда должна позволять вам быстро выполнять сборку и запускать необходимые тесты. Для достижения этой цели используйте средства автоматической сборки наподобие Make , Apache Maven , или Ant . В идеале, вы должны установить интеграционную систему, которая будет проверять, собирать и тестировать ваш код при любом изменении.

Правило 15. Размещайте всё в системе контроля версий.

Все ваши элементы - код, документация, исходники инструментов, сборочные скрипты, тестовые данные - должны быть в системе контроля версий.

Язык сборки (или ассемблера) представляет собой низкоуровневый язык программирования для компьютера или иного программируемого оборудования, в котором существует корреляция между языком и инструкцией машинного кода архитектуры. Каждый машинно-ориентированный язык (в профессиональной терминологии — «сборщик») относится к конкретной компьютерной архитектуре. Напротив, большинство высокоуровневых языков программирования кроссплатформенны, но требуют интерпретации или компиляции.

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

Использование

Для многих операций требуется один или несколько операндов, способных построить полную инструкцию, и многие ассемблеры могут принимать выражения чисел и константы, а также регистры и метки в качестве операндов. Это освобождает специалиста при программировании на языке машинного кода от утомительных повторяющихся вычислений. В зависимости от архитектуры эти элементы также могут быть объединены для конкретных инструкций или режимов адресации с использованием смещений или других данных, а также фиксированных адресов. Многие «сборщики» предлагают дополнительные механизмы для облегчения разработки программы, контроля процесса сборки и поддержки отладки.

Историческая перспектива

Первый ассемблерный язык был разработан в 1947 году Кэтлин Бут для ARC2 в Биркбекском процессе работы с Джоном фон Нейманом и Германом Голдстином в Институте перспективных исследований. SOAP (Symbolic Optimal Assembly Program) была языком ассемблера для 650, созданного Стэном Поули в 1955 году.

Исторически многие программные решения были написаны только на ассемблере. ОС писались исключительно на этом языке до введения Burroughs MCP (1961 г.), который был написан на языке Executive Systems Problem Oriented Language (ESPOL). Многие коммерческие приложения были написаны на машинно-ориентированном языке, в том числе большое количество программного обеспечения мэйнфреймов IBM, созданного ИТ-гигантами. COBOL и FORTRAN в конечном итоге вытеснили большую часть наработок, хотя многие крупные организации сохранили ассемблерные прикладные инфраструктуры в 1990-х годах.

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

Область применения

Языки сборки устраняют большую часть проблемного, утомительного и трудоемкого программирования на ассемблерах первого поколения, необходимого на самых ранних компьютерах. Это освобождает программистов от рутины в виде запоминания числовых кодов и вычисления адресов. На начальных этапах «сборщики» широко использовались для всех разновидностей программирования. Однако к концу 1980-х гг. их применение в значительной степени было вытеснено языками более высокого уровня в поисках повышения производительности программирования. Сегодня язык ассемблера по-прежнему используется для прямой аппаратной манипуляции, доступа к специализированным инструкциям процессора или для решения критических проблем с производительностью. Типичной областью применения являются драйверы устройств, низкоуровневые встроенные системы и параметры реального времени.

Образцы применения

Типичными примерами крупных программ на языке ассемблера являются операционные системы IBM PC DOS, компилятор Turbo Pascal и ранние приложения, такие как программа электронных таблиц Lotus 1-2-3.

Машинно-ориентированный язык — основной язык разработки для многих востребованных домашних ПК 1980-х и 1990-х годов (таких как MSX, Sinclair ZX Spectrum, Commodore 64, Commodore Amiga и Atari ST). Это обусловлено тем, что интерпретированные диалоги BASIC на этих системах обеспечивали низкую скорость выполнения, а также ограниченные возможности для полного использования имеющегося оборудования. Некоторые системы даже имеют интегрированную среду разработки (IDE) с высокоразвитыми средствами отладки и макрообъектов. Некоторые компиляторы, доступные для Radio Shack TRS-80 и его преемников, имели возможность комбинировать встроенный источник сборки с программами высокого уровня. После компиляции встроенный ассемблер создал встроенный двоичный код.

Машинный код для чайников. Терминология

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

Машинные коды также могут выполнять некоторые простые типы оптимизации, зависящей от набора команд. Одним из конкретных примеров этого могут быть популярные «сборщики» x86 от разных поставщиков. Большинство из них могут выполнять замены команд перехода в любом количестве проходов, по запросу. Также способны выполнять простую перегруппировку или вставку инструкций, таких как некоторые сборщики для архитектур RISC, которые могут помочь оптимизировать разумное планирование команд, чтобы максимально эффективно использовать конвейер CPU.

Подобно ранним языкам программирования, таким как Fortran, Algol, Cobol и Lisp, сборщики были доступны с 1950-х годов, как и первые поколения текстовых компьютерных интерфейсов. Однако сначала появились сборщики, поскольку их намного проще писать, чем компиляторы для высокоуровневых языков. Это связано с тем, что каждая мнемоника, а также режимы адресации и операнды инструкций транслируются в числовые представления каждой конкретной инструкции без большого контекста или анализа. Также был ряд классов переводчиков и полуавтоматических генераторов кода со свойствами, аналогичными как сборкам, так и языкам высокого уровня, причем скоростной код, возможно, является одним из наиболее известных примеров.

Количество проходов

Существует два вида программирования на ассемблере, основанные на количестве проходов через источник (по количеству попыток прочтения) для создания объектного файла.

Однопроходные ассемблеры проходят через исходный код один раз. Любой символ, используемый до его определения, потребует errata в конце объектного кода.
Многопроходные ассемблеры создают таблицы со всеми символами и их значениями в первых проходах, а затем применяют таблицу в последующих проходах для генерации кода.

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

Что такое двоичный код?

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

Например, приведенная ниже инструкция сообщает процессору x86/IA-32 переместить 8-битное значение в регистр. Двоичный код для этой команды — 10110, за которым следует 3-битный идентификатор, для которого используется регистр. Идентификатором AL является 000, поэтому следующий код загружает регистр AL с данными 01100001.

Возникает вопрос: что такое двоичный код? Это система кодирования с использованием двоичных цифр «0» и «1» для представления буквы, цифры или другого символа на компьютере или другом электронном устройстве.

Пример машинного кода: 10110000 01100001.

Технические особенности

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

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

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

Язык дизайна

Существует большая степень разнообразия в том, как авторы сборщиков классифицируют заявления и номенклатуру, которые они используют. В частности, некоторые описывают все, что отличается от машинной или расширенной мнемоники, как псевдооперацию. Базовый словарь сборки состоит из системы команд — трех основных разновидностей инструкций, которые используются для определения программных операций:

  • мнемоника опкода;
  • определения данных;
  • директивы сборщика.

Мнемоника опкода и расширенная мнемоника

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

Расширенная мнемоника зачастую применяется для специализированной эксплуатации инструкций — для целей, не очевидных из названия мануала. Например, многие процессоры не имеют явной инструкции NOP, но имеют встроенные алгоритмы, которые используются для этой цели.

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

Директивы данных

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

Директивы сборки

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

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

Самодокументирующийся код

Символьные ассемблеры позволяют программистам связывать произвольные имена (метки или символы) с ячейками памяти и разными константами. Зачастую каждой постоянной величине и переменной присваивается собственное имя, поэтому инструкции могут ссылаться на эти местоположения по имени, тем самым способствуя самодокументирующему коду. В исполняемом коде имя любой подпрограммы соотносится с ее точкой входа, поэтому любые вызовы подпрограммы могут использовать ее имя. Внутри подпрограмм назначаются метки GOTO. Многие сборщики поддерживают локальные символы, которые лексически отличаются от обычных символов.

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

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