Программное обеспечение и языки программирования

1.

Программное обеспечение
и языки программирования

2.

Знакомство
Алиса Скрынько - Team Lead команды автоматизаторов в IT-компании FIX
Опыт
Дипломированный инженер-программист (Сибирский Государственный Университет Телекоммуникаций и
Информатики, СибГУТИ)
10 лет работы в IT
7 лет в сфере автоматизации тестирования
Карьера
Билайн (г. Новосибирск)
ЦФТ - Центр финансовых технологий (г. Новосибирск)
FIX (г. Казань)
Петер-сервис (г. Санкт-Петербург)
Акбарс Цифровые технологии (г. Казань)
Maxima (г. Казань)
FIX (г. Казань)

3.

Программное обеспечение
Программа - комбинация компьютерных инструкций и данных, позволяющая аппаратному обеспечению вычислительной
системы выполнять вычисления или функции управления (ISO/IEC/IEEE 24765:2010)
Программное обеспечение - программа или множество программ, используемых для управления компьютером (ISO/IEC
26514:2008 - Международная организация по стандартизации)
В английском языке для программного обеспечения выбрано очень удачное слово – software (буквально – «мягкое изделие»),
которое подчеркивает равнозначность программного обеспечения и самой машины («железки» - hardware) и вместе с тем
говорит о его гибкости, способности модифицироваться, приспосабливаться, развиваться.
Первая компьютерная программа была написана еще до появления слова «компьютер» . И автором ее была женщина — Ада
Лавлейс, дочь поэта Байрона. Программа была написана для разностной машины Чарльза Бэббиджа, однако поскольку эта
машина так и не была достроена, разработки леди Лавлейс остались чисто теоретическими

4.

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

5.

Часть кода чипа иммобилайзера у Subaru Impreza

6.

Языки программирования
ЯП - формальная знаковая система, предназначенная для записи программ, задающих алгоритм в форме, понятной для
исполнителя (например, компьютера).
Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при
составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет
реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над
этими данными при различных обстоятельствах.
Не бывает плохих или хороших языков программирования! Нельзя говорить, что Java хороший язык, потому что “его все
используют”, а С - плохой, потому что очень сложный и т.д.. Каждый ЯП по-своему хорош для каких-то определенных целей.
Нужно понимать ДЛЯ КАКИХ ЦЕЛЕЙ он вам нужен
Для этого рассмотрим несколько классификаций языков программирования

7.

Языки программирования высокого и низкого уровней
ЯП
Высокоуровневые
[high-level languages]
Абстракция
Низкоуровневые
[low-level languages ]
Дружественный к программисту язык,
который обеспечивает высокий уровень
абстракции от оборудования
Язык, дружественный к компьютеру и не
обеспечивающий абстракции от
оборудования или без него.
python:
print("This line will be printed.")
машинный код: «10110000 01100001»
язык ассемблера может упростить это
как «MOV AL, 61h».
Машинный код

8.

Языки программирования низкого уровня
Примером языка низкого уровня является ассемблер.
Языки низкого уровня ориентированы на конкретный тип процессора и учитывают его особенности, поэтому для переноса
программы на ассемблере на другую аппаратную платформу ее нужно почти полностью переписать. Определенные различия
имеются и в синтаксисе программ под разные компиляторы. Правда, центральные процессоры для компьютеров фирм AMD и
Intel практически совместимы и отличаются лишь некоторыми специфическими командами. А вот специализированные
процессоры для других устройств, например, видеокарт, телефонов содержат существенные различия.
+
-
-
С помощью языков низкого уровня создаются эффективные и компактные программы, поскольку разработчик получает
доступ ко всем возможностям процессора.
Программист, работающий с языками низкого уровня, должен быть высокой квалификации, хорошо понимать
устройство микропроцессорной системы, для которой создается программа. Так, если программа создается для
компьютера, нужно знать устройство компьютера и, особенно, устройство и особенности работы его процессора.
Результирующая программа не может быть перенесена на компьютер или устройство с другим типом процессора.
Значительное время разработки больших и сложных программ
Языки низкого уровня, как правило, используют для написания небольших системных программ, драйверов устройств,
модулей стыков с нестандартным оборудованием, программирование специализированных микропроцессоров, когда
важнейшими требованиями являются компактность, быстродействие и возможность прямого доступа к аппаратным
ресурсам.

9.

