Как создать собственный язык программирования и компилятор для него [закрыт]

Я хорошо разбираюсь в программировании и сталкиваюсь с языками, включая BASIC, FORTRAN, COBOL, LISP, LOGO, Java, C ++, C, MATLAB, Mathematica, Python, Ruby, Perl, JavaScript, Assembly и т. д. Я не понимаю, как люди создают языки программирования и разрабатывают для него компиляторы. Я также не мог понять, как люди создают ОС, такие как Windows, Mac, UNIX, DOS и т. Д. Другое загадочное для меня - это то, как люди создают библиотеки, такие как OpenGL, OpenCL, OpenCV, Cocoa, MFC и т. Д. Последнее, что я не могу понять, это то, как ученые разрабатывают язык ассемблера и ассемблер для микропроцессора. Мне бы очень хотелось узнать все эти вещи, и мне 15 лет. Я всегда хотел быть компьютерным ученым, кем-то вроде Бэббиджа, Тьюринга, Шеннона или Денниса Ритчи.


Я уже ознакомился с концептуальной книгой Ако «Компилятор» и концептуальной книгой Tanenbaum OS OS, и все они только обсуждают концепции и код на высоком уровне. Они не вникают в детали и нюансы и как разработать компилятор или операционную систему. Я хочу получить конкретное понимание, чтобы я мог сам создать его, а не просто понять, что такое поток, семафор, процесс или синтаксический анализ. Я спросил об этом обо всем брате. Он является студентом SB в EECS в Массачусетском технологическом институте и не имеет понятия о том, как реально создавать все эти вещи в реальном мире. Все, что он знает, - это просто понимание концепций компилятора и ОС, таких как те, которые вы упомянули (например, Thread, Synchronization, Concurrency, управление памятью, лексический анализ, генерация промежуточного кода и т. Д.)

429 голосов | спросил 4 revs, 3 users 45%
abdul wakeel
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

30 ответов


409

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

Тем не менее, я могу взломать:

  

Я не могу понять, как люди создают языки программирования и разрабатывают для него компиляторы.

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

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

Языковой дизайн - огромная тема. Если вы заинтересованы в разработке языка, хорошим местом для начала является размышление о том, что недостатки находятся на языке, который вы уже знаете. Решения по дизайну часто возникают из-за рассмотрения дефекта дизайна в другом продукте.

В качестве альтернативы рассмотрите интересующий вас домен, а затем создайте доменный язык (DSL), который определяет решения проблем в этом домене. Вы упомянули LOGO; это отличный пример DSL для домена «line drawing». Регулярные выражения - это DSL для домена «найти шаблон в строке». LINQ в C # /VB является DSL для домена «фильтр, объединение, сортировка и данные проекта». HTML - это DSL для «описания расположения текста на странице» и т. Д. Существует множество доменов, которые поддаются языковым решениям. Одним из моих фаворитов является Inform7, который является DSL для домена с текстовой приключенческой игрой; это, вероятно, самый серьезный язык программирования на самом высоком уровне, который я когда-либо видел. Выберите домен, о котором вы что-то знаете, и подумайте о том, как использовать язык для описания проблем и решений в этом домене.

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

  1. lexical : каковы правила для слов на языке, какие символы являются законными, какие цифры выглядят и т. д.
  2. синтаксис : как слова языка объединяются в более крупные единицы? В C # большие единицы - это такие вещи, как выражения, инструкции, методы, классы и т. Д.
  3. semantic : учитывая синтаксически-правовую программу, как вы определяете, что делает программа ?

Запишите эти правила как можно точнее . Если вы хорошо справляетесь с этим, вы можете использовать это как основу для написания компилятора или интерпретатора. Взгляните на спецификацию C # или спецификацию ECMAScript, чтобы увидеть, что я имею в виду; они полны очень точных правил, которые описывают, что делает юридическую программу и как выяснить, что она делает.

Один из лучших способов начать писать компилятор - написать компилятор высокого уровня на язык высокого уровня . Напишите компилятор, который принимает строки на вашем языке и выплескивает строки на C # или JavaScript или на любом другом языке, который вы знаете; пусть компилятор для этого языка затем позаботится о тяжелом подъеме превращения его в исполняемый код.

Я пишу блог о дизайне C #, VB, VBScript, JavaScript и других языках и инструментах; если этот вопрос вас интересует, проверьте его. http://blogs.msdn.com/ericlippert (исторический) и http://ericlippert.com (текущий)

В частности, вы можете найти это сообщение интересным; здесь я перечисляю большинство задач, которые компилятор C # выполняет для вас во время семантического анализа. Как вы можете видеть, есть много шагов. Мы разбиваем проблему большого анализа на ряд проблем, которые мы можем решить индивидуально.

http://blogs.msdn.com/b /ericlippert/archive/2010/02/04/how-many-passes.aspx

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

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
128

Вы можете найти Lets Build Compiler от Джека Креншоу интересное введение в составление компиляторов и язык ассемблера.

Автор сохранил это очень просто и сосредоточился на создании фактической функциональности.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
72

