Что такое програмный код. Машинный код как язык программирования

Что такое програмный код. Машинный код как язык программирования

(Руководство разработчика по микроконтроллерам семейства HCS08)

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

Ранее нами было отмечено, что МК семейства HCS08 не позволяют выполнять операции стирания и программирования флэш-памяти, исполняя программу управления этими режимами также из флэш-памяти. Обязательно следует сначала переписать программный код, отвечающий за операции стирания и программирования, в оперативную память, а затем запустить этот код на исполнение. В процессе стирания и программирования к модулю флэш-памяти будет приложено повышенное напряжение. Однако это не приведет к срыву работы программы, поскольку в данный момент времени она будет исполняться из ОЗУ.

Компания NXP разработала набор утилит на ассемблере, который упрощает создание собственного программного кода для программирования флэш-памяти под управлением рабочей программы устройства. Эти утилиты размещены в файле doonstack.asm . Этот файл следует включить в проект, как показано на Рис. 12.3 .

Рис. 12.3. Окно проекта с включенным файлом doonstack.asm .

Содержимое файла doonstack.asm представлено ниже. Приведен оригинальный текст используемого программного кода, поэтому комментарии переводу не подлежат.


;* This stationery is meant to serve as the framework for a *
;* user application. For a more comprehensive program that *
;* demonstrates the more advanced functionality of this *
;* processor, please see the demonstration applications *
;* located in the examples subdirectory of the *
;* Metrowerks Codewarrior for the HC08 Program directory *
;**************************************************************
; export symbols
XDEF DoOnStack
XDEF FlashErase
XDEF FlashProg
; we use export "Entry" as symbol. This allows us to
; reference "Entry" either in the linker .prm file
; or from C/C++ later on

; include derivative specific macros
Include "MC9S08GB60.inc"

Две следующие строки следует раскомментировать и назначить желаемые значения.

;mPageErase equ $40
;mByteProg equ $20
mFACCERR equ $10
mFPVIOL equ $20
mFCBEF equ $80
; variable/data section
MY_ZEROPAGE: SECTION SHORT
; Insert here your data definition. For demonstration, temp_byte is used.
; temp_byte ds.b 1
; code section
MyCode: SECTION
;**************************************************************
; this assembly routine is called the C/C++ application
DoOnStack: pshx
pshh ;save pointer to flash
psha ;save command on stack
ldhx #SpSubEnd ;point at last byte to move to stack;
SpMoveLoop: lda ,x ;read from flash
psha ;move onto stack
aix #-1 ;next byte to move
cphx #SpSub-1 ;past end?
bne SpMoveLoop ;loop till whole sub on stack
tsx ;point to sub on stack
tpa ;move CCR to A for testing
and #$08 ;check the I mask
bne I_set ;skip if I already set
sei ;block interrupts while FLASH busy
lda SpSubSize+6,sp ;preload data for command
cli ;ok to clear I mask now
bra I_cont ;continue to stack de-allocation
I_set: lda SpSubSize+6,sp ;preload data for command
jsr ,x ;execute the sub on the stack
I_cont: ais #SpSubSize+3 ;deallocate sub body + H:X + command
;H:X flash pointer OK from SpSub
lsla ;A=00 & Z=1 unless PVIOL or ACCERR
rts ;to flash where DoOnStack was called
;**************************************************************
SpSub: ldhx LOW(SpSubSize+4),sp ;get flash address from stack
sta 0,x ;write to flash; latch addr and data
lda SpSubSize+3,sp ;get flash command
sta FCMD ;write the flash command
lda #mFCBEF ;mask to initiate command
sta FSTAT ; register command
nop ;[p] want min 4~ from w cycle to r
ChkDone: lda FSTAT ; so FCCF is valid
lsla ;FCCF now in MSB
bpl ChkDone ;loop if FCCF = 0
SpSubEnd: rts ;back into DoOnStack in flash
SpSubSize: equ (*-SpSub)
;**************************************************************
FlashErase: psha ;adjust sp for DoOnStack entry

