На каком языке программирования пишут программы для автомобилей

Чегодаев, Н. И. Сравнительный обзор распространённых языков программирования для микропроцессорных систем / Н. И. Чегодаев. — Текст : непосредственный // Молодой ученый. — 2011. — № 10 (33). — Т. 1. — С. 92-95. — URL: https://moluch.ru/archive/33/3688/ (дата обращения: 05.07.2023).

В настоящее время для микроконтроллеров фирмы Atmel существует множество языков программирования: от классического BASCOM — AVRBasic [1] до Assembler и C . Наиболее распространёнными являются язык ассемблера и язык C . В этих языках реализованы практически все возможности программирования встраиваемых систем на данном типе микроконтроллеров[2].

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

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

5 языков для разработки мобильных приложений [ + розыгрыш ]

  1. языки программирования низкого уровня;
  2. языки программирования высокого уровня.

Несмотря на то, что автоматическая оптимизация кода значительно ускоряет разработку программ, часто она может приводить к трудно обнаруживаемым ошибкам конечного программного кода, рассмотрим следующий пример [7]: unsigned short int i; void main (void) DDRB = 255; PORTB = 0; while(1) if (PINB == 255) PORTB = 0; else PORTB++; for (i=0; ii++)<> //Далее может быть иной программный код>> Пример представляет собой программу на языке программирования C для микроконтроллера фирмы Atmel, семейства AVR. В верхней строке программы объявляется глобальная переменная i типа без знаковое короткое целое (unsigned short int), которая согласно [3, с. 18] имеет размер два байта и может принимать значения от 0 до 65535.

Данная переменная будет использоваться позднее для организации цикла задержки. Далее происходит инициализация аппаратных портов ввода-вывода микроконтроллера.

Внутри бесконечного цикла while(1), значимость которого при программировании микроконтроллеров рассмотрена ниже, расположен программный код, изменяющий значение на контактах порта B микроконтроллера AVR по следующему правилу: если на всех контактах порта B обнаруживаются потенциалы единицы, то обнулить контакты, иначе увеличить значение в регистре-защёлке порта B. Последний цикл без выполняемого в теле кода предназначен для формирования задержки вывода для того, чтобы изменение потенциалов порта B можно было зафиксировать, например, с помощью светодиодов.

Далее следует комментарий. Если включить автоматическую оптимизацию, то компилятор сочтёт цикл задержки бесполезной тратой времени и исключит его из программы[7]. Таким образом, изменение параметров порта B не может быть зафиксировано.

Оборудование для чип тюнинга. Оптимальный набор для начала.

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

В большинстве публикаций, посвящённых языку ассемблера [4, с. 11], указывается на непереносимость и аппаратную зависимость программ, написанных на нём, по сравнению с языками высокого уровня, такими как C. Однако, программы на языке C также могут быть аппаратно зависимыми и вследствие чего непереносимыми, особенно, при работе с графическими контроллерами.

Некоторые функции неработоспособны при программировании под графические контроллеры различных производителей. Таким образом, приходится разрабатывать различные наборы функций для прямого взаимодействия с драйверами видеокарт [8, с.249].

Кроме того, программы автоматической оптимизации кодов, созданные для языка C, о которых написано выше, сами являются аппаратно зависимыми и непереносимыми, например, считающийся одним из лучших компиляторов Intel C Compiler производит некорректную оптимизацию программ для процессоров других производителей [9]. Известно утверждение, что программирование на языке ассемблера затруднено слабой читаемостью программ, что в свою очередь приводит к большему числу ошибок при программировании на этом языке, нежели на языке программирования C [2].

В данном случае читаемость программ, как и количество в них ошибок, занесённых при программировании, зависит в большей степени от опыта, внимательности и стараний программиста, а также от того факта, насколько хорошо известен разработчику тот или иной язык программирования[4, с. 11]. Кроме того, за якобы лучшей читаемостью программ, написанных на языке программирования C, скрывается множество недокументированных возможностей, как отрицательно, так и положительно влияющих на правильную работу конечного программного продукта.

Язык программирования C – громоздкий язык. Таким образом, хотя разработка программ на языке C, при поверхностном взгляде, быстрее программирования на языке ассемблера, однако программирование на нём требует знания нюансов, без которых написание корректно работающих программ невозможно [10, с.104].