«Я бы действительно хотел узнать этот материал». Если вы долгосрочны:

  • Пойдите в колледж, специализируйтесь на разработке программного обеспечения. Возьмите каждый класс компилятора, который вы можете получить. Те люди, которые предоставляют классы, лучше образованы и более опытны, чем вы; его хорошо, чтобы их экспертные взгляды использовались для представления информации вам способами, которые вы никогда не получите от чтения кода.

  • Придерживайтесь занятий математикой через среднюю школу и продолжайте учиться в колледже на все 4 года. Сосредоточьтесь на нестандартной математике: логике, теории групп, мета-математике. Это заставит вас мыслить абстрактно. Это позволит вам ознакомиться с передовыми документами теории по составлению и понять, почему эти теории интересны и полезны. Вы можете игнорировать эти продвинутые теории, если вы навсегда хотите быть в курсе последних достижений.

  • Соберите /прочитайте стандартные тексты компилятора: Aho /Ullman и т. д. Они содержат то, что сообщество в целом соглашается, это фундаментальные вещи. Вы не можете использовать все из этих книг, но вы должны знать, что он существует, и вы должны знать, почему вы его не используете. Я думал, что Мучник был замечательным, но это довольно сложные темы.

  • Создайте компилятор. Начните СЕЙЧАС, построив гнилую. Это научит вас некоторым проблемам. Постройте второй. Повторение. Этот опыт создает огромную синергию с обучением вашей книгой.

  • Действительно хорошее место для начала - узнать о BNF (Бэксус Наур Форма), парсерах и синтаксических анализаторах. BNF эффективно универсально используется в компиляторе, и вы не можете реально разговаривать со своими коллегами-типами компиляторов, если вы этого не знаете.

Если вы хотите отличное первое введение в компиляцию и прямое значение BNF не только для документации, но и как метаязык, обрабатываемый инструментами, см. этот tutorial (не мой) по созданию компиляторов meta (компиляторов, которые строят компиляторы) на основе бумаги от 1964 (да, вы это правильно поняли) [" META II a синтаксически-ориентированный язык написания компилятора "Вал Шорре. (Http://doi.acm.org/10.1145/800257.808896)] Это IMHO - одна из самых лучших работ, когда-либо написанных на Comp-sci: она учит вас создавать компиляторы-компиляторы на 10 страницах. Сначала я узнал из этой статьи.

То, о чем я писал выше, много из личного опыта, и я думаю, что он мне очень понравился. YMMV, но ИМХО, не сильно.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
47

Сделайте шаг назад. Компилятор - это просто программа, которая переводит документ на одном языке в документ на другом языке. Оба языка должны быть четко определенными и конкретными.

Языки не обязательно должны быть языками программирования. Они могут быть любым языком, правила которого могут быть записаны. Вероятно, вы видели Google Translate ; это компилятор, потому что он может перевести один язык (скажем, немецкий) в другой (возможно, японский).

Другим примером компилятора является механизм рендеринга HTML. Его ввод - это HTML-файл, а выход представляет собой серию инструкций для рисования пикселей на экране.

Когда большинство людей говорит о компиляторе, они обычно ссылаются на программу, которая переводит язык программирования высокого уровня (например, Java, C, Prolog) в низкоуровневый (сборка или машинный код). Это может быть сложно. Но это не так уж плохо, когда вы принимаете мнение генерала, что компилятор - это программа, которая переводит один язык в другой.

Можете ли вы написать программу, которая меняет каждое слово в строке? Например:

When the cat's away, the mice will play.

становится

nehW eht s'tac yawa, eht ecim lliw yalp.

Это не сложная программа для написания, но вам нужно подумать о некоторых вещах:

  • Что такое «слово»? Можете ли вы определить, какие символы составляют слово?
  • Где слова начинаются и заканчиваются?
  • Разделяются ли слова только одним пробелом, или может быть больше или меньше?
  • Нужно ли также отменять пунктуацию?
  • Как насчет пунктуации внутри слова?
  • Что происходит с заглавными буквами?

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

Как насчет этого: Можете ли вы написать программу, которая выполняет серию инструкций по рисованию и выводит файл PNG (или JPEG)? Может быть, что-то вроде этого:

image 100 100
background black
color red
line 20 55 93 105
color green
box 0 0 99 99

Опять же, вам нужно будет подумать, чтобы определить язык:

  • Каковы примитивные инструкции?
  • Что происходит после слова «линия»? Что происходит после «цвета»? Аналогично для «фона», «окна» и т. Д.
  • Что такое номер?
  • Разрешен ли пустой входной файл?
  • Можно ли использовать буквы в словах?
  • Разрешены ли отрицательные числа?
  • Что произойдет, если вы не дадите директиву «изображение»?
  • Можно ли не указать цвет?

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

Вы видите, писать компилятор не так уж сложно. Компиляторы, которые вы использовали на Java или C, - это просто более крупные версии этих двух примеров. Так что иди! Определите простой язык и напишите программу, чтобы заставить этот язык что-то сделать. Рано или поздно вам захочется расширить свой язык. Например, вы можете добавить переменные или арифметические выражения. Ваш компилятор станет более сложным, но вы поймете каждый его бит, потому что вы написали его сами. Это , как появляются языки и компиляторы.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
46

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

Используя тренажеры, вы фактически создаете полную компьютерную систему с нуля. Хотя многие комментаторы заявили, что ваш вопрос слишком широк, эта книга действительно отвечает на него, оставаясь очень управляемым. Когда вы закончите, вы напишете игру на высокоуровневом языке (который вы разработали), который использует функциональность вашей собственной ОС, которая компилируется вашим языком на языке VM (который вы разработали) своим компилятором, который получает переведенный на язык ассемблера (который вы разработали) вашим VM-транслятором, который собирается в машинный код (который вы разработали) вашим ассемблером, который работает на вашей компьютерной системе, которую вы создали вместе с чипами, которые вы создали с помощью логической логики и простой язык описания аппаратного обеспечения.

Главы:

  1. Обзор курса
  2. Логическая логика
  3. Комбинаторные чипы
  4. Последовательные чипы
  5. Язык машины
  6. Архитектура компьютеров
  7. Ассемблер
  8. Виртуальная машина I: Арифметика
  9. Виртуальная машина II: Управление
  10. Язык программирования
  11. Компилятор I: анализ синтаксиса
  12. Компилятор II: генерация кода
  13. Операционная система
  14. Элемент списка

Больше удовольствия, чтобы идти

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
21

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

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
10

«Давайте построим компилятор» уже было предложено. Существует «модернизированная» версия, использующая Haskell вместо Turbo Pascal: http: //alephnullplex.appspot.com/blog/view/2010/01/12/lbach-1-introduction

Сохраняясь с Haskell, есть очень поучительный интерпретатор Схемы, который может дать дополнительные идеи: Напишите себе схему в течение 48 часов

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
10

Не верьте, что есть что-то волшебное в компиляторе или ОС: нет. Помните программы, которые вы написали, чтобы подсчитать все гласные в строке или добавить числа в массиве? Компилятор ничем не отличается по своей концепции; это просто намного больше.

Каждая программа имеет три этапа:

  1. прочитайте некоторые вещи.
  2. обрабатывать этот материал: переводить входные данные в выходные данные
  3. напишите некоторые другие данные - выходные данные

Подумайте об этом: что входит в состав компилятора? Строка символов из исходного файла.

Что выводится из компилятора? Строка байтов, представляющая машинные инструкции для целевого компьютера.

Итак, какова фаза «процесса» компилятора? Что делает эта фаза?

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

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
8

Я не эксперт, но вот мой удар:

Кажется, вы не просите написать компилятор, просто ассемблер. Это не волшебство.

Похищение кого-либо из ответов от SO ( https://stackoverflow.com/вопросы /3826692 /how-do-i-translate-assembly-to-binary ), сборка выглядит следующим образом:

label:  LDA #$00
        JMP label

Затем вы запускаете его через ассемблер и превращаетесь в нечто вроде этого:

$A9 $00
$4C $10 $00

Только все раздавлено, вот так:

$A9 $00 $4C $10 $00

Это действительно не волшебство.

Вы не можете записать это в блокноте, потому что блокнот использует ASCII (не hex). Вы бы использовали шестнадцатеричный редактор или просто записывали байты программно. Вы пишете этот шестнадцатеричный файл, назовите его «a.exe» или «a.out», а затем сообщите ОС, чтобы он запускал его.

Конечно, современные процессоры и операционные системы действительно довольно сложны, но это основная идея.

Если вы хотите написать новый компилятор, вот как это делается:

1) Запишите интерпретируемый язык, используя что-то вроде примера калькулятора в pyparsing (или любой другой хорошей структуре синтаксического анализа). Это поможет вам разобраться в основах разбора.

2) Напишите переводчика. Перевести свой язык на, скажем, на Javascript. Теперь ваш язык будет запущен в браузере.

3) Напишите переводчик на более низкий уровень, например LLVM, C или Assembly.