lda #mPageErase ;mask pattern for page erase command
bsr DoOnStack ;finish command from stack-based sub
rts
;**************************************************************
FlashProg: psha ;temporarily save entry data
lda #(mFPVIOL+mFACCERR) ;mask
sta FSTAT ;abort any command and clear errors
lda #mByteProg ;mask pattern for byte prog command
bsr DoOnStack ;execute prog code from stack RAM
ais #1 ;deallocate data location from stack
rts
;**************************************************************

Также в тексте программного кода на С необходимо директивой #include подключить файл doonstack.h , текст которого представлен ниже.


/* */
/* Project Name: doonstack.h */
/* Last modified: 04/11/2004 */
/* By: r60817 */
/* */
/* */
/**********************************************************************/
/* */
/* Description: MC9S08GB60_FLASH_DOONSTACK - demo */
/* */
/* */
/* Documentation: MC9S08GB60/D Rev. 2.2 */
/* HCS08RMv1/D Rev. 1(4.8FLASH Application Examples) */
/* */
/* This software is classified as Engineering Sample Software. */
/* */
/**********************************************************************/
/* */
/* Services performed by FREESCALE in this matter are performed AS IS */
/* and without any warranty. CUSTOMER retains the final decision */
/* relative to the total design and functionality of the end product. */
/* FREESCALE neither guarantees nor will be held liable by CUSTOMER */
/* for the success of this project. FREESCALE DISCLAIMS ALL */
/* WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY INCLUDING, BUT NOT */
/* LIMITED TO, IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A */
/* PARTICULAR PURPOSE ON ANY HARDWARE, SOFTWARE ORE ADVISE SUPPLIED */
/* TO THE PROJECT BY FREESCALE, AND OR NAY PRODUCT RESULTING FROM */
/* FREESCALE SERVICES . IN NO EVENT SHALL FREESCALE BE LIABLE FOR */
/* INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT. */
/* */
/* CUSTOMER agrees to hold FREESCALE harmless against any and all */
/* claims demands or actions by anyone on account of any damage, or */
/* injury, whether commercial, contractual, or tortuous, rising */
/* directly or indirectly as a result of the advise or assistance */
/* supplied CUSTOMER in connection with product, services or goods */
/* supplied under this Agreement. */
/* */
/**********************************************************************/
/*
- this file API between main.c and doonstack.asm
*/
#ifndef _doonstack
#define _doonstack
#ifdef __cplusplus
extern "C" { /* our assembly functions have C calling convention */
#endif
void DoOnStack(void); /* prototype for DoOnStack routine */
void FlashErase(unsigned char *); /* prototype for FlashErase routine */
/* Page Erase command */
void FlashProg(unsigned char *, unsigned char); /* prototype for FlashProg routine */
/* Byte Program command */
#ifdef __cplusplus
}
#endif

#endif /* _doonstack */
/**********************************************************************/

В нашем примере для записи энергонезависимых данных резервируется блок в 512 байт. Такой размер блока выбран потому, что это минимально разрешенный для стирания объем ячеек флэш-памяти в микроконтроллере MC9S08QG8. Выбранный блок будет располагаться в начале адресного пространства резидентной флэш-памяти МК: от 0xE000 до 0xE1FF. Программный код будет начинаться с адреса 0xE200 и может занимать адресное пространство вплоть до 0xFFFF.

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

В стандартном проекте была запись:


ROM = READ_ONLY 0xE000 TO 0xFFAD;

Ее следует заменить:

SEGMENTS /* Here all RAM/ROM areas of the device are listed */
ROM = READ_ONLY 0xE200 TO 0xFFAD;

В нашем примере также использован режим защиты от записи области программного кода, т.е. адресного пространства от 0xF200 до 0xFFFF. На Рис. 12. 4 показан процесс формирования кода для регистра FPROT, который обеспечивает защиту адресного пространства 0xF200...0xFFFF от случайного стирания/записи. Семь старших битов последнего адреса 0xF1FF незащищенного адресного пространства должны быть записаны в регистр FPROT.