Язык ассемблера, в свою очередь, представляет собой набор простых правил, изучив которые, можно уверенно программировать на нём, а знание и изучение архитектуры целевой микропроцессорной системы упрощает процесс программирования и последующего чтения программ [7]. Сегодня большинство программистов убеждены, что одним из основных преимуществ языка C по отношению к языку ассемблера является наличие библиотечных программ, например, подпрограмм вычисления сложных выражений, вида (x* 2 + 8) [4, с.11].

Несмотря на удобство программирования с их использованием, следует признать, что отсутствие встроенных библиотечных программ, скорее преимущество языка ассемблера, нежели его недостаток, так как при использовании таких программ в языках высокого уровня теряется возможность полного управления ресурсами компьютера и, следовательно, возможность написания максимально эффективных, быстрых и компактных программ, кроме того существует большое количество ассемблерных библиотек, позволяющих выполнять операции, характерные для языков высокого уровня[4, с.11], например, стандартные библиотеки адресации для микроконтроллеров фирмы Atmel, позволяют обращаться к регистрам и портам микроконтроллера аналогично программам на C, в противном случае пришлось бы вручную изучать адреса регистров и вносить их в управляющие конструкции [11]. Из всего вышесказанного может сложиться впечатление, что автор данного обзора является противником программирования на языке C.

Это не так, в течение пятнадцати лет программирования автора, из которых десять лет посвящено изучению языка C, к изучению которого автор приступил ранее, чем к изучению языка ассемблера, был сделан вывод, что последний оказался практически эффективнее по сравнению с языком программирования C. В условиях программирования малых микропроцессорных систем и однокристальных микро-ЭВМ, к которым относятся микроконтроллеры, в частности фирмы Atmel, а такие технические особенности этих микроконтроллеров, как развитая регистровая память, включающая тридцать два регистра общего назначения, исключают необходимость использования сложных высокоуровневых языков программирования, хотя и допускают её [11].

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

Особенностью такой архитектуры является наличие единственного регистра, в общем используемого и для пересылок и для арифметических операций[4, с.53], в этих условиях переход к высокоуровневым языкам является естественным, но, как уже было замечено выше, технические особенности архитектуры Enhanced RISC, микроконтроллеров фирмы Atmel позволяют отказаться от высокоуровневых языков при программировании[11]. Таким образом, если большинство программистов по каким-то причинам не пожелали использовать или изучить язык ассемблера, язык программирования C подходит для использования в случаях, когда группа программистов работает над программным кодом для одной задачи.

Читайте также:
Какие есть программы для редактирования фотографий на компьютере

Здесь требуется достоверная читаемость кода каждым из них субъективно, и язык C становится своеобразным «Lingua Franca» программирования, подобно английскому языку. Для написания же эффективных, быстродействующих и компактных программ язык ассемблера предпочтительнее языка C.

Общение автора данного обзора с программистами систем на микроконтроллерах, работающих с языком C и знающих его достаточно хорошо, показали, что они по непонятным причинам демонстрируют нежелание изучать и использовать язык ассемблера. Несмотря на то, что они часто сталкиваются с описанными выше «подводными камнями» языка при отладке программ, тратя на неё при этом значительное количество времени, язык ассемблера вызывает у них отторжение, как на техническом уровне, так и психологически.

Причин неприязни они, зачастую, не называют, либо говорят об описанных выше спорных. Как говорил классик программирования Дональд Кнут, «каждый, кто всерьёз интересуется компьютерами, должен рано или поздно изучить по крайней мере один машинный язык» [7]. Как показал опыт автора, проблемы в освоении языка ассемблера, связаны с недостаточным знанием английского языка.

Язык ассемблера – необычный компьютерный язык. Почти весь текст исходной программы состоит из непроизносимых слов cli, movsb, sbb [4, c.

17] в архитектуре x86, или ADD, TST, SBR, CBR, RJMP [11] в архитектуре RISC, микроконтроллеров AVR, фирмы Atmel. Человек, не владеющий английским языком в должной мере, предпочитает распространённые языки программирования высокого уровня, где операторы если и не постигаются интуитивно, то зачастую имеют многозначное толкование в соответствии с множеством вариантов использования.

