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

Содержание

«Как создаются языки программирования?» — Яндекс Кью

Сообщества

Технологии

Александр Мануйлов

  ·

22,4 K

ОтветитьУточнить

Арина Левадная

Образование

509

Работа — в сфере IT.
Увлечения — книги, финансы, иностранные языки, здоровье.  · 29 апр 2021  ·

Отличный и очень интересный вопрос.

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

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

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

И тут тоже вопрос, на каком уровне компилятор\интерпретатор будет взаимодействовать с системой — будет ли он базироваться на других языках и их возможностях — или будет взаимодействовать с ОС и железом на низком уровне.

Заходите в Яндекс.Дзен

Перейти на bit.ly/3w79GNg

Комментировать ответ…Комментировать…

Первый

Дмитрий Тумали

2

Делал модули для CMS (сайты) на PHP.
Разрабатываю язык программирования ksi.  · 11 окт 2021

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

Igor Lytkin

22 октября 2021

Я считаю что у каждого из всех свой язык. Там так и не было ответа как именно они создаются. Только ответ на «почему» и есть.
По факту, создать язык = создать компилятор который интерпритирует текст в бинарный код понятный машине.
Они создаются точно так же как и любые другие программы.
1. Продумывается под какие задачи должен язык… Читать далее

Александр Коновалов

1 января 2021

Можно писать не компилятор. Можно писать интерпретатор.

Комментировать ответ…Комментировать…

Первый

Владимир Журавлёв

18

любопытный  · 14 июл 2015

Наверное, для того чтобы понять, как они создаются, нужно узнать — почему.
При разработке нового языка программирования люди могут преследовать разные цели.
Во-первых, банально сделать жизнь программиста более легкой, а его код — менее
подверженным риску возникновения новых ошибок, «багов». Так, язык C работает непосредственно с оперативной памятью компьютера, в отличии… Читать далее

Комментировать ответ…Комментировать…

Nail Zagidullin

32

учитель информатики  · 10 июл 2015

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

mr Question

15 июля 2015

«учитель информатики» — сразу видно

Комментировать ответ…Комментировать…

Вы знаете ответ на этот вопрос?

Поделитесь своим опытом и знаниями

Войти и ответить на вопрос

1 ответ скрыто(Почему?)

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

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


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

Введение

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

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

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

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

Первые шаги

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

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

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

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

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

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

история — На чем написаны языки программирования?

спросил

Изменено
2 года, 1 месяц назад

Просмотрено
2к раз

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

Подумай об этом так. Python написан на C, который написан на более старом компиляторе C, который написан на еще более старом компиляторе C, который написан на B, который написан (я думаю) на BCPL. Я не уверен, на чем написан BCPL, но кажется, что где-то должен быть исходный язык?

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

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

3

На каких языках программирования написаны?

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


После начальной загрузки языки программирования могут размещаться самостоятельно, поэтому они часто пишутся на том же языке, на котором компилируются. Например, компиляторы C написаны на C или C++, а компилятор C# Roselyn написан на C#.

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

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


Так что же было первым и в чем это было закодировано?

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

Подумай об этом так. Python написан на C,

Нет, это не так.

Кажется, вы путаете язык программирования , такой как Python или C, с реализацией языка программирования (например, компилятор или интерпретатор ), например PyPy или Clang.

Язык программирования представляет собой набор семантических и синтаксических правил и ограничений. Это просто идея. Клочок бумаги. Он ни на чем не «написан» (в том смысле, что, например, Linux «написан на» C). В лучшем случае мы можем сказать, что она написана на английском языке, а точнее, на определенном 9 языке.0053 жаргон английского языка, полуформат подмножество английского языка, расширенное логической нотацией.

Различные спецификации написаны в разных стилях, вот пример некоторых спецификаций:

  • Спецификация языка Java
  • Спецификация языка Scala
  • Языковой отчет Haskell 2010
  • Пересмотренный 7 Отчет о схеме алгоритмического языка
  • Спецификация языка ECMA-262 ECMAScript®
  • Python на самом деле не имеет единой спецификации языка, как многие другие языки, информация как бы расколота между справочником по языку Python, предложениями по улучшению Python, а также лотом неявных институциональных знаний, которые существуют только в коллективе. главы сообщества Python

Сегодня широко используется несколько реализаций Python, и только одна из них написана на C:

  • Brython написан на ECMAScript
  • IronPython написан на C#
  • Jython написан на Java
  • GraalPython написан на Java с использованием платформы реализации языка Truffle
  • .

  • PyPy написан на языке программирования RPython (язык со статической типизацией примерно на уровне абстракции Java, примерно с производительностью C, с синтаксисом и семантикой времени выполнения, которые являются надлежащим подмножеством Python) с использованием среды реализации языка RPython
  • .

  • CPython написан на C

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

Опять вы путаете Языки программирования и Реализации языка программирования .

