Современный язык программирования высокого уровня: примеры и сравнения. Краткий обзор известных языков программирования Расширения языков программирования

Для решения вычислительных задач сейчас все активнее используются графические процессоры, но до сих пор открыт вопрос: как писать эффективные программы под соответствующие конфигурации?

15.06.2011 Андрей Адинец

Для решения вычислительных задач сейчас все активнее используются графические процессоры, но до сих пор открыт вопрос: как писать эффективные программы под соответствующие конфигурации? Стандартное решение - связка CUDA или OpenCL - позволяет сравнительно быстро реализовать алгоритм, однако создать оптимизированную под конкретную конфигурацию версию с их помощью сложно. Требуются инструменты для программирования графических процессоров более высокого уровня, которые могут быть созданы, например, при помощи расширяемых языков.

Еще три года назад графические процессорные устройства (Graphical Processing Unit, GPU) рассматривались лишь как видеокарты для ПК, то сейчас отношение к ним изменилось - появились специальные серверные модели GPU, ориентированные на решение вычислительных задач, увеличилась производительность на вычислениях с двойной точностью, возникли системы рекордной производительности, занимающие высшие строки в Top500 . А как писать эффективные программы под такие машины? Стандартный ответ - связка CUDA или OpenCL для программирования GPU и MPI на уровне кластера. Эти инструменты доступны, активно поддерживаются производителями оборудования, под них уже написано много программ, однако есть и недостатки.

CUDA и OpenCL - расширения языка Си, они не сложны для изучения, хотя и являются достаточно низкуровневыми инструментами. С их помощью можно сравнительно быстро реализовать алгоритм для GPU, однако создать оптимизированную под конкретное приложение и конфигурацию версию оказывается значительно сложнее. Все оптимизации потребуется выполнять вручную, что приведет к увеличению размера кода и ухудшению его читаемости. И хотя программы, созданные при помощи OpenCL, будут переносимыми между широким спектром архитектур, производительность при таком переносе не сохранится. Требуются инструменты для программирования GPU более высокого уровня.

Создавать такие инструменты можно разными путями: вводить новый язык программирования; добавлять директивы в уже существующий язык, как делается в модели PGI Accelerator или CAPS HMPP; воспользоваться расширяемыми языками. Расширяемые языки - языки программирования, синтаксис и семантика которых не фиксированы, а могут быть изменены в зависимости от потребностей программиста. По сравнению с традиционными, расширяемые языки обладают рядом преимуществ: в них проще добавлять новые возможности; они открыты; изучение новых моделей программирования на основе таких языков проще, поскольку требуется изучить лишь сравнительно небольшие по объему расширения; с помощью таких языков легче выполнять тонкую настройку и оптимизацию программ.

Расширяемые языки

Для того чтобы язык был расширяемым, необходимо чтобы в нем присутствовали:

  • механизм расширения без изменения компилятора, одинаково поддерживаемый всеми компиляторами, что означает, в частности, наличие стандартного интерфейса взаимодействия с компиляторами;
  • конструкции для расширения и манипуляции с деревом кода, такие как макросы или квазицитирование, для расширения языка;
  • мощные средства написания расширений, например сам расширяемый язык, так и другой язык, мощность которого предполагает, что код расширения может делать то же самое, что и любая программа на этом языке.

Оказывается, что языков, удовлетворяющих этим требованиям, сравнительно немного: Lisp, Nemerle , Seed7, xoc и Stratego. При этом xoc, который предназначен для расширения языка Си, использует отдельный язык Zeta для написания расширений, а Stratego - это язык предметной области для создания преобразователей исходного кода. Nemerle - расширяемый язык, использующий среду. Net.

Все расширяемые языки поддерживают механизмы для работы с деревом программ, и прежде всего это конструкция квазицитирования - спецификации объекта, представляющего дерево программы, при помощи самого исходного кода.

В языке Nemerle для этого используется конструкция, например создает дерево, состоящее из объявления переменной i с начальным значением 0. Квазицитирование похоже на создание строковых объектов при строковых константах. На рис. 1 приведен пример квазицитирования. Конструкция интерполяции позволяет подставлять значения переменных в фиксированный шаблон внутри квазицитирования. В Nemerle для этого используются конструкции $(...), если требуется подставить список, например. Также в расширяемых языках присутствуют конструкции разбора дерева программы. В языке Nemerle для этого используется оператор match(...) { ... }, аналог switch из языка Си, в качестве веток которого используются конструкции квазицитирования. При этом интерполяция трактуется как объявление новых переменных, которые в случае успешного сопоставления получают значения соответствующих поддеревьев. Например, для оператора сопоставления match(e) {| => ... }, если e содержит дерево, в переменную a попадет, а в переменную b .

Средства для работы с деревом программы используются в конструкциях расширения языка. В языке Nemerle таковыми являются макросы - специальные функции, выполняемые на этапе компиляции и возвращающие фрагмент дерева программы, который подставляется на место их вызова. При этом макрос принимает фрагменты программы в качестве параметров, и может их преобразовывать. В принципе, вызывать макрос можно точно так же, как и обычную функцию; но более интересной возможностью является привязка вызова макроса к специальному синтаксису. Это позволяет вводить в язык Nemerle новые синтаксические конструкции и таким образом расширять язык.

На рис. 2 приведен пример макроса с синтаксическим расширением, позволяющий объявить многомерный цикл с переменными и количеством итераций по каждому измерению, а на рис. 3 дан пример преобразования программы, которое осуществляет этот макрос. Заметим, что макрос, осуществляющий такое расширение, занимает менее 30 строк исходного кода и при этом включает несколько проверок на ошибки. При традиционном подходе реализация такого расширения потребовала бы значительно большего количества кода и, кроме того, потребовала бы изучения внутреннего устройства компилятора.

Исторически первым появился механизм макросов в Лиспе, программа в котором представляется как обычный список и не требует специальных конструкций для работы с деревом программы, поэтому именно в этом языке расширяемое программирование получило наибольшее распространение. Макросы в Nemerle аналогичны таковым в Лиспе. В системе xoc механизм расширений реализован через расширения грамматики и атрибуты дерева разбора. Любое расширение обязательно задает два атрибута: тип синтаксической конструкции и выражение на базовом языке, в которое она преобразуется.

Для расширяемых языков характерна реализация через макросы многих стандартных конструкций. В языке Nemerle все циклы и условные операторы, кроме match, реализованы через макросы, а в Лиспе макросами являются стандартные конструкции циклов и объявления функций.

Как использовать языки?

Для расширяемого языка программирования можно написать конструкции, позволяющие наиболее удобным способом программировать графические процессоры, что и было сделано в рамках проекта NUDA (Nemerle Unified Device Architecture), целью которого является создание расширений языка Nemerle для программирования GPU. В качестве интерфейса взаимодействия с GPU и целевого языка для представления программы используется OpenCL.

Для начала надо реализовать исполнение на GPU подмножества кода на языке Nemerle. При этом должны поддерживаться привычные операторы языка, такие как циклы и ветвления, а также работа с простыми типами данных, структурами и массивами. Код для GPU выносится в отдельные функции, или в ядра NUDA. Каждое ядро отмечается макросом nukernel, который по коду ядра генерирует код на OpenCL и метод-заглушку для вызова ядра на стороне хоста. Перед генерацией кода производится раскрытие всех макросов, за исключением макросов циклов и ветвления. Если внутри ядра требуется вызвать функцию, эта функция должна быть помечена макросом nucode, который сгенерирует для этой функции код на языке OpenCL. Вызов ядра осуществляется при помощи макроса nucall; помимо параметров ядра, ему передается еще и конфигурация решетки потоков, с которой оно запускается.

Чаще всего в качестве ядра для GPU используется тело цикла, поэтому хотелось бы сразу переносить цикл на GPU. В Nemerle это можно реализовать - соответствующий макрос в NUDA называется nuwork. В качестве обязательных параметров он принимает размер блока потоков и на основании текущего контекста и анализа кода тела цикла определяет набор переменных, которые необходимо передать ядру в качестве параметров. Тело ядра формируется из тела цикла, вычисления индексов цикла через глобальный номер потока, а также условия, позволяющего корректно исполнять цикл даже в том случае, когда глобальный размер сетки не делится на размер группы потоков. На место цикла подставляется вызов макроса nucall, осуществляющий вызов сгенерированного ядра.

В принципе можно разрешить использовать в GPU-программах обычные массивы языка Nemerle, но это приводит к высоким накладным расходам - массив требуется копировать в память GPU при каждом вызове ядра, а затем копировать обратно. Поэтому в программах для GPU используются специальные типы-массивы с ленивой синхронизацией между GPU и CPU. Это позволяет, с одной стороны, не загромождать текст программы командами копирования данных, а с другой - избежать накладных расходов на копирование данных. Для таких массивов, как и для обычных массивов в Nemerle, используется управление памятью при помощи сборки мусора. Для выделения памяти под такие массивы существует макрос nunew, который надо применить к обычному оператору выделения памяти.

На рис. 4 слева приведена обычная программа сложения массивов, а справа - аналогичная программа, но выполняющая вычисления на GPU. Получить GPU-программы из обычной достаточно просто - требуется лишь применить макросы к циклам и операциям выделения памяти, при этом объем кода практически не меняется. Программа, написанная с использованием NUDA, занимает менее 20 строк кода. Аналогичная программа, но на чистом языке Си и OpenCL занимает более 100 строк.

Помимо макросов, облегчающих работу с GPU, система расширений NUDA включает также аннотации для преобразования циклов. Аннотации, по сути, являются специальными макросами. Например, аннотация inline применяется к циклу с фиксированным числом итераций и выполняет его полную развертку. Аннотация dmine выполняет глубокую развертку цикла. “Глубокая развертка” означает, что создание нескольких копий тела цикла и перемешивание выполняются не только для самого преобразуемого цикла, но и для вложенных циклов, если они независимы.

