Как создаются языки программирования: Как создаются языки программирования

Содержание

теория, инструменты и советы от практика

Рассказывает программист Вильям В. Вольд


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

Введение

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

Тем не менее, я написал абсолютно новый язык. И он работает. Наверное, я что-то делаю правильно.

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

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

Первые шаги

«А с чего вообще начинать?» — вопрос, который другие разработчики часто задают, узнав, что я пишу свой язык. В этой части постараюсь подробно на него ответить.

Компилируемый или интерпретируемый?

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

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

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

%saved0% Кстати, у нас есть краткий обзор серии статей по созданию собственного интерпретатора — это отличное упражнение для тех, кто изучает Python.

Выбор языка

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

Но в целом совет можно дать такой:

  • интерпретируемый ЯП крайне рекомендуется писать на компилируемом ЯП (C, C++, Swift). Иначе потери производительности будут расти как снежный ком, пока мета-интерпретатор интерпретирует ваш интерпретатор;
  • компилируемый ЯП можно писать на интерпретируемом ЯП (Python, JS). Возрастёт время компиляции, но не время выполнения программы.

Проектирование архитектуры

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

Лексический анализатор / лексер

Строка исходного кода проходит через лексер и превращается в список токенов.

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

Обращения к исходному коду уже не будет происходить на следующих этапах, поэтому лексер должен выдать всю необходимую для них информацию.

Flex

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

Одним из основных таких инструментов является Flex — генератор лексических анализаторов. Он принимает на вход файл с описанием грамматики языка, а потом создаёт программу на C, которая в свою очередь анализирует строку и выдаёт нужный результат.

Моё решение

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

Синтаксический анализатор / парсер

Список токенов проходит через парсер и превращается в дерево.

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

Bison

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

Преимущества кастомных программ

С лексером моё решение писать и использовать свой код (длиной около 200 строк) было довольно очевидным: я люблю задачки, а эта к тому же относительно тривиальная. С парсером другая история: сейчас длина кода для него — 750 строк, и это уже третья попытка (первые две были просто ужасны).

Тем не менее, я решил делать парсер сам. Вот основные причины:

  • минимизация переключения контекста;
  • упрощение сборки;
  • желание справиться с задачей самостоятельно.

В целесообразности решения меня убедило высказывание Уолтера Брайта (создателя языка D) в одной из его статей:

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

Абстрактный семантический граф

Переход от синтаксического дерева к семантическому графу

В этой части я реализовал структуру, по своей сути наиболее близкую к «промежуточному представлению» (intermediate representation) в LLVM. Существует небольшая, но важная разница между абстрактным синтаксическим деревом (АСД) и абстрактным семантическим графом (АСГ).

АСГ vs АСД

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

Запуск

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

Варианты компиляции

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

Написать свой компилятор

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

LLVM

LLVM — это коллекция инструментов для компиляции, которой пользуются, например, разработчики Swift, Rust и Clang. Я решил остановиться на этом варианте, но опять не рассчитал сложности задачи, которую перед собой поставил. Для меня проблемой оказалось не освоение ассемблера, а работа с огромной многосоставной библиотекой.

Транспайлинг

Мне всё же нужно было какое-то решение, поэтому я написал то, что точно будет работать: транспайлер (transpiler) из Pinecone в C++ — он производит компиляцию по типу «исходный код в исходный код», а также добавил возможность автоматической компиляции вывода с GCC. Такой способ не является ни масштабируемым, ни кроссплатформенным, но на данный момент хотя бы работает почти для всех программ на Pinecone, это уже хорошо.

Дальнейшие планы

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

Заключение

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

Вот общие советы от меня (разумеется, довольно субъективные):

  • если у вас нет предпочтений и вы сомневаетесь, компилируемый или интерпретируемый писать язык, выбирайте второе. Интерпретируемые языки обычно проще проектировать, собирать и учить;
  • с лексерами и парсерами делайте, что хотите. Использование средств автоматизации зависит от вашего желания, опыта и конкретной ситуации;
  • если вы не готовы / не хотите тратить время и силы (много времени и сил) на придумывание собственной стратегии разработки ЯП, следуйте цепочке действий, описанной в этой статье. Я вложил в неё много усилий и она работает;
  • опять же, если не хватает времени / мотивации / опыта / желания или ещё чего-нибудь для написания классического ЯП, попробуйте написать эзотерический, типа Brainfuck. (Советуем помнить, что если язык написан развлечения ради, это не значит, что писать его — тоже сплошное развлечение. — прим. перев.)

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

О том, что ввязался в историю с созданием Pinecone, ни в коем случае не жалею — это отличный эксперимент, и он только начался.

Перевод статьи: «I wrote a programming language. Here’s how you can, too»

11 шагов и реальные перспективы

В статье рассказывается:  

  1. Зачем нужны новые языки программирования
  2. 11 шагов создания своего языка программирования с нуля
  3. Книги про создание языка программирования с нуля
  4. Реально ли в одиночку написать язык программирования
  5. Онлайн-курсы по изучению и созданию языков программирования
  6. Пройди тест и узнай, какая сфера тебе подходит:
    айти, дизайн или маркетинг.

    Бесплатно от Geekbrains


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

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

