Balancer> Это - не признак
Это, как раз, основной признак. Вырос из спора статические языки vs динамические ещё до появления интерпретаторов. А вот интерпретаторы пошли позже, когда придумали язычки с сильно ослабленным контролем типов и необязательностью описания (ага, тут Фортран сыграл злую шутку с выведением типа по первой букве имени). Поскольку читать строку за строкой было легче всего, то таких интерпретаторов появилось море. Но были и другие. Которые требовали описания переменных.
Но и с текущими интерпретаторами есть проблемки. Скажем, переход по метке. Интепретатор читает текст без исполнения — ищет метку (если её ещё не было). Аналогичные проблемы возникают при вызове ф-ции или метода, которые будут объявлены позже.
Именно из-за таких ситуаций не работает определение построчного чтения и исполнения.
Balancer> Многие интерпретаторы имеют жёсткую проверку типов. Эта особенность никак не связана с данным делением.
Это связано с динамикой. И с тем, что делать надо её один раз, а не каждый раз. Если интересно, то можешь попытаться поискать споры комадны Терехова (и Цейтина) с Эльбрусниками. А новосибирцы были посередине.

Я, правда, не знаю, есть ли что-то в инете по этому поводу. Хотя, вроде, на Базе приводили ссылочку на воспоминания Берка.
Balancer> Вот. Преобразование перед исполнением. А не во время исполнения 
Ещё хуже, компилятор часто знает что надо делать и может уже сделать это. И ты ни как не увидишь этого на этапе исполнения. И проверка типов и отсутствие её в момент исполнения это из того же разряда.
Balancer> У классического Си++ много проверок бывает в рантайме. Но это не делает популярные реализации интерпретируемыми
У классического С++ — не так много.

Только по дереву наследований и спускании вниз по дереву наследований. Сообственно, для работы с этим разработан специальный механизм RTTI и typeid. А вот всякие присваивания типов — только на этапе компиляции и следов не остаётся.
Balancer> Ну да, само собой. Раз делается полная предварительная трансляция, грех что-нибудь не соптимизировать.
Ты посмотри на то, что делают сейчас подменой наиболее часто исполняемых комбинаций, как в компиляторах, так и в интерпретарорах.

Просто, это требует больших знаний и встречается очень редко. Та же идея Трансметы из этой серии.
Balancer> Это уже мешанина сущностей. JIT касается виртуальной машины, а не языка.
Не, это у тебя такое восприятие. А идея намного шире. Нормальные интерпретары тоже ведут статистику и могут на ходу кое-чего менять. Иногда и код сгенерить могут на лету и его использовать (один шаг от evaluate expression). Интерпретатор, кстати, тоже работает в рамках виртуальной машины. Всякие там таблицы переменных и прочего в рамках архитекутуры проца нет.
Balancer> Ну, поехали... Уже отдельные библиотеки начнём по этому признаку делить?
У Алгола 68 (в отличии от С и С++) не библиотеки, а часть языка. Просто язык такой. Впрочем, у Паскаля тоже не библиотека.
Balancer> printf у Си++ - интерпретатор? 
А ты думаешь нет? Ещё какой. Потому и работает медленно. Он каждый строку формата интерпретирует в полном смысле слова. И от этого никуда не уйти, поскольку формат не известен в момент компиляции в общем случае.
Не даром этот спор — чистый компилятор и/или интерпретатор уже много лет как никто не рассматривает. Все говорят про смещанный тип.
Balancer> Уже наличие кодогенератора говорит о компиляторной сути трансляции. И оптимизатор туда же. Ты только что выше говорил, что оптимизация - это отличие компилятора от интерпретатора
Ну, в общем случае, говорило. Сейчас, думаю, что и нет. Интерпретаторы больно умные стали.