Эффект

Для чего программисту нужно учить новый язык и осваивать новые библиотеки расширяемых языков? Основной ответ - продуктивность. Имея алгоритм из параллельных циклов, работающих с массивами и записанный на языке Nemerle, достаточно добавить несколько аннотаций, чтобы получить программу для GPU. При этом программа будет исполняться на любом устройстве с поддержкой OpenCL, включая графические процессоры nVidia и AMD, а также процессоры x86. Чтобы добиться того же с помощью только технологий OpenCL или CUDA, потребуется затратить значительно больше ресурсов, которые уйдут не только на написание исходного кода, но и на отладку взаимодействия между хостом и GPU.

Другая причина - производительность созданного кода. На CUDA или OpenCL преобразования циклов потребуется выполнять вручную, причем отдельно для каждой архитектуры. Это долгий и чреватый ошибками процесс, а полученный в результате код трудночитаем и неудобен для сопровождения. С NUDA эту работу можно делать при помощи аннотаций. Например для нескольких ядер можно оптимизироватьации операции свертки изображений или умножения матриц при помощи аннотаций inline и dmine. Без увеличения размера исходного кода удается добиться повышения производительности в два–пять раз. При этом, если бы те же самые преобразования выполнялись вручную, это привело бы к увеличению кода в разы, а иногда и на порядок, не говоря уже о затратах времени на отладку и подбор оптимальных параметров развертки. Например, универсальная аннотированная программа из семи строк в NUDA умножения транспонированной матрицы на матрицу с двойной точностью выполняется на nVidia Tesla C2050 лишь на 40% медленнее самой быстрой в настоящий момент реализации (CUBLAS 3.2). Аналогичная программа, написанная вручную, заняла бы 70 строк кода. Естественно, для стандартных задач можно один раз вручную написать код, чтобы повысить производительность, но для специфических задач снижение трудозатрат и повышение продуктивности будет очень кстати. Наконец, повышение продуктивности относится и к созданию самих расширений: создавать их при помощи расширяемых языков проще, чем с помощью традиционных инструментов. Вся система NUDA, несмотря на свою функциональность, занимает всего лишь 12 тыс. строк кода, не считая тестов. Это сравнительно немного, например, компилятор языка Nemerle (сборка 9025) занимает около 130 тыс. строк.

Расширяемый язык - это мощный инструмент, и его использование в параллельных вычислениях находится пока в самом начальном состоянии. В области разработки параллельных языков программирования имеется очень много интересных задач, и любую из них можно решить при помощи сочетания расширений и библиотек. Можно добавить в язык асинхронные блоки кода и параллельные циклы, можно создать удобные конструкции для программирования кластерных систем, такие как распределенные массивы. Наконец, можно при помощи расширений построить полноценный язык параллельного программирования, такой как Chapel или X10.

Андрей Адинец ([email protected]) - м.н.с. НИВЦ МГУ (Москва).



Кроме использования комментариев для получения параллельной программы, часто идут на расширение существующих языков программирования. Вводятся дополнительные операторы и новые элементы описания переменных, позво­ляющие пользователю явно задавать параллельную структуру программы и в некоторых случаях управлять исполнением параллельной программы. Так язык High Performance Fortran (HPF), помимо традиционных операторов Фортрана и системы спецкомментариев, содержит новый оператор FORALL, введенный для описания параллельных циклов программы. Наиболее интересной чертой HPF представляется многоуровневое отображение массив - массив-шаблон - вирту­альный процессорный массив - физические процессоры, позволяющее макси­мально гибко отображать пользовательские данные на реальный компьютер.

Другим примером служит язык mpC, разработанный в Институте системного программирования РАН как расширение ANSI С. Основное назначение mpC - создание эффективных параллельных программ для неоднородных вычисли­тельных систем. Пользователь может задать топологию сети, распределение данных и вычислений и необходимые пересылки данных. Посылка сообщений организована с использованием интерфейса MPI.

DVM-система предназначена для создания переносимых и эффективных вы­числительных приложений на языках C-DVM и Fortran-DVM для параллельных компьютеров с различной архитектурой. Аббревиатура DVM соответствует двум понятиям: Distributed Virtual Memory и Distributed Virtual Machine. Первое отражает наличие единого адресного пространства. Второе отражает использо­вание виртуальных машин для двухступенчатой схемы отображения данных и вычислений на реальную параллельную машину. Модель программирования предполагает задание DVM-указаний с помощью спецкомментариев, а значит, один вариант программы для последовательного и параллельного исполнения. Поддерживаются три группы директив: директивы распределения данных, ди­рективы распределения вычислений и спецификации удаленных данных. Ком­пилятор переводит программу на язык Фортран или Си, используя для органи­зации межпроцессорного взаимодействия одну из существующих технологий параллельного программирования (MPI, PVM, Router). В систему DVM также входят библиотека поддержки LIB-DVM, DVM-отладчик, предсказатель вы­полнения DVM-программ, анализатор производительности DVM-программ. Система разработана в Институте прикладной математики им. М.В.Келдыша РАН.



Специальные языки программирования

Если нужно точнее отразить либо специфику архитектуры параллельных сис­тем, либо свойства какого-то класса задач некоторой предметной области, то используют специальные языки параллельного программирования. Для про­граммирования транспьютерных систем был создан язык Occam, для програм­мирования потоковых машин был спроектирован язык однократного присваи­вания Sisal. Очень интересной и оригинальной разработкой является деклара­тивный язык НОРМА, созданный под руководством И.Б.Задыхайло в Институ­те прикладной математики им. М.В.Келдыша РАН для описания решения вы­числительных задач сеточными методами. Высокий уровень абстракции языка позволяет описывать задачи в нотации, близкой к исходной постановке про­блемы математиком, что условно авторы языка называют программированием без программиста. Язык с однократным присваиванием, не содержит традици­онных конструкций языков программирования, фиксирующих порядок вычис­ления и тем самым скрывающих естественный параллелизм алгоритма.

Библиотеки и интерфейсы, поддерживающие взаимодейст­вие параллельных процессов

С появлением массивно-параллельных компьютеров широкое распространение получили библиотеки и интерфейсы, поддерживающие взаимодействие па­раллельных процессов. Типичным представителем данного направления являет­ся интерфейс Message Passing Interface (MPI), реализация которого есть прак­тически на каждой параллельной платформе, начиная от векторно-конвейерных супер-ЭВМ до кластеров и сетей персональных компьютеров. Программист сам явно определяет какие параллельные процессы приложения в каком месте про­граммы и с какими процессами должны либо обмениваться данными, либо син­хронизировать свою работу. Обычно адресные пространства параллельных процессов различны. В частности, такой идеологии следуют MPI и PVM. В других технологиях, например Shmem, допускается использование как локаль­ных (private) переменных, так и общих (shared) переменных, доступных всем процессам приложения, и реализуется схема работы над общей памятью с по­мощью операций типа Put/Get.

Несколько особняком стоит система Linda, добавляющая в любой последова­тельный язык лишь четыре дополнительные функции in, out, read и eval, что и позволяет создавать параллельные программы. К сожалению, простота зало­женной идеи оборачивается большими проблемами в реализации, что делает данную красивую технологию скорее объектом академического интереса, чем практическим инструментом.

Параллельные предметные библиотеки

Часто на практике прикладные программисты вообще не используют никаких явных параллельных конструкций, обращаясь в критических по времени счета фрагментах к подпрограммам и функциям параллельных предметных библио­тек. Весь параллелизм и вся оптимизация спрятаны в вызовах, а пользователю остается лишь написать внешнюю часть своей программы и грамотно восполь­зоваться стандартными блоками. Примерами подобных библиотек являются Lapack, ScaLapack, Cray Scientific Library, HP Mathematical Library, PETSc и многие другие.

Некоторые параллельные предметные библиотеки

BLAS и LAPACK - библиотеки, реализующие базовые операции линейной алгебры, такие как перемножение матриц, умножение матрицы на вектор и т.д.

ScaLAPACK включает подмножество процедур LAPACK, перера­ботанных для использования на MPP-компьютерах, включая: реше­ние систем линейных уравнений, обращение матриц, ортогональ­ные преобразования, поиск собственных значений и др.

FFTW, DFFTPack - быстрое преобразование Фурье.

PETSc - набор процедур и структур данных для параллельного ре­шения научных задач с моделями, описываемыми в виде диффе­ренциальных уравнений с частными производными.

Специализированные пакеты и программные комплексы

И, наконец, последнее направление, о котором стоит сказать, это использование специализированныю пакетов и программныю комплексов. Как правило, в этом случае пользователю вообще не приходится программировать. Основная зада­ча - это правильно указать все необходимые входные данные и правильно воспользоваться функциональностью пакета. Так, многие химики для выполне­ния квантово-химических расчетов на параллельных компьютерах пользуются пакетом GAMESS, не задумываясь о том, каким образом реализована парал­лельная обработка данных в самом пакете.

Курсовая работа

на тему: “Языки программирования”


Введение

1. Языки программирования

1.1 История развития языков программирования

2. Обзор современных языков программирования

2.1 Си его разновидности

2.2 Паскаль

2.3 Фортран

2.4 Бейсик

Выводы и предложения

Список использованной литературы

Введение

На современном этапе развития компьютерных технологий невозможно представить какого–либо высококвалифицированного специалиста, не владеющего информационными технологиями. Поскольку деятельность любого субъекта в значительной степени зависит от степени владения информации, а также способности эффективно ее использовать. Для свободной ориентации в информационных потоках современный специалист любого профиля должен уметь получать, обрабатывать и использовать информацию, прежде всего, с помощью компьютеров, а также телекоммуникаций и других новейших средств связи, в том числе и уметь, обращаться с языками программирования.

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