Вы можете остановиться здесь, это компилятор. Это не оптимизированный компилятор, но это был не вопрос. Вам также может потребоваться написать компоновщик и ассемблер, но вы действительно хотите?

4) (Insane) Напишите оптимизатор. Большие команды десятилетиями работают над этим.

4) (Sane) Присоединяйтесь к существующему сообществу. GCC, LLVM, PyPy, основная команда, работающая на любом интерпретаторе.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
8

Несколько других дали отличные ответы. Я просто добавлю еще несколько предложений. Во-первых, хорошая книга для того, что вы пытаетесь сделать, это современные тексты реализации компилятора Аппеля (сделайте выбор C , Java или Стандарт ML ). В этой книге вы познакомитесь с полной реализацией компилятора для простого языка Tiger для сборки MIPS, который можно запустить в эмуляторе, а также с минимальной библиотекой поддержки времени исполнения. Для одного прохода через все необходимое, чтобы скомпилировать язык, это довольно хорошая книга 1 .

Appel проведет вас по тому, как скомпилировать язык, который поставляется заранее, но не тратит много времени на то, что означает различные языковые функции или как думать о них с точки зрения их относительных достоинств для разработки собственных. Для этого аспекта Языки программирования: концепции и amp; Построения достойны. Концепции, методы и модели компьютерного программирования - также хорошая книга для глубокого мышления о языковом дизайне, хотя он делает это в контексте одного языка ( Oz ).

Наконец, я упомянул, что Appel имеет свой текст в C, Java и Standard ML - если вы серьезно относитесь к построению компилятора и языкам программирования, я рекомендую изучать ML и использовать эту версию Appel. Языки ML-семейства имеют сильные системы типов, преимущественно функциональные - функции, которые будут отличаться от многих других языков, поэтому изучение их, если вы еще не знаете функциональный язык, оттачивает ваше языковое ремесло. Кроме того, их сопоставление с шаблонами и функциональные мышления очень хорошо подходят для тех видов манипуляций, которые вам нужно часто делать в компиляторе, поэтому составители, написанные на языках, основанных на ML, обычно намного короче и понятнее, чем составители, написанные на языке C, Java или аналогичные языки. Книга Харпера по стандарту ML - довольно хорошее руководство, чтобы вы начали; работая над этим, вы должны подготовить вас к тому, чтобы взять на себя реализацию стандартной версии компилятора Appel. Если вы изучите стандарт ML, тогда будет довольно легко подобрать OCaml для дальнейшей работы; IMO, у него есть лучший инструментарий для рабочего программиста (более аккуратно интегрируется с окружающей средой ОС, легко создает исполняемые программы и имеет некоторые впечатляющие инструменты для создания компилятора, такие как ulex и Menhir).


