Как создать свой язык программирования: теория, инструменты и советы от практика
На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
На протяжении последних шести месяцев я работал над созданием языка программирования (ЯП) под названием Pinecone. Я не рискну назвать его законченным, но использовать его уже можно — он содержит для этого достаточно элементов, таких как переменные, функции и пользовательские структуры данных. Если хотите ознакомиться с ним перед прочтением, предлагаю посетить официальную страницу и репозиторий на GitHub.
Введение
Я не эксперт. Когда я начал работу над этим проектом, я понятия не имел, что делаю, и всё еще не имею. Я никогда целенаправленно не изучал принципы создания языка — только прочитал некоторые материалы в Сети и даже в них не нашёл для себя почти ничего полезного.
Тем не менее, я написал абсолютно новый язык. И он работает. Наверное, я что-то делаю правильно.
В этой статье я постараюсь показать, каким образом Pinecone (и другие языки программирования) превращают исходный код в то, что многие считают магией. Также я уделю внимание ситуациям, в которых мне приходилось искать компромиссы, и поясню, почему я принял те решения, которые принял.
Текст точно не претендует на звание полноценного руководства по созданию языка программирования, но для любознательных будет хорошей отправной точкой.
Первые шаги
«А с чего вообще начинать?» — вопрос, который другие разработчики часто задают, узнав, что я пишу свой язык. В этой части постараюсь подробно на него ответить.
Компилируемый или интерпретируемый?
Компилятор анализирует программу целиком, превращает её в машинный код и сохраняет для последующего выполнения. Интерпретатор же разбирает и выполняет программу построчно в режиме реального времени.
Технически любой язык можно как компилировать, так и интерпретировать. Но для каждого языка один из методов подходит больше, чем другой, и выбор парадигмы на ранних этапах определяет дальнейшее проектирование. В общем смысле интерпретация отличается гибкостью, а компиляция обеспечивает высокую производительность, но это лишь верхушка крайне сложной темы.
Я хотел создать простой и при этом производительный язык, каких немного, поэтому с самого начала решил сделать Pinecone компилируемым. Тем не менее, интерпретатор у Pinecone тоже есть — первое время запуск был возможен только с его помощью, позже объясню, почему.
Выбор языка
Своеобразный мета-шаг: язык программирования сам является программой, которую надо написать на каком-то языке. Я выбрал 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, ни в коем случае не жалею — это отличный эксперимент, и он только начался.
Все о языке программирования Python
Python по праву занял сердца миллионов программистов по всему миру. В этой статье мы расскажем вам, для чего нужен этот язык программирования и где он применяется, какие особенности и преимущества имеет, какие библиотеки и платформы поддерживает, и какие инструменты разработки предлагает.
Python(рус. питон, пайтон) — это высокоуровневый, интерпретируемый и мультипарадигменный язык программирования.
Для чего люди пишут на Питоне
Python используется для таких задач, как:
- Backend-разработка веб-сайтов, desktop- и мобильных приложений и игр
- Тестирование
- Научные расчеты
- Автоматизация процессов
- Машинное обучение
- Разработка ИИ.
Где нужны python-разработчики
Если ответить честно на этот вопрос, то питонисты нужны везде — от подсчета куриц на ферме и создания астрологических программ до запуска любого бизнеса в интернете и научных открытий. Если обобщить, то питон нужен в таких сферах, как:
- Data science и научные исследования
- Искусственный интеллект и машинное обучение
- Тестирование и автоматизация тестирования
- Продвижение науки и бизнеса
- Образование и здравоохранение
- Финансовая индустрия, блокчейн и криптовалюты
- Развлекательная и кинематографическая индустрия, игры.
Кому нужно знать Python
На самом деле профессий, где пригодится этот язык, очень много, но мы выделим 15 из них: разработчик программного обеспечения, дата-сайентист, аналитик данных, веб-разработчик, инженер данных, инженер машинного обучения, архитектор данных, разработчик бизнес-интеллекта, BI-аналитик, NLP-инженер, администратор баз данных, разработчик БД, сетевой и системный администратор, тестировщик и автоматизатор тестирования.
* Подробнее о некоторых профессиях здесь.
Преимущества
★ Простой и понятный синтаксис. Код на Python похож на обычный текст, а не на сложные конструкции из символов. Это упрощает его изучение и позволяет писать лаконичные программы.
★ Широкая область применения. От веб-разработки до науки о данных. Python – один из самых универсальных языков программирования.
★ Мультипарадигмальность. Python поддерживает разные стили программирования:
- Объектно-ориентированный
- Функциональный
- Процедурный
- Императивный.
★ Не требует компиляции перед запуском. Это приводит к:
- Быстрому циклу разработки. То есть мгновенно виден результат изменений скрипта. Это упрощает отладку и экспериментирование с кодом.
- Мультиплатформенности. Вы можете написать программу на Python на одной операционной системе (например, Windows) и запустить ее на другой (например, macOS или Linux) без необходимости перекомпиляции.
- Динамической типизации. Интерпретатор автоматически определяет тип переменных на основе их значений во время выполнения. Благодаря этому, Python поддерживает полиморфизм, а также вы можете легко добавлять или удалять элементы, присваивать значения и выполнять другие операции с контейнерами (списки, кортежи, словари), даже если типы элементов различаются.
- Расширяемости. Python имеет богатый набор стандартных библиотек и также может быть расширен с помощью сторонних модулей и пакетов. Большинство сторонних пакетов предоставляются в виде исходного кода и можно легко установить и использовать с помощью менеджера пакетов, такого как pip. За счет динамической интерпретации кода Python, модули могут быть легко импортированы и использованы без необходимости компиляции.
★ Кроссплатформенность. Благодаря интерпретируемой природе Python-код может запускаться на любой ОС без изменений.
★ Богатая экосистема. В Питоне есть модули для решения множества задач, а также поддержка сторонних библиотек, платформ и фреймворков.
★ Востребованность. В 2023 году DevJobsScanner проанализировал более 14 миллионов вакансий разработчиков и оказалось, что «тихой сапой» Python протоптал дорожку до второй строчки в рейтинге востребованности языков.
Недостатки
☆ Низкая производительность. Из-за интерпретируемой природы Python медленнее компилируемых языков. Это важно для приложений с высокой нагрузкой.
☆ Динамическая типизация. Типы определяются во время исполнения, что может приводить к неожиданным ошибкам. Затрудняет анализ кода.
☆ Ограниченная многопоточность. Механизм GIL не позволяет эффективно использовать многоядерные процессоры из-за блокировки потоков. Если нужна поддержка параллельного программирования и многоядерных процессоров, лучше используйте другие языки.
☆ Высокое потребление памяти. Динамическая типизация и автоматическое управление памятью требуют больше ресурсов.
Как запустить программу на Пайтон
Для того, чтобы запустить программу на Python, нужно иметь установленный интерпретатор Python, который можно скачать с официального сайта. Интерпретатор выполняет код построчно и выводит результат на экран или в файл.
Пакеты, модули, библиотеки
Поддержка различных пакетов, модулей и библиотек расширяет возможности языка и предоставляет готовые решения для разных задач. Существует множество пакетов и библиотек для Python, которые можно найти на сайте PyPI (Python Package Index). Некоторые из них входят в стандартную библиотеку Python, которая поставляется вместе с интерпретатором. Другие нужно устанавливать дополнительно с помощью специальных инструментов, таких как pip или conda.
* Pip — это менеджер пакетов для Python, который позволяет устанавливать, обновлять и удалять пакеты из PyPI или других источников.* Conda — это менеджер пакетов и сред для Python, который позволяет создавать изолированные среды для разных проектов на Python и управлять ими.
Пакеты
Пакет — это набор модулей, которые связаны между собой по теме или функциональности.
Модули
Модуль — это файл с кодом на Python, который содержит определения функций, классов, переменных и других объектов.
Библиотеки
Библиотеки — это наборы готовых модулей и функций, которые упрощают и ускоряют разработку. Python имеет:
- Обширную стандартную библиотеку. Простая работа со строками, файлами, сетью и другими задачами избавляет программиста от необходимости писать базовый функционал с нуля.
- Множество сторонних библиотек. Чем больше библиотек, написанных на языке, тем более он популярен, доступен и легок в использовании.
ТОП-5 библиотек на Пайтоне
- Requests позволяет легко работать с HTTP-запросами и ответами. Поддерживает разные методы, параметры, аутентификацию.
- NumPy предоставляет инструменты для работы с массивами, матрицами, векторами, статистикой. Оптимизирована для скорости.
- Pandas позволяет обрабатывать и анализировать данные. Поддерживает работу с CSV, Excel, SQL. Популярна для анализа данных.
- Matplotlib используется для визуализации данных в виде графиков и диаграмм. Позволяет настраивать стиль и параметры.
- TensorFlow – библиотека для машинного обучения и нейронных сетей. Поддерживает распределённые вычисления. Лидер в области ИИ.
Платформы Python
Python — это кроссплатформенный язык программирования, который работает на разных операционных системах и архитектурах.
Какие платформы поддерживает Python? — Windows, Linux, macOS, Unix, FreeBSD, Android и iOS. Python также запускается на встраиваемых системах с ограниченными ресурсами. Существуют специализированные версии Python, такие как MicroPython или CircuitPython, которые оптимизированы для работы на микроконтроллерах и встроенных системах.
Также хотелось бы упомянуть, что некоторые пакеты и библиотеки являются частью специальных дистрибутивов, платформ и сред, например:
- Anaconda — это платформа для научных расчетов и машинного обучения на Python. Она включает в себя интерпретатор, более 250 пакетов и библиотек для работы с данными, математикой, статистикой, визуализацией и другими задачами. Она также предоставляет инструменты для разработки и управления проектами, такие как Jupyter Notebook, Spyder IDE и conda.
- Online Python — это онлайн-среда для работы с кодом на Python. Она позволяет создавать, запускать и делиться кодом без необходимости устанавливать что-либо на свой компьютер. Она поддерживает работу с различными библиотеками и фреймворками.
Что такое IDE и SDK
IDE и SDK — это инструменты разработки, которые облегчают и ускоряют процесс написания, отладки, тестирования и запуска кода.
Python IDE
IDE — это интегрированная среда разработки, которая предоставляет редактор кода, подсветку синтаксиса, автодополнение, проверку ошибок, отладчик, консоль, графический интерфейс и другие функции. IDE также поддерживает работу с фреймворками, библиотеками и технологиями.
Мы можем выделить 2 самых популярных IDE для Python на данный момент:
- PyCharm поддерживает работу с фреймворками, библиотеками и технологиями для веб-разработки, машинного обучения, научных расчетов и других областей. Она предоставляет множество функций и возможностей для написания, отладки, тестирования и запуска кода на Python.
- Visual Studio подходит для разработки приложений на разных языках программирования, включая Python. Она поддерживает работу с веб-приложениями, десктопными приложениями, мобильными приложениями, играми и другими типами приложений и предоставляет интеграцию с различными сервисами и платформами Microsoft, такими как Azure, Windows и Xbox.
Python SDK
SDK — это набор программных компонентов, которые позволяют создавать приложения для определенной платформы или технологии: обычно включает в себя интерпретатор, библиотеки для работы с платформой или технологией, документацию и примеры кода.
Существует множество разных Python SDK, которые подходят для разных платформ или технологий. Вот некоторые из них:
- TensorFlow — это библиотека для машинного обучения и искусственного интеллекта. Она предоставляет мощные инструменты для создания, обучения и использования нейронных сетей и других алгоритмов. TensorFlow поддерживает распределенное вычисление на CPU, GPU и TPU.
- PyGame — это библиотека для создания игр на Python. Она предоставляет инструменты для работы с графикой, звуком, физикой, анимацией и другими элементами игрового процесса. А также поддерживает работу с различными форматами файлов, устройствами ввода и вывода.
- Kivy — это библиотека для создания мобильных приложений на Python. Она позволяет создавать кроссплатформенные приложения с графическим интерфейсом пользователя (GUI) для Android и iOS, и поддерживает работу с разными возможностями мобильных устройств, например с мультитачем, жестами и анимацией.
Актуальность языка

- Востребован. Это один из самых актуальных и востребованных языков программирования в настоящее время. Его популярность и применимость растут с каждым годом, как среди профессиональных разработчиков, так и среди любителей и обучающихся.
- Используется во многих областях. Пайтон — универсальный язык, который вы можете использовать Python для создания веб-сайтов, мобильных приложений, десктопных приложений, игр, научных расчетов, анализа данных, машинного обучения и искусственного интеллекта. Этот язык используется в таких крупных компаниях, как Google, Instagram, Dropbox, Netflix и Spotify.
- Поддерживает новые технологии и тренды. Язык постоянно развивается и адаптируется к новым технологиям и трендам: поддерживает работу с облачными вычислениями, интернетом вещей, блокчейном, квантовыми вычислениями.
- Имеет огромное сообщество и экосистему. Имеет миллионы пользователей и разработчиков по всему миру. Вы можете легко найти ответы на свои вопросы, получить помощь или совет от других программистов, а также воспользоваться тысячами готовых библиотек и фреймворков, которые расширяют возможности Python и упрощают разработку. Вы также можете принять участие в различных конференциях, хакатонах, курсах и проектах. Самый популярный язык в 2022 году на платформе GitHub — JavaScript, однако второе место прочно занял Python.
* Напоминаем, что GitHub пользуется около 100 млн. разработчиков по всему миру. Доля российских пользователей составляет 7.3%.
Полезные статьи
- Python с нуля: с чего начать изучение?
- ТОП-12 популярных Python фреймворков
- Фреймворки Python
- Базовый синтаксис Python: словарь терминов
- Словарь терминов Python (DS): уровень 0, новичок
- Словарь терминов Python: погружение в DS
- Как написать Telegram-бота на Python: инструкция
- Как я из кинопродюсера стал дата-сайентистом без опыта в программировании
Создаем свой язык программирования
До этого в своей работе мы использовали только один язык программирования — Python, но, как вы догадывайтесь, их гораздо больше.
Сегодня мы поговорим о том, какие бывают языки программирования, как они функционируют и даже попробуем придумать собственный. В общем, материала много, должно быть интересно.
Сколько существует языков программирования?
Сколько существует языков программирования? Это сложный вопрос, скорее всего — более 500. Многие из них создаются в процессе учебы/для развлечения. Многие использовались раньше, но сейчас мало популярны.
- https://www.quora.com/How-many-programming-languages-are-there-in-the-world — сколько есть языков программирования?
- https://en.wikipedia.org/wiki/List_of_programming_languages — список существующих языков программирования
Горадо более интересен вопрос, какие из них наиболее популярны. Определить это можно по разному: например, можно подсчитать на скольких страницах в интернете упоминается язык, так делает рейтинг TIOBE — https://www.tiobe.com/tiobe-index/.

Другой способ — подсчитать количество кода на разных языках в проектах с открытым исходным кодом, так, например, делает рейтинг GitHub (платформа для хранения кода и командного взаимодействия программистов) — https://tproger.ru/articles/github-top-10-languages-2017/.

Несмотря на то, что позиции языков в разных рейтингах различны и меняются со временем, основные действующие лица достаточно стабильны. Далее мы обсудим эти языки более подробно.
Классификация языков программирования
Общепринятой классификации языков программирования на данный момент не существует, но можно выделить некоторые ключевые отличия.
Примеры кода в разных языках программирования: http://cs.lmu.edu/~ray/notes/pltypes/
- Как мы замечали ранее, существуют языки низкого и высокого уровня. Языки низкого уровня (ассемблеры) позволяют напрямую отправлять команды процессору, а языки высокого уровня (все остальные языки) писать понятный человеку код одновременно для большого числа устройств.
- Языки различаются по назначению. Языки общего позволяют решать практически любые задачи (например, python или Java), а специализированные языки служат конкретным целям. Например, язык PostScript используется для программирования заданий для принтера (печать изображений), а язык SQL — для запросов к реляционным базам данных.
- Языки различаются по модели выполнения. Программу на компилируемом языке (C, C++, Pascal. ) перед запуском необходимо скомпилировать — транслировать (перевести) в машинный код. На выходе получится бинарный файл (.exe в windows).
Интепретируемые языки (PHP, Perl, отчасти python) для запуска используют специальную программу — интерпретатор, которая в реальном времени исполняет команды, описанные в коде. Например, для запуска программы на питоне, в системе должен быть установлен питон.
Сейчас большинство таких языков альтернативно могут использовать JIT-компиляцию (Just In Time компиляция — методика, которую изначально используют Java и C#). Программа перед запуском транслируется в промежуточное представление — байт-код, который похож на ассемблер, но не привязан к конкретному процессору. Трансляция в машинный код происходит непосредственно в процессе работы программы. Это позволяет совместить портируемость интерпретируемых языков (один код работает везде, если есть интерпретатор) со скоростью компилируемых (скомпилированная программа работает на конкретной платформе, но очень быстро).
- Ну и, конечно, парадигма программирования — это общий подход к составлению программ. Большинство современных языков поддерживают разные стили написания кода — они мультипарадигмальны. В данный момент мы используем процедурный стиль программирования (программа = блок-схема), а в следующем семестре рассмотрим и другие подходы — ООП и функциональное программирование.
Самые популярные языки

Вернемся к списку самых популярных языков от GitHub.com и рассмотрим их подробнее.
№1 JavaScript
Главный герой списка прошел долгий путь от обычного интерпретируемого языка для оживления веб-страниц, который выполняется в браузере (интерпретатор js встроен во все современные браузеры) до языка, который сейчас используется повсеместно.
Главная причина — это, конечно, повсеместное распространие веб-сервисов. На Javascript по прежнему пишется фронтенд в интернете, но теперь это уже большие самостоятельные приложения, такие, как фронтенд ВК или Gmail. Для упрощения таких задач существуют большие фреймворки, такие, как JQuery, AngularJS, React. NodeJS теперь позволяют писать на js не только фронтенд, но и серверную часть сайтов.
Но настоящий бум произошел, когда большое распространение получили веб-сервисы, замаскированные под офлайновые приложения. В мобильном приложении на весь экран запускается браузер в котором отображается веб-страница, внешне неотличимая от настоящего приложения. В мобильных приложениях для этого используются фреймворки Apache Cordova, Ionic, React Native. Для настольных приложений используется Electron.
Пример кода:
№2 Python
С питоном вы уже неплохо знакомы — это JIT-компилируемый язык общего назначения. Второе место по популярности занимает благодаря простоте синтаксиса и огромной библиотеке доступных модулей в любой области.
На питоне очень удобно писать произвольные настольные и серверные программы. На данный момент есть проблема с мобильными приложениями, но есть способы ее обойти, например Kiwi.
№3 Java
Классический пример объектно-ориентированного JIT-компилируемого промышленного языка. В основном используется в мобильных приложениях (Android), кроссплатформенных настольных приложениях и веб-сервисах (например, банковских системах).
Пример кода:
public class SimpleIfElseStatementExample < public static void main(String[] args) < int i = 0; if(i == 0) System.out.println("i is 0"); else System.out.println("i is not 0"); >>
№4 Ruby
По сфере применения и принципу работы похож на python. Подробнее — https://ru.wikipedia.org/wiki/Ruby. Наиболее известен, как язык для построения веб-сервисов, благодаря фреймворку Rails.
Пример кода:
a = [ 45, 3, 19, 8 ] b = [ 'sam', 'max', 56, 98.9, 3, 10, 'jill' ] print (a + b).join(' '), "\n" print a[2], " ", b[4], " ", b[-2], "\n" print a.sort.join(' '), "\n" a
№5 Go
Компилируемый многопоточный язык от Google - https://ru.wikipedia.org/wiki/Go
№6 PHP
PHP - это изначально и до сих пор главный язык в вебе. Его основная задача - написание кода для серверной части веб-сервисов.
Пример кода:
№7-8 C/C++
Классические компилируемые языки, которые позволяют как работать с железом на низком уровне для написания драйверов и операционных систем, так и на высоком, для разработки прикладных приложений, например, используя Qt или Windows Forms.
#include #include // для system using namespace std; int main() < cout
№9 Typescript
Объектно-ориентированный аналог Javascript от Microsoft, который транслируется в него. Сфера применения - аналогична.
№10 С Sharp
С# - это изначально аналог Java от компании Microsoft. На этом объектно-ориентированном (это парадигма) JIT-компилируемом языке общего назначения можно писать программы для платформ Microsoft: настольные приложения для Windows и Windows Phone, веб-сервисы на ASP.MVC, игры на Unity.
Сейчас Microsoft активно продвигает решения для запуска программ на C# на других платформах (.NET Core, Mono), а также решения для разработки кроссплатформенных мобильных приложений на этом языке - Xamarin.
Пример кода:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace check1 < class Program < static void Main(string[] args) < int i; Console.Write("Enter a Number : "); i = int.Parse(Console.ReadLine()); if (i % 2 == 0) < Console.Write("Entered Number is an Even Number"); Console.Read(); >else < Console.Write("Entered Number is an Odd Number"); Console.Read(); >> > >
Изотерические языки программирования
Изотерические языки программирования - это отдельный класс языков, которые разработаны либо с целью изучения границ возможностей разработки языков, либо, в качестве шутки.
Обычно такие языки состоят всего из нескольких команд, однако полны по Тьюрингу, т.е. теоретически позволяют написать произвольную программу.
Наиболее известный изотерический язык - Brainfuck - состоит всего из восьми операций, которые обозначаются знаками арифметических операций и скобочками.
Другой пример - язык Petooh - состоит из криков петуха.
Свой язык программирования
Принцип работы
Если языков так много, то почему бы не придумать свой?
В таком случае перед нами встает две проблемы: язык нужно придумать, а затем написать для него транслятор.
Даже если мы придумаем идеальный язык, без транслятора никто не сможет написать программу на нем. К задаче написания транслятора есть два подхода:
- Написать транслятор в машинный код. Это задача выполнимая, но на нашем уровне - очень сложная. Если вам интересна эта тема, можно начать копать здесь и здесь.
- Написать транслятор в другой язык, для которого уже существует транслятор в машинный код. Например, транслировать наш язык в питон или яваскрипт. Так работают Petooh (транслируется в десяток языков), язык для реальных пацанов (транслируется в javascript) и, разработанный авторами этого курса, язык pithon [писон] (транслируется в python).
Второй вариант выглядит гораздо доступнее, поэтому выбрать на этом этапе предлагается именно его. Транслировать мы будем, конечно, в python.
Требования к языку
Чтобы языком можно было пользоваться, он должен поддерживать достаточное количество операций, включая:
- определение переменных
- операции с переменными
- условный оператор, логические операции
- циклы
Для каждой из этих операций можно придумать свое название и синтаксис, но, учитывая необходимость трансляции, старайтесь всегда держать в голове процесс преобразования вашего языка в Python.
В самом простом случае в вашем языке можно просто переназвать все команды, а в процессе трансляции использовать replace для замены на команды из питона.
Написание языка программирования: с чего начать? [закрыт]
Вопросы-опросники запрещены на Stack Overflow на русском. Для получения ответа, перефразируйте ваш вопрос так, чтобы на него можно было дать однозначно правильный ответ.
Закрыт 8 лет назад .
Я далеко не ас, но хочется попробовать написать какой-то простой язык программирования для веба. Никакой мании величия, просто хочется попробовать. Подскажите, с чего можно начать?
Отслеживать
11.5k 8 8 золотых знаков 42 42 серебряных знака 69 69 бронзовых знаков
задан 18 авг 2011 в 12:19
1,866 2 2 золотых знака 24 24 серебряных знака 30 30 бронзовых знаков
18 авг 2011 в 12:24
18 авг 2011 в 12:25
велосипеды. зачем мучить фундаментальные вещи, попробуйте написать что-то типа JSF, думаю будет: доступно (жава код декомпилировать не проблема), интересно, полезно (шанс всегда есть), перспективно (мы верим в вас)
18 авг 2011 в 22:45
Ну не одному же вам быть богом.. другие тоже хотят попробовать. А почему в свое время вы решили, что сможете стать программистом вообще? И стали вы им за пару месяцев? Или я где-то говорил, что планирую написать язык за два дня? Или что мне под силу на данный момент эта задача? По-моему скромному мнению, на хэшкоде появляются тролли. Это нехорошо.
19 авг 2011 в 8:17
19 авг 2011 в 10:53
6 ответов 6
Сортировка: Сброс на вариант по умолчанию
- Если хотите создавать язык для веб, очевидно будете писать инструмент для интерпретатции/компиляции приложений получающих данные от сервера и выдающих текст в поток стандартного вывода, с тем, чтобы иметь возможность выводить результаты работы программы (веб страницу, например) - здесь могу посоветовать почитать о технологии CGI, написать парочку простых CGI-скриптов (на чем угодно).
- Определитесь, какой язык будете создавать - интерпретируемый или компилируемый. Каков будет результат работы "компилятора" (например, Вы можете просто написать транслятор, который будет переводить программу на ВАШЕМ языке в эквивалент на PHP, который и будет в дальнейшем использоваться).
- Наконец, по синтаксическому анализу, компиляции и прочему - советую (не в первый раз) - Дж. Креншоу, "Давайте создадим компилятор" - для человека, который не собирается заморачиваться теорией формальных языков, обратной польской записью, формами Бэкуса-Наура и пр. пр. пр. - в самый раз. Если хотите серьезно заниматься компиляторами - А.Ахо "Компиляторы: принципы, технологии и инструменты" ("Dragon book").
P.S. Если интересуетесь скриптами (в частности, для игр) и скриптовыми языками, советую также обратить внимание на Alex Varanese "Game Scripting Mastery" - хорошо написана и легко читается (на мой вкус)
Отслеживать
ответ дан 18 авг 2011 в 13:34
1,543 8 8 серебряных знаков 10 10 бронзовых знаков
Я так понимаю, мне нужен интерпретатор. То есть, получается, для создания языка программирования, мне нужно использовать другой язык программирования? Замкнутый круг какой то..
18 авг 2011 в 14:04
> Я так понимаю, мне нужен интерпретатор. То есть, получается, для создания языка программирования, мне нужно использовать другой язык программирования? Замкнутый круг какой то.. Именно так. Все языки написаны так.
18 авг 2011 в 17:36
"Именно так. Все языки написаны так." Ну почему-же, можно обойтись и без ЯЗЫКОВ ПРОГРАММИРОВАНИЯ - ведь они нужны ЛЮДЯМ. Нужно просто сесть, и написать все в чистом машинном коде. Соблюдая при этом соответствующий формат исполняемого файла (PE, ELF). Ну и далее в том же роде 😉 )))
18 авг 2011 в 18:43
ну, например, компилятор C написан на С. так что можете использовать свой язык и больше ничего
19 авг 2011 в 8:58
Первый компилятор С все равно был написан на чем-то более близком к машинному коду.
19 авг 2011 в 13:18
Язык программирования — просто его идея, спецификация описывающая синтаксис, семантику и стандартную библиотеку.
Реализация языка программирования — программа, которая траслирует программу из исходного текста этого языка в код какого-либо другого выходного языка. При этом выходной язык может быть ассемблер, байткод виртуальной машины или любой другой язык.
Реализация языка программировая — программа которая получает самый обычный текст, преобразует и выводит результат преобразования (текстовый или бинарный). Т.е. здесь нет никакой магии.
Сам язык программирования придумать можно и не написав ни строчки кода (хотя и чертовски сложно, ведь код можно тестировать). То чего хотите вы — написание реализации языка программирования.
Программу которая переводит текст вида
print('test')
Вполне можно считать примитивным вариантом транслятора.
Руководствуясь материалами указанными другими участниками можно сделать гораздо более сложный пример.