36

Возможные Дубликаты:
References Needed for Implementing an Interpreter in C/C++
How to create a language these days?
Learning to write a compilerсоздать свой собственный язык программирования

Я знаю, что некоторые C++, очень хорошо в PHP, про в CSS HTML, хорошо в JavaScript , Итак, я думал о том, как создавался C++. Я имею в виду, как компьютер может понять, что означают коды? Как он может читать ... так можно ли я создать свой собственный язык и как?

+7

Уже большой выбор ресурсов здесь: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

+39

Спасибо за этот конструктивный комментарий Пол. – 2010-09-07 20:30:52

+2

@Pierre Здесь, чтобы помочь! –

ответ

46

Если вы заинтересованы в разработке компилятора («как компьютер может понять, что означают коды»), я настоятельно рекомендую Dragon Book. Я использовал его в колледже и дошел до того, что сам создал язык программирования.

+2

+1: Это то, что я читал и создал [Язык программирования хинди] (http://www.sktnetwork.com/portfolio/hindi-programming-language) – shamittomar

+34

Я не думаю, что рекомендовал книгу драконов к 13 -лет. –

+19

@mmyers, если он уже знает некоторые C++ и * очень * хорошо на php ... у него могут быть навыки и знания, необходимые для понимания книги Дракона. Если ничего другого, это не поможет научить его тому, что ему еще нужно знать/учиться * сначала *. –

3

Это возможно. Вы должны узнать о компиляторах и/или интерпретаторах: для чего они предназначены и как они сделаны.

3

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

+3

Большинство компиляторов написаны на их собственных языках [http://en.wikipedia.org/wiki/Bootstrapping_(compilers)]. Точно так же интерпретатор PHP вначале написан на C - там мало, если есть какая-либо сборка. –

+1

Err, вы можете писать компиляторы для любого языка на любом другом языке. Я имею в виду, что для практики в колледже мы создали lisp, используя java, затем java, используя губы. Конечно, это был очень точный синтаксис и не очень умный. – Parris

+1

@Frank: @Parris: Я не думаю, что Марком было то, что компилятор должен быть написан в сборке, но он должен скомпилироваться для сборки. Или, может быть, он просто ответил на вопрос, который сказал: «Как компьютер может понять, что означают коды?». – sepp2k

19

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

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

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

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

+0

Ни понимание сборки, ни электроника не требуется для написания языка высокого уровня (хотя они, безусловно, могут помочь). Например, в JVM запущено много недавно созданных языков: http://en.wikipedia.org/wiki/List_of_JVM_languages ​​ –

+3

Хотя это прекрасные вещи для изучения, за исключением первого, ничто из этого не кажется необходимым для написания компилятор. Даже первый не нужен, если вы используете LLVM или аналогичную технологию. – ergosys

+6

«высокий уровень» не был задан в вопросе –

7

Yup! Это определенно возможно. Другие упомянули Книгу Дракона, но есть также много информации в Интернете. LLVM, например, есть учебник по реализации языка программирования: http://llvm.org/docs/tutorial/

+3

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

+0

@Larry Gritz: зависит, если вы заинтересованы в написании компилятора или разработке языка. Если вы решите создать llvm-сборку, я думаю, что это может быть довольно просто (как только вы создали свой АСТ), это не значит, что вы не должны читать хорошую книгу. –

3

Если вы знаете, C - это звучит, как вы - захватить использованную копию этой древней книги: http://www.amazon.com/Craft-Take-Charge-Programming-Book-Disk/dp/0078818826

В нем есть глава, в которой автор создает интерпретатор «С», на С. Это не является академически серьезным, как книга Дракона, но я помню, что это было довольно просто, очень практично и легко следовать, и, поскольку вы только начинаете, это было бы удивительным введением к идеям «грамматики» для языков и «токенизации» программы.

Это идеальное место для вас. Кроме того, на 0,01 доллара за использованную копию, дешевле, чем Книга Дракона. ;)

11

Да, вы можете создать свой собственный язык. Взгляните на компиляторы компилятора. Или исходный код для некоторых языков сценариев, если вы смеете.Некоторые полезные инструменты: yacc, bison и lexx.

Другие упомянули книгу драконов. Мы использовали книгу, которая, как я думаю, называлась «теория и практика компилятора» еще в мои университетские дни.

Нет необходимости изучать ассемблер для написания языка. Например, Javascript работает в чем-то, называемом интерпретатором, который является приложением, которое выполняет файлы javascript. В этом случае интерпретатор обычно встроен в браузер.

Простейшим языком начальной программы может быть простой калькулятор на основе текста. то есть взять текстовый файл, запустить его и выполнить вычисления. Вы можете написать это на C++ очень легко.

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

+4

+1 для начала написания калькулятора. Однако я попытался бы прочитать что-то вроде Книги Дракона и использовать компилятор компилятора, такой как Bison или ANTLR. –

+0

Согласовано, написать простой синтаксический анализатор и интерпретатор является хорошим первым шагом, но, вероятно, не ответит на вопросы OP о том, как работает C++, как компьютер запускает код. Не уверен, что я согласен с генераторами компиляторов/генераторов парсеров (в этом конкретном случае, чтобы узнать, как работает материал). Возможно, стоит сначала написать свой собственный токенизатор и парсер из руки, просто чтобы понять, что эти инструменты делают для вас. – uliwitness

3

Начните с создания парсера. Прочитайте грамматики EBNF. Это ответит на ваш вопрос о том, как компьютер может читать код. Это очень сложная тема, поэтому не ждите от вас слишком многого, но получайте удовольствие. Некоторые ресурсы, которые я использовал для этого, - bison, flex и PLY.

37

«Время от времени я чувствую соблазн разработать программирование языка , но тогда я просто лежу, пока он не уйдет». - L. Peter Deutsch

EDIT (для тех, кто жаждет контекста):

"[L. Peter Deutsch] also wrote the PDP-1 Lisp 1.5 implementation, Basic PDP-1 LISP, 'while still in short pants' between the age of 12-15 years old."

+1

+1 для пропаганды здравого смысла и избежания мазохизма ... =) (** отредактировано **, чтобы добавить ссылку на источник для цитаты: http://books.google.com/books?ID = nneBa6-mWfgC & СУГ = PA436 & отс = gDzsJhOQ3A & дк = Каждый% 20now% 20and% 20then% 20I% 20feel% 20a% 20temptation% 20to% 20design% 20a% 20programming% 20language% 20but% 20then% 20I% 20just% 20lie% 20down% 20until% 20it% 20goes% 20away & пг = PA436 # v = OnePage & д = Каждый% 20now% 20and% 20then% 20I% 20feel% 20a% 20temptation% 20to% 20design% 20a% 20programming% 20language% 20but% 20then% 20I% 20just% 20lie% 20down% 20until% 20it% 20goes% 20away & f = false) –

+0

спасибо за ссылку. я задаюсь вопросом, была ли моя жизнь лучше или хуже, если бы я прочитал «Coders at Work», когда мне было 13 ... – anthony

+2

Я мог бы сказать то же самое. Я также делаю это с помощью «большой космической игры» и «ммo». –

1

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

1

Ознакомьтесь с этой книгой, The Elements of Computing Systems: Building a Modern Computer from First Principles. Вы шаг за шагом проделаете несколько аспектов проектирования компьютерного языка, компилятора, vm, ассемблера и компьютера. Я думаю, это поможет вам ответить на некоторые из ваших вопросов.

4

Я действительно рекомендую Programming Language Pragmatics. Это отличная книга, которая отнимает у вас весь путь от того, как язык работает, как работают компиляторы и создают свои собственные. Это немного более доступно, чем Книга Дракона, и объясняет, как все работает, прежде чем прыгать вперёд.

3

Да! Интерес к компиляторам был мой крючок в профессиональную CS (ранее я был на пути к EE и только формально перешел на сторону колледжа), это отличный способ узнать TON о широком спектре вопросов, связанных с информатикой. Вы немного моложе (я учился в старших классах, когда начал дурачиться с синтаксическими анализаторами и переводчиками), но в наши дни в вашем распоряжении еще много информации.

Начало маленького: спроектируйте самый маленький язык, о котором вы можете подумать, - начинайте с простого математического калькулятора, который позволяет назначать переменные и замену. Когда вы начинаете приключений, попробуйте добавить «if» или «loop». Забудьте тайные инструменты, такие как lex и yacc, попробуйте вручную написать простой рекурсивный анализатор спуска, возможно, перейдете на простые байт-коды и напишите для него интерпретатор (избегайте всех жестких частей понимания сборки для конкретной машины, распределения регистров и т. Д.). Вы узнаете огромную сумму только с этим проектом.

Как и другие, я рекомендую книгу Дракона (издание 1986 года, мне не нравится новый, откровенно говоря).

Я добавлю, что для ваших других проектов я рекомендую использовать C или C++, резать PHP, а не потому, что я язык фанатичный, но только потому, что я думаю, что работа через трудности в C/C++ научит вас гораздо больше о проблемах с машинной архитектурой и компилятором.

(Примечание:... Если ты профессионал, то совет будет не создавать новый язык, который почти никогда не является правильным решением Но как проект для изучения и исследования, это фантастика)

Смежные вопросы