Объектом исследования послужили языки программирования и история развития языков программирования.

Целью курсовой работы является изучение классификации языков программирования и их развития.

Цели исследования:

1. Просмотреть общее сведения и уровни языков программирования.

2. Просмотреть историю развития языков программирования.

3. Сделать обзор современных языков программирования.

Задачи исследования:

1. Ознакомления с языками программирования.

2. Рассмотрение истории развития языков программирования.

3. Обзор современных языков программирования.

В первой главе рассматриваются общие сведения о языках программирования и история развития их.

Во второй главе рассматривается обзор современных языков программирования.

В данной курсовой работе использовался научно-исследовательские методы.

Применяемые технические средства: ПЭВМ: Core 2 DuoE6600 2.4 ГГц 2 x 4 Мб L2; 2 x 1024 Мб DDR3-1333МГц; NVIDIAGeForce 8600 GT 512 Мб; HDDHitachiDeskstar 7K1000 1 Тб; Принтер: Canon LBP3010.

Программные средства ОС WindowsXPProfessionalSP3. Данная курсовая работа выполнена в программе MicrosoftWord 2003, а также были использованы другие программы: Microsoft PowerPoint, Nero StartSmart.

1. Языки программирования

Язык программирования - это система обозначений, служащая для точного описания программ или алгоритмов для ЭВМ. Языки программирования являются искусственными языками. От естественных языков они отличаются ограниченным числом “слов” и очень строгими правилами записи команд (операторов). Поэтому при применении их по назначению они не допускают свободного толкования выражений, характерного для естественного языка.

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

Основные требования, предъявляемые к языкам программирования:

наглядность - использование в языке по возможности уже существующих символов, хорошо известных и понятных как программистам, так и пользователям ЭВМ;

единство - использование одних и тех же символов для обозначения одних и тех же или родственных понятий в разных частях алгоритма. Количество этих символов должно быть по возможности минимальным;

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

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

однозначность - недвусмысленность записи любого алгоритма. Отсутствие ее могло бы привести к неправильным ответам при решении задач .

В настоящее время в мире существует несколько сотен реально используемых языков программирования. Для каждого есть своя область применения.

Любой алгоритм, есть последовательность предписаний, выполнив которые можно за конечное число шагов перейти от исходных данных к результату. В зависимости от степени детализации предписаний обычно определяется уровень языка программирования - чем меньше детализация, тем выше уровень языка.

По этому критерию можно выделить следующие уровни языков программирования:

· машинные;

· машинно-оpиентиpованные (ассемблеры);

· машинно-независимые (языки высокого уровня).

Машинные языки и машинно-ориентированные языки - это языки низкого уровня, требующие указания мелких деталей процесса обработки данных. Языки же высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Эти языки более удобны для человека.

Разные типы процессоров имеют разные наборы команд. Если язык программирования ориентирован на конкретный тип процессора и учитывает его особенности, то он называется языком программирования низкого уровня. В данном случае “низкий уровень” не значит “плохой”. Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора.

При программировании на машинном языке программист может держать под своим контролем каждую команду и каждую ячейку памяти, использовать все возможности имеющихся машинных операций. Но процесс написания программы на машинном языке очень трудоемкий и утомительный. Программа получается громоздкой, труднообозримой, ее трудно отлаживать, изменять и развивать.

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

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

Язык ассемблера позволяет программисту пользоваться текстовыми мнемоническими (то есть легко запоминаемыми человеком) кодами, по своему усмотрению присваивать символические имена регистрам компьютера и памяти, а также задавать удобные для себя способы адресации. Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант, использовать в программе комментарии и др.

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

Таким образом, программы, написанные на языке ассемблера, требуют значительно меньшего объема памяти и времени выполнения. Знание программистом языка ассемблера и машинного кода дает ему понимание архитектуры машины. Несмотря на то, что большинство специалистов в области программного обеспечения разрабатывают программы на языках высокого уровня, наиболее мощное и эффективное программное обеспечение полностью или частично написано на языке ассемблера.

Языки высокого уровня - были разработаны для того, чтобы освободить программиста от учета технических особенностей конкретных компьютеров, их архитектуры. Уровень языка характеризуется степенью его близости к естественному, человеческому языку. Машинный язык не похож на человеческий, он крайне беден в своих изобразительных средствах. Средства записи программ на языках высокого уровня более выразительны и привычны для человека. Например, алгоритм вычисления по сложной формуле не разбивается на отдельные операции, а записывается компактно в виде одного выражения с использованием привычной математической символики. Составить свою или понять чужую программу на таком языке гораздо проще.

Важным преимуществом языков высокого уровня является их универсальность, независимость от ЭВМ. Программа, написанная на таком языке, может выполняться на разных машинах. Составителю программы не нужно знать систему команд ЭВМ, на которой он предполагает проводить вычисления. При переходе на другую ЭВМ программа не требует переделки. Такие языки – не только средство общения человека с машиной, но и людей между собой. Программа, написанная на языке высокого уровня, легко может быть понята любым специалистом, который знает язык и характер задачи.

Таким образом, можно сформулировать основные преимущества языков высокого уровня перед машинными:

алфавит языка высокого уровня значительно шире алфавита машинного языка, что существенно повышает наглядность текста программы;

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

формат предложений достаточно гибок и удобен для использования, что позволяет с помощью одного предложения задать достаточно содержательный этап обработки данных;

требуемые операции задаются с помощью общепринятых математических обозначений;

Zalina 13 января 2016 в 15:42

Разные языки программирования и их области применения. Лекция в Яндексе

  • Блог компании Яндекс ,
  • Разработка веб-сайтов ,
  • Программирование ,
  • Промышленное программирование

Наш первый пост в этом году мы решили посвятить очень базовой теме, лекция на которую была прочитана в Малом ШАДе. Занимаются в нём старшеклассники, которым интересны технологии, отсюда специфичность изложения - лекция будет особенно интересна тем, кто только начинает программировать и задумывается о том, в каком направлении развиваться. Для них же у Яндекса есть курс «Введение в программирование (С++)» , который можно пройти на платформе Stepic.org.

Лектор Михаил Густокашин - куратор академических программ Яндекса, директор центра студенческих олимпиад факультета компьютерных наук ВШЭ. Михаил подготовил десятки победителей и призёров Всероссийских олимпиад по программированию.

В рамках лекции рассказывается о том, какие бывают языки программирования, чем они отличаются, как они появились и какие из них лучше, а какие - хуже. В начале речь немного пойдет об истории языков - как они появились, как люди начали программировать, как все развивалось, что сейчас происходит. Во второй части будет затронуто то, для каких задач какой язык подходит, как «выбрать себе любимый язык и получать удовольствие от жизни». Лектор также немного расскажет о том, как, по его мнению, всему этому научиться и потом устроиться на работу.

Как всегда, под катом - подробная расшифровка лекции, чтобы вы могли сориентироваться в ее содержании.

История языков программирования

Давайте начнём с самого начала. В самом начале у компьютеров не было даже клавиатуры! То есть всё было очень плохо - у них не было ни клавиатуры, ни экрана, были перфокарты (это такие штучечки с дырочками или с отсутствием дырочек). Соответственно, то ли штырьки туда засовывали, то ли там светом светили. Если есть дырочка (или наоборот нет) - это означало нолик или единичку. И программы в то время писали с помощью машинных кодов - у каждой операции в компьютере (сложение, вычитание, какие-то более сложные операции) был какой-то код машинный. Люди сами по табличке выбирали этот код, всякие адреса в памяти, всё это выбивали руками и засовывали в считыватель - и оно всё считалось. Конечно, работа программиста была, наверное, тогда не особо интересной - проделывать дырочки - и с развитием науки и техники, конечно, начали придумывать всякие, более «интересные» штуки. Например, ассемблер (Assembler), который уже несколько облегчал жизнь.

Ну, как он облегчал жизнь? Вместо запоминания того, что там какой-то «волшебный» код у команды, использовались всякие слова, похожие на «человеческий» английский язык - какие-нибудь add или mov - ну и затем перечислялись регистры или области памяти, переменные, с которыми нужно эти операции производить. Но понятное дело, что это в общем-то тоже требовало достаточно большого напряжения ума, чтобы держать у себя в голове, в каком регистре у нас что лежит, где какие переменные и что вообще происходит. Почему так происходило? Потому что компьютеры были «глупые» и ничего более «умного» понять не могли. Вообще-то и собрать из ассемблера машинный код тоже требует времени, памяти (по тем временам было конечно мало её).

Постепенно, становилось понятно, что разрабатывать так большие сложные программы очень сложно. Производительность программиста в этих командах была предельно низкой - то есть он писал несколько строк в день (осмысленных), и каждая строка ничего особо и не делала - какие-нибудь простые арифметические действия. И людям хотелось сделать языки гораздо более похожими на человеческий язык, на английский в частности, чтобы писать программы было легче и удобнее. И пошло-поехало!

Старые и мертвые языки

Одним из первых языков стал Fortran . Кстати, его тоже ещё выбивали на перфокартах - были специальные перфокарты для выбивания программ на Fortran’е. Но если вы сейчас возьмёте этот Fortran - по-моему, он даже где-то между 50-60 гг. появился - и попытаетесь на нём что-то написать, то вам будет очень неприятно, я вам гарантирую! Современный Fortran до сих пор живой, но уже довольно сильно отличается от того, что было раньше.

