Я собираюсь запустить LFS-дистрибутив Linux только для хобби. Я планирую выполнять некоторые нестандартные задачи, и большая часть из них будет включать в себя изменение почти всех сценариев в дистрибутиве. (в основном, сценарии инициализации, но также я буду писать простой набор сценариев диспетчера пакетов.) Поскольку я собираюсь идти так далеко от нормы, и так как я никогда не был поклонником динамически типизированных языков (perl, python, bash и остальное хороши, но только не моя сильная сторона), мне было интересно, знает ли кто-нибудь о интерпретируемом языке, который на самом деле объявил переменные.Кто-нибудь знает какие-либо статично типизированные языки сценариев?
ответ
Посмотрите в команде "Typeset" в вашей любимой оболочке. bash и ksh93 оба могут применять целые числа и строки, использовать ссылки (переменные переменные) и т. д. С помощью ksh93 вы также можете выполнять математику с плавающей запятой и использовать объекты с атрибутами. Статическая типизация на самом деле не покупает вам ничего полезного в сценариях инициализации и тому подобное. Вы в первую очередь будете читать файлы и запускать системные команды - это то, на что действительно хороша оболочка. Потратьте некоторое время на то, чтобы О'Рейли «изучил книгу« Корн Шелл », прежде чем решить, что все эти другие Unixes тупо спроектированы ...;)
и «set -o nounset» в начале скрипта ... – dannysauer
Это ужасное предложение. Если OP не поддерживает динамические языки, он собирается * ненавидеть * shell-скрипты. Они намного более динамичны, чем любой другой язык сценариев. –
В этом ответе содержится предложение о применении типов в языке, который OP уже знаком с сценариями инициализации, возможно, уже написанными. Наверное, я получил бы больше голосов, если бы только сказал «это невозможно» или «здесь, используйте этот язык, о котором слышали три человека», :) – dannysauer
Обычно статически типизированные языки являются скомпилированными языками. Я предполагаю, что причина в том, что статический анализ типов довольно дорогой, и вы должны иметь подробный анализ всего кода, который вы обрабатываете. После того, как вы это сделали, кажется, что тратить время на то, чтобы не писать всю эту информацию в файл, так что вам не придется делать это снова в следующий раз. Таким образом, вы быстро получаете скомпилированный язык.
С другой стороны, превратить скомпилированный язык в «не скомпилированный» вариант довольно прост. Вы просто не сохраняете результаты компиляции в любом месте, но выполняете их напрямую. Один компилятор, который я знаю, предоставляет такую оболочку GHC, стандартный Haskell компилятор. Вы можете добавить #!/usr/bin/runhaskell
в исходные файлы, а затем выполнить их непосредственно. И так как вы планируете быть далеко от нормы, Haskell кажется идеальной подгонкой;). Но ожидайте некоторого довольно большого времени запуска для ваших скриптов, потому что весь анализ времени и времени компиляции не является бесплатным.
Haskell не предназначен для сценариев оболочки, и это функциональный язык, поэтому, если вы его никогда не видели, может потребоваться некоторое время, чтобы привыкнуть. Но у него очень мало синтаксических издержек, а сила функциональных языков - это абстракция, поэтому я не понимаю, почему вы не можете создать библиотеку, которая делает забавную работу оболочки. Есть даже некоторые experimental Haskell shell, но, похоже, это скорее доказательство концепции, чем реальное решение.
В целом я бы сказал, что накладные расходы на весь анализ типов значительны, но я бы предложил вам выбрать свой любимый статически типизированный скомпилированный язык и искать оболочку, например runhaskell
, для выполнения написанных на ней сценариев.
Нет такой вещи, как * скомпилированный язык *. Каждый язык может быть реализован либо компилятором, либо интерпретатором. И, на самом деле, подавляющее большинство языков программирования имеют по крайней мере одну реализацию каждого из них. Кроме того, в большинстве современных реализаций языка есть * оба * компилятор * и * интерпретатор. Поскольку вы упоминаете Haskell: Hugs - интерпретатор Haskell. V8 является компилятором JavaScript. Microsoft PowerShell является компилятором. Пару лет назад разработчики Bash думали о переходе на скомпилированную реализацию. HotSpot JVM является как интерпретатором, так и компилятором –
быстрый google. F3, JavaFX Script, Linden Scripting Language (сценарии для второй жизни), в отличии от комментариев по первому ответу F # может быть использован в качестве языка сценариев http://blogs.msdn.com/chrsmith/archive/2008/09/12/scripting-in-f.aspx
Felix, Tuga, CFGScript, талька, AngelScript, и угадывает больше чем этот быстрый поиск.
Douglas
Groovy. По умолчанию он динамический, утиный. Но также поддерживает статическую типизацию.
Python строго типизирован. Не динамический. Вы не можете добавлять число и строку без явного преобразования. – George
@gdivos: Python строго типизирован * и * динамический.Он динамичен, потому что вы можете попытаться вызвать любую функцию с любыми аргументами типа, а тип несоответствующих параметров не будет обнаружен до времени выполнения. Статический язык обнаружил бы эту проблему во время компиляции (или, по крайней мере, до времени выполнения). –
Нет такой вещи, как интерпретируемый язык. Каждый язык может быть реализован либо компилятором, либо интерпретатором. И, на самом деле, подавляющее большинство языков программирования имеют по крайней мере одну реализацию каждого из них. Кроме того, в большинстве современных языковых реализаций есть как компилятор, так и интерпретатор. Поскольку вы упоминаете Haskell: Hugs - интерпретатор Haskell. V8 является компилятором JavaScript. Microsoft PowerShell является компилятором. Пару лет назад разработчики Bash думали о переходе на скомпилированную реализацию. HotSpot JVM - это как интерпретатор, так и компилятор. –