38
Скриптовые языки. Часть1 Студент гр. 4057/2 Лев Панов 26.10.2012 Доклад на семинаре по специальности Санкт-Петербургский Государственный Политехнический Университет Спиртовые напитки

Scripting languages

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Scripting languages

Скриптовые языки. Часть1

Студент гр. 4057/2 Лев Панов

26.10.2012

Доклад на семинаре по специальности

Санкт-Петербургский Государственный Политехнический Университет

Спиртовые напитки

Page 2: Scripting languages

2

Содержание1. Определение скриптового языка2. Сравнение компилируемых и скриптовых языков3. Разновидности скриптов по области применения4. Обзор отдельных представителей скриптовых языков

1. Unix shell – встроенный язык командного интерпретатора2. AppleScript, PowerShell – управление ОС Mac OS X и Windows3. Perl – язык извлечения данных и составления отчётов4. Python – быстрая разработка и читаемость кода5. Ruby – «настоящий объектно-ориентированный язык»6. QML – быстрая разработка мобильных приложений

5. Заключение: в чем секрет популярности скриптовых языков

Скриптовые языки. Часть1

Page 3: Scripting languages

Скриптовые языки. Часть1 3

Скриптовый язык - «высокоуровневый язык программирования для написания сценариев» (Wikipedia)

Скрипт (от англ. script – сценарий) — запись последовательности действий — программа или часть программы,

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

«A script is what you give the actors. A program is what you give the audience.» (Larry Wall)

Определение скриптового языка

Page 4: Scripting languages

Скриптовые языки. Часть1 4

Что можно считать скриптовым языком?

Для скриптового языка типично:

1. Быть интерпретируемым (возможно, с помощью байткода)

2. Высокоуровневые типы данных (списки, ассоциативные массивы и т.д.)

3. Сборщик мусора

4. Среда выполнения может быть интегрирована со скриптовой программой

5. Можно использовать модули, написанные на более низкоуровневых языках

Page 5: Scripting languages

Скриптовые языки. Часть1 5

Сравнение компилируемых и скриптовых языков

Компилируемый код• Единожды компилируется в

машинный код, а потом много раз запускается

• Оптимизация специфичных участков кода (циклов, условий) ; под конкретную архитектуру CPU

• Ошибки на этапе компиляции

• Для многоплатформенности есть множество фреймворков

Скрипт• [Транслируется в байт-код и]

выполняется интерпретатором

• Циклы и вызовы процедур не оптимизируются [не всегда так]

• Исполняется даже если есть ошибки

• Многоплатформенность есть и так

Page 6: Scripting languages

Скриптовые языки. Часть1 6

Разновидности скриптов(по области применения)

Командный скрипт -“клей”

• Склеивающая прослойка для программных компонентов• Автоматизация мелких прикладных задач• Системное администрирование

Встраиваемые и встроенные

• Расширение функциональности отдельных приложений• Игры: управление персонажами и игровой логикой• Написание плагинов• Макросы диалоговых программ• Дизайн пользовательского интерфейса

Самостоятельные• Полностью скриптовое приложение• Обработка текста• Прикладные программы и игры

Web Scripting

Lev Panov
В качестве такого примера можно взять использование процедур map() & reduce(), написанных на bash для Hadoop - на слайде про bash
Lev Panov
Считаю, что Web-скрипты являются чем-то промежуточным между интегрируемыми и самостоятельными. К первой категории их смело можно отнести исходя из того факта, что исполняются они всегда внутри специальной программы - web браузера, ко второй - потому, что на JavaScript можно написать полноценное приложение, например графический редактор или 3d игру (WebGL).
Lev Panov
Вообще думаю рассказать про JavaScript тоже, т.к. его очень удобно и просто можно синтегрировать в своё приложение, и тому есть множество примеров - тот же Qt Quick (QML) основан на JavaScript'е, и там можно вызывать методы одного из другого в обе стороны.
Page 7: Scripting languages

Скриптовые языки. Часть1 7

Обзор отдельных представителей скриптовых языков

Page 8: Scripting languages

Скриптовые языки. Часть1 8

Unix shell• Командная оболочка, доступная в абсолютно любой UNIX-

совместимой системе• Язык для автоматизации простых массовых задач• Команды — сторонние программы• Перенаправление ввода/вывода команд — построение цепочек обработки данных• Конструкции языка — простейшие условные и циклические операторы• Чистая интерпретация всегда• Переменные окружения

