Какую тему информатики я пытаюсь описать? - PullRequest
18 голосов
/ 01 марта 2010

Я программирую около ... 6-> 8 лет, и я начал понимать, что я действительно не знаю, что на самом деле происходит на низком уровне, когда я делаю что-то вроде

int i = j%348

Дело в том, что я знаю, что делает j% 348, он делит j на 348 и находит остаток. Чего я не знаю, так это то, КАК компьютер делает это.

Точно так же я знаю, что

try
{
 blah();
}catch(Exception e){
 blah2();
}

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

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

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

Суть вопроса:
О какой теме / курсе информатики я спрашиваю? Потому что, честно говоря, я не знаю.

Поскольку я не знаю, как называется эта тема, я не могу найти книгу или онлайн-ресурс, чтобы узнать о ней, поэтому я застрял. Я был бы бесконечно благодарен, если бы кто-то помог мне = /

Ответы [ 9 ]

12 голосов
/ 01 марта 2010

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

Вот несколько хороших книг по компьютерной архитектуре, если вы хотите узнать немного больше о том, как компьютер выполняет программу:

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

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

7 голосов
/ 01 марта 2010

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

Я нашел этот ресурс, который очень классный: http://en.wikibooks.org/wiki/X86_Disassembly

По сути, это сборочная книга, которая объясняет некоторые концепции того, как код более высокого уровня выполняется в сборке, и содержит несколько примеров, в которых показано, как функции и т. Д. Могут генерироваться в сборке компилятором.

1 голос
/ 01 марта 2010

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

(Наиболее) общая «вещь CS», которая может реализовывать исключения, - это, вероятно, продолжения (как, среди прочего, встречается в Схеме). Если вы еще не читали "Структура и интерпретация компьютерных программ" (SICP, веб-страница здесь, включая полный текст ), возможно, стоит дать краткий обзор, это слегка затрагивает конструкцию компилятора.

1 голос
/ 01 марта 2010

Я думаю, вы смотрите, как компилятор переводит код языка высокого уровня в машинные инструкции. Посмотрите на дизайн компилятора. Это классическая книга .

1 голос
/ 01 марта 2010

Первая часть может рассматриваться как компьютерная инженерия, а вторая - только языковой дизайн.

0 голосов
/ 29 апреля 2010

Если вы не хотите тратить деньги, есть отличная книга под названием «Основы организации и проектирования компьютеров». здесь (ссылка в формате PDF). Я также рекомендую «Кодекс» Чарльза Петцольда, опубликованный Microsoft Press.

0 голосов
/ 01 марта 2010

В упомянутой выше книге «Элементы вычислительных систем: построение современного компьютера из первых принципов» Ноама Нисана и Шимона Шокена рассматриваются типы вопросов, которые вы поднимаете целостно: от архитектуры до ВМ и компиляторов в ОС.

0 голосов
/ 01 марта 2010

Никто не говорит о математике по модулю? Первый семестр по медиаинформатике (я на пятом), курс: математический:

10% 3 =?
x% y = z

Расчет:

  1. 10/3 = 3,33333
  2. 3,3333 округляется до 3
  3. 3 * 3 = 9
  4. 10 - 9 = 1

Как одно из формул:
10 - (Math.round (10/3) * 3) = 1

С переменными:
x% y = x - (Math.round (x / y) * y)

Понимание двоичного кода, и вы поймете, что каждая математическая операция основана на сложении.

0 голосов
/ 01 марта 2010

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

Может быть, Алгоритмы - это общая область, которая вас интересует?

...