Другие языки - сейчас напишу одну штуку, о которой наверное вы если и слышали, то только на всяких мероприятиях, где рассказывают про историю программирование - это COBOL . Это был язык для написания бизнес-приложений. Что такое бизнес-приложения? Какие-нибудь транзакции в банках, еще что-то, всё это писали на Коболе. У нас, понятное дело, не очень популярен. Я думаю, программиста на Коболе, в Москве, вы найдёте с большим трудом. А где-нибудь не в Москве -- с ещё большим трудом. Но, что удивительно, ещё 10 лет назад больше половины всего кода, написанного человечеством, было написано на Коболе. И до сих пор, значительная часть всяких банковских транзакций идёт с помощью программ, написанных на нём (COBOL), и до сих пор люди на нём что-то пишут.

Есть ещё «забавный» язык, он назывался Алгол (68-я версия, что характеризует год его создания). Это алгоритмический язык. В общем, они что-то там умели, но нам сейчас не очень интересно, что они умеют. И на этом наш экскурс в древность и в относительно неиспользуемые языки можно закончить и перейти к тому, что живо до сих пор (и активно живёт).

Старые, но живые языки

Алгол придумали в Европе, а Фортраном пользовались в основном в Штатах - больших отличий нет. Какая тенденция заметна? Сначала всё было сложно и чтобы писать нужно было быть чуть ли не инженером, электротехником, понимать, где какие контакты замыкаются и ещё что-то для программирования. Потом тоже нужно было сидеть с листочками и считать память, смотреть за ней. И постепенно всё становилось проще, проще, проще и дальше ещё проще для программиста - как можно меньше думать человеку, как можно больше делать автоматически. Примерно в конце вот этого периода (лектор указывает на Алгол и Кобол) начинают появляться языки, которые в каком-то смысле «дожили» до наших дней.

BASIC . Возможно, до сих пор некоторые люди на нём что-то пишут, по крайней мере я видел, что в некоторых заведениях учат на QBasic ’е - такое синее окошко, где написано «1989». В общем, «вовсю» живёт! Он придумывался как язык для не программистов. В то время программист была такая очень специализированная профессия. А здесь тебе говорят: «Вот у нас есть классный язык Basic, и любой разумный человек возьмёт и напишет программу на нём - легко». Опять же тот Бейсик и современный Бейсик - это огромная разница. Всякие вот эти строки с нумерацией через 10, всякие GOTO и прочий ужас - они к современному Бейсику уже не имеют никакого отношения и даже к Бейсику 89-го года они имеют мало отношения.

Ещё одна забавная история - язык Паскаль , широко известный в вузовских кругах, в основном в России и в странах бывшего Советского Союза. Он использовался и продолжает использоваться на удивление как учебный язык. Во всём остальном мире он поменьше распространён, но тоже живёт и здравствует. Есть такой человек Вирт - вот он учёный, теоретик. Он участвовал в обсуждении Алгола, ему не понравилось то, что получилось, и он придумал свой язык - Pascal. А потом фирма Borland (и до этого многие другие фирмы - Apple занималась, в частности) взяли и всё испортили. У него была красивая теория, стройная - «всё будет хорошо», - а они взяли и напихали туда того, что людям нужно для работы. Ну, и получилось не так красиво, как он хотел.

И, наконец, . Си придумали инженеры. Если Паскаль придумал учёный, то Си придумали Керниган и Ритчи , они работали инженерами в Bell. Как это произошло? В то время на этих языках (лектор указывает на Fortran, COBOL, Algol) ничего системного написать было нельзя. Что такое «системное»? Например, операционную систему, драйвера какие-нибудь, ещё что-то. Эти языки предназначались для математических расчётов, для бизнес-расчётов, для всего такого. А всё остальное писали на Ассемблере . Были какие-то языки, они сейчас умерли, то есть язык Си появился не сразу от Ассемблера, а через какие-то промежуточные вещи.

Суть в чем? Керниган и Ритчи любили играть в игрушку Asteroids - летает космический корабль, и тут есть астероиды, он в них стреляет, и они разваливаются на части. У них был сервер, на котором они играли, но там было много народу, и игрушка тормозила. И они обнаружили у себя где-то в кабинете, что у них стоит какой-то компьютер, которым никто не пользуется. Но было проблема - он другой архитектуры был, а игра была написана на Ассемблере.

Они её переписали, конечно, даже впилили фичи какие-то, чтобы играть на нём. Но это навело их на мысль, что переписывать под новую архитектуру каждый раз - это не очень умно. И они решили написать такой язык высокого уровня, который будет подходить для системного программирования, то есть, в котором можно будет управлять памятью, в котором можно будет понимать где-что лежит и как обращаться к этим кусочкам памяти. И так появился язык Си, который оказал огромное влияние на всё дальнейшее. Они все (лектор показывает на Алгол, Фортран и прочие упомянутые языки) оказали большое влияние, но вот Си - прямо да…

Соответственно, это был основной язык в Unix - операционной системе, которая в то время была ещё популярнее, чем сейчас. И примерно к 80-м годам ситуация была какая-то вот такая (лектор показывает на Basic, C и прочие упомянутые языки). Допустим, что всё это у нас уже потихоньку умерло (лектор стирает упоминания об Ассемблере, Фортране и Алголе)… И в 80-е годы компьютеры стали меньше, умнее, дешевле, и людям захотелось всяких странностей, чтобы жить стало ещё лучше, жить стало ещё веселее.

Языки родом из 80-х

Одна из первых странностей - это был язык C++ . Язык C имеет огромное количество недостатков (ну просто вообще огромное) - на нём можно делать вообще всё, в том числе стрелять себе в ногу, стрелять себе в ногу с выдумкой, в другую ногу, одной ногой стрелять в другую ногу, в общем - что угодно делать. Но при этом некоторые архитектурные вещи там делаются довольно сложно - опять же, как и в Ассемблере, нам приходится всё время следить, где мы, чего и какую память выделили; она там всё время «течёт» куда-то эта память -- то есть мы выделили, забыли удалить, удалили не то, вылезли за пределы памяти, в общем - огребли кучу проблем.

C++ создавался сначала как набор дополнений к языку C, который облегчит разработку. В то время стало модно объектно-ориентированное программирование и люди решили, что всё можно описать в виде иерархии, то есть - есть у вас мячик (абстрактный), вы от него наследуете футбольный мяч, волейбольный мяч, ещё один абстрактный мяч. Тогда было модно, что «мы сейчас пишем всё в виде какой-то иерархии, и всё будет хорошо, жизнь наладится, всё станет прекрасно и всё». C++ в каком-то смысле реализовывал этот объектный подход - это не был первый язык объектно-ориентированного программирования, но он стал достаточно популярным и в нём начали появляться всякие фичи. При этом C++ сохранял почти полную совместимость (на тот момент) с языком C, программа написанная на Си в 99% случаев успешной компилировалась как C++-ная и даже работала также. Это было задумано, чтобы с Си было легко перейти на C++.

Помимо объектного подхода (в C++) достаточно быстро появилась стандартная библиотека шаблонов (STL). Я думаю, что в школе те, кто ещё учил Паскаль, обнаруживали, что у вас там, во-первых, нет встроенной сортировки (в древнем, синем Борланд Паскале, сейчас она уже есть в современных версиях) - там есть пример (исходник) сортировки, его можно скопировать и вставить. Но если вы хотите здесь отсортировать целые числа, здесь хотите вещественные числа, а здесь строки, которые можно между собой сравнивать, вам приходилось писать три разные сортировки, которые делают абсолютно одно и тоже, просто у них разные типы данных. Вот это не очень хорошо и шаблоны, которые не сразу появились в C++, эту проблему здорово облегчили. То есть, у вас была абстрактная программа, которая что-то, что может между собой сравниваться, успешно сортировала.

Скриптовые языки из 90-x

Но время не стояло на месте, в 80-е годы ещё много чего интересного происходило. Но где-то на рубеже 80-х и 90-х компьютеры стали настолько хороши, что можно уже было делать совсем странные и очень неэффективные вещи. В частности, это были скриптовые языки, которые не компилировались в машинный код, а интерпретировались. Бейсик тоже в какое-то время интерпретировался, но эти скриптовые языки были предназначены в основном для обработки текстов - это, например, Perl , Python (он был тогда не очень знаменит), PHP , Ruby - вот те скриптовые языки, которые в той или иной степени живут до сих пор (они все успели появиться до 2000 года, даже сильно раньше).

Давайте немного по ним пройдёмся, потому что это специфичные вещи и сейчас много где используются. Идея заключается в чём? Если мы не компилируем, то можно позволить намного больше всего. Например, программа может смотреть на свой код и как-то пользоваться этим; она знает, что в ней происходит и за счёт этого можно много чего интересного делать.

Perl был предназначен для обработки текстов - в те времена уже памяти стало настолько много в компьютерах, что туда можно было запихнуть какой-то текст и с этим текстом что-то полезное делать (например, считать слова, поиск какой-то). Но, на мой взгляд, его проектировали люди, которые были немного не в себе, потому что про него шутка такая есть: «Любой набор символов, написанный, является корректной программой на Перле». На мой взгляд, на нём можно только писать, читать его нельзя. Когда я смотрю на код на Перле и пытаюсь что-то понять, я ничего не понимаю. Может быть, если бы я знал его лучше, я бы что-то понимал, но как я слышал от тех людей, которые всё таки умеют, - они говорят, что легче переписать заново. То есть, программки получаются коротки и реально проще переписать заново, чем разобраться с тем, что там есть и исправить.

Примерно в то время, в середине 90-х, появился интернет. Сначала это были почта, сайтики со статичным HTML, но людям захотелось добавить туда какую-то динамику, чтобы у нас всё происходило динамично, формочки какие-то можно было заполнять, гостевые книги делать, ещё что-то. Соответственно это требовало какого-то взаимодействия, придумали протокол, как это взаимодействует, и, самое главное, генерацию этих статических (условно) страниц, которые будут «выплёвываться» пользователю в ответ на его запрос.

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