Shebang – начальные два символа начальной строчки скрипта, остаток строчки составляет директиву интерпретатора

Page 9: Scripting languages

Скриптовые языки. Часть1 9

Unix shell. История• 1971 Ken Thompson: Thompson shell, sh — простой интерпретатор

без возможностей программирования• 1977 Stephen Bourne: Bourne Shell, sh — скриптовый язык с

возможностью работы в качестве командного интерпретатора• 1978 Bill Joy: C Shell, csh — командный интерпретатор и скриптовый язык

с синтаксисом похожим на C• 1980 David Korn: Korn Shell, ksh — объединение лучших сторон C Shell и

Bourne Shell, с синтаксисом второго• 1989 Brian Fox: Bourne-again shell, bash — свободная,

модернизированная вариация Bourne Shell• 1990 Paul Falstad: Z Shell, zsh — расширенный Bourne Shell с некоторыми

возможностями из bash, ksh и csh

Page 10: Scripting languages

Скриптовые языки. Часть1 10

Unix shell. Примеры кода

#!/bin/bash num = 0for img in ‘find - name ’*. jpg ’ | sort ‘; do

num = ‘expr $num + 1‘if convert $ {img} ‘printf "page-%02d.png" $num‘; then

rm img else

echo 'error: failed to convert "$img"' >&2 exit 1 fi doneecho all conversions successfulexit 0

Конвертация всех jpg в png с перенумерацией

Page 11: Scripting languages

Скриптовые языки. Часть1 11

#!/bin/bashpids=""signal="" find_pid() {

while test $# -gt 0; doname=$1shift;ps -A -o pid,comm | grep -F " ${name}" | awk '{print $1;}'

done} while test $# -gt 0; do

arg=$1shift;case ${arg} in--) pids="${pids} $(find_pid "$@")"; break;;-*) signal="${arg}";;*) pids="${pids} $(find_pid "$arg")";;esac

done

echo kill ${signal} ${pids}

Послать заданный сигнал каждому процессу из списка

$ killall.sh vlc python firefox -KILL -- -login | bash

Page 12: Scripting languages

Скриптовые языки. Часть1 12

# Проверить все хосты на уязвимостиfor host in $ { hosts }; do

echo " >>> $ { host } " ;ssh $ { host } glsa - check -t all ;

done & > security_check . log# Убить все процессы пользователя mikekill -9 ‘ ps aux | grep " ^ $mike " ‘# Рекурсивно распаковать rar архивы в сожержащий их каталогfind . -name '*.rar' -execdir unrar e {} \;# Вывести количество файлов в поддиректориях до уровня вложенности 5find -maxdepth 5 -type d | while read -r dir; do

printf "%s:\t" "$dir";find "$dir" | wc -l;

done# Очистить системный кэш от файлов старее неделиfind /var/cache -not -mtime -7 | xargs rm# Забыли выполнять последнюю команду с правами root’аsudo !!# BC-встроенный язык для численных расчетовresult=$(echo "scale=2; 5 * 7 / 3;" | bc) #11.66result=$((5 * 7 /3)) #11echo 'scale=1000; 4*a(1)' | bc –l #π до 1000 знака

Повседневные полезности

Page 13: Scripting languages

Скриптовые языки. Часть1 13

Unix shell. Критика

Обширные возможности при крайней простоте и малом размереНаличие на любой POSIX-совместимой системе

Интерактивная отладка $ bash -x script-nameНизкая скорость работы; каждая команда - новый процессПлохая переносимость и масштабируемость«It is easier to port a shell than a shell script.» (Larry Wall)

Оружие разрушения rm -rf */ rm -rf * /

echo "some line" >> file echo "some line" > file

Не подходит для больших и сложных задач; для обработки данных

>

Page 14: Scripting languages

Скриптовые языки. Часть1 14

PowerShell• Появился в: 2006• Разработчик: Microsoft Corporation

• Расширяемое средство автоматизации: командная оболочка + скриптовый язык• Построен на базе Microsoft .NET Framework и интегрирован с ним• Командлеты: специализированные классы .NET

• Можно комбинировать их в скриптах• Выполняют отдельные административные задачи

• Можно обращаться к обычным классам .NET, объектам Windows Management Instrumentation или COM

• Механизм встраивания• Приложения предоставляют свои командлеты

• Графический интерфейс управления поверх PowerShell

Page 15: Scripting languages

Скриптовые языки. Часть1 15