Программисты запоминают операторы высокоуровневых языков программирования, в большей степени основываясь не на логике, которое несёт название функции, а на логике выполняемых оператором действий. Например, студенты, изучающие немецкий язык, при изучении языка программирования BASIC, часто неверно произносят названия функций и команд данного языка программирования, но это не мешает им постигать программирование на этом языке [12, с. 5].

При изучении языка ассемблера мнемонические операторы имеют в большинстве случаев однозначное соответствие между названием оператора и выполняемым им действием и изучение в этом случае должно также основываться на знании, понимании и правильной интерпретации названий и расшифровок операторов для успешного программирования в будущем. Например, упоминавшийся выше, оператор cli, означает clear if, то есть сброс флага разрешения прерываний if и представляет собой сокращение [4, с.484], а оператор SBR аббревиатуру от Set Bit(s) in Register [12] и т.п.

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

Отдельно хотелось бы заметить, что хотя язык ассемблера считается языком программирования для профессионалов [13, с. 104] [14 c. 130] он не так сложен.

Преимуществами языка ассемблера является, низкоуровневый доступ к процессору, достижение максимальной скорости за счёт возможности полностью управлять процессом вычисления, компактность и скорость программ [4, с.10]. Программам на языке ассемблера присуща точность исполнения заложенного алгоритма в отсутствии описанных выше нюансов, основанных на своеобразном «языковом барьере» между высокоуровневым языком программирования и реальным вычислительным процессом, так как программы на языках высокого уровня преобразуются в машинные коды опосредованно посредствам промежуточного языка, ассемблерные мнемонические операторы имеют прямое соответствие «код-машинная операция» [3],[4], [13],[14].

Как уже отмечалось выше, язык ассемблера чрезвычайно эффективен в условиях систем на микроконтроллерах фирмы Atmel, также большинство программ для микроконтроллерных систем сохранили условности характерные для традиционных технологий программирования, при которых имеется ограничение на используемые вычислительные ресурсы и от программ требуется прежде всего эффективность и компактность [15]. При таких условиях, в большинстве случаев, возможностей языка ассемблера достаточно, а возможности языка C избыточны.

В заключение хотелось бы процитировать авторитетного автора, специалиста по языку ассемблера, Тома Свана, в предисловии к своей книге «Освоение Turbo Assembler» он пишет: «…если кто-то вам говорил, что ассемблер очень сложен, не верьте.»[4, с.5]. Литература:

Глушаков, С.В., Программирование на C++ [Текст] / C.В. Глушаков, Т.В. Дуравкина – М.:АСТ, 2008 – 685 с.
Сван, Том, Освоение Turbo Assembler: Пер. с англ. [Текст] / Том Сван – К.;М.;СПб.: Диалектика, 1996 – 544 с.

Источник: moluch.ru

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

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

Языки программирования «высокого» уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки «высокого» уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы — трасляторы для соответствующего процессора.)

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

В тех случаях, когда объЈм ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемлеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т.к. испортить можно всЈ!).

Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объЈм памяти программ (несколько десятков килобайт). Увеличение объЈма программы связано с несколькими факторами:

  1. Язык программирования расчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче (исключив не нужные в данном конкретном случае проверки или защиты).
  2. Программист не видит к чему приводит использование тех или других операторов языка программирования, поэтому может выбирать операторы, не оптимальные как с точки зрения длины машинного кода программы, так и с точки зрения быстродействия программы.
  3. Программист не использует подпрограммы там, где они могли бы сократить объЈм программы, так как на языке программирования высокого уровня это всего один или несколько операторов.

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

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

Виды компиляторов

Компиляторы бывают оценочные и профессиональные.

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

Читайте также:
Атлант 50с124 как сбросить программу

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

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

Оценочные компиляторы обычно предлагаются бесплатно фирмами — производителями микроконтроллеров. Только фирма Intel предложила в своЈ время профессиональный пакет разработки программ — язык программирования PLM-51 в состав которого входит профессиональный язык программирования ASM-51.

