Изучение, как работают языки программирования

Согласно исследованиям различных проектов (1), Модульные тесты находят 15.. 50% из дефектов (среднее число 30%). Это не делает их худшим средством поиска ошибки в Вашем арсенале, но не серебряной пулей также. Там никакие серебряные пули, любая хорошая стратегия QA состоит из нескольких методов.

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

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

Dev по сравнению с Тестерами Разработчики известно плохи при тестировании их собственного кода: причины являются психологическими, техническими и длятся не в последнюю очередь экономичный - тестеры являются обычно более дешевыми, чем разработчики. Но разработчики могут внести свой вклад и сделать тестирование легче. TDD делает тестирование внутренней части конструкции программы, не только запоздалой мысли, которая является истинным значением TDD.

Другой интересный момент о тестировании: в 100%-м покрытии нет никакого смысла. Статистически, ошибки следуют 80:20 правило - большинство ошибок найдено в маленьких разделах кода. Некоторые исследования предполагают, что это еще более резко - и тесты должны focuse на местах, где ошибки поднимаются.

(1) Производительность Программирования Jones 1986 США, заключенный в кавычки из Кода, Завершенного, 2-го. редактор, Но как другие сказал, единица , тесты являются только одной частью тестов, интеграция, регрессионные тесты и тестирование системы могут быть - в leat частично - автоматизированы также.

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

14
задан Community 23 May 2017 в 12:23
поделиться

10 ответов

Код для выполнения в двух словах

Программа (код) передается в компилятор (или интерпретатор).

Символы используются для формирования токенов (+, идентификаторы, числа) и их значение хранится в некоторой вещи, называемой таблицей символов.

Эти токены собираются вместе для формирования операторов: (int a = 6 + b * c;). В основном в форме синтаксического дерева:

                     =
                    / \
                   /   \ 
                  a     +
                       / \
                      /   \
                     6     *
                          / \
                         b   c

В интерпретаторе дерево выполняется напрямую.

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

Теперь у вас есть один или несколько «объектных файлов». Они содержат код ассемблера без точных переходов (потому что эти значения еще не известны, особенно если цели находятся в других объектных файлах). Объектные файлы связаны вместе с помощью компоновщика, который заполняет пробелы для переходов (ссылки ans). Результатом компоновщика является библиотека (которая тоже может быть связана) или исполняемый файл.

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

12
ответ дан 1 December 2019 в 08:53
поделиться

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

Лично я узнал из книги Себесты . Он дает очень широкое введение в предмет, не вдаваясь в подробности. В нем также есть хорошая глава по истории языков программирования (~ 20 языков ~ 3 статьи на каждый язык). В нем есть хорошее объяснение грамматики и теории языков в целом. Кроме того, он дает хорошее введение в схемы, пролог и парадигмы программирования (логические, функциональные, императивные ^, объектно-ориентированные).

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

4
ответ дан 1 December 2019 в 08:53
поделиться

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

3
ответ дан 1 December 2019 в 08:53
поделиться

Ого, это огромный вопрос, об этом написано множество книг. Я действительно сомневаюсь, что вы получите достойный ответ по этому поводу в ТАК. Вам нужно добраться до местного книжного магазина или взять несколько классов comp sci.

Чтобы дать вам быстрое введение:

  • Компилятор: Программа, которая преобразует написанный код в инструкции, которые изначально понимаются процессор.
  • Интерпретатор: Программа, которая считывает написанный код и на лету транслирует и выдает соответствующие инструкции процессора.
  • Управляемый код: Код, который выполняется в виртуальной машине, например, для обеспечения кроссплатформенной совместимости (Java).
  • Виртуальная машина: Программа, которая имитирует поведение или, скорее, API, полноценной компьютерной среды. Среди прочего, это дает некоторые преимущества безопасности и кроссплатформенную совместимость.
2
ответ дан 1 December 2019 в 08:53
поделиться

http://en.wikipedia.org/wiki/Dragon_Book_ (computer_science) объяснит многие из этих концепций, вы должны прочитать это, это было настоящим открытием для меня.

2
ответ дан 1 December 2019 в 08:53
поделиться

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

  • Некоторая форма предварительной обработки файла, который обрабатывает макросы и тому подобное (например, из C).
  • Парсер , который принимает исходный код files, проверяет, соответствуют ли они синтаксическим правилам вашего языка, и преобразует файл в структуру данных в памяти, которой проще манипулировать другими частями программы. Это называется абстрактным синтаксисом деревом или AST.
  • Некоторая форма анализа AST, которая проверяет, что фактический код, который вы написали, не нарушает никаких правил языка (например, рекурсию на языке, который ее не поддерживает), а также многое другое.
  • Оптимизация , такая как оптимизация хвостового вызова, оптимизация цикла и многие другие виды оптимизации.
  • Генерация кода , который представляет собой фактический процесс принятия окончательного AST и любых других сгенерированных данных и преобразования их в какой-то двоичный файл, который может быть выполнен или интерпретирован.