Языки программирования высокого уровня
Можно сказать более понятны человеку, чем компьютеру. Особенности конкретных компьютерных архитектур в
них не учитываются, поэтому созданные программы легко переносятся с компьютера на компьютер. В основном
достаточно просто перекомпилировать программу под определенную компьютерную архитектурную и
операционную систему. Разрабатывать программы на таких языках гораздо проще и ошибок допускается
меньше. Значительно сокращается время разработки программы, что особенно важно при работе над большими
программными проектами.
К языкам программирования высокого уровня относятся:
Примеры: C++, C#, Delphi, Fortran, Java, JavaScript, Лисп, Паскаль, PHP
также Ruby, Python, Perl, которые иногда называют сверхвысокоуровневыми.
Недостатком языков высокого уровня является больший размер программ по сравнению с программами на
языке низкого уровня. Поэтому в основном языки высокого уровня используются для разработок программного
обеспечения компьютеров и устройств, которые имеют большой объем памяти. А разные подвиды ассемблера
применяются для программирования других устройств, где критичным является размер программы.

10.

Java
(NASM синтаксис, с использованием Windows API и
kernel32.lib)
global _main
extern
extern
extern
_GetStdHandle@4
_WriteFile@20
_ExitProcess@4
section .text
_main:
; DWORD
mov
sub
ebp, esp
esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push
-11
call
_GetStdHandle@4
mov
ebx, eax
public static void main(String[] args) {
System.out.println("Hello World!");
}
bytes;
; WriteFile( hstdOut, message,
length(message), &bytes, 0);
push
0
lea
eax, [ebp-4]
push
eax
push
(message_end - message)
push
message
push
ebx
call
_WriteFile@20
; ExitProcess(0)
push
0
call
_ExitProcess@4
; never here
hlt
message:
db
message_end:
'Hello, World', 10

11.

Компилируемые и интерпретируемые языки программирования
Для преобразования кода, написанного на каком-либо языке программирования, в двоичный код были созданы
специальные программы - трансляторы.
Компилятор переводит программу с языка высокого уровня на низкоуровневый язык, создавая при этом
отдельную программу.
Интерпретатор переводит на машинный язык прямо во время исполнения программы.

12.

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

13.

Интерпретируемый язык программирования
Язык программирования, исходный код на котором выполняется методом интерпретации. Классифицируя языки
программирования по способу исполнения к группе интерпретируемых относят языки, в которых операторы
программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются) с помощью специальной
программы-интерпретатора (что противопоставляется компилируемым языкам, в которых все операторы программы
заранее оттранслированы в объектный код)
+
+
Скорость разработки программы
Переносимость на разные платформы
- Скорость выполнения программ
- Легче совершить ошибку

14.

Байт-код языки
Байткод-языки — это такие языки, которые используют для исполнения кода как компиляцию, так и интерпретацию.
Java и фреймворк .NET — это типичные примеры байткод-языков. На самом деле, Java Virtual Machine (JVM) — это
настолько популярная виртуальная машина для интерпретации байткода, что на ней работают реализации нескольких
языков.
В байткод-языке сперва происходит компиляция программы из человекочитаемого языка в байткод. Байткод — это
набор инструкций, созданный для эффективного исполнения интерпретатором и состоящий из компактных числовых
кодов, констант и ссылок на память. С этого момента байткод передаётся в виртуальную машину, которая затем
интерпретирует код также, как и обычный интерпретатор.
При компиляции кода в байткод происходит задержка, но дальнейшая скорость исполнения значительно возрастает в
силу оптимизации байткода. Кроме того, байткод-языки являются платформо-независимыми, превосходя при этом по
скорости интерпретируемые.

15.

Статические и динамические языки
Язык обладает статической типизацией, если тип переменной известен во время компиляции, а не выполнения. Типичными
примерами таких языков являются Ada, C, C++, C#, JADE, Java, Fortran, Haskell, ML, Pascal, и Scala.
такой код вызовет ошибку во время компиляции:
public void foo() {
int x = 5;
boolean b = x;
}
Динамическая проверка типов — это процесс подтверждения типобезопасности программы во время её выполнения. Типичными
примерами динамически типизированных языков являются Groovy, JavaScript, Lisp, Lua, Objective-C, PHP, Prolog, Python, Ruby,
Smalltalk и Tcl.
такой код вызовет ошибку во время исполнения:
такой код не вызовет ошибку вообще:
def erroneous():
s = 'cat' - 1
def erroneous():
s = 'cat' - 1
erroneous()
print('hi!')
print('hi!')
English     Русский Правила