Адрес A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0xE1FF 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1
FPROT FPS7 FPS6 FPS5 FPS4 FPS3 FPS2 FPS1 FPDIS
0xE0 1 1 1 0 0 0 0 0

Рис. 12.4. Формирование записи кода зашиты для регистра FPROT.

Пример 12.1. Операции с энергонезависимыми данными во флэш-памяти

// Демонстрационная плата DEMO9S08QG8
// стирание/запись/чтение резидентной флэш-памяти
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "hcs08.h" /* Это наш файл с объявлениями! */
#include "doonstack.h"
#define BUSCLK 8000000
#define vFCDIV (BUSCLK/200000-1)
char fdata, operation;
unsigned int faddress;
// Назначается область защищенных от записи адресов: от 0xE200 до 0xFFFF
const byte NVPROT_INIT @0x0000FFBD = 0xE0;
// Инициализация МК
void mcu_init(void)
{
SOPT1 = bBKGDPE; // Разрешение функции линии отладки BKGD
ICSSC = NV_FTRIM; // Записать значение подстройки FTRIM
ICSTRM = NV_ICSTRM; // Записать значение подстройки TRIM
ICSC2 = 0; // ICSOUT = DCOOUT / 1
// BUSCLK = 8 МГц
FCDIV = vFCDIV; // Записать значение кода делителя для частоты FCLK
// (FCLK = 200 кГц)
}
#pragma inline
// Функция чтения байта из ячейки памяти с заданным адресом
char flash_read(unsigned int address)
{
unsigned char *pointer;
pointer = (char*) address;
return (*pointer);
}
// Функция записи байта в ячейку памяти с заданным адресом
char flash_write(unsigned int address, unsigned char data)
{
unsigned char *pointer;
pointer = (char*) address;
FlashProg(pointer,data); // Вызов функции программирования флэш-памяти
if (FSTAT_FACCERR) data=1; else data=0;
if (FSTAT_FPVIOL) data|=2;
return(data);
}
// Функция стирания заданного блока в области флэш-памяти
unsigned char flash_sector_erase(unsigned int address)
{
unsigned char *pointer, res;
pointer = (char*) address;
FlashErase(pointer);
if (FSTAT_FACCERR) res=1; else res=0;
if (FSTAT_FPVIOL) res|=2;
return(res);
}
void main(void)
{
mcu_init();
fdata = 0;
faddress = 0xE000;
operation = 0;
while (1)
{
switch (operation)
{
case 1: // Стирание блока
fdata = flash_sector_erase(faddress);
operation = 0;
break;
case 2: // Запись байта
fdata = flash_write(faddress,fdata);
operation = 0;
break;
case 3: // Чтение байта
fdata = flash_read(faddress);
operation = 0;
break;
}
}
}

Рассмотрим методику тестирования программного кода Примера 12.1. Для этого в окно отладчика Data добавим три переменные: faddress , fdata , operation . Также установим для окна режим периодического обновления, например, через 200 мс.

Перед запуском на исполнение программного кода запишите в переменную faddress адрес для записи, а в переменную fdata — байт данных для записи. Далее в переменную operation запишите код 0x02. После запуска программного кода примера начнется запись байта данных в выбранную ячейку флэш-памяти. Обратите внимание, что выбранная ячейка должна находиться в стертом состоянии, т.е. в ней должен быть код 0xFF.

Для того чтобы стереть блок памяти 0xE00...0xE1FF, запишите в faddress любой адрес из указанного диапазона и установите переменную operation в 1. Далее запустите код снова на исполнение.

Прочитать данные из флэш-памяти тоже просто. Для этого запишите в переменную faddress код адреса, в переменную operation — код 0x03. Содержимое выбранной ячейки флэш-памяти отобразится в переменной fdata после исполнения программного кода.