PowerShell. Примеры кода# Убить процессы, начинающиеся на ‘p’Get-Process p* | Stop-Process ps p* | kill# Убить процессы, использующие слишком много памятиGet-Process | Where-Object WS -gt 1000MB | Stop-Process# Посчитать число байтов в файлах текущего каталогаGet-Childitem | Measure-Object -Property Length –Sum# Скачать RSS-канал и показать заголовки восьми последних записей$rssUrl = 'http://blogs.msdn.com/powershell/rss.aspx‘$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl) $blog.rss.channel.item | select title -first 8# Вызвать статический метод .NET объекта[System.Math]::Sqrt(16) #4# Исполнить внешнюю команду с параметрами[Array]$arguments = '-h', '15', 'www.Wikipedia.com‘tracert $arguments# Получить серийный номер удаленного компьютера из WMIGet-WmiObject -ComputerName MyServer -Class Win32_BIOS | Select-Object SerialNumber gwmi -co MyServer Win32_BIOS | select SerialNumber # Командлет с помощьюGet-Help

Page 16: Scripting languages

Скриптовые языки. Часть1 16

AppleScriptПоявился в: 1993Разработчик: Apple Inc.Классы языка: объектно-ориентированный,

натуральныйТипизация данных: динамическая, слабая

• Является компонентой Mac OS начиная с System 7• Интегрируется в Cocoa приложения• Можно посылать команды объектам во многих приложениях, включая

непосредственно Mac OS X• Script Editor – стандартное средство разработки• Поддержка Unicode с AppleScript 2.0 [Mac OS X Leopard]

Page 17: Scripting languages

Скриптовые языки. Часть1 17

AppleScript. Примеры кодаsay "This is a spoken sentence." using "Zarvox" tell application "Finder"

empty the trashopen the startup disk

end tell tell application "Microsoft Word" to quit

tell application "QuarkXPress" tell document 1 tell page 2 tell text box 1 set word 5 to "Apple" end tell end tell end tellend tell

pixel 7 of row 3 of TIFF image "my bitmap"

Page 18: Scripting languages

Скриптовые языки. Часть1 18

set theLength to the length of "I am“ -- 4 set nonsensical to "fifteen" – 3 -- 12 set coercedToNumber to "15" as number -- 15set coercedToString to 12 as string – “12” set myList to {"a", "b", "c", "d", "e", "f", "g", "h"}set shortList to items 2 through 5 of myList -- {"b", "c", “d", "e"} set x to some item of {"hearts", "clubs", "spades", "diamonds"} set cardType to "hearts"set stringAsList to cardType as list -- {"hearts"} set itemized to every character of "Hi there." -- {"h","i"," ", ...}

Page 19: Scripting languages

Скриптовые языки. Часть1 19

try-- commands to be testedset x to 1 / 0say "You will never hear this!"

on error-- error handling commands display dialog "Some error occured"

end trysay "The error does not stop this sentence being spoken"

on circleArea(radius)set area to pi * (radius ^ 2)

end circleAreaset areaCalculated to circleArea(3)  on circleCalculations(radius)

set area to pi * (radius ^ 2)set circumference to 2 * pi * radiusreturn {area, circumference}set testVar to 3

end circleCalculationsset circleProperties to circleCalculations(10)

repeat 2 timessay “AppleScript rulz"

end repeat repeat -- commands to be repeatedend repeat set total to 0repeat with x in {1, 2, 3, 4, 5} set total to total + xend repeat

Page 20: Scripting languages

Скриптовые языки. Часть1 20

PerlПоявился в: 1987Автор: Ларри УоллКлассы языка: мультипарадигменный: императивный,

объектно-ориентированный,функциональный

Типизация данных: динамическая

Page 21: Scripting languages

Скриптовые языки. Часть1 21

Practical extraction and report language — “язык извлечения данных и составления отчётов”

Девизы Perl 5• Есть больше одного способа это сделать• Простые вещи должны оставаться простыми, а сложные — стать выполнимыми

Особенности• Встроенные в язык регулярные выражения• Множество специальных синтаксических “трюков”• Гибкость структур данных и парадигмы программирования

Типы данных в perl:

$foo; # скаляр или указатель

@foo; # массив

%foo; # хеш-таблица

&foo; # функция

FOO; # дескриптор ввода-вывода или константа

Page 22: Scripting languages

Скриптовые языки. Часть1 22

Perl. Примеры кода$x = 10; # число$y = $x + 1; # используем $x как число…$z = $x . 'string'; # … а теперь — как строку$ref = \$x; # $ref является указателем на $x$$ref = 10; # $x теперь содержит значение 10