Языки программирования написаны на английском языке. Реализации языков программирования написаны на языках программирования. Они могут быть написаны на любом языке программирования . Например, Jython — это реализация Python, написанная на Java. GHC — это реализация Haskell, написанная на Haskell. GCC — это компилятор C, написанный на C. tsc — это компилятор TypeScript, написанный на TypeScript. rustc — компилятор Rust, написанный на Rust. NSC — это компилятор Scala, написанный на Scala. javac — компилятор Java, написанный на Java. Roslyn — это компилятор C#, написанный на C#.

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

8

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

Этот набор инструкций является первым языком.

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

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

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

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

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

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

Изучите: какие существуют уровни языков программирования?

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

Языки программирования можно разделить на два разных уровня:

  • Языки высокого уровня — Python, Visual Basic, Java, C, C++, SQL и многие другие.
  • Языки низкого уровня – Языки ассемблера и машинный код для конкретных аппаратных средств/процессоров.

Различий между языками низкого и высокого уровня:

Learn It: Program Translators

Программные переводчики:

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

Есть три типа программ-переводчиков, которые могут это сделать:

  • Переводчики
    • После создания программы ее необходимо сохранить перед запуском.
    • В этот момент язык программирования переводит исходный код в машинный код одну команду/строку за раз и немедленно выполняет их 9 9020.
    • У вас должен быть интерпретатор , установленный на вашем компьютере в порядке запустить программное обеспечение .
    • Каждый раз, когда программа запускается , она имеет для повторного перевода , так как нет вторичного файла, созданного для хранения машинного кода, и поэтому его необходимо переводить при каждом запуске программы.
    • Длинная, сложная программа займет значительно больше времени до выполнение если она интерпретируется .
    • Это делает интерпретируемый код медленнее запускать , чем скомпилированный код , но он показывает любые ошибки как только находит их , поэтому легче отлаживать скомпилированный код . Python, Basic, JavaScript и Pascal все интерпретаторные языки программирования .
  • Компиляторы:
    • Компилятор переводит все исходный код одновременно по создать скомпилированный код или машинный код , также известный как объектный код .
    • Машинный код - это сохраненный и сохраненный в отдельном файле на языке программирования высокого уровня .
    • Как только программист создал программу , ему необходимо запросить скомпилировать до они могут запустить и протестировать файл, который может занять некоторое время .
    • Это может сделать тестирование небольших разделов программы медленнее, так как вся программа нуждается в для компиляции до любой из он может быть запущен 9020 9.
    • Компиляция может занять много времени , но после завершения скомпилированный код выполняется быстро и сообщает список ошибок , если они произошли.
    • Всего , как только программа завершила компиляцию , скомпилированные программы выполняются на быстрее . Java и C++ являются языками программирования компилятора .
    • Для разработчика , скомпилированный код имеет преимущество перед пользователь программного обеспечения не может видеть исходный код или скопировать его .
  • Сборщики:
    • Ассемблер Переводит Язык сборочного языка в Машинный код и Эффективно, но также может быть для Язык , но также может быть .0124 .
    • Язык ассемблера использует слова, называемые «мнемоника» , такие как LOAD, STORE и ADD . Инструкции являются специфическими для аппаратного обеспечения , будучи запрограммированными , потому что различные процессоры используют разные языки программирования .
    • Наконец , каждая инструкция на ассемблере - это переведенный в один машинный код инструкция .
  • Компиляторы и интерпретаторы Таблица:

Badge It: Exam Questions

Silver — Exam Style Questions
  1. Объясните , почему разработчик, хорошо владеющий как низкоуровневыми, так и высокоуровневыми языками программирования, обычно использует язык высокого уровня, когда писать программы? (4 балла)
  2. Что такое машинный код? (1 балл)
  3. Приведите пример языка высокого уровня? (1 балл)

Загрузка в раздел «Основы 3. 2 программирования» — 3.2.9 Классификация языков программирования: Серебряный на BourneToLearn

Badge It: Exam Questions

Gold - Ответьте на следующие вопросы:
  1. Опишите три различия между языками низкого уровня и языками высокого уровня? (6 баллов)
  2. Чем занимается переводчик? (2 балла)
  3. Определить два типа трансляторов , которые могут преобразовывать языки высокого уровня в машинный код? (4 балла)

Загрузка в раздел «Основы 3.2 программирования» — 3.2.9 «Классификация языков программирования»: золото на BourneToLearn

Badge It: экзаменационные вопросы

Platinum — экзаменационные вопросы
  1. В чем разница между интерпретатором и компилятором? (4 балла)
  2. Что такое язык ассемблера? (2 балла)
  3. Разработчик пишет программу.
    • а) Программа написана на языке высокого уровня, а затем переведена в машинный код. Опишите два различия между языком высокого уровня и машинным кодом? (2 балла)
    • б) Одним из видов переводчиков является устный переводчик.