Профессиональные компиляторы разрабатываются и продаются отдельными фирмами. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм как FRANCLIN, IAR, KEIL. В состав современных средств написания и отладки программ для микроконтроллеров обычно входят эмуляторы процессоров или отладочные платы, текстовый редактор, компиляторы языка высокого уровня (чаще всего «C») и ассемблера, редактор связей и загрузчик программы в отладочную плату. Все программы обычно объединены интегрированной средой разработки программного проекта, позволяющую поддерживать один или несколько программных проектов.

Источник: computer-museum.ru

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

Все это началось в прошлом году, когда я получил письмо от Клайва (Макса) Максфилда. Он проводил семинар в Design West, и поинтересовался, хочу ли я принять в нем участие. Семинар назывался «10 языков за 45 минут».

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

Семинар прошел очень хорошо. Несмотря на то, что мы начали в 8:30 утра, в зале собралось довольно много людей, настроенных весьма доброжелательно. После краткого введения Макса выступили докладчики. Для организации честной игры Макс специально завел таймер. Благодаря быстрому темпу семинар получился очень динамичным, и я считаю, что аудитории это понравилось.

Мне уж точно понравилось.

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

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

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

  1. Во встраиваемых системах ресурсы (память и мощность процессора) ограниченны. А настольные системы, как обычно предполагается, не имеют никаких ограничений.
  2. Встраиваемые системы, как правило, работают в режиме реального времени.
  3. Количество операционных систем для настольных компьютеров невелико. Для встраиваемых систем существует множество вариантов, в том числе работа «на голом железе» (то есть вообще без операционной системы).
  4. Аппаратная часть всех персональных компьютеров в первом приближении одинакова. Но каждая встраиваемая система уникальна, поэтому здесь более распространено программирование, приближенное к аппаратному.

На заре становления встраиваемых систем из-за фактора №1 и, в некоторой степени, №2 и №4 большинство систем программировалось на ассемблере. Такой подход и сейчас остается в качестве одного из вариантов, но теперь ассемблер используется только тогда, когда обойтись без него действительно невозможно.

Потребности разработчиков встраиваемых систем достаточно специфичны, поэтому можно было бы ожидать, что специализированные языки были разработаны для удовлетворения их уникальных требований. Есть примеры языков, которые изначально создавались для встраиваемых приложений (например, PL/M, Forth, Ada), но они не нашли всеобщего признания.

Язык C

Язык Си был разработан в 1970-х Деннисом Ритчи (Dennis Ritchie) в AT

Следующий стиль написания немного компактнее, но при этом код все еще полностью работоспособен.

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

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

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

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

Язык C++

Хотя идея объектно-ориентированного программирования (ООП) не нова (по крайней мере, один такой язык существовал в середине 1960-х годов), модным ООП стало лишь в 1980-х. В результате появился целый ряд языков, некоторые из которых были основаны на Си. Видимо, теперь самое время посмотреть на «родословную» языков программирования, показанную ниже.

«Генеалогическое дерево» языков программирования.

Некоторое количество C-подобных объектно-ориентированных языков выжило, но единственным языком, который действительно утвердился и теперь популярен в области разработки встраиваемых систем, является C++. Он был создан Бьерном Страуструпом (Bjarne Stroustrup) в Bell Labs.

Одним из ключевых факторов успеха C++ была его первоначальная реализация. Вместо того, чтобы писать обычный компилятор, Страуструп написал препроцессор – «Cfront», который переводил C++ в стандартный Си. Это означало, что новый язык был готов для использования практически в любом месте, где был доступен компилятор Си. В настоящее время очень распространены специальные компиляторы C++, но мощный стимул его развитию дало именно создание препроцессора.

Цель ООП – поддерживать разработку крупных программных проектов. Такая задача все чаще встает перед разработчиками встраиваемых систем. Использование подхода ООП может позволить каждому программисту сосредоточиться на его или ее собственной области знаний без необходимости понимания каждого аспекта всего приложения.

C++ можно использовать двумя способами. Его можно просто рассматривать как язык Си, «улучшенный» за счет ряда объектов и конструкций, или же он может использоваться как истинный объектно-ориентированный язык. Последний подход может быть очень полезен для встраиваемых приложений, поскольку он позволяет инкапсулировать специальные коды, например, коды доступа к устройству.

Ключевой особенностью языка C++ является понятие класса. Класс в C++ представляет собой нечто подобное структуре в языке Си, но с некоторыми отличиями:

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