@array = (1,2,3,4); # записали в массив @array четыре элементаprint $array[2]; # напечатать третий элементprint @array[2,3]; # напечатать третий и четвертый элемент.# Здесь используется @, так как результат операции среза массива тоже является массивом. %hash = ( cat => 'kitten', # здесь => - это так называемая "длинная запятая", в этом примере dog => 'puppy', # по функции полностью аналогичная обыкновенной "," за исключением cow => 'calf' # того, что литералы слева неявно заключаются в кавычки );print $hash{'cat'}; #Напечатает kittenprint join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calfprint join("-", %hash) ; # Напечатает cat-kitten-cow-calf-dog-puppy, так как в списковом контексте хэш автоматически разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются, пары каждый раз будут выводиться в произвольном порядке.

perl -e ' print "P1\n256 256\n", map {$_&($_>>8)?1:0} (0..0xffff)' | display

Page 23: Scripting languages

Скриптовые языки. Часть1 23

Perl. КритикаПлюсы• Простота, надежность и гибкость• CPAN (англ. Comprehensive Perl Archive Network —“всеобъемлющая сеть

архивов Perl») — решения большинства задач• 114,447 модулей• в 25,970 пакетах• 10,119 авторов

• Непревзойденная эффективность обработки текстовых данныхМинусы• Perl — один раз написал, через месяц ничего не понял и переписал• Высокий порог вхождения (подходит только для высококвалифицированных

программистов)

$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see

Page 24: Scripting languages

Скриптовые языки. Часть1 24

PythonПоявился в: 1990Автор: Гвидо ван РоссумКлассы языка: мультипарадигменный:

объектно-ориентированный,императивный,функциональный,аспектно-ориентированный

Типизация данных: строгая, динамическая (утиная)

Page 25: Scripting languages

Скриптовые языки. Часть1 25

Назван в честь комедийного телешоу 1970-х «Летающий цирк Монти Пайтона»Философия Python [import this]1. Красивое лучше, чем уродливое.

2. Читаемость имеет значение.

3. Особые случаи не настолько особые, чтобы нарушать правила.

4. Ошибки никогда не должны замалчиваться.

5. Встретив двусмысленность, отбрось искушение угадать.

6. Должен существовать один — и, желательно, только один — очевидный способ сделать это.

7. Хотя он поначалу может быть и не очевиден, если вы не голландец.

Особенности• Акцент на производительность разработчика и читаемость кода• Минималистичность ядра• Расширяемость стандартными библиотеками• Много разных интерпретаторов

Page 26: Scripting languages

Скриптовые языки. Часть1 26

Стиль кодирования жестко регламентирован

Python. Особенности языка

def distance(arg1, arg2):return abs(arg1 - arg2)

print distance(-2, 3))

def distance(arg1, arg2): return abs(arg1 - arg2) print distance(-2, 3)

File "python", line 2 return abs(arg1 - arg2) ^IndentationError: expected an indented block

5==> That's correct!

Page 27: Scripting languages

Скриптовые языки. Часть1 27