1 Для долгосрочной ссылки я предпочитаю книгу Дракона, так как она имеет более подробную информацию о вещах, которые я, скорее всего, отношусь к внутренним работам алгоритмов парсера, и имеет более широкий охват из разных подходов, но книга Аппеля очень хороша для первого прохода. В принципе, Appel учит вас одному способу делать все по-своему через компилятор и направляет вас через него. Книга Дракона более подробно описывает различные варианты дизайна, но дает гораздо меньше рекомендаций о том, как заставить что-то работать.


Отредактировано : замените неправильную ссылку Aho на Sethi, укажите CTMCP.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
6

Мне пришлось создать компилятор для класса в колледже.

Основы этого делать не так сложны, как вы думаете. Первым шагом будет создание вашей грамматики. Подумайте о грамматике английского языка. Точно так же вы можете проанализировать предложение, если у него есть предмет и предикат. Подробнее об этом читайте Контекстные бесплатные грамматики .

Как только у вас есть грамматика (правила вашего языка), писать компилятор так же просто, как только следовать этим правилам. Компиляторы обычно переводят на машинный код, но если вы не хотите изучать x86, я предлагаю вам, возможно, взглянуть на MIPS или создать собственную виртуальную машину.

Компиляторы обычно имеют две части: сканер и парсер. По сути, сканер считывает код и отделяет его от токенов. Парсер смотрит на структуру этих жетонов. Затем компилятор проходит и следует некоторым довольно простым правилам, чтобы преобразовать его в любой код, в котором он должен быть (сборка, промежуточный код, такой как байт-код и т. Д.). Если вы разбиваете его на более мелкие и мелкие кусочки, это в конечном итоге не является сложным.

Удачи!

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
6

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

Теперь, когда я написал это, мне придется перечитать его.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
5

Вы можете проверить этот отличный вопрос (и ответы) на StackOverflow: Обучение написанию Компилятор . Он содержит широкий список ресурсов.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
5

В этой теме есть отличные ответы, но я просто хотел добавить мой, поскольку у меня тоже был один и тот же вопрос. (Кроме того, я хотел бы отметить, что книга, предложенная Джо-Интернетом, является отличным ресурсом.)

Во-первых, вопрос о том, как работает компьютер? Вот как: Input -> Вычислить -> Выход.

Сначала рассмотрим часть «Компромисс». Мы рассмотрим, как работают Input и Output позже.

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

Чтобы ответить на этот вопрос, нам нужно понять структуру процессора. Ниже приводится довольно простое представление. Процессор по существу состоит из двух частей. Один из них - это набор ячеек памяти, встроенных в процессор, которые служат в качестве рабочей памяти. Они называются «реестрами». Второй - это набор электронных машин, построенных для выполнения определенных операций с использованием данных в регистрах. Существует два специальных регистра, называемых «счетчик программ» или ПК, «регистрационный журнал» или «ir». Процессор считает, что память разбивается на три части. Первая часть - «память программы», в которой хранится исполняемая компьютерная программа. Вторая - «память данных». Третий используется для некоторых специальных целей, мы поговорим об этом позже. Счетчик программ содержит местоположение следующей инструкции для чтения из памяти программы. Счетчик команд Содержит номер, который ссылается на текущую выполняемую операцию. Каждая операция, которую может выполнять процессор, имеет номер, называемый кодом операции операции. Принцип работы компьютера заключается в том, что он считывает ячейку памяти, на которую ссылается счетчик программ, в регистр команд (и он увеличивает счетчик программ, чтобы он указывал на ячейку памяти следующей команды). Затем он считывает регистр команд и выполняет требуемую операцию. Например, инструкция может состоять в том, чтобы прочитать определенную ячейку памяти в регистре или записать в какой-либо регистр или выполнить некоторую операцию, используя значения двух регистров и записать вывод в третий регистр.

Теперь, как компьютер выполняет ввод /вывод? Я дам очень упрощенный ответ. См. http://en.wikipedia.org/wiki/Input/output и http://en.wikipedia.org/wiki/Interrupt . для большего. Он использует две вещи, эту третью часть памяти и что-то вроде прерываний. Каждое устройство, подключенное к компьютеру, должно иметь возможность обмениваться данными с процессором. Он делает это, используя третью часть памяти, упомянутую ранее. Процессор распределяет кусочек памяти каждому устройству, а устройство и процессор взаимодействуют через этот фрагмент памяти. Но как процессор знает, какое местоположение относится к какому устройству и когда устройству необходимо обмениваться данными? Здесь происходят прерывания. Прерывание - это, по сути, сигнал процессору, чтобы приостановить то, что он в настоящее время, и сохранить все его регистры в известном месте, а затем начать делать что-то еще. Там много прерываний, каждый из которых идентифицируется уникальным номером. Для каждого прерывания есть специальная программа, связанная с ним. Когда происходит прерывание, процессор выполняет программу, соответствующую прерыванию. Теперь, в зависимости от BIOS и того, как аппаратные устройства подключены к материнской плате компьютера, каждое устройство получает уникальное прерывание и фрагмент памяти. При загрузке операционной системы с помощью BIOS определяет местоположение прерываний и памяти каждого устройства и настраивает специальные программы для прерывания для правильной работы с устройствами. Поэтому, когда устройству нужны некоторые данные или он хочет отправить некоторые данные, он сигнализирует прерывание. Процессор приостанавливает то, что он делает, обрабатывает прерывание и затем возвращается к тому, что он делает. Есть много видов прерываний, например, для hdd, клавиатуры и т. Д. Важным является системный таймер, который вызывает прерывание через регулярные интервалы. Также есть коды операций, которые могут вызывать прерывания, называемые программными прерываниями.

