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

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top