Типы данных• bool, int[C long], float[C double], long[точность не ограничена], complex• Стандартная библиотека: Fraction[дробь], decimal[float с заданной точностью]• Строка [неизменяема] str( 'Wikipedia‘ )

• Список list( [4.0, 'string', True] )

• Кортеж [неизменяем] tuple( (4.0, 'string', True) )

• Словарь dict( {'key1': 1.0, 3: False} )

• Множество[без дубликатов] set( [4.0, 'string', True] )

Дополнительно• Все значения являются объектами, в том числе функции, методы, модули• Можно описывать классы ИЛИ типы в модулях расширения [на C]• Система классов: одиночное и множественное наследование, метапрограммирование, полная

интроспекция• Объекты

• Атомарные: при присваивании копируется значение• Ссылочные: копируется указатель на объект

Python. Особенности языка

Page 28: Scripting languages

Скриптовые языки. Часть1 28

# Множественное (tuple) присваиваниеparents, babies = (1, 0)while babies < 100: print 'This generation has {0} babies'.format(babies) parents, babies = (babies, parents + babies)

# Работа с регулярными выражениямиimport refor test_string in ['555-1212', 'ILL-EGAL']: if re.match(r'^\d{3}-\d{4}$', test_string): print test_string, 'is a valid US local phone number' else: print test_string, 'rejected‘

# Словари, выражения-генераторыprices = {'apple': 0.40, 'banana': 0.50}my_purchase = { 'apple': 1, 'banana': 6}grocery_bill = sum(prices[fruit] * my_purchase[fruit] for fruit in my_purchase)print 'I owe the grocer $%.2f' % grocery_bill

Page 29: Scripting languages

Скриптовые языки. Часть1 29

RubyПоявился в: 1995Автор: Юкихиро МацумотоКлассы языка: мультипарадигменный:

объектно-ориентированный,императивный,функциональный

Типизация данных: строгая, динамическая (утиная)

Page 30: Scripting languages

Скриптовые языки. Часть1 30

Мотивация: • Perl — устаревший язык с гибкой парадигмой• Python — недостаточно ООП

“Python мне не нравился потому, что я не считал его настоящим объектно-ориентированным языком. Его OO свойства казались надстройкой над языком” (Юкихиро Мацумото)

Особенности• Стабильность возможностей• Минимизация работы программиста• Полностью ОО• объект = данные• метод = функция

• Переменная = ссылка на объект

Page 31: Scripting languages

Скриптовые языки. Часть1 31

Ruby. Пример кодаclass HexNum < Numeric

# Create a new instance from an int or String. def initialize(val) case val when String @i = parse_string(val) @s = val.frozen? ? val : val.dup.freeze when Numeric @i = val.to_i else raise ArgumentError, 'Cannot convert %p' % val end end end

a = HexNum.new(0xFFFF)

==> #<Context::HexNum:0x000000014e8328 @i=65535>

Page 32: Scripting languages

Скриптовые языки. Часть1 32

Плюсы• Гибкость структур• Поддержка множества современных технологий• Встроенная поддержка YAML [формат сериализации данных]• Perl-подобная обработка данных• RubyGems — поиск и проверка нужных расширенийМинусы• Идеология ООП превыше здравого разума• Плохая совместимость между версиями пакетов• Высокие требования к ресурсамОбласти применения• Массовое системное администрирование: системы Puppet, Chef• Web: Ruby On Rails

Ruby. Критика

Page 33: Scripting languages

Скриптовые языки. Часть1 33

Perl• Гибкость структур и многообразие возведенные в основу• Синтаксис изобилующий специализированными “трюками”Python• Читаемость кода, высокая скорость прототипирования• Потеря гибкости ради единообразия подходов• Стабильность при активном развитии• “Встроенные” системы документирования и тестирования• Простой механизм интеграции не-скриптовых частейRuby• Минимум специального синтаксиса• Гибкость структур данных и подходов• Жесткость структуры ООП

Page 34: Scripting languages

Скриптовые языки. Часть1 34

Текущее состояние

Perl Язык обработки данных и сложного администрирования

Python Язык внутренней логики и язык самостоятельных приложений

Ruby Язык массового администрирования и Web-приложений

Прогноз

Perl Останется популярным среди “хакеров”

Python Дальнейшая экспансия в внутреннюю логику и приложения

Ruby Развитие в текущих областях применения

Будущее языков “большой тройки”

Page 35: Scripting languages

Скриптовые языки. Часть1 35

QMLПоявился в: 2009Разработчик: NokiaКлассы языка: декларативныйТипизация данных: динамическая, строгая

• Основан на JavaScript• Часть Qt Quick - высокоуровневой технологии для создания приложений• Мобильные приложения, работающие и на настольных компьютерах• Идея Look & Feel

• Интеграция с C++ кодом на Qt• Вызов JavaScript функций• WYSIWYG редактор

• Нет необходимости быть опытным разработчиком

Page 36: Scripting languages

Скриптовые языки. Часть1 36

Популярность скриптовых языков

Индекс популярности языков TIOBE Programming Community за октябрь 2012

Page 37: Scripting languages

Скриптовые языки. Часть1 37

Простота разработки• Высокая скорость “компиляции”• Высокоуровневость• Эффективность отладки

Удобство использования• Расширяемость и гибкость• Возможность интеграции скрипта разными языками• Возможность интеграции разных языков в скрипты

Заключение: в чем секрет популярности СЯ

Page 38: Scripting languages

Скриптовые языки. Часть1 39

Использованные источники

1. Alexander Kanavin An overview of scripting languages, 2002 ww.sensi.org/~ak/impit/studies/report.pdf

2. http://www.applescript.ru3. http://www.perl.org4. http://python.org5. http://www.python.ru/files/book-ods.pdf6. http://diveinto.python.ru7. http://www.ruby-lang.org