Теперь мы можем понять, как работает операционная система. Когда он загружается, os устанавливает прерывание таймера, так что оно дает контроль os через равные промежутки времени. Он также настраивает другие прерывания для работы с другими устройствами и т. Д. Теперь, когда на компьютере запущен набор программ, а прерывание таймера происходит, он получает контроль и выполняет важные задачи, такие как процессуправление, управление памятью и т. д. Также os обычно предоставляет абстрактный способ для программ обращаться к аппаратным устройствам, а не позволять им напрямую обращаться к устройствам. Когда программа хочет получить доступ к устройству, он вызывает некоторый код, предоставляемый os, который затем разговаривает с устройством. В них много теории, которая касается параллелизма, потоков, блокировок, управления памятью и т. Д.

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

Как начать проектирование процессора и языка ассемблера. Знать, что вам нужно прочитать некоторые книги по компьютерной архитектуре. (см. главы 1-7 книги, на которую ссылается joe-internet). Это включает в себя изучение булевой алгебры, создание простых комбинаторных схем для добавления, умножения и т. Д., Как построить память и последовательные схемы, как построить микропроцессор и т. Д.

Теперь, как записывать компьютерные langauges. Можно начать с написания простого ассемблера в машинный код. Затем используйте этот ассемблер для написания компилятора для простого подмножества C. Затем используйте это подмножество C, чтобы написать более полную версию C. Наконец, используйте C для записи более сложного языка, такого как python или C ++. Разумеется, чтобы написать язык, вы должны сначала его спроектировать (так же, как и вы, процессор). Снова посмотрите на некоторые учебники по этому вопросу.

И как писать os. Сначала вы нацеливаете платформу, такую ​​как x86. Затем вы выясните, как он загружается, и когда будет вызван ваш os. Типичный pc boots таким образом. Он запускается, и bios выполняет некоторые тесты. Затем BIOS считывает первый сектор hdd и загружает содержимое в определенное место в памяти. Затем он устанавливает процессор, чтобы начать выполнение этих загруженных данных. Это то, что вы вызываете. Типичный os в этот момент загружает остальную память. Затем он инициализирует устройства и устанавливает другие вещи, и, наконец, он приветствует вас экраном входа.

Итак, чтобы написать os, вы должны написать «бот-загрузчик». Затем вы должны написать код для обработки прерываний и устройств. Затем вы должны написать весь код для управления процессами, управления устройствами и т. Д. Затем вы должны написать api, который позволяет программам, работающим в вашем os, обращаться к устройствам и другим ресурсам. И, наконец, вы должны написать код, который читает программу с диска, устанавливает ее как процесс и начинает ее выполнять.

Конечно, мой ответ явно упрощен и, вероятно, мало практичен. В моей защите я теперь теоретик, аспирант, поэтому я забыл многое из этого. Но вы можете многого узнать о Google и узнать больше.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
4

Я помню момент в моей карьере программирования, когда я был в таком же смятении: я немного почитал теорию, книгу Дракона, книгу Тигра (красный), но все же не знал, Знаете ли вы, как собрать все это вместе.

Что связало это, было найти конкретный проект do (а затем выяснить, что мне нужно только небольшое подмножество всей теории).

Java VM предоставила мне хорошую отправную точку: это концептуально «процессор», но он сильно абстрагирован от беспорядочных деталей реальных процессоров. Это также дает важную и часто упущенную часть процесса обучения: отделять вещи, прежде чем снова объединять их (как это делали дети в ранние времена).

Играйте с декомпилятором и классом Hello, World на Java. Прочтите спецификацию JVM и попытайтесь понять, что происходит. Это даст вам обоснованное представление о том, что компилятор делает .

Затем поиграйте с кодом, который создает класс Hello, World. (Фактически вы создаете компилятор, специфичный для приложения, для особо специализированного языка, на котором вы можете только сказать Hello, World.)

Попробуйте написать код, который сможет читать в Hello, World, написанном на каком-то другом языке, и вывести тот же класс. Сделайте так, чтобы вы могли изменить строку из «Hello, World» на что-то еще.

Теперь попробуйте выполнить компиляцию (в Java) класса, который вычисляет некоторое арифметическое выражение, например «2 * (3 + 4)». Разделите этот класс, напишите «игрушечный компилятор», который может собрать его снова.

ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
3

1) Отличные видео-лекции из Университета Вашингтона:

Строительство компилятора CSE P 501 - осень 2009 г. www.cs.washington.edu/education/courses/csep501/09au/lectures/video.html *

2) SICP http: //groups.csail. mit.edu/mac/classes/6.001/abelson-sussman-lectures/ И книга с тем же именем. Это действительно является обязательным для любого разработчика программного обеспечения.

3) Кроме того, о функциональном программировании, Haskell, лямбда-исчислении, семантике (включая денотационные) и реализации компилятора для функциональных языков. Вы можете начать с 2005-SS-FP.V10.2005-05-24.HDV, если вы уже знаете Haskell. Видеоролики Uxx - это ответы. Сначала следуйте Vxx .

