Встроенный язык
Общее описание встроенного языка
Встроенный язык является важной частью технологической платформы 1С:Предприятия 8.0, поскольку позволяет разработчику описывать собственные алгоритмы функционирования прикладного решения.
Вот лишь некоторые, наиболее значимые особенности встроенного языка:
По этой причине модули, содержащие текст на встроенном языке, используются системой в конкретных, заранее известных ситуациях, которые могут возникнуть в процессе работы прикладного решения. Такие ситуации называются событиями. События могут быть связаны с функционированием объектов прикладного решения или с самим прикладным решением, как таковым.
Таким образом можно сказать, что встроенный язык является скриптовым языком для программирования бизнес-логики, а использование модулей на встроенном языке является событийно-зависимым, т.е. выполнение модулей происходит при возникновении определенных событий в процессе функционирования прикладного решения.
Предопределенные типы данных
Платформа 1С:Предприятия 8.0 позволяет разработчику использовать различные типы данных.
Описание примитивных типов данных :
Массив. Представляет собой пронумерованную коллекцию значений произвольного типа. К элементу массива можно обращаться по его индексу. В качестве элементов массива могут выступать, в частности, другие массивы. Это позволяет создавать многомерные массивы.
Список значений. Используется, как правило, для решения интерфейсных задач. Позволяет строить динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Он может содержать значения любого типа, кроме того, в одном списке типы хранимых значений могут быть разными.
Таблица значений. Таблица значений позволяет строить динамические наборы значений и манипулировать ими. Она может быть наполнена значениями любого типа, и в одной таблице типы хранимых значений могут быть разными.
Кроме этого в платформе реализованы специфические типы данных, реализующие ту или иную функциональность прикладных решений: текстовый документ, табличный документ, ХранилищеЗначения, ПостроительОтчета, ПостроительЗапроса и пр.
Остановимся подробнее на типе данных «ХранилищеЗначений». Хранилища предназначены для хранения значений, тип которых не может быть выбран в качестве типа поля, например: картинки, двоичные данные. При помещении значения в хранилище значений можно сжимать данные, указав требуемую степень сжатия. Данный метод позволяет уменьшить размер хранимого значения в информационной базе.
К значению, хранящемуся в хранилище, нельзя обращаться напрямую. Перед использованием значения его необходимо извлечь. Не рекомендуется хранить ссылки на объекты, т.к. в системе не поддерживается контроль ссылочной целостности по объектам, сохраненным в полях типа «Хранилище значения».
Операции помещения в хранилище и извлечения из него могут занимать продолжительное время, что необходимо учитывать при проектировании структур объектов.
Пример использования хранилища значения на примере справочника «Картинки»:
Встраиваемые языки: почему Lua?
Этот материал продолжает серию публикаций, основанных на докладах, которые мы сделали на конференции Games Gathering 2017 в декабре прошлого года. В одном из докладов была затронута тема выбора встраиваемого скриптового языка.
Что такое и зачем нужны скриптовые языки
Как уже упоминалось в предыдущем посте нашего блога, в нашей компании написан собственный движок. Сегодня речь пойдёт о том, чем мы руководствовались во время выбора скриптового языка для этого движка.
Таким образом, есть потребность в средстве для описания несложной, но всё-таки логики, без привлечения тяжёлой артиллерии программистов. Сделаем вывод — что такое для нас скриптовый язык? Это средство, которое позволит сделать разработку игр быстрее и дешевле.
Сразу возникает вопрос, а почему бы нам просто не использовать что-то вроде XML? Дело в том, что для наших целей нам часто нужны управляющие конструкции — ветвление и циклы, в то время как XML это декларативное описание.
Ещё одно преимущество скриптовых языков в том, что скрипты в проекте могут быть как кодом, так и ресурсом. И, соответственно, обновлять скриптовую часть игры можно не только вместе с кодом, то есть в ходе обычных обновлений через механизмы магазинов приложений. Но и вместе с ресурсами — то есть вместе с графическими и прочими материалами, с использованием CDN.
Требования к идеальному скриптовому языку
Сформулируем требования к идеальному скриптовому языку.
Python
Python — динамический язык, который пользуется немалой популярностью. Он характеризуется достаточно пологой кривой обучения, его довольно просто выучить. Однако изучить его как следует уже не так-то просто. Как результат, хорошие Python-программисты встречаются редко и дорого стоят. Это противоречит нашему желанию ускорить и удешевить разработку игровой логики.
Python обладает широкими возможностями, отличается хорошей производительностью. Его проблемой является неконсистентная система библиотек. Ещё одна его проблема, которая играет для нас важную роль, заключается в том, что он, на самом деле, не является встраиваемым языком. Это язык, из которого удобно вызывать библиотеки, написанные на C или C++.
По поводу возможностей по встраиванию Python можно сказать, что, например, существует Maya, где используется именно Python. Но тот, кто видел изнутри плагины для Maya, написанные на Python, согласится с нами в том, что выглядят они не очень хорошо.
В итоге можно сказать, что Python, при всех его сильных сторонах, нам не подходит. Теперь рассмотрим JavaScript.
JavaScript
JavaScript — это, без преувеличений, великий язык, который буквально захватил мир.
JavaScript — это популярный динамический язык, отличающийся пологой кривой обучения, обладающий широкими возможностями, хорошей производительностью и обширным набором библиотек.
Если нам, для построения игрового движка, нужен какой-нибудь интерпретатор языка — мы можем найти множество таких интерпретаторов. В реальности же придётся выбирать из двух подобных проектов — V8 и WebKit. И тот и другой имеют достаточно большие размеры. Как результат, если речь идёт о настольных играх, можно было бы рискнуть и включить в игру весь интерпретатор, но в случае мобильных игр нас такой вариант не устраивает.
В компании SocialQuantum есть собственный интерпретатор JavaScript, который проходит 98% тестов, мы планируем перевести этот проект в разряд опенсорсных.
В результате оказывается, что JavaScript выглядит сильным кандидатом на роль встраиваемого языка, но нам он тоже не подходит.
Тут надо отметить, что когда заходит разговор о JavaScript, следующим обычно вспоминают Haxe. Но, на самом деле, о возможности использования этого языка в качестве встраиваемого говорить нет смысла, так как Haxe, по сути, является не столько языком, сколько транс-компилятором в другие языки. А это не то, что нам нужно.
Может быть, нас устроит ActionScript или какой-нибудь другой скриптовый язык?
ActionScript
Если формально проанализировать ActionScript на соответствие вышеозначенным требованиям, то может показаться, что идеальный скриптовый язык найден. На его стороне динамическая природа, популярность, лёгкость изучения, хорошие возможности, производительность, наличие библиотек, лёгкость встраивания. Этот язык любят и помнят в игровой индустрии, на нём написано огромное количество замечательных Flash-игр. Главная проблема ActionScript заключается в том, что язык этот почти мёртв. Поэтому нас он тоже не устраивает.
AngelScript, Squirrel и другие
Помимо ActionScript существует множество скриптовых языков, таких, как AngelScript, Squirrel и другие. Среди них можно найти такие, которые, формально, почти полностью удовлетворяют нашим требованиям, но обычно это — языки, которые привязаны к их разработчику, в них бывают какие-то застарелые проблемы, которые годами не исправляются. Они, скорее всего, не слишком популярны, недостаточно хорошо документированы, по ним мало учебных материалов, у них не очень большие сообщества. Одним из следствий такого положения дел является тот факт, что их сложно изучать — хотя бы потому, что не до конца ясно — что они собой представляют и как работают.
Как видно, идеального встраиваемого языка мы пока не нашли. Что если создать собственный язык?
Создание собственного языка
Вполне возможно, что язык, разработанный внутри компании, будет идеально соответствовать её нуждам и его будет легко изучать. Но, скорее всего, такой язык не станет популярным. У такого языка либо будет минимальное количество библиотек, либо их не будет вовсе. Кроме того, сложно поверить, что в современных условиях можно создать нечто такое, что будет работать лучше, что будет обладать большей производительностью и будет проще встраиваться чем что-то, что уже есть на рынке.
Есть компании, которые разрабатывают и используют собственные языки, среди них есть и успешные игроки игрового рынка, но, скорее всего, это — не очень хорошая идея.
Рассмотрев существующие языки программирования, претендующие на роль встраиваемых и обсудив идею разработки собственного языка, перейдём к Lua.
Lua — встраиваемый язык, который выбрали мы
Lua — динамический язык. Он довольно-таки популярен, вокруг него сложилось большое сообщество, особенно — в сфере разработки игр. Он отличается весьма пологой кривой обучения. Например, в нашей компании сценарии для автотестов пишут на Lua. Стандартный вводный курс для автотестеров занимает примерно два часа, после чего человек в состоянии использовать этот язык. При этом Lua — мультипарадигменный язык. Он поддерживает функциональный стиль программирования и ООП. В результате он подходит не только для решения каких-то простейших задач, но и для более серьёзных дел, которыми занимаются профессиональные программисты.
Lua обладает хорошей производительностью и у него довольно много библиотек. Не так много, как у JavaScript, но, тем не менее, на сайте LuaForge можно найти практически всё, что может понадобиться. И, наконец, Lua очень просто встраивается, более того — он создан для того, чтобы его использовали как встраиваемый язык.
Например, вот как выглядит наша рабочая среда на основе IDE CLion от JetBrains. Здесь можно видеть созданный нами механизм автодополнения для Lua, который планируется сделать опенсорсным. Опенсорсным мы собираемся сделать и отладчик.
Мы выбрали Lua, но, когда речь заходит об использовании его в качестве встраиваемого скриптового языка, обычно приходится сталкиваться с примерно одними и теми же возражениями, которые мы сейчас рассмотрим.
Возражения по поводу использования Lua
Lua предназначен для C а не для С++
Никто не спорит с тем, что Lua — отличный встраиваемый язык. Главное, что считают его минусом, заключается в том, что он создан для использования с языком C, а не C++. Из-за этого, пытаясь применить в Lua что-то такое, что есть в C++ и нет в C, мы сталкиваемся с проблемами. Однако тут надо понимать, что проблемы эти решало множество довольно умных людей. Среди средств, решающих проблемы встраивания Lua в C++-проекты, можно отметить такие, как Luabind, Luabridge, toLua++, SQLuaHost. Это — далеко не полный список. Они обладают разными достоинствами и недостатками, но, тем не менее, скорее всего, всё, что вам может потребоваться, уже реализовано в одном из этих решений.
Рассмотрим, например SQLuaHost. Это — биндинг, который сделан внутри компании SocialQuantum, и который планируется сделать опенсорсным. Это решение представляет наше видение того, как должен биндиться Lua. Поэтому, вполне возможно, что если вы не нашли то, что вам нужно в существующих биндерах, вы найдёте это в SQLuaHost.
Lua — это медленно
Нам часто приходится сталкиваться с мнением, в соответствии с которым Lua — это очень медленный язык. Во-первых — это не так. Lua — это стековая машина, и там, на самом деле, просто нечему тормозить. К тому же надо понимать, что в скриптовый язык мы обычно отдаём игровую логику, бизнес-логику, а не какие-то действительно тяжёлые вещи. В результате, если Lua-скрипты заставляют игру тормозить, то проблема, возможно, кроется в неоптимальном биндинге или в нерациональном использовании каких-то функция языка. Мы, например, проводили синтетические тесты, на которых LuaJIT работает быстрее, чем Mono. При этом никто не мешает писать примерно такой вот неоптимальный код:
Здесь в каждом игровом тике создаётся новая текстура и устанавливается в качестве фона. Конечно, работать такая конструкция будет не особенно быстро, но никто не мешает писать такие вот вещи.
Lua подходит только для маленьких проектов
Следующее возражение заключается в том, что Lua сделан для того, чтобы писать какие-то маленькие вещи и что-то большое на этом языке написать невозможно. С одной стороны это правда. Но у этого языка высокая модульность. И из множества маленьких блоков можно делать достаточно большие и сложные системы. А если вспомнить то, что было уже сказано о мультипарадигменности и об ООП, то окажется, что ООП подталкивает разработчика к тому, чтобы создавать маленькие модули, которые можно использовать при создании больших и сложных конструкций.
При этом зачастую на Lua какие-то маленькие модули пишутся быстро, а в игровой индустрии «быстрее» — значит «дешевле».
Другие аргументы против Lua
Критикуя Lua, говорят о том, что язык это древний, что он, что называется, «из коробки», не поддерживает ООП, что нумерация элементов в его таблицах начинается не с 0, как можно было бы ожидать от любого приличного языка, а с 1.
Говорят, что его минус в том, что в нём нет тернарного оператора. На самом деле, таких вот аргументов против Lua довольно много, но мы не будем их обсуждать, так как полагаем, что они, по большей части, относятся к привычкам и личным предпочтениям разработчиков.
Итоги
Подведём итоги. Если ваша задача — с минимальными усилиями обзавестись встраиваемым языком — возьмите Lua. В то же время, если у вас есть время и ресурсы на разработку собственного языка или собственных биндингов — опять же — обратите внимание на Lua. Почему и в первом и во втором случаях мы рекомендуем Lua?
В первом случае, выбрав Lua, вы выберете язык, который очень просто встраивать и использовать. Существует ровно одна обучающая книга по этому языку, написанная его автором. Других книг нет просто потому, что в первой рассказано абсолютно всё, что нужно знать о Lua, и рассказывать о нём больше нечего. Lua — не идеальный и не самый распространённый в мире язык, но, по сумме критериев, это, определённо, один из лучших языков для встраивания. Он — лучший из того, что есть в нашем распоряжении прямо сейчас. К тому же, существует множество стандартных инструментов для Lua, которые сильно облегчают жизнь тем, кто им пользуется.
Во втором случае, если у вас есть ресурсы на разработку инструментов, вы, выбрав Lua, сможете с толком потратить эти ресурсы, так как Lua, несмотря на его популярность в среде разработки игр, язык весьма недооценённый. Как результат, у вас будет возможность, взяв за основу Lua, учесть свои потребности и получить именно то, что вам нужно.
Встроенный язык программирования
Строго говоря, деление языков программирования на языки общего назначения и предметно-ориентированные весьма условно, особенно, если учесть, что формально любой протокол или формат файлов является языком. Существует масса языков общего назначения, применяемых в качестве предметно-ориентированных для определённых задач, и наоборот, предметно-ориентированных языков, применяемых в качестве языков общего назначения. Так, язык ML, породивший целое семейство языков общего назначения (включая Haskell), — изначально разрабатывался в качестве DSL для системы автоматического доказательства теорем LCF. Примером, показывающим условность классификации, служит язык БНФ (и компилятор с него Lex/Yacc): с одной стороны, это яркий пример метаязыка, с другой — он предназначен для одной конкретной задачи.
Содержание
Терминология
Мартин Уорд (англ. Martin Ward ) [3] в работе «Language Oriented Programming» [4] (которая считается отправной точкой развития ЯОП), использовал термины « problem oriented » и « domain oriented », но в англоязычном научном сообществе прижился термин « domain-specific », причём именно « domain-specific language », а не « domain-specific programming language ». В русскоязычной литературе по программированию встречаются варианты «доменно-специфичный», «проблемно-ориентированный», «предметно-ориентированный».
Фаулер [5] и Дмитриев [6] определяют понятие DSL как «урезанный язык программирования (в большинстве случаев неполный по Тьюрингу)».
Примеры
Существуют языки программирования, встроенные в систему управления ресурсами предприятия (язык ABAP в SAP/R3, языки систем Галактика, Парус, 1С, Инфо-Бухгалтер) [ источник не указан 2122 дня ] и применяемые для их дополнения специфичными для конкретной организации модулями. Использование встроенного языка упрощает программирование специфичных задач, поскольку в языке изначально присутствуют понятия предметной области. Некоторые [ какие? ] геоинформационные системы и САПР также имеют встроенные языки программирования.
Встраиваемые языки
Текстовые языки
В дополнение к традиционному делению языков на интерпретируемые и компилируемые, встраиваемые языки вводят ещё несколько видов реализации языка:
Язык, используемый в качестве базового для реализации другого, часто называют метаязыком.
Основных причин для разработки встраиваемых текстовых языков три:
В контексте метаязыков самостоятельные языки временами называют «языками первого класса» (по аналогии с сущностями первого класса в языках), а встраиваемые — «объектными языками».
В подавляющем большинстве случаев встраиваемые языки имеют лишь одну поддерживаемую реализацию, и различия в результирующем машинном представлении кода на них зависят лишь от используемого транслятора базового языка. Однако, бывают и исключения — например, язык Concurrent ML (CML), расширяющий Standard ML конструкциями для явного параллелизма, имеет две принципиально различные реализации.
Визуальные языки
Один из языков (базовый или встраиваемый) может быть визуальным, что нередко применяется в пользовательском программировании (англ. end-user development ). Типичными примерами таких пар могут служить AutoLisp — AutoCAD и VBA — Microsoft Excel. Подобные пары образуют целостную интерактивную систему, и с точки зрения пользователя невозможно (и не нужно) определить, являются ли визуальные инструменты надстройкой, имитирующей команды встроенного текстового языка, или же текстовый язык управляет визуальными инструментами. Действительные взаимоотношения в этих парах определяются разработчиком.
В паре Emacs — Emacs Lisp отношения более определённые. Лисп традиционно относится к метаязыкам, и в данном случае текстовый редактор надстраивается над ним как визуальный DSL, что и делает последний изменяемым и расширяемым.
В случае, когда оба языка являются визуальными, встраиваемые языки обычно называют иными терминами — плагинами, фильтрами и др., и не используют терминологию языково-ориентированного программирования. Формально же можно говорить, например, что для визуального мета-языка обработки графики Adobe Photoshop есть множество встраиваемых визуальных мини-языков (см. Photoshop plugin [en] ).
Преимущества и недостатки
Таким образом, вопрос о преимуществах и недостатках корректнее ставить в свете применения языково-ориентированной методологии вместо какой-либо другой при изначальном отсутствии готового DSL, сопоставляя потенциальный выигрыш от его использования с затратами на его разработку и сопровождение.
Языки программирования встраиваемых систем
Специализированные языки были разработаны для удовлетворения специфических требований разработчиков встраиваемых систем, но ни один язык не нашел всеобщего признания
Все это началось в прошлом году, когда я получил письмо от Клайва (Макса) Максфилда. Он проводил семинар в Design West, и поинтересовался, хочу ли я принять в нем участие. Семинар назывался «10 языков за 45 минут». Суть заключалась в том, что выступят десять участников, каждому из которых будет отведено четыре минуты для рассказа о конкретном языке, имеющем отношение к разработчикам встраиваемых систем. Оставшиеся пять минут рассчитаны на вступление Макса и заключительную речь. Он попросил меня рассказать о C++, и я был счастлив принять его приглашение.
Семинар прошел очень хорошо. Несмотря на то, что мы начали в 8:30 утра, в зале собралось довольно много людей, настроенных весьма доброжелательно. После краткого введения Макса выступили докладчики. Для организации честной игры Макс специально завел таймер. Благодаря быстрому темпу семинар получился очень динамичным, и я считаю, что аудитории это понравилось. Мне уж точно понравилось.
После семинара у меня возникла идея – почему бы не написать статью, чтобы поделиться представленными на этом семинаре концепциями с более широкой аудиторией. И вот она вышла, хотя должен заметить, что я ограничился лишь пятью языками программирования. Остальные пять были языками описания аппаратуры (HDL), которые, может быть, рассмотрим в следующий раз.
Языки программирования встраиваемых систем
Во многих отношениях программирование встраиваемых систем не слишком отличается от написания кода для настольного компьютера, но есть некоторые ключевые различия.
На заре становления встраиваемых систем из-за фактора №1 и, в некоторой степени, №2 и №4 большинство систем программировалось на ассемблере. Такой подход и сейчас остается в качестве одного из вариантов, но теперь ассемблер используется только тогда, когда обойтись без него действительно невозможно.
Потребности разработчиков встраиваемых систем достаточно специфичны, поэтому можно было бы ожидать, что специализированные языки были разработаны для удовлетворения их уникальных требований. Есть примеры языков, которые изначально создавались для встраиваемых приложений (например, PL/M, Forth, Ada), но они не нашли всеобщего признания.
Язык C
Язык Си был разработан в 1970-х Деннисом Ритчи (Dennis Ritchie) в AT&T Bell Labs. Си основывался на более ранней попытке создать высокоуровневый язык под названием B, обладавший преимуществами ассемблера. Он, в свою очередь, начал разрабатываться в Кембридже (Англия) и первоначально носил название BCPL. Оригинальный справочник «Язык программирования Си» (The C Programming Language), написанный Брайаном У. Керниганом (Brian W. Kernighan) и Деннисом М. Ритчи, был опубликован в 1978 году. Для полной стандартизации (в соответствии с ANSI) потребовалось еще 10 лет, и с тех пор вышло много версий.
Хотя Си никогда не разрабатывался или не предназначался для использования во встраиваемых системах, для них он остается наиболее широко используемым языком программирования благодаря компиляторам, доступным практически для любого представленного на рынке микропроцессора, микроконтроллера и процессорного ядра.
Несмотря на то, что Си является структурированным языком, он предлагает большую гибкость, позволяя писать легко читаемый код, хотя этот же код можно написать в сложной для восприятия форме.
Ниже приведен пример хорошо скомпонованного кода.
for (x = 0; x Язык C++
Хотя идея объектно-ориентированного программирования (ООП) не нова (по крайней мере, один такой язык существовал в середине 1960-х годов), модным ООП стало лишь в 1980-х. В результате появился целый ряд языков, некоторые из которых были основаны на Си. Видимо, теперь самое время посмотреть на «родословную» языков программирования, показанную ниже.
![]() |
| «Генеалогическое дерево» языков программирования. |
Некоторое количество C-подобных объектно-ориентированных языков выжило, но единственным языком, который действительно утвердился и теперь популярен в области разработки встраиваемых систем, является C++. Он был создан Бьерном Страуструпом (Bjarne Stroustrup) в Bell Labs.
Одним из ключевых факторов успеха C++ была его первоначальная реализация. Вместо того, чтобы писать обычный компилятор, Страуструп написал препроцессор – «Cfront», который переводил C++ в стандартный Си. Это означало, что новый язык был готов для использования практически в любом месте, где был доступен компилятор Си. В настоящее время очень распространены специальные компиляторы C++, но мощный стимул его развитию дало именно создание препроцессора.
Цель ООП – поддерживать разработку крупных программных проектов. Такая задача все чаще встает перед разработчиками встраиваемых систем. Использование подхода ООП может позволить каждому программисту сосредоточиться на его или ее собственной области знаний без необходимости понимания каждого аспекта всего приложения.
C++ можно использовать двумя способами. Его можно просто рассматривать как язык Си, «улучшенный» за счет ряда объектов и конструкций, или же он может использоваться как истинный объектно-ориентированный язык. Последний подход может быть очень полезен для встраиваемых приложений, поскольку он позволяет инкапсулировать специальные коды, например, коды доступа к устройству.
Ключевой особенностью языка C++ является понятие класса. Класс в C++ представляет собой нечто подобное структуре в языке Си, но с некоторыми отличиями:
Ниже приведен простой пример определения класса в C++.
class woport
<
int shadow;
int* address;
public:
woport(long);
Обратите внимание на то, как объект (или, если хотите, переменная) 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-файл.


Python
Еще один язык, который впервые появился в начале 1990-х годов – Python – был создан Гвидо ван Россумом (Guido van Rossum). Он замышлялся как скриптовый язык, однако его мощности достаточно для разработки намного более сложных приложений.
| Логотип языка Python. |
Python заимствует некоторые синтаксические элементы Си, но он меньше похож на Си, чем все языки, о которых говорилось выше. В частности, пробел имеет значение для структуры программы, что делает код более читаемым.
Ниже приведен пример кода на Python.
Python – это объектно-ориентированный язык, но он также поддерживает стили процедурного и функционального программирования. Типизация жесткая, но динамическая, с поддержкой списков, словарей и т.д. Python является интерпретируемым языком – исходный код компилируется в байт-код (как на Java), и выполняется на виртуальной машине.
Философия Python заключается в следующем:
Python широко используется во встраиваемых приложениях и имеет гораздо больше возможных областей применения, где его уникальный стиль будет полезен. Написанные на Python программы легко портируются, поэтому язык может использоваться где угодно. Не так давно разработчики дешевого одноплатного компьютера Raspberry Pi выбрали Python в качестве основного языка программирования.
Выводы и благодарности
Когда речь заходит о языках программирования для встраиваемых систем, первыми приходят на ум Си (наряду с C++), а также, в некоторой степени, ассемблер. Тем не менее, есть и другие варианты, где особые требования к написанию программы диктуют необходимость специфических решений. Интересно, что синтаксис языка Си, хотя зачастую и подвергается критике, все же является основой для многих других языков, появившихся позднее.
Я с благодарностью принимаю неоценимую помощь, которую получил в процессе подготовки и написания этой статьи от Клайва Максфилда и других докладчиков и авторов Design West: Дуэйна Бенсона (Duane Benson), Дэвида Бебермана (David Beberman) и Марка Гуадженти (Mark Guagenti).
Перевод: Mikhail R по заказу РадиоЛоцман