Ниже приведен простой пример определения класса в C++.

class woport
int shadow;
int* address;
public:
woport(long);
~woport();
void operator|=(int);
void operator
>

Обратите внимание на то, как объект (или, если хотите, переменная) out объявлена вполне обычным способом, и естественно используется со знакомыми операторами. Автору этой функции main() не нужен доступ к исходному коду функций в классе woport.

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

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

Java

Язык Java был разработан Джеймсом Гослингом (James Gosling) в Sun Microsystems (теперь часть корпорации Oracle) и выпущен в 1995 году. Оригинальная концепция Гослинга заключалась в создании надежного языка, который мог бы быть использован для написания портируемых приложений для встраиваемых систем. На протяжении многих лет язык Java успешно применялся в качестве средства запуска программ (апплетов) в браузере. Это позволяло разработчикам выполнять размещаемые на веб-страницах сложные приложения, которые будут работать в любом браузере на любой платформе.

Официальная эмблема языка Java.

Позже использование языка Java стало больше соответствовать его первоначальной концепции как инструмента включения развернутых приложений во встраиваемые устройства. Такая практика является обычной в операционной системе Android.

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

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

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

Вот пример кода на Java:

BitSet mask = new BitSet();
mask. set(cpuId);
AffinitySet as = AffinitySet.generate (mask);
AffinitySet.set(as, thread);

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

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

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

JavaScript

JavaScript был разработан в Netscape в 1995 году. Его название сбивает с толку, поскольку этот язык не имеет никакой реальной связи с Java. Выбор такого названия был только маркетинговым ходом.

Неофициальный логотип JavaScript.

Язык имеет Си-подобный синтаксис, но в то же время он имеет ряд особенностей, которые отличают его от других производных от Си языков. Типизация в нем динамическая: значение имеет тип, а переменная нет. Это объектно-ориентированный язык; объекты являются ассоциативными массивами (и наоборот). Вместо классов в JavaScript имеются прототипы. Доступно множество библиотек, многие из которых предназначены для работы с браузером и реализации интерфейса пользователя.

Программирование на JavaScript может быть очень продуктивным – многое доступно даже с ограниченными знаниями языка. Это делает язык привлекательным для непрограммистов, а также объясняет изобилие плохо написанного кода на JavaScript.

JavaScript был первоначально задуман как средство, наделяющее веб-страницы возможностями программирования, и в такой роли он сейчас используется почти повсеместно. Любая сделанная в современном стиле веб-страница использует JavaScript. Он был назван «Ассемблер для Web». (По-видимому, кем-то, кто не был знаком с программированием на ассемблере). Кроме того, JavaScript является сердцем HTML 5, который получает все большее распространение.

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

Ниже показан пример кода на JavaScript, который был встроен в HTML-файл.

script
function fact(x)
if (x == 0)
return 1;
return x * fact(x — 1);
>

Python

Еще один язык, который впервые появился в начале 1990-х годов – Python – был создан Гвидо ван Россумом (Guido van Rossum). Он замышлялся как скриптовый язык, однако его мощности достаточно для разработки намного более сложных приложений.

Логотип языка Python.

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

Ниже приведен пример кода на Python.

def remove_dupes(mylist):
mylist.sort()
last = mylist[-l]
for i in range(len(mylist)-2, -1, -1):
if last == mylist[i]:
del mylist[i]
else:
last = mylist[i]

Python – это объектно-ориентированный язык, но он также поддерживает стили процедурного и функционального программирования. Типизация жесткая, но динамическая, с поддержкой списков, словарей и т.д. Python является интерпретируемым языком – исходный код компилируется в байт-код (как на Java), и выполняется на виртуальной машине.

Философия Python заключается в следующем:

  • Красивое лучше, чем некрасивое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем очень сложное.
  • Читаемость имеет значение.

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

Выводы и благодарности

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

Я с благодарностью принимаю неоценимую помощь, которую получил в процессе подготовки и написания этой статьи от Клайва Максфилда и других докладчиков и авторов Design West: Дуэйна Бенсона (Duane Benson), Дэвида Бебермана (David Beberman) и Марка Гуадженти (Mark Guagenti).

Перевод: Mikhail R по заказу РадиоЛоцман

Источник: www.rlocman.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru