Когда кто-то пишет новый язык программирования, что они пишут IN?

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

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

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

С моим слабым интеллектом я нахожу это увлекательным... Пожалуйста, просветите меня!

Ответ 1

Это не глупый вопрос. Это отличный вопрос.

Как уже ответил короткий ответ, "Другой язык".

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

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

Ну, первые компиляторы для "языков высокого уровня" были бы записаны в так называемом "языке ассемблера". Язык ассемблера - это язык, на котором каждая инструкция на языке соответствует одной команде CPU. Его язык очень низкого уровня и чрезвычайно многословный и очень трудоемкий, чтобы писать.

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

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

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

И даже раньше, чем эти компьютерные программы должны были быть жестко подключены с помощью плагинов!

Ответ 2

Самый общий ответ - C. Большинство языков реализовано на C или в гибриде C с обратными вызовами и "lexer", например Flex и генератор синтаксического анализатора, например YACC. Это языки, которые используются для одной цели - для описания синтаксиса другого языка. Иногда, когда дело доходит до скомпилированных языков, они сначала реализуются на C. Тогда первая версия языка используется для создания новой версии и так далее. (Как Haskell.)

Ответ 3

Многие языки загружаются, то есть написанные самими. Что касается того, почему вы хотели бы сделать это, часто рекомендуется съесть свой собственный dogfood.

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

Ответ 4

Практически любой язык, хотя использование одного, подходящего для работы с графиками и другими сложными структурами данных, облегчит многое. Компиляторы производства часто записываются на C или С++ по соображениям производительности, но языки, такие как OCaml, SML, Prolog и Lisp, возможно, лучше для прототипирования языка.

В языковом дизайне используется несколько "маленьких языков". Например, Lex и yacc используются для указания синтаксиса и грамматик, и они компилируются на C. (Есть порты для других языков, такие как ocamllex/ocamlyacc и многие другие подобные инструменты.)

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

В сущности, компиляторы - это просто программы, которые что-то читают и переводят на что-то другое - преобразование источника LaTeX в DVI, преобразование кода C в сборку, а затем в машинный язык, преобразование спецификации грамматики в код C для синтаксического анализатора и т.д. Его конструктор определяет структуру исходного формата (синтаксический анализ), что означают эти структуры, как упростить данные (оптимизация) и тип вывода для генерации. Переводчики читают источник и выполняют его напрямую. (Переводчики, как правило, проще писать, но гораздо медленнее.)

Ответ 5

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

Переводчик вводит программу на одном языке и выводит эквивалентную программу на другом языке. Интерпретатор вводит программу на каком-то языке и запускает ее.

Например, компилятор C обычно переводит исходный код C (язык ввода) в программу языка ассемблера (язык вывода). Затем ассемблер берет программу ассемблера и создает машинный язык. Когда у вас есть выход, вам не нужны переводчики для запуска вашей программы. Поскольку у вас теперь есть программа машинного языка, ЦП выступает в роли интерпретатора.

Многие языки реализованы по-разному. Например, javac - это переводчик, который преобразует исходный код Java в байт-код JVM. JVM - это интерпретатор [1], который запускает байт-код Java. После запуска javac и получения байт-кода вам больше не нужно javac. Однако, когда вы хотите запустить свою программу, вам понадобится JVM.

Тот факт, что переводчики не нужно поддерживать для запуска программы, - это то, что позволяет "загружать" ваш язык, не заканчивая тем, что он "поверх" слоев и слоев других языков.

[1] Большинство JVM выполняют перевод за кулисами, но на самом деле они не переводчики, поскольку интерфейс JVM не является "языком ввода → языком вывода".

Ответ 6

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

Ответ 7

На самом деле вы можете писать практически на любом языке, который вам нравится. Там ничего не мешает вам писать компилятор C в Ruby. "Все" вам нужно проанализировать программу и исправить соответствующий машинный код. Если вы можете читать/записывать файлы, ваш язык программирования, вероятно, будет достаточным.

Если вы начинаете с нуля на новой платформе, вы можете выполнить кросс-компиляцию: напишите компилятор для вашей новой платформы, который работает на Java или изначально на x86. Разработайте на своем ПК, а затем перенесите программу на новую целевую платформу.

Наиболее основными компиляторами являются, вероятно, Assembler и C.

Ответ 8

Обычно с языком программирования общего назначения, подходящим для разработки систем, например. C, Haskell, ML, Lisp и т.д., Но список вариантов длинный. Кроме того, обычно с некоторыми языковыми языками для языка, то есть генераторами парсера и лексического анализатора, промежуточные языки, такие как LLVM и т.д. И вероятно, некоторые сценарии оболочки, тестовые рамки и система конфигурации сборки, например Autoconf.

Ответ 9

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

Мне было интересно начать загрузку с тех пор, как я прочитал об этом. Чтобы узнать больше, я попытался сделать это сам, написав свой собственный надмножество BF, который я назвал EBF сам по себе. первая версия EBF имела 3 дополнительных примитива, и я вручную скомпилировал первый двоичный файл. При этом я обнаружил двухэтапный ритм. Я реализовал функцию на текущем языке в одном выпуске и имел сладкий релиз, где я переписал код, чтобы использовать реализованную функцию. Язык был достаточно выразительным, чтобы использовать LISP интерпретатор.

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

Эдмунд Гримли Эванс сделал что-то подобное с своим языком HEX

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

Ответ 10

Большинство компиляторов были wriiten C или ac как программа, если не c, тогда сборка lang - это путь к успеху. Однако при написании нового lang с нуля и у вас нет макро-lib или исходного кода с языка прототипа, вы должны определить ваши собственные функции Теперь на каком языке? Вы можете просто написать форму "исходного кода, называемого psedocode, для машины, это выглядит как грамматика bnf из объектно-ориентированной структурированной спецификации lang, такой как Fortran basic algo lisp. Таким образом, изображение записывает кросс-код, похожий на любой из этих синтаксисов языка. Это psedo код

Ответ 11

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

Ответ 12

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

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

То, что я сделал на моем новом языке, можно найти здесь - http://www.singhajit.com/writing-a-new-programming-language/

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