Обратите внимание, что функции flash_write() и flash_sector_erase() возвращают переменную типа chare с кодом ошибки при выполнении действия: 0 — не было ошибки, 0x02 — была ошибка доступа, 0x04 — была попытка стирания/записи защищенного адресного пространства. Обе упомянутые функции требуют для своего исполнения около 35 байт стековой памяти. Если реальная область стека окажется меньше, то произойдет фатальная ошибка. Восстановить работоспособность программы можно будет только сбросом МК.

Для того чтобы посмотреть в отладчике изменения флэш-памяти, необходимо внести некоторые изменения в конфигурацию отладчика. Следуя установкам по умолчанию, отладчик считывает область флэш-памяти МК только один раз после запуска сессии отладки. Для изменения конфигурации выберите в главном меню отладчика опцию MultilinkCyclonPro > Debug Memory Map . Откроется окно, показанное на Рис. 12.5 , а . Выберите в этом окне memory block 3 и нажмите кнопку Modify/Details . В новом окне, показанном на Рис. 12.5 , б , выберите отмеченную опцию. Она позволит отладчику периодически обновлять окно памяти.

Рис. 12.5. Изменение конфигурации отладчика для периодического обновления содержимого окна памяти.

Назначение

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

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

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

Программисты часто переносят исходный код из одного проекта в другой, что носит название повторного использования кода (Software reusability ).

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

Организация

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

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

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

Качество

