Когда кто-то пишет новый язык программирования, что они пишут на IN? - PullRequest
148 голосов
/ 27 октября 2009

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

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

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

Ответы [ 12 ]

175 голосов
/ 15 августа 2011

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

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

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

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

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

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

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

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

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

22 голосов
/ 27 октября 2009

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

14 голосов
/ 27 октября 2009

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

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

10 голосов
/ 27 октября 2009

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

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

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

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

4 голосов
/ 02 апреля 2011

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

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

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

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

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

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

4 голосов
/ 27 октября 2009

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

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

Самыми основными компиляторами, вероятно, являются Ассемблер и С.

3 голосов
/ 27 октября 2009

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

2 голосов
/ 27 мая 2013

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

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

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

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

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

1 голос
/ 01 сентября 2013

Большинство компиляторов были написаны на языке C или ac, если нет, то ассемблерный язык - это путь. Однако, при написании нового языка с нуля, и у вас нет макроса lib или исходного кода из языка-прототипа, вы должны определить ваши собственные функции теперь на каком языке? Вы можете просто написать «форму» исходного кода, называемого psedocode, на машине, которая выглядит как грамматика bnf из объектно-ориентированной структурированной спецификации языка, такой как базовый algo lisp Фортрана. Итак, изображение, написание кросс-кода, напоминающего любой из этих синтаксисов языка. Это код psedo

1 голос
/ 28 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...