PHP появился как… случайно. Один человек довольно быстро перестал заниматься этим - делал свою страничку какую-то, была у него гостевая книга какая-то, ещё что-то, какие-то штуки. И он написал набор макросов каких-то для Перла, которые были похожи на Си, потому что он на Си умел, просто потому что ему было так удобно. И назвал это Personal HomePage. Расшарил и говорит: «Люди, смотрите какую штуку я написал, здесь всё намного понятнее, чем на Перле и можно править». И людям это понравилось.

Потом он это дело бросил. В общем, в итоге этот PHP стал жить и стал со временем гораздо популярнее, чем Perl. Но вот эта его «родовая травма» (задумка как набор макросов для Перла) с ним сыграла довольно злую шутку. Язык получился странный. То есть он развивался сам по себе, его никто не проектировал, никто не администрировал процесс развития (ни компания, ни какой-то человек), а было много группок, каждая из которых пилила то, что им нравится. В итоге там функции называются по-разному, даже стиля нет, всё через подчёркивания, в общем как попало, настройки лежат здесь и там, и как всё это будет работать не очень понятно. Зато можно сесть и через два часа писать на PHP, потому что он так задумывался.

Python и Ruby: Ruby сейчас менее популярен, Python как-то лучше «выструган», давайте о нём потом поговорим. Понятное дело, что в те времена это были (лектор указывает на Perl, Python, Ruby, PHP) сильно специализированные языки для сильно специализированных целей. В общем случае никакого системного программирования, никакой бизнес-логики никто на них не писал в то время и сейчас не очень много это делает.

Компилируемые языки из 90-х