http: //video.s-inf .de /# FP.2005-SS-Giesl. (COT) .HD_Videoaufzeichnung

(видеоролики на английском языке, другие курсы на немецком языке.)

  • новые пользователи могут публиковать максимум две гиперссылки.
ответил Alexander Torstling 30 Jpm1000000pmThu, 30 Jan 2014 21:48:49 +040014 2014, 21:48:49
3

ANTLR - хорошая отправная точка. Это система генерации языка, похожая на Lex и Yacc. Существует gui, называемый ANTLRWorks , который упрощает процесс.

В .NET-мире существует динамический язык исполнения , который может использоваться для генерации кода в мир .NET. Я написал язык выражения Zentrum , который генерирует код с использованием DLR. Он покажет вам, как анализировать и выполнять статически и динамически типизированные выражения.

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
2

Для простого введения в работу компиляторов и создания собственного языка программирования я бы рекомендовал новую книгу http: //createyourproglang.com , в котором больше внимания уделяется теории языкового дизайна, не требуя знать о внутренних функциях ОС /ЦП, то есть лексеры, парсеры, интерпретаторы и т. д.

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

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
2

Если все, что вы говорите, верно, у вас есть профиль перспективного исследователя, и конкретное понимание может быть получено только одним способом: изучением. И я не говорю « Прочитайте все эти книги по информатике высокого уровня (специально эти ), написанные этим гений !"; Я имею в виду: вы должны быть с людьми высокого уровня, чтобы быть компьютерным ученым, таким как Чарльз Бэббидж, Алан Тьюринг, Клод Шеннон или Деннис Ритчи. Я не презираю людей с самообучением (я один из них), но таких людей не так много, как вы. Я серьезно рекомендую Программу Symbolic Systems (SSP) на Стэнфордский университет . Как говорится на веб-сайте:

  

Программа символических систем (SSP) в   Стэнфордский университет фокусируется на   компьютеры и умы: искусственные и   естественные системы, которые используют символы для   представлять информацию. SSP приносит   вместе студенты и преподаватели   заинтересованных в различных аспектах   человеко-компьютерные отношения,   включая ...

     
  • познавательная наука : изучение человеческого интеллекта, естественных языков,   и мозг как вычислительный   процессов;
  •   
  • искусственный интеллект : предоставление компьютеров человекоподобным   поведение и понимание; и
  •   
  • человеко-компьютерное взаимодействие : разработка программного обеспечения для компьютеров и   интерфейсы, которые хорошо работают с человеческими   пользователей.
  •   
ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
2

Я собираюсь предложить что-то немного из левого поля: изучите Python (или, возможно, Ruby, но у меня есть намного больше опыта в Python, вот что я буду обсуждать). И не просто баловать в нем, но действительно узнавать это на глубоком уровне.

Есть несколько причин, которые я предлагаю:

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

  2. Стандартная реализация Python (CPython) является открытым исходным кодом и хорошо документирована, что упрощает понимание того, как язык работает под капотом.

  3. Python скомпилирован в простой байт-код, который легче понять, чем сборка и который работает одинаково на всех платформах Python. Итак, вы узнаете о компиляции (поскольку Python компилирует исходный код в байтовый код) и интерпретации (поскольку этот байт-код интерпретируется на виртуальной машине Python).

  4. Python предлагает множество предлагаемых новых функций, задокументированных в нумерованных PEP (предложениях по улучшению Python). PEP интересно читать, чтобы увидеть, как дизайнеры языка рассмотрели возможность реализации функции, прежде чем выбирать способ, которым они на самом деле это сделали. (PEP, которые все еще находятся на рассмотрении, особенно интересны в этом отношении.)

  5. Python сочетает в себе функции от различных парадигм программирования, поэтому вы узнаете о различных способах решения проблем и имеете более широкий спектр инструментов, которые следует учитывать в своем родном языке.

  6. Python упрощает расширение языка различными способами с помощью декораторов, метаклассов, захватов импорта и т. д., чтобы вы могли играть с новыми языковыми функциями до такой степени, не покидая язык. (В стороне: блоки кода являются первоклассными объектами в Ruby, поэтому вы можете писать новые структуры управления, такие как циклы! У меня создается впечатление, что программисты Ruby не обязательно считают, что расширение языка, но это как раз то, вы программируете в Ruby, но это довольно круто.)

  7. В Python вы можете фактически разобрать байт-код, сгенерированный компилятором, или даже написать свой собственный с нуля и выполнить его интерпретатор (я сделал это сам, и это было разумно, но весело).

  8. У Python есть хорошие библиотеки для синтаксического анализа. Вы можете проанализировать код Python в абстрактное синтаксическое дерево, а затем управлять им с помощью модуля AST. Модуль PyParsing полезен для разбора произвольных языков, например тех, которые вы разрабатываете. Теоретически вы могли бы написать свой первый компилятор языка в Python, если хотите (и он может генерировать C, сборку или даже вывод Python).

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

Удачи!

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
1

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

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

Сердцем операционной системы является ядро, которое управляет ресурсами (например, распределением /освобождением памяти) и переключает между задачами /процессами /программами.

Ассемблер представляет собой преобразование типа text> байт.

Если вас интересует этот материал, я бы предложил написать ассемблер X86 в Linux, который поддерживает некоторые подмножества стандартной сборки X86. Это будет довольно простой отправной точкой и познакомит вас с этими проблемами. Это не детский проект, и вы научитесь многому.