Зачем нужны новые языки программирования

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

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

Требования к созданию языков программирования постепенно менялись по мере того, как стали появляться компьютеры помощнее, более простые и удобные в использовании. К примеру, Fortran придумывался больше для ведения математических вычислений, Basic и Pascal были «заточены» под учебные цели и отличались легкостью изучения, а другие (вроде Си) были хороши своей универсальностью и скоростью работы.

Как только в программировании свершались некие значимые достижения, тут же появлялась куча новых языков. Например, языки C++, Objective C, Java были разработаны в 1980-1990-е годы на фоне открытия парадигмы объектно-ориентированного программирования. Скриптовые языки (вроде PHP, JavaScript, Python) стали бурно развиваться в связи с появившейся необходимостью в создании веб-приложений. Да и сейчас тоже продолжают появляться отличные языки, они быстро пишутся, и программы на них работают просто молниеносно (примеры — Go, Swift, Rust).

Зачем нужны новые языки программирования

Разумеется, современные новые языки программирования – это не просто «модное» веяние. Часто в них возникает конкретная необходимость, когда требуется решение неких особых задач. К примеру, для автоматической обработки логических суждений создавался Prolog. А Erlang принят как стандарт в сфере разработки ПО для сетевых коммуникаций.

11 шагов создания своего языка программирования с нуля

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

Шаг 1. Ознакомьтесь с устройством компьютера.

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

Шаг 2. Разберитесь в терминах.

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

Шаг 3. Обозначьте специализацию языка.

То есть определитесь, создаете вы инструмент для решения конкретных задач или это будет язык с широким профилем применения в самых разных областях IT. Прикиньте общий объём работ, обозначьте цели. Тут вот что важно решить: вы стараетесь для всего мира или это чисто проба своих сил в новом направлении?

Шаг 4. Определитесь с основными концептуальными моментами.

Вот вопросы, на которые вам следует дать ответ:

  • Задействовать компиляцию или интерпретацию? Компилируемый код пишется так, что машина сразу его «понимает» и исполняет. Интерпретируемый код работает построчно. Что именно использовать – выбирать вам, рассмотрите оба варианта с точки зрения удобства, функциональности, производительности, защищенности и т. п.
  • Задавать статическую или динамическую типизацию? При статической пользователь сам указывает типы данных, а для динамической нужно будет создать систему, определяющую типы.
  • Для памяти будет предусмотрено ручное управление или автоматическая очистка?
  • Какую модель вы собираетесь задействовать: ООП, логическое, структурное или функциональное программирование? Или вы вообще планируете придумать нечто новое, чего раньше еще не было?
  • Будет ли ваш язык интегрироваться с другими?
  • Предусмотрен ли в языке базовый функционал или всё будет работать за счет внешних библиотек?
  • Каким будет архитектурное построение программы?

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

Шаг 5. Продумайте синтаксис.

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

Шаг 6. Придумайте название.

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

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

Поможет разобраться в актуальной ситуации на рынке труда

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

pdf 3,7mb

doc 1,7mb


Уже скачали 20608

Шаг 7. Определитесь с языком написания языка.

Помешанные на высоких технологиях гики готовы задействовать для этого машинные коды или язык ассемблера. Но в современных реалиях есть смысл заниматься созданием языков программирования на компилируемых языках Pascal, C, C++, C#, Swift (для интерпретируемого кода) и на интерпретируемых языках Java, JavaScript, Python, Ruby (для написания компилируемого кода). Это на выходе дает максимальную производительность.

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

Шаг 8. Создайте лексер и парсер.

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

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

Шаг 9. Сформируйте стандартную библиотеку.

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

Шаг 10. Напишите громадное количество текстов.

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


Только до 4.05


Скачай подборку тестов, чтобы определить свои самые конкурентные скиллы

Список документов:

Тест на определение компетенций

Чек-лист «Как избежать обмана при трудоустройстве»

Инструкция по выходу из выгорания

Чтобы получить файл, укажите e-mail:

Подтвердите, что вы не робот,
указав номер телефона:


Уже скачали 7503

Шаг 11. Представьте язык миру.

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

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

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

Например, работа А. В. Хохлова под названием «Как создать язык программирования и транслятор». Книга хорошая, но тут всё же больше про транслятор. Процессам выбора тех или иных решений внимания не уделено, а между тем, было бы интересно проследить за ходом мыслей автора. Может быть в скором времени он об этом еще расскажет.

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

Для тех, кто задумался о создании языка программирования, есть неплохая книга «Теоретические основы разработки и реализации языков программирования». Авторы – отечественные разработчики М. М. Гавриков, А. Н. Иванченко, Д. В. Гринченков. Но и здесь следует сделать уточнение, что книга больше не про «разработку», а про «реализацию».

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

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

А реально ли в одиночку написать язык программирования?

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