Мы пойдём примерно в те же времена, но в другую сторону. У нас на тот момент C++ применялся практически для всего, что нужно было писать не для веба, не для обработки текста, а для просто приложений, для операционных систем, для игрушек - в общем, для чего угодно. Но C++ - это жуткий язык на самом деле. Почему? Потому что, во-первых, он наследовал из-за обратной совместимости все проблемы Си. Там можно было по-прежнему убиться миллионом разных способов, тех же самых, что были в Си (естественно, добавились и новые способы в C++). При этом, если писать всё хорошо и правильно, как было задумано авторами C++, то, конечно, старыми сишными способами уже убиться было нельзя, и вроде как их стало поменьше. Тем не менее, у него была очень странная объектная модель своеобразная. Разбиение программы на модули, на кусочки какие-то вообще пришло из Си (если include вы умеете писать на Си или на C++ - фактически это было задумано как просто вставить текст библиотеки в вашу программу, в итоге, когда вы пишите кучу инклюдов у вас всё - если «примитивно», как это было в самом начале - у вас всё вставляется в один файлик и потом всё это жутко долго компилируется, потому что по несколько раз ходит. Тот же Паскаль, Виртовский, был в этом плане намного продуманнее, более поздние версии стали ещё лучше.

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

Так и появилась Java (Ява). Там тоже связана довольно забавная история, как название появилось у этого языка. Там программисты, они всё время пьют кофе и в то время было модным пить кофе, который на острове Ява рос. Язык задумывался как язык для встраиваемых приборов, в частности для кофе-машины. Вот так и получилось название…
Что вообще началось с неё, что в ней было хорошее и почему же она завоевала большую популярность? Во-первых, они избавились от наследия Сишного, полностью. Никаких указателей, гораздно меньше способов отстрелить себе какую-нибудь часть тела и всё сломать. Во-вторых, они внедрили гораздо более свежие идеи в плане объектной модели - то есть C++ появился значительно раньше, чем Java и использовал более архаичную, «дикую» модель объектную. Ну а здесь (лектор указывает на Java) она была уже более продуманной тогда уже, и в теории люди думали, и на практике применяли и сделали всё намного круче.

И наконец, третье. У нас программки на Джаве собирались не в машинный код, а в код для виртуальной машины. То есть, у вас жила виртуальная машина (VM) JVM - Javовская. Ваши программки собирались в какое-то промежуточное представление и затем, с помощью это машины уже выполнялись. Что это дало? Во-первых, оно тормозило, во-вторых, оно жрало память со страшной силой, в третьих оно было переносимо куда угодно (теоретически) - хоть на кофеварку, хоть на кофемолку, хоть на компьютер, хоть на телефон мобильный. Это, с одной стороны хорошо, то есть вы написали просто реализацию виртуальной машины, потом свои джавовские программы запускаете везде. Но, с другой стороны, плохо, что на том же телефоне тогда было мало памяти, была низкая производительность и всё это ещё дополнительно начинало тупить и тормозить.

Но даже не это главное, для чего вообще язык придумывался. Язык Джава придумывался чтобы снизить требования к квалификации программистов. То есть более плохие программисты могут писать хорошие программы на Java, потому что она не позволяет писать плохие программы - там нет средств, чтобы писать программы плохо. Там можно писать только хорошо, программы. Хорошо, в понимании создателей языка.

То есть, если на Си, на C++, на Питоне, на чём угодно мы можем развести из своего проекта жуткую помойку какую-то, где у нас всё лежит вперемешку, собирается часами и там ещё чего-то. То в Java помойку развести тоже можно, но для этого уже надо приложить какие-то усилия. То есть, по умолчанию, там получается не “помойка”, получаются другие проблемы, что там что-то пронаследовали-пронаследовали - в общем на одну осмысленную строку получается десять не очень осмысленных. Зато, может такой, средней квалификации, программист писать довольно качественный код.
Мы почти пришли к концу. У нас, следующее, что появилось - это.Net (дотнет), ну и в частности нас интересует C# (почти то же самое [лектор указывает на Java], то есть там различия в деталях, если будете выбирать между ними - смотрите, где денег больше платят).

И ещё одна штука - JavaScript. Не имеет никакого отношения к языку Java, появился в том же году - слово было модное, они лицензировали торговую марку, чтобы использовать.

На что, главное, нужно обратить внимание? (Лектор рисует стрелки от C++ к Java, .Net, C#, JavaScript и PHP). Чтобы написать простенькую программку на одном из этих языков, да и на многих других - если вы знаете C++, вам в общем-то ничего больше знать не надо - вы берете и пишете на C++, а потом добавляете доллары в начале, ещё что-то делаете по мелочи и у вас она начинает работать на чём угодно (лектор показывает на языки, к которым были отведены стрелочки от C++). То есть они предельно похожи в каких-то простых вещах. Если вы решаете какие-то школьные задачи, учебные задачи, ещё что-то (не проектируете большой проект - у вас один файлик, который читает числа, выводит числа в консоли, ещё чего-то делает), то разницы почти никакой нет между этими языками. Понятно, что JavaScript и PHP они специализированные, у них всё немножко по другому. А вот здесь (лектор указывает на Java и C#) вообще предельно мало разницы.

С тех пор появляются всякие другие интересные вещи, но непонятно - будут они жить или успешно умрут. Чем сейчас, для каких задач пользуются?

Выбор языка в зависимости от задачи

Допустим, перед вами стоит задача написать драйвер для видеокарты. Каким языком вы будете пользоваться сегодня? (Выкрик из зала: Java!) А чего… Джава - отлично, но чего не на Руби или на PHP? (Лектор говорит с сарказмом.)

Низкоуровневое программирование

Если вы пишете чего-то низкоуровневое, то лучший выбор - это Си, но вообще-то я чего-то слышал (но не видел), что C++ применяют для этого. Но я слабо верю в это, потому что в Си можно четко контролировать - раз вы дали столько-то байт памяти, значит столько-то и будет. А в C++ (STL) как реализована строка? Ну, как-то реализована. И мы в итоге не знаем, как и что там происходит, может у нас память кончится на нашей видеокарте или ещё что-то произойдёт. Поэтому Си до сих пор живёт и не умирает, такие задачи системного программирования по прежнему есть - написать операционную систему, написать драйвера, написать ещё чего-нибудь - Си отлично подходит для этого. Кроме того, сейчас появляются всякие устройства, (интернет вещей обещают, что он вот-вот наступит) которые живут от батарейки (и, естественно, их будут миллионы, всё будет обвешано этим интернетом вещей), они должны быть очень дешёвыми и очень мало электричества потреблять. Соответственно, там будет 2 Кб памяти, процессор на 5 кГц, ну и понятное дело, что вкрутить какую-то виртуальную машину или скриптовый язык в ближайшее время не получится -- значит, придётся писать что-то на Си. Да и сейчас, например, вычисления на видеокарте (OpenCL или ещё какая-нибудь технология) - там не придумывают новый язык, чтобы писать для них программ - там делают Си с каким-то большими ограничениями. Просто потому что люди уже умеют, зачем учить чего-то новое? Формально это, наверное, тоже, в каком-то смысле Си.

Веб-программирование

Допустим, вы хотите написать новый Facebook (социальную сеть). На чем вы будете это писать? (Из зала говорят про HTML и CSS.) HTML, CSS - это дизайн, а мы хотим, чтобы там можно было фотографии добавлять, друзей, комментарии оставлять.

Для скриптовой части - то есть то, что будет происходит на стороне клиента, - это JavaScript. Причем иногда JavaScript генерируется на другом языке и высылается (так бывает, что скрипт генерируется…, потому что так проще иногда бывает обрабатывать какие-то изменения в логике).

На удивление, он написан на PHP - и Facebook, и многие другие большие проекты. Пришлось, конечно, написать свои какие-то вещи, чтобы это всё-таки работало нормально, а не так как «тяп-ляп» было сделано, но они справились. В принципе, более менее всё равно, на чём вы будете писать, но не советую Perl. Здесь и сейчас, понятное дело, с нуля уже для веба никто ничего не пишет. Все пишут какой-нибудь фреймворк или ещё чего-то. Интернет-магазин? Скачали фреймворк для интернет-магазина - ну и всё, написали интернет-магазин.

Программирование для бизнеса

Дальше вы хотите написать какое-нибудь скучное приложение для банка. Или, например, есть ли у вас кто-нибудь, кто продаёт симки? Возможно, вы когда-нибудь покупали телефон или ещё что-то и вам говорили: «Вот система висит, мы ничего не можем сделать». На чём вы будете писать такое приложение? (Выкрик из зала про Python) На Питоне такое нельзя писать, вы что?! Ничего для бизнеса не стоит писать на Питоне. Почему? Потому что когда вы пишете что-то на Питоне, у вас в процессе написания невозможно обнаружить значительно количество багов. Питон всячески динамически типизированный, и вообще там можно так спрятать баг, что он всплывёт в такой ситуации, что вы даже понять не сможете, что там сделали вот эти криворукие пользователи, что у вас всё сломалось. То есть на Питоне лучше писать для себя, маленькие скрипты - вы понимаете, что там происходит и что делается. Ну или что-нибудь, что не жалко выкинуть: вы хотите раньше конкурентов что-то выкатить, ну и что, что оно через раз будет ломаться. Вы написали на Питоне и всё - вы захватили рынок. А если вы пишите что-то надолго, например банковское приложение какое-то (чтобы оно кредиты одобряло, ещё что-нибудь) - вы пишете это на Java. Потому что там дело серьезное, бумажки, деньги, документы, ещё чего-то, а в ней так накосячить нельзя, что всё сломается, а то люди обидятся - у них деньги ушли и никуда не дошли, потому что у вас в какой-то момент строка превратилась в число или наоборот. Итак, значит, методично на Java берёте и пишете, пишете… Ну или на.Net, тоже такие ситуации, в принципе, бывают. Там, конечно, тоже можно нарваться на проблемы, но всё таки вероятность этого несколько ниже.

Программирование для армии, аэрокосмической отрасли

А теперь представьте, что вас решили отправить на Луну на ракете. На чём бы вы предпочли, чтобы был написать код, который управляет двигателями ракеты? Давайте посмотрим. Вот это, наверное (лектор показывает на Perl, Python, PHP, Ruby), не стоит - оно тормозит, ещё чего-то происходит, ну и вообще я бы не согласился лететь на такой ракете. На C++? Я бы тоже, честно говоря, не доверил, потому что на C++ слишком много способов убиться. Когда ты там где-то в космосе, это не очень хорошо.

Может быть на Java? Вроде там довольно надёжно всё и архитектура хороша, никаких диких типов, никаких выходов за пределы памяти лишних. Допустим, наступил самый ответственный момент, а наша Java решила собрать мусор за нас. Нам нужно приземляться, тормозить, а она такая: «Нет, garbage собирается». В общем, тоже не очень.

Честно говоря, я бы предпочел, чтобы на Паскале писали эту программу. Я, конечно, не очень люблю Паскаль, но как-то в таких вопросах, было бы очень здорово.

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

Ну и что нужно вообще сказать о современных языках. Сейчас многие проекты не живут каким-то одним языком, то есть у них часть какая-то живет на одном языке, часть - на другом, ещё какая-то часть - на третьем. Например, если у вас какое-то веб-приложение, которое обрабатывает дикие объемы информации, обращения к дискам (даже не к базам данных, они настолько огромны, что там даже база данных не тянет какая-то уже написанная) наверняка написаны на каком-то низкоуровневом Си, чтобы дико быстро писать на диск и всё такое. Естественно, писать весь проект на Си не стоит. Может быть, там какая-то промежуточная логика, написанная на Java, которая обращается к Сишным функциям для быстрых обращений. Ну а фронтенд (то на что смотрит пользователь), конечно, уже написан на чём-нибудь, на каких-то скриптах, на том, что непосредственно выполняется браузером (JavaScript). И всё это живет вместе и успешно взаимодействует.

В разработке каких-то приложений, даже больших, иногда люди что делают? Они берут и на Питоне пишут прототип (как оно всё будет работать), набрасывают, какую-то архитектуру продумывают. Писать на нём реально очень быстро - они накидали прототип, поэкспериментировали с ним и сказали: «Во! Вот так круто!» И полностью переписали. Казалось бы, они два раза сделали работу, от этого в два раза больше времени ушло (ну, в полтора). Но нет! Часто оказывается, что такой способ неплох, потому что, если вы напишете сразу на чем-то, например на Java, а потом решите: «Нет, давайте рефакторинг, меняем архитектуру полностью и всё такое,» - то потратите в 10 раз больше времени. Такие вещи тоже существуют и живут.

Условия успеха какого-либо языка программирования

Теперь поговорим о том, почему некоторые хорошие на вид языки не выжили, ну или живут в очень ограниченном пространстве. Когда Вирт увидел, что сделали с его Паскалем нехорошие фирмы Applе, Borland и всё такое, он придумал язык ещё лучше - Oberon. Он только был дико минималистичный - то есть, там было очень мало команд (Строки? Зачем нам строки? Мы сделаем массив символов!). Ну и чего-то не пошло у него, в той степени, как могло бы пойти.

Ещё одна штука. Американские военные попросили разработать им тоже крутой язык, на котором всё работает и всё можно написать. В результате получился довольно монструозный язык Ada, на котором, правда, до сих пор что-то пишут, но опять же - для военных только.

В чём проблема? Почему некоторые языки вроде Python, который никакая компания его не поддерживала вначале, захватили рынок. PHP, который ещё и плохо спроектирован, тоже сам по себе взял и захватил рынок (большую часть). А всякие миллиарды долларов вложены (лектор показывает на Ada) и никуда не пошли, ничего не произошло. С чем это связано? Это связано с тем, что нет инфраструктуры вокруг этих языков. То есть язык может быть отличный, но пока нет документации, пока нет сообщества, которое умеет отвечать на вопросы (на Stack Overflow) и, наконец, самое главное, пока нет большого количества библиотек, язык не выстреливает. То есть, вы, например, захотели на Обероне написать сайт. А что такого, почему бы и нет? И начинается морока… Веб-сервер вы не можете поднять свой на Обероне, чтобы потестировать легонько, какие-нибудь библиотеки вы подключить не можете, потому что их на Обероне нет. И всё это через какие-то костыли делается, силы уходят, и в общем вы плюете и пишете на чистом Си свой сайт вместо Оберона. А живут хорошо те языки, которые умеют пользоваться библиотеками от других языков. Тот же Питон в тех местах, где он тормозит. Ну и вообще всякие стандартные вещи типа сортировки и ещё чего-то написаны на Си, и он (Python) умеет с ними взаимодействовать.

У Java тоже есть Java Native Interface. Это по сути Си, то есть там (по-моему, всё время хотят запретить, но кажется ещё не запретили) эти языки могут взаимодействовать с уже существующими библиотеками (в основном Сишными). И за счёт этого берут и работают. Понятна идея, которую я пытаюсь до вас донести, да? Не пишите на тех языках, которые не умеют подключать Сишную библиотеку. Ну, если вы хотите пользоваться чем-то классным. Ну, и постепенно они (языки) обрастают своей какой-то инфраструктурой. И живут как-то хорошо.

Язык программирования и профориентация

Теперь поговорим о том, как понять, чего вы хотите в жизни. Что бывает из прикольных вещей? Вы можете заниматься каким-нибудь системным программированием, да? У вас там классно считать эти байтики, вы хотите запускать квадрокоптеры, камеры какие-то, ещё чего-то делать. Тогда, наверное, Си - ваш выбор.

Если вы хотите писать, может быть, не самые интересные в жизни приложения, но вам круто их проектировать, думать об этом всём и зарабатывать кучу денег, за то, что вы сидите и скучаете большую часть времени (за это надо платить, если вы качественно скучаете), вот они - Java, .Net. Вы идёте работать в какой-нибудь банк, пишете, ходите к девяти на работу в белой рубашечке, получаете хорошую зарплату и пишете согласно рекомендациям лучших Java-водов, .Net-овцев и всё такое…

Если вы хотите писать какие-нибудь приложения, браузер какой-нибудь, игрушки какие-нибудь, ещё что-то, то C++ отлично подходит. Если вы хотите писать сайтики, то вот они, языки на ваш выбор (лектор показывает на Perl, Python, PHP, Ruby), большой разницы нет. Единственное - PHP умрёт раньше, чем Python, поэтому если вы ленитесь учиться новому, то учитесь Питону. Большой разницы не заметите, но подольше протянете.

Что происходит с Ruby, тоже непонятно. Ну, можете и PHP, если уже выучили, благо они такие простые, что там переучиваться не так долго.

И, наконец, есть ещё одна область применения языков программирования - это когда не программист ими пользуется. Допустим, вы математик, физик, химик, аналитик, кто угодно, и вам нужно быстро что-то посчитать, какие-нибудь данные проанализировать (биологам, например, сколько песцов живёт на Командорских островах). Вы можете в табличку в Excel’е вбить всё это или проанализировать чем-нибудь. Тоже Питон хорошо подходить для этого, с текстом умеет работать и библиотек полно всяких, статистических и всего такого. Если хотите делать какой-нибудь Machine Learning, какие-нибудь данные обрабатывать, прогнозировать, то тоже на Питоне это сейчас делается быстрее всего. Правда, надо заметить, что задачи бывают очень разные. Например, если вы хотите торговать на бирже моментально в условиях, когда котировки меняются всё время, то какой бы вы классный Machine Learning не написали на Питоне, люди, у которых это написано на чём-то более быстром, успеют всё скупить раньше, пока у вас всё досчитается, даже если у них алгоритмы хуже. Поэтому даже эти задачи машинного обучения (некоторые из них) требуют высокой производительности (причём экстремально высокой), и соответственно других языков.

Единственный способ понять, чего вам хочется - это всё попробовать. Сейчас я скажу как одно из видений того, как можно всё попробовать. Как стать программистом, причём счастливым? Итак. С чистого листа начинаем. Вот вы учитесь в школе своей математике, русскому языку и другим обязательным и необязательным предметам, и ваши знания в области программирования отражены на доске (лектор показывает на пустую доску) на данный момент. И вы хотите стать счастливым человеком, заниматься любимым делом, зарабатывать много денег и ни в чём себе не отказывать и радоваться.

Один из способов этого добиться. Есть, конечно, всякие вдохновляющие истории о людях, которые вообще не поступали в университеты, или бросили их и стали миллиардерами, владельцами компаний и так далее. Но надо отметить, что большинство людей, которые может быть и не стали миллиардерами, но тоже неплохо живут, всё-таки университет в какой-то момент закончили.

Какая у нас ситуация с поступлением в университет (сейчас вы в школе учитесь)? Пока вы учитесь в школе, нужно понять что следующий шаг - поступить и позаботиться об этом. Сдать ЕГЭ или победить в олимпиаде. На ЕГЭ можно пользоваться Паскалем, C++ (включая чистый Си), Питоном (не буду их дальше упоминать). На олимпиаде - тот же Паскаль, тот же C++, тот же Питон (мы поговорим сейчас о его проблемах) и, чаще всего, есть Java. Там ещё всякое бывает в зависимости от олимпиады, но не суть.

Как выглядит график распределения языков на Всероссийской олимпиаде по информатике? Люди, которые участвуют во всероссийской, самой крутой олимпиаде, на чём они пишут? Выглядит он вот так (здесь значит Паскаль, а здесь примерно 2000 год, а здесь примерно ноль, здесь C++, а здесь 2015 год).

В 2000 году на C++ почти никто не писал. Прошло 15 лет, и на Паскале почти никто не пишет, несмотря на то, что Паскаль современный. Это язык, который умеет почти всё то же самое. Просто чего-то всем стало лень этому учиться, всяким новым веянием, и всё продолжают писать на Borland Pascal’е, который конечно ничего не умеет. На C++ люди пишут какие-нибудь алгоритмы (STL) посортировать - отлично, написали sort() и всё. На Паскале, на обычном, на старом - это проблема. Написали какой-нибудь set (понадобился) - отлично, на C++ написали, на Паскале опять мучение сплошное. На новых Паскалях, понятное дело, можно это делать, но они денег стоят вообще-то. Возможно, вы не замечали этого, но это так.

Есть Java ещё, но в Java очень много букв. Она для больших проектов, а для маленьких одноразовых программок она получается совсем плохая, потому что много лишних букв. Но тоже какие-то люди пишут, можно научиться писать на ней. Но на ЕГЭ её нет и ЕГЭ всё равно сдавать придётся в большинстве своём.

Что лучше всего для ЕГЭ? Для ЕГЭ лучше всего (если вы ничего не знаете и в школе вас ничему не учат) выучить Питон. Некоторые задачи экзамена отлично решаются на нём. На олимпиаде, в общем-то, получается что (используется) C++, потому что Питон очень медленный, там не всё решается на нём.

Таким образом, вы изучили некоторое небольшое подмножество языка и какие-то алгоритмы (возможно) и много задачек порешали для того, чтобы получить диплом своей олимпиады и поступить в университет, чтобы получать высшее образование.

Я сейчас расскажу о том, как мы в Вышке выстраиваем курс, в каком порядке языки идут, как изучаются на прикладной математике и информатике факультета прикладных наук, которые мы с Яндексом делаем. В первом семестре - Питон (не в полном объёме, примерно как вы в школе должны учить) и С++ (уже шире, значительно шире, чем его обычно учат в школах). Давайте сразу скажу, чтобы вы не пугались, если вы вдруг захотите поступать, скажете: «Чего, я уже всё это знаю, зачем я пойду куда-то учиться? Лучше я пойду в другое место». Для тех, кто уже умеет программировать хорошо, там есть возможность сразу перейти к изучению алгоритмов, причем в довольно теоретической подготовке. Мы сейчас на них не смотрим, это (показывает на доску) для тех кто программирует средне или вообще никак.

В первом семестре изучаются основы Питона, просто чтобы люди научились программировать и чтобы никому особо не было обидно. Питону мало где учат в школах, в основном люди приходит со знанием Паскаля или C++. В основном даже Паскаля, если это массовая школа. Ну и чтобы никому не было обидно, все учат новый язык (как бы в равных условиях находятся). И C++ просто потому, что от C++ потом можно перейти куда угодно.

Затем идёт курс «Алгоритмы» и отдельный курсовой проект. Классические алгоритмы с реализацией. Не то, что в теории мы чего-то взяли, посчитали сложность. На лекции мы взяли, посчитали сложность, на семинаре - взяли, реализовали алгоритм. Проект - это студенты делают нечто законченное. Например, один из проектов был: посчитать… Допустим у вас много квартир в Москве и вы понимаете: «О, чего-то у меня много лишних, я сдам какую-нибудь. И выставили какую-то цену, и никто чего-то не хочет у вас квартиру снимать - наверное, слишком дорого. Или выставили какую-то цену, у вас тут же сняли и вы думаете: «Ой, наверное, я дёшево сдал» - и тоже расстраиваетесь. То есть надо было посчитать, сколько стоит аренда квартиры? Вы вбиваете данные - оно вам строит оценку. Такой сайтик, который состоял из нескольких вещей: взять предложения, попарсить, применить какой-то алгоритм обучения машинного (наверное) простенький и сделать красивую веб-морду, в которой можно что-то выбрать, что-то вбить, какие-нибудь метры, какие-нибудь количества комнат, количество саун, количество джакузи в вашей квартире и примерно оценить стоимость. То есть какая-то законченная, не очень сложная вещь. Здесь значит (лектор показывает на курс по алгоритмам) такой ядрёный C++, с консольным вводом-выводом. Ну, а здесь (лектор показывает на надпись «проект») нечто под руководством ментора, возможно с базами данных, возможно с парсингом текстов и с чем-то ещё.
Затем, идёт третий семестр - это курс, который называется “Компьютерные системы”. Там совсем немножко ассемблера для понимания (очень мало) и затем, нечто похожее на чистый Си и взаимодействие с операционными системами, системное программирование по сути. И проект на семинар - тоже нечто на тему всяких сетевых взаимодействий, достаточно низкоуровневых: разработать какую-нибудь утилиту, например rsync (синхронизация, возможно вы знаете. На чистом Си, более менее, написать аналог rsync’а, который по сети будет у вас синхронизировать папочки со всеми доступами к файлам и так далее).

И наконец, четвёртый. Я даже не знаю, как это назвать, это такой винегрет технологий, необходимых для реальной разработки, например для веб-разработки. То есть это практическое применение баз данных, опять же нечто похожее на то, что делалось в проекте (лектор показывает на проект 2 курса) но уже более углубленное. То есть такие более-менее конкретные вещи уже, практическое программирование. Параллельно с этим идёт всякая теория, ну и тут наукой занимаются ещё.

И после двух курсов люди расходятся заниматься, чем им интересно, потому что эта штука охватывает достаточно широко такие основы программирования и люди к этому моменту уже понимают, что они не хотят заниматься компьютерными системами ни в коем случае (системное программирование им, например, не понравилось), а хотят заниматься какими-нибудь теоретическими алгоритмами, сложности считать, придумывать новые какие-то штуки, распределённые или ещё что-то. Или наоборот думают, что тут у них не очень (лектор указывает на строчку первого курса с Питоном и C++ ) пошло, потом (лектор указывает на строку третьего курса, с системным программированием ) - как не нравится, считать байтики и выставлять всякие ограничения на чтение-запись, делать потоки, треды и ещё что-нибудь. И в соответствии с этим люди выбирают какое-то направление и учатся. То есть, в принципе, чтобы у вас не развился «синдром утёнка» - вы первым увидели свой Паскаль и теперь говорите «Паскаль - сила»; или более продвинутое - вы увидели C++ и начали про всех говорить, что C++ сила, а всё остальное там не очень.

Вот надо посмотреть на это (лектор показывает на список курсов на доске) шире - это один из способов, который был выбран, в частности в Вышке (недавно появился, так что он достаточно современный). Есть и другие способы познакомиться. В других хороших университетах немножко в другом порядке и другие акценты расставлены. Но тоже стараются людей со всем познакомить, что имеют.

Как программисту искать работу

Вы это (лектор показывает на список курсов ) сделали всё, научились в университете, ещё чем-то два года позанимались более продуктивно и вам нужно идти работать. Как выбрать себе что-нибудь для работы? Во-первых, вы со всем познакомились, углубились куда-то и знаете уже, что вы любите. Надо выбирать то, что вы любите, естественно. Потому что если вы любите, будете вкладывать силы, у вас будет мотивация и вообще всё будет хорошо. Потому что там дело не только в деньгах, дело в том, чтобы вам было интересно и приятно. Ну, и вы хотите попасть в крутую компанию, устроиться на работу. Какого человека вот лично я хотел бы видеть? Ко мне приходит, допустим, сто студентов - я должен взять двоих на работу или одного. Чего они приходят, я вообще не понимаю, кто они, что они, как они? В лучшем случае они мне покажут диплом, который получили в университете, и я скажу: «Во! Это крутой диплом, а это не такой крутой!» И могу ошибиться, кстати. Может, у человека было много свободного времени, и он научился гораздо лучше.

Что было бы здорово? Во-первых, какой-нибудь опенсорс-проект, который вы от начала и до конца написали. Желательно, если я делаю какую-нибудь инфраструктуру, чтобы данные быстро считались, ещё что-то, то, конечно, мне было бы интересно, чтобы мне написали чего-нибудь опенсорсное. Не сайтик какой-то сделали, а чего-нибудь по теме. Почему мне это интересно? Могу посмотреть на ваш код, я могу посмотреть как часто вы коммитили, могу посмотреть как вы реагировали на баги от пользователей, баги от разработчиков, которые это используют - всё записано, я всё смотрю и думаю: «Во, тут баг два года уже не закрывали, тут вы невежливо ответили пользователю, тут ещё чего-то - не беру». То есть это ваш личный проект.

Дальше, что ещё было бы классно? Я хотел бы посмотреть, как вы сделали командную работу. То есть вы приходите ко мне на собеседование и говорите: «Мы с ребятами из универа запилили какое-то приложение хорошее. Я вот там делал базу данных, они там делали какое-то мобильное приложение, и ещё у нас там парниша работал, девочка-дизайнер, мальчик на техподдержке. Нас было пять человек, и мы сделали классный проект». Ну я смотрю, что действительно ваш проект, говорю: «Что ваше?» Смотрю ещё раз код и понимаю, что вы умеете работать в команде с людьми.

Программист - это не тот кто сидит один (инди такой) в гараже, где-то с выключенным светом, ни с кем не разговаривает, обрастает бородой и пишет. Всё равно какое-то взаимодействие с людьми есть. С начальником, например, который на вас возможно ругается иногда (начальники, они бывают такими, не всегда добрыми). И я вижу, что вы умеете работать с людьми и меня это радует, если у вас хорошая команда какая-то. Даже если не хорошая, это лучше чем её отсутствие.

Чего ещё лично мне бы понравилось? Если бы вы проявили себя в больших проектах. Например, закоммитили что-то в ядро Линукса, если вы системным программированием занимаетесь, поправили какой-то баг. То есть показали, что вы умеете читать чужой код и умеете какие-то изменения в него вносить. Я смотрю: «О, действительно, вы разобрались в чём-то сложном и какие-то баги поправили!» И я начинаю от этого очень радоваться. Потому что у меня есть … ну не знаю… вот мой программист уволился, потому что конкуренты предложили ему больше зарплату, и мне нужно срочно кого-то затыкать его место - вами. Я такой смотрю, что вы только с нуля писали, а чужой код не умеете читать и править, и расстраиваюсь.

Ну и наконец, в зависимости от конкретной должности бывают разные другие вещи. Если вы устраиваетесь аналитиком, я бы хотел, чтобы вы на Kaggle порешали задачи на анализ данных. Если вы устраиваетесь на какие-то алгоритмические вещи, я бы хотел чтобы вы в спортивном программировании какие-то алгоритмы поделали. И наконец, если вы задумывались о профессии, читали как интервью проходят, - встречали, что там некоторые люди выражают большое недовольство: «Я пришёл, а у меня спрашивают, какое у меня хобби. Я сижу как сыч и не отвечаю, потому что у меня нет хобби,» - и думают, что HR’ы делают такое. На самом деле, они пытаются понять, насколько вы доброжелательны и адекватны. Если вы недоброжелательны и неадекватны, то каким бы вы ни были там гением и трудоголиком, крутым специалистом с большими знаниями, коллективу будет с вами сложно работать, а в одиночку вы проект не вытяните. Кроме того, даже если вытяните, то представляете, какая для компании нагрузка. А что вы завтра придёте и скажете: «Увеличьте мне зарплату в 10 раз, а то я от вас уйду». Понятное дело, компании не хотят попадать в такую ситуацию. Поэтому воспитание в себе адекватности и доброжелательности настолько же важно (как минимум) как развитие каких-то профессиональных навыков.

Подводя итог, что можно сказать? Какие языки хорошие, а какие плохие? Ну внутри какой-то группы языков, например между Ruby, Python и PHP, что выбрать? Конечно, правильный ответ Питон, но на самом деле разница между ними в количестве багов допускаемых, в количестве ещё чего-то - 5%, ну, может 10%. То есть, если у вас уже готовый проект на PHP написан, то никто в здравом уме не будет говорить: «Давайте перепишем всё на Python». Скажут: «Давайте наймём ещё PHP-разработчиков и будем дальше писать на PHP». Отлично, это неплохой выбор. Понятное дело, если вы вдруг затеете писать какой-то проект, то возможно разумно сейчас выбрать Питон. Хотя, это тоже зависит. Может, у вас на рынке куча дешёвых PHP-разработчиков, а питоновские дорогие, и вы думаете: «Да, технология более прикольная, но я сэкономлю деньги на уже готовых разработчиках». И всё, отлично, вы уже приходите и работаете там.
Как выбрать между Java и C++? Да то же самое примерно происходит. Я думаю, что к тому моменту, когда вы будете решать, на каком языке вам начинать новый большой проект, вы наберёте знаний именно в вашей профессиональной области и сможете сделать правильный выбор. Сейчас вам пока что не нужно делать такой выбор, и поэтому я вам советую делать то, что нравится.

Основы, как я уже говорил, самые-самые основы программирования (что такое функция, что такое if’ики, for’ики, массивчики, ещё что-то) можно выучить более-менее на любом языке. Например на C++, поскольку на него много чего похоже, и специфики в нём (на таком уровне) меньше всего, и буковок лишних писать меньше всего. Ну а потом, когда будете какие-то сложные архитектурные вещи учить, научитесь и переживать сильно не надо по этому поводу. То есть, главное --пробуйте, ищите то, что нравится и, когда вы поймёте, что сейчас уже 4 часа утра, а вы for fun сидите и пишете, потому что вам нравится - наверное, в этот момент понятно, что вы нашли своё.

Эта статья о расширении и его важности для компьютерных систем. Вот, казалось бы, что такого особенного может быть в расширении программного файла? Но тем не менее надеемся, читатели смогут получить важную и интересную для себя информацию. Умение разбираться с расширениями сослужит неплохую службу, о чем будет написано ниже.

Какое расширение имеет C plus plus?

Этот язык программирования имеет собственное обозначение файлов. Обозначение cpp - это специальное расширение, используемое для файлов с кодом С++. В них содержится ещё не готовый для использования (не скомпилированный) код, который можно отредактировать и внести правки без существенных издержек и сбоев в работе программы. С помощью такого расширения можно узнать, какой файл содержит текст на "Си" (язык программирования, который сейчас очень популярен).

Расширение и его важность в программировании

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

Что вообще такое расширение имени файла?

Но давайте поговорим о расширениях имён файлов с точки зрения компьютерных наук. С его предназначением уже определились - оно нужно для идентификации формата или типа файла. Отсоединяется расширение от имени файла с помощью точки. До 95-го у "Виндовс" имелось ограничение на количество символов в расширении: их не могло быть больше трех. В современных системах такого ограничения нет. Даже более, в современных файловых системах могут быть файлы, у которых несколько типов расширения. Все они следуют через точку. К таким как cpp это, правда, не относится.

Таким подарком разработчиков часто пользуются мошенники. Свои вредоносные файлы, которые они пропихивают на компьютеры пользователей, злоумышленники часто маскируют под другие программы, прячут основное расширение файла (у вирусов и различных троянов оно отличается от обычных программ). Даже может быть такое, что все настоящие файлы прячутся или удаляются, и вместо них подсовываются совсем другие. И окажется, что cpp - это вовсе не cpp, а компьютерный вирус. Хорошей защитой от такого типа мошенников служит команда показа всех типов расширений. Включить эту функцию можно в «Панели управления», достаточно найти только и необходимый пункт. И тогда можно быть спокойным за свои файлы C plus plus, и уверенным в том, что не запустишь вместо них вредную программу. Хотя тут необходимо всегда смотреть на расширение исполняемых файлов.

Точность информации, указываемой в расширении

Иногда расширение неточно указывает на тип файла и не решает всех возможных проблем, которые могут возникнуть в процессе пользования различными программами. Так, расширение.txt, знакомое многим, не даёт информацию компьютеру о том, в какой кодировке файл. Поэтому часто при открытии текстовых файлов можно увидеть листы непонятных символов. Особенно печально видеть такое состояние документа, если он использовался для написания программного кода. В таких случаях следует менять кодировки файлов до тех пор, пока компьютер не сможет предоставить адекватный текст. Можно на основе неправильных символов попробовать вычислить необходимую кодировку, но нужно знать, какая кодировка относительно которой к чему приводит. Для вордовских файлов тоже используется одно и то же расширение, которое не даёт понять, с каким файлом человек имеет дело: с обычным типом или отформатированным. Также расширение не указывает, какая версия используется, что хорошо проявляется при попытках открыть версии ранних документов в более поздних средах обработки, как в случае с Microsoft Office.

Иные способы и возможности указать формат

Есть и другие возможности указать для файловой системы. Но они не являются распространёнными, и про них вы, скорее всего, никогда не слышали:

  • Сохранение информации о формате файла в самой операционной системе. Неудобства возникают при желании перейти на другой компьютер и поработать с этим же файлом.
  • Применение так называемого метода «магических чисел». Это когда в самом файле зашифровывается определённая последовательность байтов, которая указывает всю необходимую информацию для работы файла. Имеет определённый потенциал, но нужна кооперация производителей программного обеспечения.
  • Для некоторых Unix-систем разработана функция, которая оставляет специальные обозначения на начале файла, предназначенные для интерпретатора.
mob_info