Я бы рекомендовал написать его на C; C является лингва-франкой для этого уровня работы.

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
1

См. книгу Кеннета Лоудена «Строительство компилятора»

http://www.cs.sjsu.edu/~louden/cmptext/

Он обеспечивает лучший практический подход к разработке компилятора.

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

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
1

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

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

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
0

Компиляторы и языки программирования (и все, в том числе при построении одного - например, определение конечной грамматики и преобразование в сборку) - очень сложная задача, требующая большого понимания систем в целом. Этот тип курса обычно предлагается в качестве 3-го /4-го класса Comp Sci в Университете.

Я настоятельно рекомендую вам сначала лучше понять операционные системы в целом и как скомпилировать /выполнить существующие языки (например, изначально (C /C ++), в VM (Java) или интерпретатором (Python /Javascript )).

Я полагаю, что мы использовали концепцию операционной системы Абрахама Сильбершаца, Петра Б. Галвина, Грега Гана на моем курсе по операционным системам (в 2-м году). Это была отличная книга, которая дала тщательный пошаговый обзор каждого компонента операционной системы - немного дорогой, но стоит того, и старые /использованные копии должны плавать вокруг.

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
0

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

Большинство компиляторов и /или интерпретаторов работают следующим образом:

Tokenize : сканируйте текст кода и перебейте его в список токенов.

Этот шаг может быть сложным, потому что вы не можете просто разделить строку на пробелы, вы должны признать, что if (bar) foo += "a string"; - это список из 8 жетонов : WORD, OPEN_PAREN, WORD, CLOSE_PAREN, WORD, ASIGNMENT_ADD, STRING_LITERAL, TERMINATOR. Как вы можете видеть, простое разделение исходного кода на пробелы не будет работать, вы должны прочитать каждый символ как последовательность, поэтому, если вы столкнулись с буквенно-цифровым символом, вы продолжаете читать символы, пока не нажмете символ не-алфавита, и эта строка будет просто прочитайте это СЛОВО, которое будет далее классифицировано позже. Вы можете сами решить, насколько гранулирован ваш токенизатор: проглатывает ли "a string", поскольку один токен с именем STRING_LITERAL будет далее разбираться позже или видит "a string" как OPEN_QUOTE, UNPARSED_TEXT, CLOSE_QUOTE или что-то еще, это всего лишь один из многих вариантов, которые вы должны решить сами, когда вы его кодируете.

Lex : теперь у вас есть список токенов. Вероятно, вы отметили некоторые маркеры с неоднозначной классификацией, такой как WORD, потому что во время первого прохода вы не тратите слишком много усилий, пытаясь понять контекст каждой строки символов. Теперь вы снова читаете список токенов источника и реклассифицируете каждый из двусмысленных токенов с более конкретным типом токена на основе ключевых слов на вашем языке. Таким образом, у вас есть WORD, например «if», а «if» находится в вашем списке специальных ключевых слов, называемых символом IF, поэтому вы меняете тип символа этого токена с WORD на IF и любое WORD, которого нет в списке ваших специальных ключевых слов , например WORD foo, является IDENTIFIER.

Разбор : теперь вы превратили if (bar) foo += "a string"; список лексических токенов, которые выглядят следующим образом: IF OPEN_PAREN IDENTIFER CLOSE_PAREN IDENTIFIER ASIGN_ADD STRING_LITERAL TERMINATOR. Этап - распознавание последовательностей токенов как операторов. Это разбор. Вы делаете это с использованием грамматики, например:

ЗАЯВЛЕНИЕ: = ASIGN_EXPRESSION | IF_STATEMENT

IF_STATEMENT: = IF, PAREN_EXPRESSION, ЗАЯВЛЕНИЕ

ASIGN_EXPRESSION: = IDENTIFIER, ASIGN_OP, VALUE

PAREN_EXPRESSSION: = OPEN_PAREN, VALUE, CLOSE_PAREN

VALUE: = IDENTIFIER | STRING_LITERAL | PAREN_EXPRESSION

ASIGN_OP: = EQUAL | ASIGN_ADD | ASIGN_SUBTRACT | ASIGN_MULT

Произведения, которые используют "|" между терминами означает «соответствовать любому из них», если между запятыми есть запятые, это означает «соответствовать этой последовательности терминов»

Как вы это используете? Начиная с первого токена, попытайтесь сопоставить свою последовательность токенов с этими произведениями. Поэтому сначала вы пытаетесь сопоставить свой список токенов с ЗАЯВЛЕНИЕМ, поэтому вы читаете правило для ЗАЯВЛЕНИЯ, и оно гласит: «ЗАЯВЛЕНИЕ - это либо ASIGN_EXPRESSION, либо IF_STATEMENT», поэтому сначала вы пытаетесь сопоставить ASIGN_EXPRESSION, поэтому вы просматриваете правило грамматики для ASIGN_EXPRESSION и он говорит: «ASIGN_EXPRESSION - это ИДЕНТИФИКАТОР, за которым следует ASIGN_OP, за которым следует VALUE, поэтому вы просматриваете правило грамматики для IDENTIFIER, и вы видите, что для IDENTIFIER нет грамматического грабежа, поэтому IDENTIFIER означает« терминал », что означает, что он не требует дальнейшего синтаксический анализ, чтобы соответствовать ему, чтобы вы могли попытаться сопоставить его непосредственно с вашим токеном. Но ваш первый токен источника - это IF, а IF - это не то же самое, что IDENTIFIER, поэтому совпадение не получилось. Что теперь? Вы вернетесь к правилу ЗАЯВЛЕНИЯ и попробуйте чтобы соответствовать следующему термину: IF_STATEMENT. Вы просматриваете IF_STATEMENT, он начинается с IF, lookup IF, IF - это терминал, сравните терминал с вашим первым токеном, совпадением IF-маркера, awesome продолжите, следующий термин PAREN_EXPRESSION, поиск PAREN_EXPRESSION, это не терминал, что это первый термин, PAREN_EXPRESSION начинается с OPEN_PAREN, поиск OPEN_PAREN, это терминал, соответствует OPEN_PAREN для вашего следующего токена, он соответствует, .... и так далее.