Написать что-то такое, чем потом можно будет реально пользоваться, очень трудно, и уж тем более – в одиночку. К примеру, неслучайно в Microsoft долгие годы был в ходу язык Си, созданный еще в далеком 1973 году. Да, безусловно, можно привести примеры людей, самостоятельно создававших шедевры. Но процесс разработки ПО за последние десятки лет очень усложнился, и подобные подвиги уже вряд ли возможны. Язык без удобной среды разработки поддерживать никто не станет.

Онлайн-курсы по изучению и созданию языков программирования

В создании качественных продуктов обычно участвуют целые команды профессионалов-энтузиастов. При необходимости вы найдете их на GitHub. Став членом одной из таких команд, вы найдете практическое применение своим знаниям, попробуете себя в деле.

Онлайн-курсы по изучению и созданию языков программирования

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

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

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

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

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

Большое количество курсов и мастер-классов собрано на образовательном портале GeekBrains. Есть и возможность стажировки после обучения.


Продвижение блога — Генератор
продаж


Рейтинг:
2


( голосов
4 )


Поделиться статьей

Как создаются языки программирования

8 декабря 2021 г. | Salesforce, SAP

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

Но задумывались ли вы когда-нибудь – как создаются языки программирования ?

Сегодня мы рассмотрим этапы, требования и стратегии разработки нового языка программирования.

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

Как создаются языки программирования?

(Как создаются языки программирования?)

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

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

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

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

Требования для создания языка программирования

Как создаются языки программирования?

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

Видение

Вы должны определить Видение вашего нового языка. Этот этап является обязательным и помогает вам оценить богатство и ценность вашего нового языка.

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

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

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

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

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

Аромат

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

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

Компилятор или интерпретатор

При выборе компилятора или интерпретатора вам также потребуется обрабатывать ошибки, сообщения и условия гонки.

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

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

Библиотеки

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

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

Реализация

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

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

Тестирование

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

Этап тестирования жизненно важен перед этапом развертывания. Используя процедуры тестирования, вы гарантируете, что все идет в правильном направлении.

Зачем создавать новый язык программирования?

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

Экспертиза

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

Кастомизация

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

Например, мы используем язык структурированных запросов (SQL) для управления базами данных, этот факт известен всем. С другой стороны, Salesforce использует SOQL (Salesforce Object Query Language) для обработки своих запросов к базе данных. Можно сказать, что SOQL — это один из хорошо известных примеров пользовательского языка (языков) для корпоративного использования.

Вам слово

Как создаются компьютерные языки?

Итак, как создаются новые языки программирования?

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

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

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

Как создаются языки программирования? [2023]

Как создаются языки программирования? Как был создан первый язык программирования? Вы действительно можете запрограммировать язык программирования?

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

  • Как создаются языки программирования?
  • Как был создан первый язык программирования?
  • Зачем создавать собственный язык программирования?

Как создаются языки программирования?

В двух словах:

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

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

Первый — Лексер. Он берет исходный код и преобразует его в упорядоченный список токенов. Токены — это просто ключевые слова, символы, операторы или числа (например, если, +, — и т. д.)

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

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

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

Почему? — Какова цель?

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

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

Платформа

Далее вам нужно решить, на каких платформах будет работать ваш код. – Ваш язык будет использоваться только для Windows-приложений или для Linux и мобильных платформ тоже?

Конечно, интерпретатор должен иметь возможность работать на этой платформе, а компилятор должен иметь возможность генерировать файл, с которым может работать платформа (например, .exe в Windows).

Компилируется или интерпретируется?

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

Скомпилированные языки транслируются в машинный код перед выполнением. Следовательно, пользователю приложения не нужно устанавливать компилятор.

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

Какие токены (ключевые слова) мне нужны?

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

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

ООП или функциональное программирование?

Теперь программист должен решить, должно ли программирование быть объектно-ориентированным или функционально-ориентированным.

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

Функциональные языки не используют классы для создания объектов. У них просто есть свои функции и переменные. Например, Python — это в основном функциональный язык программирования.

Синтаксис

Следующим шагом является определение синтаксиса языка программирования. При использовании нового языка программирования программист должен строго следовать ему. В противном случае компилятор/интерпретатор не сможет понять код и выдаст ошибку.

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

Какие библиотеки я буду использовать? — Должен ли я создать свой собственный?

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

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

Имя

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

Как был создан первый язык программирования?

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

Первый «язык» встроен в процессор (электрическая цепь, состоящая из электрических переключателей, называемых транзисторами). Он называется Машинный Код . Машинный код состоит только из единиц (вкл.) и нулей (выкл.), называемых битами.
Определенные комбинации битов выполняют определенную задачу на процессоре (инструкции жестко зашиты). В 1949 году был создан первый язык программирования Assembly для создания синонимов для тех комбинаций, которые легко понять человеку.
Чтобы это заработало, первый ассемблер, который мог переводить язык ассемблера в машинный код, должен был быть написан непосредственно в машинном коде .

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

Опять же вкратце:
Первый язык программирования был написан на машинном коде.

Зачем вам создавать новый язык программирования

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

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