В отличие от человека, для компьютера нет «хорошо написанного» или «плохо написанного» кода. Но то, как написан код, может сильно влиять на процесс сопровождения ПО . О качестве исходного кода можно судить по следующим параметрам:

  • читаемость кода (в том числе наличие или отсутствие комментариев к коду;
  • лёгкость в поддержке, тестировании, отладке и устранении ошибок, модификации и портировании;
  • низкая сложность;
  • низкое использование ресурсов - памяти, процессора, дискового пространства;
  • отсутствие замечаний, выводимых компилятором;
  • отсутствие «мусора» - неиспользуемых переменных, недостижимых блоков кода, ненужных устаревших комментариев и т. д.

Неисполняемый исходный код

См. также

  • Пример: Программа Hello world

Ссылки

Wikimedia Foundation . 2010 .

Смотреть что такое "Программный код" в других словарях:

    программный пакет - 3.19 программный пакет: Архивный файл, содержащий программный код в бинарном или исходном виде, а также метаданные о программе, ее версии, зависимостях и другую информацию. Источник: ГОСТ Р 54593 2011: Информационные технологии. Свободное… …

    - (англ. Netscape Plugin Application Programming Interface, NPAPI кросс платформенная архитектура разработки плагинов, поддерживаемая многими браузерами. Интерфейс был разработан для семейства браузеров Netscape Navigator, начиная с Netscape… … Википедия

    В компьютерных науках программный агент это программа, которая вступает в отношение посредничества с пользователем или другой программой. Слово «агент» происходит от латинского agere (делать) и означает соглашение выполнять действия от… … Википедия

    Framework термин, имеющий размытое значение. Обычно используется в программировании, обозначая «простую концептуальную структуру, используемую для решения сложной, проблемной задачи». Значение этого термина существенно зависит от контекста его… … Википедия

    Эта статья о системе команд в целом; об инструкциях см.: Код операции. Машинный код (платформенно ориентированный код), машинный язык система команд (набор кодов операций) конкретной вычислительной машины, которая интерпретируется… … Википедия

    Официальная терминология

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

    - (англ. managed code) термин, введённый Microsoft для обозначения кода программы, исполняемой под «управлением» виртуальной машины.NET Common Language Runtime. При этом обычный машинный код называется неуправляемым кодом… … Википедия

    Заплатка, или патч (англ. patch /pætʃ/ заплатка) автоматизированное отдельно поставляемое программное средство, используемое для устранения проблем в программном обеспечении или изменения его функционала, а также сам процесс установки патча (… … Википедия

    Pyramid Тип Программный каркас веб приложений Разработчик … Википедия

Книги

  • Объектно-ориентированное проектирование: концепции и программный код , Гаст Хольгер. Эта книга призвана помочь читателю глубоко усвоить понятие объектов, раскрыть их истинный потенциал, чтобы писать код, эффективно работающий в реальных условиях. Вней рассматриваются…

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

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

Первый машинный язык был придуман в 1941 году Конрадом Цузе, который является изобретателем аналитической машины. Чуть позже, в 1943 г., Говард Эйкен создал машину "Марк-1", способную считывать инструкцию на уровне машинного кода.

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

Классификация языков программирования

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

  • Аспектно-ориентированные (основная идея - разделение функциональности для увеличения эффективности программных модулей).
  • Структурные (в основе лежит идея создания иерархической структуры отдельных блоков программы).
  • Логические (в основе лежит теория аппарата математической логики и правил резолюции).
  • Объектно-ориентированные (в таком программировании используются уже не алгоритмы, а объекты, которые принадлежат определенному классу).
  • Мультипарадигмальные (сочетают в себе несколько парадигм, и программист сам решает, каким языком воспользоваться в том или ином случае).
  • Функциональные (в качестве основных элементов выступают функции, которые меняют значение в зависимости от результатов вычислений исходных данных).

Программирование для начинающих

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

  • Basic придуман в 1964 году, относится к семейству высокоуровневых языков и используется для написания прикладных программ.
  • Python ("Питон") довольно легко выучить благодаря простому читаемому синтаксису, преимущество же в том, что на нем можно создавать как обычные десктопные программы, так и веб-приложения.
  • Pascal ("Паскаль") - один из древнейших языков (1969 г.), созданных для обучения студентов. Его современная модификация имеет строгую типизацию и структурированность, однако "Паскаль" - вполне логичный язык, который понятен на интуитивном уровне.

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

Новички имеют возможность ускорить изучение программирования и его основ благодаря специальным инструментам. Основной помощник - это интегрированная среда разработки программ и приложений Visual Basic («Визуал Бейсик» одновременно является и языком программирования, который унаследовал стиль языка Basic 1970-х годов).

Уровни языков программирования

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

Низкоуровневые языки предназначены для создания машинных команд для процессоров. Главное их преимущество в том, что они используют мнемонические обозначения, т. е. вместо последовательности нулей и единиц (из двоичной системы счисления) компьютер запоминает осмысленное сокращенное слово из английского языка. Самые известные языки низкого уровня - это "Ассемблер" (существует несколько подвидов этого языка, каждый из которых имеет много общего, а отличается лишь набором дополнительных директив и макросов), CIL (доступен в платформе.Net) и Байт-код JAVA.

Языки программирования высокого уровня: список

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

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

Самые используемые языки программирования

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

  • языки ООП: Java, C++, Python, PHP, VisualBasic и JavaScript;
  • группа структурных языков: Basic, Fortran и Pascal;
  • мультипарадигмальные: C#, Delphi, Curry и Scala.

Область применения программ и приложений

Выбор языка, на котором написана та или иная программа, во многом зависит от области ее применения. Так, например, для работы с самим "железом" компьютера (написания драйверов и поддерживающих программ) лучшим вариантом станет C ("Си") или С++, которые входят в основные языки программирования (список смотрите выше). А для разработки мобильных приложений, в том числе игр, следует выбрать Java или С# ("Си-шарп").

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

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

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

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

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

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

Первый ассемблерный язык был разработан в 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 обеспечивают гибкое управление символами, позволяя программистам управлять разными пространствами имен, автоматически вычислять смещения в структурах данных и назначать метки, которые ссылаются на литеральные значения или результат простых вычислений, выполняемых ассемблером. Ярлыки также могут использоваться для инициализации констант и переменных с помощью перемещаемых адресов.

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

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

    «Argh!», «Oof!», «2-ill», «Nhohnhehr», «Noit o" mnain gelb», «DZZZZ», «Ypsilax», «YABALL», fuckfuck - это заклинания, поэзия только названия… под катом - примеры кода на самых вырвиглазных языках программирования.

    Кроличья нора глубока.

    INTERCAL (тьюринг-полный)



    Don Woods и Jim Lyon

    Один из старейших эзотерических языков программирования. Как утверждают создатели, его название означает «Язык программирования с непроизносимой аббревиатурой» (англ. Compiler Language With No Pronounceable Acronym). Язык был создан в 1972 году студентами Доном Вудсом (Don Woods) и Джеймсом М. Лайоном (James M. Lyon) как пародия на существующие языки программирования и гимнастика ума.

    Hello, world

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

    Hello, world!

    // «Hello World» by Stephen McGreal.
    // Note that the views expressed in this source code do not necessarily coincide with those of the

    Gr34t l33tN3$$?
    M3h…
    iT 41n"t s0 7rIckY.

    L33t sP33k is U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
    1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE!!! ;p
    w4r3Z c0ll3cT10n2 r 7eh l3Et3r!

    Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD!!!
    g4m3s wh3r3 u g3t to 5h00t ppl r 70tAl1_y w1cK1d!!!
    I"M teh fr4GM4stEr aN I"lL t0t41_1Ly wIpE teh phr34k1ng fL00r ***j3d1 5tYlE*** wItH y0uR h1dE!!! L0L0L0L!
    t3lEphR4gG1nG l4m3rs wit mY m8tes r34lLy k1kK$ A$$

    L33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff lIkE n34t pR0gR4mm1nG lAnguidGe$…
    s0m3tIm3$ teh l4nGu4gES l00k jUst l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y"r3 ju$t n0rMal lEE7 5pEEk but th3y"re 5ecRetLy c0dE!!!
    n080DY unDer5tAnD$ l33t SpEaK 4p4rT fr0m j3d1!!!
    50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t ppl cAn 8E m0re lIkE y0d4!!! hE i5 teh u8ER!!!
    1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE.
    1t 3v3n MiTe jUs7 s4y «H3LL0 W0RLD!!!» u ju5t cAn"T gu3s5.
    tH3r3"s n3v3r anY p0iNt l00KiNg sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s whAt th1s 1s!!!

    5uxX0r5!!!L0L0L0L0L!!!

    ArnoldC

    Язык программирования терминатора.

    Hello, world!

    Ook!

    То ли язык орангутангов, то ли мечта Вильяма Оккама.

    Hello, world!

    Chef

    Эзотерический язык программирования, разработанный Дэвидом Морган-Маром, программы на котором сходны с кулинарными рецептами. Каждая программа в языке состоит из названия, списка переменных и их значений, списка инструкций. Переменные могут быть названы только названиями основных продуктов питания. Стек, в которые помещаются значения переменных, называется англ. mixing bowl («чаша для смешивания»), а операции для манипуляции с переменными - mix («смешать»), stir («взболтать») и так далее.

    Hello World

    Hello World Souffle.

    Ingredients.
    72 g haricot beans
    101 eggs
    108 g lard
    111 cups oil
    32 zucchinis
    119 ml water
    114 g red salmon
    100 g dijon mustard
    33 potatoes

    Method.
    Put potatoes into the mixing bowl.
    Put dijon mustard into the mixing bowl.

    Put red salmon into the mixing bowl.

    Put water into the mixing bowl.
    Put zucchinis into the mixing bowl.
    Put oil into the mixing bowl.
    Put lard into the mixing bowl.
    Put lard into the mixing bowl.
    Put eggs into the mixing bowl.
    Put haricot beans into the mixing bowl.
    Liquefy contents of the mixing bowl.
    Pour contents of the mixing bowl into the baking dish.


    Самое обсуждаемое
    Как добиться максимальной экономии заряда батареи на андроиде Как добиться максимальной экономии заряда батареи на андроиде
    Дисплей IPS или TFT лучше? Дисплей IPS или TFT лучше?
    Лучшие игры для VR Очки виртуальной реальности список игр Лучшие игры для VR Очки виртуальной реальности список игр


    top