Интерпретатор:

Интерпретатор - это программа, которая принимает определенную форму. двоичных данных, которые представляют программу, не скомпилированную для кода, непосредственно исполняемого целевой машиной, и запускают команды внутри. Примеры: python, java и lua.

Собственный код:

Это код, который был скомпилирован в собственные инструкции, непосредственно выполняемые целевой машиной. Например; если вы работаете на архитектуре x86, то c ++ будет компилироваться в исполняемый файл, понятный процессору.

Виртуальная машина:

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

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

Виртуальная машина:

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

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

Виртуальная машина:

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

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

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

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

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

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

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

(Большая часть этой статьи была написана с помощью Википедии, хотя некоторые были написаны по памяти)

4
ответ дан 1 December 2019 в 08:53
поделиться

Если вы хотите знать, как перейти от исходного кода к чему-то, что действительно работает на целевой машине, вам следует получить копию знаменитой Red Dragon Book . Я использовал его для создания парсеров и лексических анализаторов. Хотя он датируется 1986 годом, и я уверен, что за это время был достигнут прогресс, насколько я могу судить, он не был превзойден как текст.

Похоже, что Эддисон-Уэсли сделал перепечатку его предшественник, Книга Зеленого Дракона, и выдает его за что-то недавнее, поэтому будьте осторожны, чтобы получить подлинный предмет.

2
ответ дан 1 December 2019 в 08:53
поделиться

Когда я узнал о программировании где-то во второй половине прошлого века, я понял, что все нужно преобразовать в машинный код. Языки сценариев просто решат, какой код вызывать, на основе кода сценария. Скомпилированный код сначала будет скомпилирован в p-code, что означает предварительно скомпилированный код, который необходимо связать с другим предварительно скомпилированным кодом для создания полного приложения. Мне тогда понравился Turbo Pascal просто потому, что Turbo Pascal компилировался непосредственно в код machione и не использовал промежуточный p-код между ними. Так было до Turbo Pascal 4.0, который создавал скомпилированные * .tpu модули. Большинство других компиляторов вместо этого компилируются в формат .obj.

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

В настоящее время интерпретаторы почти вымерли. Большинство скриптовых языков сначала будут скомпилированы в машинный код, затем машинный код будет сохранен в некотором кэше и, таким образом, его можно будет выполнить очень быстро, без необходимости повторно интерпретировать какие-либо повторяющиеся инструкции. Это хорошо работает для текстовых и двоичных сценариев. PHP был бы примером текстового скрипта. Java и .NET представляют собой двоичные сценарии, поскольку обычно код компилируется в этот формат двоичного сценария. (Они назовут это иначе, но я думаю, что двоичные сценарии звучат лучше.)

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

Я также помню время, когда я мог написать приложение на C ++, в котором операторы SQL располагались бы внутри самого кода. Это тоже было очень практично, но для этого требовался препроцессор, который сначала анализировал бы операторы SQL из кода, чтобы преобразовать его в другие операторы C ++ и заменяя операторы SQL более сложными командами C ++. Затем все это будет скомпилировано в p-код. Затем вам нужно связать его с дополнительными библиотеками SQL, и, наконец, у вас будет исполняемый файл.

но для этого требовался препроцессор, который сначала анализировал бы операторы SQL из кода, чтобы преобразовать его в другие операторы C ++ и заменяя операторы SQL более сложными командами C ++. Затем все это будет скомпилировано в p-код. Затем вам нужно будет связать его с дополнительными библиотеками SQL, и, наконец, у вас будет исполняемый файл.

но для этого требовался препроцессор, который сначала разбирал бы операторы SQL из кода, чтобы преобразовать его в другие операторы C ++ и заменяя операторы SQL более сложными командами C ++. Затем все это будет скомпилировано в p-код. Затем вам нужно связать его с дополнительными библиотеками SQL, и, наконец, у вас будет исполняемый файл.

1
ответ дан 1 December 2019 в 08:53
поделиться

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

1
ответ дан 1 December 2019 в 08:53
поделиться

Вы можете найти множество лекций. Например, на сайте Itunes U

0
ответ дан 1 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

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