В основном это совпадение.
Языки программирования со временем эволюционировали, а технология компиляторов и интерпретаторов улучшилась. Эффективность базовой обработки (т. Е. Время компиляции, накладные расходы на интерпретацию, время выполнения и т. Д.) Также не так важна, поскольку мощные вычислительные платформы выросли.
Синтаксис языка действительно оказывает влияние - например, Паскаль был очень тщательно спроектирован, чтобы он мог использовать однопроходный компилятор - то есть один проход по исходному тексту, и у вас есть исполняемый машинный код. Ада, с другой стороны, не обратила на это никакого внимания, а компиляторы Ады, как известно, трудны для написания - большинству требуется более одного прохода. (Один очень хороший компилятор Ada, который я использовал много лет назад, был 8-проходным компилятором. Как вы можете себе представить, он был очень медленным.)
Если вы посмотрите на старые языки, такие как Fortran (скомпилированный) и BASIC (интерпретированный или скомпилированный), у них / был очень строгий синтаксис и семантические правила. [В случае с Бейсиком, то есть не со старым Бейсиком Билла, вам нужно вернуться к этому оригиналу.]
С другой стороны, при взгляде на другие более старые вещи, такие как APL (куча веселья), это была своего рода динамическая типизация. Это также обычно интерпретировалось, но также могло быть скомпилировано.
Сложный синтаксис сложен - если это означает, что у вас есть вещи, которые являются необязательными или могут быть выведены, то это означает, что язык обладает достаточным богатством, чтобы его можно было отбраковать. Опять же, у BASIC было это много лет назад, когда утверждение «LET» стало необязательным!
Многие из идей, которые вы сейчас видите (например, типизирование или динамическая типизация), на самом деле очень старые - впервые появились в 1970-х или в начале 1980-х годов. То, как они используются, и языки, на которых эти идеи используются, изменилось и выросло. Но по сути, многое из того, что нового, на самом деле - это старые вещи, одетые в новую одежду.
Вот несколько примеров из головы:
- APL: динамическая типизация. Обычно интерпретируется. Пришел с 1960-х / 1970-х годов.
- ОСНОВНАЯ: сильная или динамическая типизация. Интерпретируется или компилируется. 1970-е и многие другие.
- Фортран: сильная типизация. Составитель. 1960-е или раньше.
- Алгол68: сильная типизация. Составитель. 1960-х годов.
- PL / 1: строгая типизация. Составитель. 1960-х годов.
- Паскаль: сильная типизация. Составитель. 1970-х. (Но в 1980-х были компиляторы P-System, очень похожие на компиляторы JIT!)
- Некоторые реализации Fortran и других DEC в первые дни были частично скомпилированы и частично интерпретированы.
- Smalltalk: динамическая типизация. Скомпилировано в байт-код, который интерпретируется. 1980-х.
- Пролог: больше странностей. Функциональная. Скомпилировано (Turbo Prolog, кто-нибудь?). 1980-х.
- C: сильный (ха-ха) типирование. Составитель. 1960's..today.
- Ада: супер-сильная типизация. Составитель. 1980-х.
- Perl: динамическая типизация. (Сильный синтаксис). Интерпретированный. 1990-е (?).
Я мог бы продолжить.
- Уголок Nitpickers: Многие интерпретируемые языки токенизируются или «скомпилированы в байты» во время загрузки / чтения исходного кода. Это значительно упрощает последующую работу интерпретатора. Иногда вы можете сохранить скомпилированную версию кода. Иногда ты не можешь. Его все еще интерпретируют.
Обновление: потому что я не был достаточно ясен.
Набор текста может широко варьироваться.
Фиксированная статическая типизация во время компиляции распространена (например, C, Ada, C ++, Fortan и т. Д.). Это где вы объявляете вещь типа, и так всегда.
Также возможно иметь динамическую типизацию, когда вещь выбирает тип, который ей назначен. Например, PHP и некоторые ранние версии BASIC, а также APL, где вы назначали бы целое число переменной, и с тех пор это был целочисленный тип. Если позже вы присвоили ей строку, то это был тип строки. И так далее.
И затем есть свободная типизация, например PHP, где вы можете делать действительно странные вещи, такие как присвоение числового целого числа (в кавычках, то есть строки) переменной, а затем добавление к ней числа. (например, «5» + 5 приведет к 10). Это земля странного, но иногда очень и очень полезного.
ОДНАКО это функции, разработанные на языке. Реализация просто делает это возможным.