Самый простой способ приблизиться к этому шагу - это функция, называемая parse (), которую вы передаете ему токен исходного кода, который вы пытаетесь сопоставить, и термин грамматики, с которым вы пытаетесь его сопоставить. Если термин грамматики не является терминалом, то вы рекурсируете: вы вызываете parse (), снова передавая ему тот же токен источника и первый член этого правила грамматики. Вот почему это называется «рекурсивным парсером спуска». Функция parse () возвращает (или изменяет) вашу текущую позицию при чтении токенов источника, она, по существу, передает последний токен в согласованной последовательности, и вы продолжаете следующий вызов parse () оттуда.

Каждый раз, когда parse () соответствует произведению вроде ASIGN_EXPRESSION, вы создаете структуру, представляющую этот фрагмент кода. Эта структура содержит ссылки на исходные токены источника. Вы начинаете создавать список этих структур. Мы все будем называтьструктура абстрактного дерева синтаксиса (AST)

Скомпилировать и /или выполнить . Для определенных производств в вашей грамматике вы создали функции обработчика, которые, если они были заданы структурой AST, скомпилировали или выполнили бы этот кусок AST.

Итак, давайте посмотрим на часть вашего АСТ, которая имеет тип ASIGN_ADD. Так как интерпретатор имеет функцию ASIGN_ADD_execute (). Эта функция передается как часть АСТ, которая соответствует дереву разбора для foo += "a string", поэтому эта функция смотрит на эту структуру и знает, что первый член в структуре должен быть IDENTIFIER, а второй термин - VALUE, поэтому ASIGN_ADD_execute () передает член VALUE функции VALUE_eval (), которая возвращает объект, представляющий оцениваемое значение в памяти, затем ASIGN_ADD_execute () выполняет поиск «foo» в таблице переменных , и сохраняет ссылку на все, что было возвращено функцией eval_value ().

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

Шаги с 1 по 3 и некоторые 4 могут быть упрощены с помощью таких инструментов, как Flex и Bison. (ака. Лекс и Як), но писать переводчика с нуля - это, вероятно, самое эффективное упражнение, которое любой программист мог бы достичь. Все другие проблемы программирования кажутся тривиальными после встречи на высшем уровне.

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

Прочтите их и удачи!

http://www.iro.umontreal.ca /~felipe/IFT2030-Automne2002/Complements/tinyc.c

http://en.wikipedia.org/wiki/Recursive_descent_parser

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
0

Поле компьютера сложное, потому что оно успело развиваться во многих направлениях. По сути, это всего лишь вычислительные машины.

Мой любимый очень простой компьютер - ретранслятор Гарри Портера . Это дает представление о том, как компьютер работает на базовом уровне. Тогда вы можете начать понимать, почему нужны такие языки, как языки и операционные системы.

Дело в том, что трудно понять что-либо, не понимая , что ему нужно . Удачи, и не просто читать вещи. Do .

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
-1

Посмотрите http://mikeos.berlios.de/

В сборке x86 есть действительно простая операционная система.

У него есть хороший учебник о том, как писать простые os с нуля.

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
-1

Еще одна хорошая вступительная книга - «Компиляторбау» Н. Вирта с 1986 года (построение компилятора), которая составляет около 100 страниц и описывает сжатый, хорошо продуманный код для языка игрушек PL /0, включая парсер, генератор кода и виртуальную машину. Он также показывает, как написать парсер, который читает в грамматике, для анализа в нотации EBNF. Книга написана на немецком языке, но я написал резюме и перевел код на Python в качестве упражнения, см. http://www.d12k.org/cmplr/w86/intro.html .

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
-1

Если вы заинтересованы в понимании сути языков программирования, я бы предложил вам работать через книгу PLAI (http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/), чтобы понять концепций и их реализации. Это также поможет вам в разработке вашего собственного языка.

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06
-1

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

  • Разрешенные номера
  • Допустимые операторы
  • Приоритеты оператора
  • Проверка синтаксиса
  • Переменный механизм поиска
  • Обнаружение цикла
  • Оптимизация

Например, у вас есть следующие формулы, ваш калькулятор должен иметь возможность вычислить значение x:

a = 1
b = 2
c = a + b
d = (3 + b) * c
x = a - d / b

Это не очень сложный компилятор, но вы можете подумать над некоторыми основными идеями о том, что такое компилятор, а также помочь вам улучшить свои навыки программирования и контролировать качество вашего кода (это на самом деле идеальная проблема, связанная с тем, что TestDiven Development TDD может применяться для улучшения качества программного обеспечения).

ответил Sean 24 +04002011-10-24T17:08:06+04:00312011bEurope/MoscowMon, 24 Oct 2011 17:08:06 +0400 2011, 17:08:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132