Основы с языка: Введение в Си. Послание из прошлого столетия / Хабр

Содержание

Учебник по языку С# 8.0 и платформе .NET Core 3

Последнее обновление: 16.10.2019

  1. Глава 1. Введение в C#

    1. Язык C# и платформа .NET

    2. Начало работы с Visual Studio. Первая программа

    3. Компиляция в командной строке с .NET Core CLI

    4. Установка версии языка

  2. Глава 2. Основы программирования на C#

    1. Структура программы

    2. Переменные

    3. Литералы

    4. Типы данных

    5. Консольный ввод-вывод

    6. Арифметические операции

    7. Поразрядные операции

    8. Операции присваивания

    9. Преобразования базовых типов данных

    10. Условные выражения

    11. Условные конструкции

    12. Циклы

    13. Массивы

    14. Программа сортировки массива

    15. Методы

    16. Параметры методов

    17. Передача параметров по ссылке и значению. Выходные параметры

    18. Массив параметров и ключевое слово params

    19. Область видимости (контекст) переменных

    20. Рекурсивные функции

    21. Перечисления enum

    22. Кортежи

  3. Глава 3. Классы. Объектно-ориентированное программирование

    1. Классы и объекты

    2. Структуры

    3. Типы значений и ссылочные типы

    4. Пространства имен, псевдонимы и статический импорт

    5. Создание библиотеки классов

    6. Модификаторы доступа

    7. Свойства

    8. Перегрузка методов

    9. Статические члены и модификатор static

    10. Константы, поля и структуры для чтения

    11. Перегрузка операторов

    12. Значение null

    13. Индексаторы

    14. Наследование

    15. Преобразование типов

    16. Перегрузка операций преобразования типов

    17. Виртуальные методы и свойства

    18. Сокрытие методов

    19. Различие переопределения и сокрытия методов

    20. Абстрактные классы

    21. Класс System.Object и его методы

    22. Обобщенные типы

    23. Ограничения обобщений

    24. Наследование обобщенных типов

  4. Глава 4. Обработка исключений

    1. Конструкция try..catch..finally

    2. Блок catch и фильтры исключений

    3. Типы исключений. Класс Exception

    4. Создание классов исключений

    5. Поиск блока catch при обработке исключений

    6. Генерация исключения и оператор throw

  5. Глава 5. Делегаты, события и лямбды

    1. Делегаты

    2. Применение делегатов

    3. Анонимные методы

    4. Лямбды

    5. События

    6. Ковариантность и контравариантность делегатов

    7. Делегаты Action, Predicate и Func

  6. Глава 6. Интерфейсы

    1. Определение интерфейсов

    2. Применение интерфейсов

    3. Явная реализация интерфейсов

    4. Реализация интерфейсов в базовых и производных классах

    5. Наследование интерфейсов

    6. Интерфейсы в обобщениях

    7. Копирование объектов. Интерфейс ICloneable

    8. Сортировка объектов. Интерфейс IComparable

    9. Ковариантность и контравариантность обобщенных интерфейсов

  7. Глава 7. Дополнительные возможности ООП в C#

    1. Методы расширения

    2. Частичные классы и методы

    3. Анонимные типы

    4. Локальные функции

    5. Pattern matching

    6. Деконструкторы

    7. Паттерны switch

    8. Nullable-типы

    9. Переменные-ссылки и возвращение ссылки

  8. Глава 8. Объектно-ориентированное программирование. Практика

    1. Создание проекта библиотеки классов

    2. Создание классов. Часть 1

    3. Создание классов. Часть 2

    4. Создание главного проекта

  9. Глава 9. Коллекции

    1. ArrayList

    2. Список List<T>

    3. Двухсвязный список LinkedList<T>

    4. Очередь Queue<T>

    5. Стек Stack<T>

    6. Словарь Dictionary<T, V>

    7. Класс ObservableCollection

    8. Интерфейсы IEnumerable и IEnumerator

    9. Итераторы и оператор yield

  10. Глава 10. Работа со строками

    1. Строки и класс System.String

    2. Операции со строками

    3. Форматирование и интерполяция строк

    4. Класс StringBuilder

    5. Регулярные выражения

  11. Глава 11. Работа с датами и временем

    1. Структура DateTime

    2. Форматирование дат и времени

  12. Глава 12. Дополнительные классы и структуры .NET

    1. Отложенная инициализация и тип Lazy

    2. Математические вычисления и класс Math

    3. Преобразование типов и класс Convert

    4. Класс Array и массивы

    5. Span

    6. Индексы и диапазоны

  13. Глава 13. Многопоточность

    1. Введение в многопоточность. Класс Thread

    2. Создание потоков. Делегат ThreadStart

    3. Потоки с параметрами и ParameterizedThreadStart

    4. Синхронизация потоков

    5. Мониторы

    6. Класс AutoResetEvent

    7. Мьютексы

    8. Семафоры

    9. Таймеры

  14. Глава 14. Параллельное программирование и библиотека TPL

    1. Задачи и класс Task

    2. Работа с классом Task

    3. Задачи продолжения

    4. Класс Parallel

    5. Отмена задач и параллельных операций. CancellationToken

  15. Глава 15. Aсинхронное программирование. Task-based Asynchronous Pattern

    1. Асинхронные методы, async и await

    2. Возвращение результата из асинхронного метода

    3. Последовательный и параллельный вызов асинхронных операций

    4. Обработка ошибок в асинхронных методах

    5. Отмена асинхронных операций

    6. Асинхронные стримы

  16. Глава 16. LINQ

    1. Основы LINQ

    2. Фильтрация выборки и проекция

    3. Сортировка

    4. Объединение, пересечение и разность коллекций

    5. Агрегатные операции

    6. Методы Skip и Take

    7. Группировка

    8. Соединение коллекций. Метод Join, GroupJoin и Zip

    9. Методы All и Any

    10. Отложенное и немедленное выполнение LINQ

    11. Делегаты и анонимные методы в запросах LINQ

  17. Глава 17. Parallel LINQ

    1. Введение в Parallel LINQ. Метод AsParallel

    2. Метод AsOrdered

    3. Обработка ошибок и отмена параллельных операции

  18. Глава 18. Рефлексия

    1. Введение в рефлексию. Класс System.Type

    2. Применение рефлексии и исследование типов

    3. Динамическая загрузка сборок и позднее связывание

    4. Атрибуты в .NET

  19. Глава 19. Dynamic Language Runtime

    1. DLR в C#. Ключевое слово dynamic

    2. DynamicObject и ExpandoObject

    3. Использование IronPython в .NET

  20. Глава 20. Сборка мусора, управление памятью и указатели

    1. Сборщик мусора в C#

    2. Финализируемые объекты. Метод Dispose

    3. Конструкция using

    4. Указатели

    5. Указатели на структуры, члены классов и массивы

  21. Глава 21. Работа с потоками и файловой системой

    1. Работа с дисками

    2. Работа с каталогами

    3. Работа с файлами. Классы File и FileInfo

    4. FileStream. Чтение и запись файла

    5. Чтение и запись текстовых файлов. StreamReader и StreamWriter

    6. Бинарные файлы. BinaryWriter и BinaryReader

    7. Бинарная сериализация. BinaryFormatter

    8. Архивация и сжатие файлов

  22. Глава 22. Работа с JSON

    1. Сериализация в JSON. JsonSerializer

  23. Глава 23. Работа с XML в C#

    1. XML-Документы

    2. Работа с XML с помощью классов System.Xml

    3. Изменение XML-документа

    4. XPath

    5. Linq to Xml. Создание Xml-документа

    6. Выборка элементов в LINQ to XML

    7. Изменение XML-документа в LINQ to XML

    8. Сериализация в XML. XmlSerializer

  24. Глава 24. Процессы и домены приложения

    1. Процессы

    2. Домены приложений

    3. AssemblyLoadContext и динамическая загрузка и выгрузка сборок

  25. Глава 25. Валидация модели

    1. Основы валидации модели

    2. Атрибуты валидации

    3. Создание своих атрибутов валидации

    4. Самовалидация модели

  26. Вопросы для самопроверки

  27. Создание графических приложений с C# в Windows Forms

Основы работы с языком CSS для новичков

Мы с вами уже разобрали
основные теги языка HTML и теперь пришло время навести красоту.
Хотелось бы иметь возможность менять цвет текста, его размер, фон и многое другое. Это делается
с помощью языка CSS.

Блок . Как работать с CSS

Каждому тегу в HTML соответствует так называемый селектор CSS. К примеру, тегу
<p> соответствует CSS селектор p,
с помощью которого мы можем обратиться ко всем абзацам HTML страницы и,
например, покрасить их всех одновременно в красный цвет.
После селектора следует ставить фигурные скобки {}, внутри которых следует писать CSS свойства.

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

Давайте покрасим все абзацы в красный цвет:

Это HTML код:

<p>
	Абзац с текстом.
</p>

Это CSS код:

p {
	color: red;
}

Так код будет выглядеть в браузере:

Абзац с текстом.

А теперь давайте покрасим абзацы в зеленый цвети сделаем их большого размера:

<p>
	Абзац с текстом.
</p>
p {
	color: red;
	font-size: 25px;
}

Так код будет выглядеть в браузере:

Абзац с текстом.

Обратите внимание на оформление CSS кода: каждое новое свойство пишется с новой строки.

Блок . Способы подключения CSS к HTML коду

Давайте теперь разберемся с тем, как сделать так, чтобы написанный CSS
применился к нашему HTML коду. Это можно сделать тремя способами.

Первый способ заключается в том, что CSSбудет написан в отдельном файле и специальным
образом подключен к нашей HTML странице.

Еще два способа заключаются в том,
что CSS код будет написан прямо на HTML странице.

Первый способ используется гораздо чаще (в подавляющем большинстве случаев).
Одновременно можно применять все три способа.

Давайте разберемся с этими способами более подробно.

Способ 1. Отдельный CSS файл

Самый распространенный способ подключения CSS —
это когда он хранится в отдельном файле и этот файл
подключается ко всем страницам нашего сайта.

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

Чтобы подключить CSS файл к HTML странице,
в теге head следует написать такую конструкцию: <link rel=»stylesheet» href=»путь к CSS файлу»>.

Сам CSS файл должен быть с расширением .css.
Обычно его называют styles.css или style.css.

В следующем примере к нашему HTML файлу подключается CSS файл style.css:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Это заголовок тайтл</title>
		<link rel="stylesheet" href="style.css">
	</head>
	<body>
		<p>
			Это абзац с текстом.
		</p>
	</body>
</html>

Можно подключать не один файл, а несколько. Давайте подключим
файлы style1.css, style2.css и style3.css:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Это заголовок тайтл</title>
		<link rel="stylesheet" href="style1.css">
		<link rel="stylesheet" href="style2.css">
		<link rel="stylesheet" href="style3.css">
	</head>
	<body>
		<p>
			Это абзац с текстом.
		</p>
	</body>
</html>

Способ 2. CSS внутри тега style

Второй способ заключается в том, что CSS код можно написать в теге <style>
Его можно размещать как внутри <head> (чаще всего), так и внутри <body>.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Это заголовок тайтл </title>
		<style>
			p {
				color: red;
			}
		</style>
	</head>
	<body>
		<p>
			Это абзац с текстом.
		</p>
	</body>
</html>

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

Правило такое: если что-то можно сделать первым способом,
то использовать второй способ — дурной тон.

Способ 3. CSS внутри атрибута style

Третий способ заключается в том, что можно добавить атрибут style любому
тегу на странице и прямо там написать для него HTML код. Обратите внимание на то,
что при этом никаких селекторов писать не нужно, так как CSS код применится только к тому тегу,
для которого он написан:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Это заголовок тайтл</title>
	</head>
	<body>
		<p>
			Это абзац с текстом.
		</p>
	</body>
</html>

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

Впрочем, иногда без второго и третьего способа не обойтись.

Блок . Комментарии CSS

Так же, как и в HTML, в CSS можно ставить комментарии.
Они оформляются следующим образом:
слеш и звездочка /*, потом текст комментария, потом звездочка и слеш */.
Смотрите пример:

p {
	/*
		Тут находится
		комментарий CSS.
	*/

	color: red;
	font-size: 27px;
}

Видео про CSS

Посмотрите следующее видео
из заочного курса: скачайте его по данной ссылке.
Там я рассказываю про подключение CSS, а также демонстрирую работу с некоторыми свойствами
(эти знания пригодятся вам в следующем уроке).

Что вам делать дальше:

Приступайте к решению задач по следующей ссылке: задачи к уроку.

Когда все решите — переходите к изучению новой темы.

ɯǝʚɯо ņıqнqvиʚɐdu) / Блог компании RUVDS.com / Хабр

Многие начинают путь к изучению программирования, открыв поздним вечером Google. Обычно ищут что-то вроде «Как выучить…». Но как тот, кто ищет подобное, решает, какой именно язык программирования выбрать?

Кто-то, начитавшись сайтов и блогов крупнейших компьютерных компаний, рассуждает так: «В Кремниевой долине что ни слово –  то Java. Думаю, это – то, что мне нужно». Бывает и так: «Haskell. Он ведь на пике популярности. Страшно подумать, что будет дальше. Определённо – Haskell». И даже так: «Этот суслик на логотипе Go – такая няшка. Хочу знать Go».


Некоторые, движимые стремлением научиться программировать, ищут вот что: «Какой язык программирования выучить первым?».

Бывают вопросы, которые задают так часто, что, для ответа на них создают целые схемы. Вот, например, одна из них, посвящённая выбору первого языка программирования, подготовленная командой этого сайта.

Кликабельно:

Если рассмотреть эту схему, окажется, например, что Ruby подходит тем, кто ребёнком любил лепить из пластилина.

Выбор первого языка программирования может стать увлекательным занятием, как полусерьёзные опросники, вроде: «Кто вы из героев Квентина Тарантино?».

Но, прежде чем вы уйдёте с головой в изучение Ruby, причём, только потому, что в детстве жить не могли без пластилина, позвольте обратить ваше внимание на то, что первый язык программирования – это очень и очень важно. Слишком многое от него зависит.

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

Выбирая первый язык стоит трезво оценить следующие факторы:

  • Рынок труда.
  • Долгосрочные перспективы языка.
  • Сложность изучения языка.
  • Что именно вы сможете создать в процессе изучения, и, показав окружающим, поддержать мотивацию.

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

Из анализа поисковых запросов можно выяснить, что у Java были взлёты и падения. А, например, рейтинг Python постепенно рос, он стал чуть ли не самым популярным языком программирования. Есть здесь и один язык, простой, но обладающий замечательными возможностями, график интереса к которому год от года медленно растёт, хотя и находится в самом низу. Это – JavaScript.

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

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

Начнём наш разговор о первом языке с рассмотрения того, как сегодня учат программировать.

Основы информационных технологий и обучение программированию

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

Наверняка вы знакомы с этим высказыванием Эрика Рэймонда: «Образование в сфере компьютерных технологий точно так же не сделает из вас отличного программиста, как изучение кистей и красок не сделает вас прекрасным художником».

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

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

И те, кто принимают решения о том, чему учить на курсах по программированию, обычно придерживаются всяческих официальных источников, регулярно публикующих отчёты с рейтингами языков. Среди таких отчётов, например, TIOBE Index. А вот — таблица лидеров по версии IEEE.

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

Так, в 2014-м году Python обошёл Java, став самым популярным языком программирования в ведущих курсах по информационным технологиям в США.

И я уверен, что ещё одно изменение обязательно произойдёт, да что там говорить – это уже происходит.

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

Вот результат опроса, который проводился на Stack Overflow в 2016-м году. В нём участвовало 49397 разработчиков. Более половины из них используют JavaScript.

Без JavaScript невозможна разработка веб-интерфейсов, а в последнее время, благодаря Node.js, растёт актуальность JavaScript в серверном коде. Этот язык стремительно распространяется и в другие области, такие, как разработка игр и интернет вещей.

Среди программистских вакансий JavaScript упоминается чаще, чем другие языки, если не брать в расчёт Java. Вот данные с крупнейшего агрегатора вакансий Indeed.com.

Неслучайно и то, что мы, на freecodecamp.com, собрали сообщество разработчиков, занятых проектами на JavaScript с открытым исходным кодом. За прошедшие два года более 5000 человек воспользовались Free Code Camp для того, чтобы найти свою первую работу в роли программиста.

Я, кстати, не ратую за JavaScript только потому, что обучаю на нём программировать. Всё, как раз, наоборот. Я обучаю этому языку именно потому что знание JavaScript – это верная дорога к первой работе программиста.

Но подходит ли JavaScript именно вам? Стоит ли ему становиться вашим первым языком программирования? Рассмотрим подробнее те факторы выбора языка, о которых я говорил выше.

Фактор №1: рынок труда

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

Как я уже говорил, в объявлениях о вакансиях чаще всего упоминается Java. На втором же месте стоит JavaScript.

Но в случае с JavaScript надо учесть одну важную вещь. Хотя язык существует уже два десятка лет, лишь сравнительно недавно он превратился в серьёзный инструмент, с помощью которого гиганты вроде Netflix, Walmart и PayPal создают полноценные приложения.

В результате множество компаний нанимают JavaScript-разработчиков, но разработчиков этих не так уж и много.

Вот данные с Indeed.com, здесь показано соотношение вакансий и соискателей.

Итак, что мы видим. На одно место Java-разработчика приходится 2.7 программиста. В сфере вакансий, где требуется знание PHP, а также в среде iOS-разработки, складывается похожая ситуация.

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

Фактор №2: долгосрочные перспективы

JavaScript-проекты на GitHub получают, в среднем, в два раза больше pull-запросов, чем проекты на Java, Python или Ruby. И, кроме этого, JavaScript растёт быстрее, чем любой другой популярный язык.

Вот соответствующие данные GitHub Octoverse:

На экосистему JavaScript, кроме того, благотворно влияют серьёзные инвестиции, как финансовые, так и выражающиеся в человеческом капитале талантливых инженеров, от таких компаний, как Google, Microsoft, Facebook и Netflix.

Например, вклад в язык программирования с открытым исходным кодом TypeScript (расширенная версия JavaScript со статической типизацией) внесли более 100 разработчиков. Многие из них – сотрудники Microsoft и Google, которые получают зарплату за эту работу.

Подобную форму совместной работы компаний в среде Java найти сложнее. Например, Oracle, которая фактически владеет Java, поглотив Sun Microsystems, часто судится с компаниями, которые пытаются работать над этим языком.

Фактор №3: сложность изучения языка

Вот карикатура о сложности языков программирования от XKCD.

Большинство программистов согласится с тем, что высокоуровневые скриптовые языки сравнительно легки в изучении. JavaScript подпадает под эту категорию, вместе с Python и Ruby.

И даже, хотя в учебных заведениях языками, с которых начинают учить программировать, всё ещё являются такие, как Java и C++, разобраться в них значительно сложнее.

Фактор №4: проекты, которые можно создать, используя полученные знания

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

Повсеместное распространение JavaScript привело к такому знаменитому высказыванию Джефа Этвуда, сооснователя Stack Overflow: «Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript».

С течением времени это высказывание, которое ещё называют «Законом Этвуда», не утрачивает актуальности.

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

Python страдает от похожих проблем. Вот что по этому поводу написал Джеймс Хэг в статье о том, что пришла пора отказаться от Python, как от основного языка, используемого при обучении программированию. Ученик спрашивает: «Как мне дать эту вот игру, которую я написал, друзьям? Или, это будет даже лучше, можно ли как-нибудь записать её на мой телефон, чтобы я мог показать её всем в школе, а им не пришлось бы её устанавливать?». Учителю же, если речь идёт о Python, остаётся лишь хмыкнуть. В двух словах тут и не ответишь.

Если же говорить о JavaScript, то вот живые ответы на вышеупомянутый вопрос. Это – приложения, которые написали члены сообщества Free Code Camp в CodePen, пользуясь браузером.

Вот игра «Simon», созданная в стиле 1970-х.

Вот – реализация математической игры Джона Конвея «Жизнь».

Вот – страница поиска для Wikipedia, стилизованная под «Звёздные войны».

А вот – игра-«рогалик» с традиционным подземельем.

Первый язык: пройтись по верхам, или копнуть поглубже?

Сначала как следует изучите один язык. Затем принимайтесь за следующий.

Если вы будете прыгать от одного языка к другому, нигде толком не задерживаясь, далеко вам не уйти. Для того, чтобы продвинуться заметно дальше «Hello World», нужно как следует изучить ваш первый язык. После этого со вторым и последующим языками будет разобраться гораздо проще.

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

  • Изучение C – это отличный способ разобраться с тем, как, на самом деле, работают компьютеры, в частности, в плане управления памятью. C особенно хорош в высокопроизводительных вычислениях.
  • C++ отлично подходит для разработки игр.
  • Python нет равных в научных и статистических расчётах.
  • Java пригодится тем, кто видит себя программистом в крупной компании.

Но сначала, повторюсь, стоит изучить JavaScript.

Так, а теперь хочу сделать невозможное. Собираюсь попытаться представить себе возражения некоторых читателей, критику JavaScript и моих идей, которая может появиться в комментариях, и на эту критику ответить.

Возражение №1. JavaScript – язык медленный

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

JavaScript (речь идёт о Node.js) на порядки быстрее, чем Python, Ruby и PHP. Его быстродействие приближается к C++, Java и Go. Вот результаты одного весьма серьёзного теста производительности для различных языков программирования.

Возражение №2. В JavaScript нет статической типизации

Как Python и Ruby, JavaScript – это язык с динамической типизацией. И это, с одной стороны, удобно, а с другой – способно завести разработчика в лабиринт ошибок. Вот, например, здесь мне хочется, чтобы переменная exampleArray была массивом. Я записываю в массив значения, проверяю его длину, то есть – количество содержащихся в массиве элементов. Выглядит это так:

exampleArray = [1, 2]
-> [1, 2]
exampleArray.length
-> 2

Затем я случайно записываю в переменную строку, при этом, что ещё хуже, благодаря особенностям строкового типа данных в JavaScript, я вполне могу получить длину того, что считаю массивом, обратившись к свойству length:

exampleArray = "text"
-> "text"
exampleArray.length
-> 4

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

Если же вам, в первом языке программирования, совершенно необходима статическая типизация, я всё равно рекомендую начать с JavaScript. После этого вы сможете быстро освоить TypeScript. Вот что говорит на эту тему Алекс Эверлоф: «Для того, чтобы освоить TypeScript, нужно время, но, если вы уже знаете JavaScript, всё будет гораздо быстрее и проще».

Возражение №3. Я очень хочу создавать мобильные приложения, поэтому JavaScript не для меня

Даже если так, я всё равно советую сначала изучить JavaScript. И, кстати, он вполне подходит для разработки мобильных приложений, причём, как их клиентской, так и серверной частей. А именно:

  1. В экосистеме JavaScript имеются несколько инструментов для разработки полноценных мобильных приложений. Например, это Angular Cordova и React Native.
  2. Для того, чтобы ваше мобильное приложение делало что-нибудь по-настоящему интересное, вероятно, ему понадобится серверная часть, построенная на некоей подходящей платформе, вроде Node.js + Express.js.

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

Для начала, хотя мобильными приложениями пользуются буквально все, по данным опроса Stack Overflow, в котором приняли участие 49525 программистов, практически половина из них занята в сфере веб-разработки. И лишь немногим более восьми процентов занимаются мобильными приложениями.

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

Безусловно, программами они пользуются. В основном это Facebook, Google Maps и некоторые другие. Их не так уж и много. В результате основной спрос на разработчиков мобильных приложений сконцентрирован в нескольких крупных компаниях.

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

По состоянию на 2016-й год, практически вся работа программистов сосредоточена на веб-проектах. Всё так или иначе связано с этой огромной платформой, со «Всемирной паутиной». И грядущее поколение бытовых приборов, с которыми можно будет разговаривать, и автомобили, которые будут сами забирать детей из школы – всё это тоже будет частью веба.

Из вышесказанного следует простой вывод: учите JavaScript.

Возражение №4: Разве JavaScript это не игрушечный язык, который был создан за десять дней?

Когда слышу подобное, сразу на ум приходит этот твит. А вообще, у JavaScript, конечно, необычная история. Это провоцирует. Наверняка вам доводилось читать и слышать, как кто-то отпускает шутки об этом языке.

Кстати, некоторым невероятно нравится критиковать C++. Но, как и JavaScript, C++ преуспел несмотря ни на что. Теперь он, точно так же, практически повсюду.

JavaScript – это ни разу не игрушка.

Удачной учёбы!

В итоге хочу сказать вот что. Если кто-нибудь станет вас доставать только потому, что вы изучаете JavaScript, а не «хит сезона», просто вспомните знаменитые слова Бьёрна Страуструпа, человека, который создал C++: «Существует лишь два вида языков программирования: те, которые постоянно ругают, и те, которыми никто не пользуется».

Удачи в изучении вашего первого языка программирования!

10 самых влиятельных языков программирования последних 50 лет и их создатели

В IT-вселенной существует множество языков программирования. С каждым годом их становится всё больше и больше. Например, сравнительно недавно появились языки Scala, Kotlin, Go и Closure. Но история говорит нам о том, что выживут лишь немногие из них.

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

Языки — это важнейшая составляющая индустрии программирования. Их часто обсуждают, критикуют, их, с течением времени, улучшают. Они у всех на слуху, но их историю, хотя бы то, как зовут их создателей, знают далеко не все. Такое менее характерно для популярных языков. Например, все знают о том, что Джеймс Гослинг — это отец Java. Но далеко не каждый программист знает о том, кто создал Perl, Pascal, Lisp или Erlang.

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

Топ-10 языков программирования и их создатели

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

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

1. Java — Джеймс Гослинг

Джеймс Гослинг

Java — это один из самых популярных и успешных языков программирования. Java создал доктор Джеймс Артур Гослинг. Он известен как «отец Java».

Изначально разработкой и поддержкой Java занималась компания Sun Microsystems. С января 2010 года, после того, как компанию Sun купила Oracle, этим занимается Oracle.

В основу Java положен принцип WORA («Write Once Run Anywhere», «Написано один раз, работает везде»). Платформонезависимость Java стала одной из фундаментальных причин успеха этого языка в корпоративной среде.

В настоящее время Java — это один из самых популярных языков. Если вы хотите изучить Java — взгляните на этот учебный курс.

2. C — Деннис Ритчи

Деннис Ритчи

Деннис Макалистэйр Ритчи, американский компьютерный специалист, занимался созданием языка программирования C в 1967 — 1973 годах в AT&T Bell Labs.

Язык C всё ещё весьма популярен. Он широко используется в системном программировании. Он старше Java, но не сдаёт своих позиций.

Деннис Ритчи, кстати, создал ещё и всемирно известную операционную систему Unix. Сделал он это вместе со своим давним коллегой Кеном Томпсоном.

Если сравнить популярность Денниса Ритчи с популярностью Билла Гейтса или Стива Джобса, то окажется, что сравнивать тут почти нечего. Но мало кто может сравниться с ним в том, какой вклад он сделал в мир информационных технологий. Об этом стоит знать каждому программисту. Если вы хотите изучить C — взгляните на эту специализацию на Coursera.

3. С++ — Бьёрн Страуструп

Бьёрн Страуструп

Бьёрн Страуструп родился 30 Декабря 1950 года в городе Орхус, в Дании. Он известен благодаря созданию и разработке широко используемого языка программирования C++. 

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

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

Если вы хотите изучить С++ с нуля — рекомендую взглянуть на этот учебный курс. В нём хорошо сочетаются теория и практика.

4. Python — Гвидо ван Россум

Гвидо ван Россум

Язык Python разработал Гвидо ван Россум из Центра математики и информатики (CWI). Python — это высокоуровневый язык общего назначения. При его проектировании особое внимание уделялось хорошей читабельности кода. Его синтаксис считается чистым и выразительным.

В США Python почти заменил Java в научной среде. В частности, это выражается в том, что современные студенты начинают осваивать программирование с изучения Python, а не C или Java, как это было раньше.

Python широко используется в разных сферах, в частности, в веб-разработке и в области информационной безопасности. Этот язык применяется в таких компаниях, как Google, Yahoo и Spotify. Вот хороший учебный курс по Python.

5. JavaScript — Брендан Эйх

Брендан Эйх

Если бы вы спросили меня о том, какой язык программирования можно назвать самым популярным в последние 5-10 лет, то я сказал бы, что это JavaScript. Он, совершенно определённо, господствует в мире клиентской веб-разработки, не в последнюю очередь — за счёт существующих JavaScript-библиотек. Кроме того, он пользуется серьёзной популярностью и в серверной среде — благодаря платформе Node.js.

JavaScript — это скриптовый язык, в котором используются механизмы прототипного наследования. Это — динамический язык со слабой типизацией, который поддерживает работу с функциями высшего порядка. JavaScript создал Брендан Эйх, работавший во время разработки этого языка в Netscape Communications Corporation.

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

Если вы хотите изучить JavaScript — к вашим услугам огромное количество материалов.

6. PHP — Расмус Лердорф

Расмус Лердорф

Язык PHP (изначально он назывался Personal Home Page Tools, что переводится как «Инструменты для создания персональных веб-страниц») создал в 1995 году Расмус Лердорф. Вне зависимости от того, насколько сильно вы этот язык ненавидите, вам никуда не деться от того факта, что он довольно-таки популярен при разработке серверных частей современных веб-проектов.

В настоящее время эталонная реализация PHP разрабатывается силами The PHP Group. PHP соперничал с технологиями Microsoft Active Server Pages (ASP) и Java Server Pages (JSP) и в итоге стал гораздо более востребованным, чем они. Это — опенсорсный язык, который используется такими интернет-гигантами, как Facebook, Wikipedia, WordPress и Joomla.

Если вы хотите изучить PHP — загляните сюда.

7. Perl — Ларри Уолл

Ларри Уолл

Perl — это высокоуровневый, динамический, интерпретируемый язык программирования общего назначения. Его создал Ларри Уолл в середине 1980-х. Своей популярностью Perl обязан замечательными возможностями по обработке текстов.

Perl всё ещё является основным языком, используемым для разработки скриптов в UNIX-системах. Perl используется в сфере компьютерной графики, в приложениях для работы с базами данных, в сфере сетевого программирования. Среди компаний, которые используют этот язык, можно отметить IMDB, Amazon и Priceline. Вот хороший учебный курс по Perl.

8. Ruby — Юкихиро Мацумото

Юкихиро Мацумото

Язык Ruby был создан Юкихиро Мацумото в середине 1990-х в Японии. Программирование на Ruby — занятие увлекательное. Если вы пробовали веб-фреймворк Ruby on Rails, то вы меня поймёте.

Воздействие на Ruby оказали такие языки, как Perl, Ada, Lisp, Smalltalk. Этот язык создан в расчёте на то, чтобы писать программы на нём можно было бы быстро и приятно.

Ruby, в основном, используется при разработке веб-приложений. В частности, этот язык применяется в таких компаниях, как Twitter, Hulu и Groupon.

Вот учебный курс по Ruby.

9. Lisp — Джон Маккарти

Джон Маккарти

Язык Lisp (LISt Processing language, язык обработки списков) был разработан Джоном Маккарти. Это — один из старейших высокоуровневых языков, которые используются по сей день.

Я никогда не изучал Lisp, но говорят, что этот язык является прародителем таких языков функционального программирования, как Haskell, Erlang и Scala. Этот язык используется в самых разных сферах. В частности — в военной. По Lisp существует не так уж и много учебных курсов. Вот — один из них.

10. Pascal — Никлаус Вирт

Никлаус Вирт

Pascal — это императивный процедурный язык, разработанный в конце 1960-х Никлаусом Виртом. Этот язык оказал значительное влияние на IT-индустрию. Он создавался как компактный и эффективный язык, направленный на поддержание хорошего стиля программирования за счёт использования структурного подхода к разработке. Как и в случае с Lisp, по Pascal существует не так уж и много учебных курсов. Всё же язык это довольно старый. Но если вы хотите его изучить — загляните сюда.

Итоги

Я поделился с вами моим рассказом о 10 языках программирования и об их создателях. Все, о ком я рассказал, внесли серьёзный вклад в развитие IT-индустрии. Без них современный мир был бы совсем другим.

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

5 языков программирования, которые надо учить первыми | GeekBrains

Основа востребованности современного программиста.

https://d2xzmw6cctk25h.cloudfront.net/post/1666/og_cover_image/af4a28a7853d17625124ffebf3b28891

Сегодня каждый, кто стремится попасть в IT, задается вопросом — какой язык программирования изучить? Все ищут универсальный ответ, который предопределит головокружительную карьеру. Да, до изобретения интернета и появления мобильных платформ можно было освоить один язык, написать на нем программу и быть востребованным разработчиком. Сегодня реалии таковы, что даже джуниорам предъявляется огромный список требований, среди которых — знание нескольких языков.

Судите сами: для веб-разработки неплохо бы владеть PHP, JavaScript, Python, Ruby, а еще HTML и CSS; в мобильной сфере — Swift, Objective-C, Java, C#. Перечень языков для создания десктопных приложений можно даже не начинать — по сути, все будут полезны. Именно поэтому мы взяли на себя ответственность назвать 5 языков программирования, которые надо изучить хотя бы шапочно, чтобы сегодня называться программистом.

Python

Python — пожалуй, самый простой язык программирования из нашего списка. Здесь минимум служебных символов, динамическая типизация, максимально понятный синтаксис. И если вы мало что поняли из прошлого предложения — это повод начать обучение именно с Python.

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


def fib_recursion(i):
	if i > 1:
   	 return fib_recursion(i-1) + fib_recursion(i-2)
	return i
            	
for i in range(10):
	print i, fib_recursion(i)

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

Стоит упомянуть, что на данный момент актуальны две версии: Python 2 и Python 3. Вам за основу лучше брать последнюю, так как поддержка Python 2, а значит — и активная разработка на ней, прекратится совсем скоро.

Кстати, для тех, кто решился изучать Python, мы подготовили список полезных и практичных советов.

JavaScript

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


function fib_recursion(n) {
   return n < 1 ? 0
    	: n <= 2 ? 1
    	: fib_recursion(n - 1) + fib_recursion(n - 2);
}
 
console.log(fib_recursion(10));

Объем кода практически не изменился, зато снизилась читаемость. После изучения Python вы без проблем разберетесь, как работает структура return, и оцените удобство именно такого способа записи.

Кроме того, экосистема JavaScript богаче, чем Python. Она предлагает обилие сред разработки, редакторов кода, фреймворков, библиотек. Это еще один шаг к пониманию, как работает «взрослое» программирование.

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

C#

Если вы не определились с языком, значит еще не решили, что вас привлекает: веб, мобильные или десктопные приложения. Тогда ваше решение — C#, универсальный инструмент для всех направлений разработки. Чтобы создавать десктопные приложения, понадобится Visual Studio (версия Community — бесплатная). Для мира мобильных устройств установите Xamarian, а для веба пригодится ASP.NET.

Взглянем на наш код на языке C#:


static void Main(string[] args)
{
	int number = 10;
	fib_recursion(number);
}
 
static void fib_recursion(int n, int a = 0, int b = 1)
{
	if (n == 0) return;
	Console.WriteLine(a);
	fib_recursion(--n, b, b+a);
}

Код вновь незначительно усложнился — это связано с использованием ключевого слова static. На этом этапе вы познакомитесь с грамотным использованием памяти, областями видимости данных и полностью погрузитесь в ООП. Ну, если не успели при знакомстве с JavaScript.

Подробней о языке C# вы можете узнать в нашей ознакомительной статье.

Swift

Подходим к самому интересному — языкам, безупречное владение которыми поможет вам попасть в сферу мобильной разработки. Swift не вполне универсален: он еще не полностью вытеснил Objective-C из приложений для Apple, но перспективы у него блестящие.

Четвертая версия Swift вышла в 2017 году: она содержит множество улучшений для работы со строками, коллекциями; возросла надежность и многое другое. Это уже не «сырой» язык, а классический представитель верхушки рейтинга TIOBE с планомерным развитием. С помощью Swift вы можете создавать приложения для всех продуктов Apple: macOS, watchOS, iOS и любой новой системы, если она появится.

Посмотрим на код последовательности Фибоначчи:


func fib_recursion(num1: Int, num2: Int, steps: Int) {
 
	if steps > 0 {
    	let newNum = num1 + num2
    	fib_recursion(num2, num2: newNum, steps: steps-1)
	}
	else {
    	print("result = \(num2)")
	}
}
fib_recursion(0, num2: 1, steps: 10)

Java

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

Кроме того, Java — великолепный язык, чтобы полноценно понять программирование: здесь реализованы все принципы ООП, организована работа с памятью и периферией, можно поупражняться с функциональным программированием.

А вот так выглядит Java-код нашей последовательности в простейшем императивном случае:


public class MainClass {
 
  public static long fib_recursion(long number) {
	if ((number == 0) || (number == 1))
  	return number;
	else
  	return fib_recursion(number - 1) + fib_recursion(number - 2);
  }
 
  public static void main(String[] args) {
	for (int counter = 0; counter <= 10; counter++)
  	System.out.printf("Fibonacci of %d is: %d\n", counter, fib_recursion(counter));
  }
}

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

Для тех, кто хочет начать быстрое освоение Java, наш педагог Сергей Ирюпин подготовил цикл вводных статей, которые мы постепенно публикуем в блоге:

Заключение

К списку можно было бы добавить ряд полезных языков вроде PHP, C++ или Ruby. Или несколько функциональных для общего развития: Lisp, Haskell, Clojure. Впрочем, до этого вы обязательно дойдете. Но сперва выбирайте специализацию, записывайтесь на курсы GeekBrains и осваивайте пять описанных must know языков.

UPD. Если вы хотите знать, как изменилась ситуация с языками программирования во второй половине 2019 года, мы подготовили об этом отдельный материал.

Какой язык программирования учить в 2020-м? / Блог компании JUG Ru Group / Хабр

Статей с подобными заголовками существует уже множество. Но в них постоянно какая-то дичь! Смотрите, Google ещё до основных результатов советует такое:

HCL, Карл! Язык, который не просто очень далёк от «Самых Популярных», но ещё и создан для конфигурации, так что его вообще странно ставить в один ряд с языками общего назначения. Страшно представить приключения новичка, который решит строить карьеру по таким советам. Начнём с того, что по запросу «как выучить HCL» вместо туториалов по языку вылезают тексты о соляной кислоте.

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

Оглавление

В чём проблемы

Тексты «какие языки учить» зачастую такие слабые, что опытные разработчики разнесли бы их в пух и прах, но опытные разработчики их просто не открывают. Их открывают новички, у которых нет компетенции, чтобы заметить подвох. В результате новички доверяют всякой ерунде, а проблемы в текстах остаются незамеченными и процветают. Что именно это за проблемы?

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

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

Однако также стоит учесть, что JavaScript – это один из наиболее популярных языков программирования. А это значит, что на него существует как достаточный спрос, так и огромное количество предложений. Поэтому если вы изучаете или хотите изучить этот язык, то постарайтесь максимально в нем разобраться и стать отличным специалистом».

Проблема вторая: закидывание читателя мелочами без объяснения главного.

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

А с текстами о языках происходит именно так. Похоже, когда кому-то ставят задачу написать про них, зачастую автор гуглит по пять случайных фактов про каждый и уверенно идёт за гонораром.

Пример: «Go использовался для создания Ethereum». Что, серьёзно, вот это самая важная информация про язык (когда речь идёт не о Solidity)? Вот она поможет сделать правильный выбор?

Проблема третья: сообщают вещи, которые начинающим попросту ничего не скажут.

Пример: «Недостатки Python: нет таких модификаторов доступа, как protected, private и public».

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

Проблема четвёртая: бездумное следование рейтингам популярности языков. «А-а-а, Go поднялся в индексе TIOBE на несколько строчек, срочно учим его!» Ну слушайте, а ещё по TIOBE получается, что обучающий язык Scratch обошёл Dart — и что теперь, дартовикам надо срочно перейти на детский язык, что ли?

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

Пример: «В некоторых списках Python фигурирует на 5-ом месте, в других его ставят на 2-ое».

Проблема пятая: за всем перечисленным порой забывают про области применения, а для новичков это может быть важнее всего. Представим, что школьница Василиса, которая каждый день пользуется кучей мобильных приложений, захотела сделать своё собственное. Какая ей тогда разница, какие модификаторы доступа у Python, кто кого обошёл в рейтингах и на чём написан Ethereum? Всё, что ей надо знать — на чём пишут для iOS и для Android.

Поэтому вот текст, который пробует от всего этого уйти:

Вступление

Дорогой читатель! В интернетах можно увидеть прорву дискуссий, где опытные разработчики спорят, какой язык лучше всех. Не надо вестись на это: лучшего нет. Разные лучше подходят для разных задач и людей.

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

Если хочется заниматься чем-то определённым — тогда важнее не теоретические сравнения языков, а то, какие используются конкретно в этой области. Часть информации об этом можно получить из текста ниже, но есть смысл и погуглить «what languages are used for %интересующая_область%».

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

А если нет ни спешки, ни определённого запроса, тогда спрошу так: есть ли потребность делать что-то такое, что пользователь видит глазами? Работа над веб-сервисами делится на фронтенд и бэкенд. Грубо говоря, фронтенд — это «что видно в браузере», а бэкенд — это «что выполняется далеко на сервере, чтобы фронтенду было что показывать». Когда пользователь нажимает на кнопку, её поведение прописал фронтендер — но если это кнопка «перейти к диалогу» и надо показать историю переписки, то дальше бэкенд извлечёт сообщения из базы данных на сервере.

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

А вот теперь можно читать про конкретные языки и решать, какой из них соотносится с личными целями. Расположил популярные языки по хронологии, в порядке их появления:

C (1972) и C++ (1985)

C++ изначально появился как развитие языка C, поэтому я объединил оба в одном пункте. Можно сказать, что это дедушка и отец остальных языков в этом списке: они здесь старше всех и очень повлияли на другие языки.

Сейчас они выглядят не точно так, как в момент появления (у C++ каждые три года принимают новый стандарт, недавно был принят C++20), и с годами всё сильнее различаются. Но идеи, заложенные ещё в начале, продолжают накладывать свой отпечаток. Когда создавался C, компьютеры были куда менее производительными, так что их ресурсы приходилось экономить куда старательнее. И тогда всё было «ближе к железу»: программирование в большей степени, чем сейчас, требовало понимать, как физически работает компьютер.

В результате теперь по сравнению с более современными языками у С и С++ репутация «хардкорных»: требовательных к программисту, зато позволяющих выжать из железа всё. И зачастую используют их как раз там, где действительно нужно выжимать как можно больше: например, в играх. Или в софте не для привычных компьютеров, а для различных других устройств, в которых зачастую маломощные процессоры — от автомобилей до банкоматов.

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

Python (1991)

В каком-то смысле Python — противоположность C: если там «сложно, зато производительно», то здесь «просто, зато к производительности есть вопросы».

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

Что же до производительности, то Python действительно проигрывает и C++, и многим другим языкам. Но порой его называют «медленным» презрительно, а вот это уже зря. Вспомним слова о том, что языки хороши или плохи не сами по себе, а применительно к задачам. Да, есть задачи, для которых Python не подойдёт — но есть и такие, где разница в скорости между ним и другим языком вообще не будет заметна. У Python есть свои области применения, для которых он достаточно хорош.

Что это за области? Ещё давно Python полюбили учёные — и теперь с его помощью занимаются такими околонаучными вещами, как машинное обучение и data science. В бэкенде веб-сервисов его тоже используют. Про образование уже сказано. А помимо разработки, его любят в системном администрировании — там он отлично подходит для мелких утилит.

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

JavaScript (1995)

Если в бэкенде разные языки активно конкурируют, то с фронтендом всё проще: там господствует JavaScript. Так что, если вам интересна конкретно эта область, выбор первого языка очевиден. А из-за такого доминирования востребованность языка гигантская, количество вакансий очень большое — так что с точки зрения трудоустройства это тоже хороший вариант.

JS считается относительно простым языком для обучения. Но стоит учесть, что во фронтенде сейчас почти никто не использует «просто JavaScript», нужно будет ещё освоить один из популярных фреймворков (а также научиться пользоваться инфраструктурой). И вот к ним нареканий о сложности заметно больше — так что по пути к карьере фронтендера боль может возникнуть на этом этапе.

При популярности JavaScript и у него, и у всей современной фронтенд-разработки хватает ненавистников. Кто-то говорит, что во фронтенде всё постоянно меняется и надо постоянно переучиваться вместо спокойной работы (правда, в 2020-м таких жалоб уже заметно меньше, пик остался в прошлом). Кто-то жалуется на странности в логике JS. Во многом такие оценки субъективные, их не назвать «правильными» или «неправильными» (одно и то же кого-то злит, а кого-то радует) — так что неизвестно, что будете ощущать лично вы.

Помимо фронтенда, JavaScript используют и в других областях (бэкенде, компьютерных программах, мобильных приложениях и не только), но в них он от господства далёк.

Java (1995)

Не стоит думать, что Java имеет какое-то отношение к JavaScript — хотя названия похожие и языки были представлены миру в один год, они совершенно разные, и сходство названий объясняется сугубо историческими причинами.

Java используется в первую очередь в бэкенде, и хотя не царит там безраздельно, как JS во фронтенде, позиции очень хорошие. Порой можно услышать пренебрежительное «да она уже устарела и вот-вот умрёт». Ну, во-первых, скажу так: эти слова звучат уже лет дцать, а она что-то никуда не делась. Мы в JUG Ru Group проводим конференции по разным языкам, и по Java получаются самые посещаемые, в прошлом году собралось больше 2000 участников — это никак не выглядит смертью.

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

Другая популярная претензия к Java — мол, она «скучная и многословная», и используют её скучные компании вроде банков, а какие-то другие языки позволяют реализовать то же выразительнее и лаконичнее, и их ценят в весёлых стартапах. Ну, тут всё тоже субъективно, как с JS: знаю многих людей, которые говорят о Java с огнём в глазах и видят в банковской разработке множество интересных задач, но если для кого-то скучно, с этим не поспоришь.

C# (2000)

Когда компания Microsoft представила C#, многие назвали это «ответом Microsoft на Java». Разумеется, между этими языками хватает различий (и за прошедшие 20 лет их число лишь увеличилось), но некоторая перекличка действительно есть, и знание любого из этих языков помогает быстрее освоить другой.

Изначально самая заметная разница была не в самих языках (в синтаксисе или рантайме), а в сферах их применения. Microsoft создал C# как часть своей платформы .NET, связанной с Windows. И если нужно было сделать программу для Windows, то напрашивающимся вариантом выглядел .NET. А вот если такую программу, чтобы запускалась и на Windows, и на Linux, и на Mac — тут могла помочь Java.

Но с годами ситуация изменилась: у .NET появилась новая версия .NET Core, уже не привязанная к конкретной операционной системе, а люди стали реже устанавливать программы на компьютер и больше делать в браузере. Это отчасти сблизило сферу применения языков: если посмотреть сейчас вакансии с названием C#, там, как и у Java, часто будет написано что-то вроде «Построение бэкенда для веб-приложений».

Впрочем, это не единственный вариант. В играх на движке Unity тоже используют C#, а это самый популярный движок в мире — так что в геймдеве язык тоже активно представлен (в отличие от Java).

Kotlin (2011)

Этот язык создала в Санкт-Петербурге компания JetBrains. Он совместим с Java, поэтому Java-проекты можно постепенно переводить на Kotlin: не переписывая всё разом, а постепенно добавляя туда Kotlin-код. И многие попробовавшие его Java-разработчики захотели к нему перейти, ощутив, что тут нет «скуки и многословности», всё выразительнее и современнее.

Пока что язык покорил одну конкретную область: разработку приложений для Android. Изначально их писали на Java, но в последние годы начался массовый переход к Kotlin, он стал новым индустриальным стандартом. Поскольку никто не хочет просто выбрасывать уже написанное раньше, сейчас во многих приложениях есть код и на Java, и на Kotlin, поэтому сегодня Android-разработчику желательно знать оба языка. Но похоже, что в будущем будет достаточно Kotlin — уже сейчас во многих Android-вакансиях упомянут только он.

JetBrains совершенно не хотят останавливаться на Android и метят с Kotlin в самые разные ниши, даже те, где не представлена Java. Каких-то успехов в этом компания добивается, с каждым годом язык становится популярнее, но от других вроде той же Java пока что сильно отстаёт, и насколько ещё ему получится вырасти — открытый вопрос. Так что, если учить Kotlin, в Android-разработке это точно очень пригодится, а в других областях — как повезёт.

Swift (2014)

Наконец, самый молодой язык из перечисленных — он был представлен меньше шести лет назад. Обычно за такое время языки не успевают стать достаточно популярными для попадания в такие списки. Но здесь ситуация особая: компания Apple, создавшая его, ясно дала понять, что теперь iOS-приложения надо писать на нём. А тут как Apple скажет — так и будет, свою платформу компания контролирует.

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

И в итоге выбор получается совсем простой. Хотите писать приложения для айфонов (ну или для Mac, Apple TV, Apple Watch) — учите Swift. Не хотите их писать — не учите Swift. Ну, если хотите делать приложения «для iOS и Android сразу», существуют ещё кроссплатформенные решения вроде Flutter, но они куда менее популярны.

Прочие языки

Молодые: Go, Dart, Rust и так далее

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

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

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

Высокооплачиваемые: Scala, F#, Haskell и так далее

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

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

Узкоспецифичные языки: SQL, HTML, Bash и так далее

Упомяну для полноты картины. До этого речь шла о языках общего назначения, на которых гипотетически можно писать что угодно. Но существуют ещё языки, используемые строго для конкретного круга задач. Например, SQL используется конкретно для работы с базами данных. И его знание вам может понадобиться «в дополнение» к вашему основному языку.

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

Заключение

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

И к этому посту почти наверняка появятся комментарии, что в нём многое некорректно, упущено что-то значимое и вообще надо было всё написать иначе.

Что если я заявляю «надо объяснять главные различия», то надо было обязательно рассказать про типизацию.

Что где-то я забыл упомянуть важнейшую область применения.

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

А напоследок хочу обратиться к опытным разработчикам с минуткой рекламы. Несмотря на личные предпочтения, я старался в этом тексте не ставить никакой язык выше другого. Тот же подход у компании JUG Ru Group, где я работаю: мы проводим конференции по самым разным языкам и темам (от JS и .NET до тестирования и devops).

И этим летом в наших онлайн-конференциях поучаствуют такие люди, как создатель C++ Бьярне Страуструп и создатель Java Джеймс Гослинг. А ещё будет создатель Stack Overflow Джоэл Спольски — поскольку на SO задают вопросы о самых разных языках, то и ему самому наверняка захотят задать вопрос самые разные разработчики. В общем, на каком бы языке вы ни писали, вероятно, среди этих конференций есть интересные для вас — рекомендую сходить на сайт и проверить лично.

Формальные языки и грамматики / Хабр

Мотивация

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

Этот текст задуман как популярное введение в теорию формальных языков и грамматик. Эта теория считается (и, надо сказать, справедливо) довольно сложной и запутанной. На лекциях студенты обычно скучают и экзамены тем более не вызывают энтузиазма. Поэтому и в науке не так много исследователей в этой тематике. Достаточно сказать, что за все время, с зарождения теории формальных грамматик в середине 50-х годов прошлого века и до наших дней, по этому научному направлению было выпущено всего две докторских диссертации. Одна из них была написана в конце 60-х годов Алексеем Владимировичем Гладким, вторая уже на пороге нового тысячелетия — Мати Пентусом.

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

Формальные языки

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

Чтобы лучше разобраться в том, как именно изучаются формальные языки, необходимо сначала понять, в чем заключаются особенности математических методов изучения. Согласно Колмогорову и др. (Александров А.Д., Колмогоров А.Н., Лаврентьев М.А. Математика. Ее содержание, методы и значение. Том 1. М.: Издательство Академии Наук СССР, 1956.), математический метод, к чему бы он ни применялся, всегда следует двум основным принципам:

  1. Обобщение (абстрагирование). Объекты изучения в математике — это специальные сущности, которые существуют только в математике и предназначены для изучения математиками. Математические объекты образуются путем обобщения реальных объектов. Изучая какой-нибудь объект, математик замечает только некоторые его свойства, а от остальных отвлекается. Так, абстрактный математический объект «число» может в реальности обозначать количество гусей в пруду или количество молекул в капле воды; главное, чтобы о гусях и о молекулах воды можно было

    говорить как о совокупностях. Из такой «идеализации» реальных объектов следует одно важное свойство: математика часто оперирует бесконечными совокупностями, тогда как в реальности таких совокупностей не существует.
  2. Строгость рассуждений. В науке принято для выяснения истинности того или иного рассуждения сверять их результаты с тем, что существует в действительности, т.е. проводить эксперименты. В математике этот критерий проверки рассуждения на истинность не работает. Поэтому выводы не проверяются экспериментальным путем, но принято доказывать их справедливость строгими, подчиняющимися определенным правилам, рассуждениями. Эти рассуждения называются доказательствами и доказательства служат единственным способом обоснования верности того или иного утверждения.

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

В качестве известного примера такой математической абстракции можно привести модель, известную под неблагозвучным для русского уха названием «мешок слов». В этой модели исследуются тексты естественного языка (т.е. одного из тех языков, которые люди используют в процессе повседневного общения между собой). Основной объект модели мешка слов — это слово, снабженное единственным атрибутом, частотой встречаемости этого слова в исходном тексте. В модели не учитывается, как слова располагаются рядом друг с другом, только сколько раз каждое слово встречается в тексте. Мешок слов используется в машинном обучении на основе текстов в качестве одного из основных объектов изучения.

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

Алфавит представляет собой конечное непустое множество элементов. Эти элементы будем называть символам. Для обозначения алфавита обычно будем использовать латинское V, а для обозначения символов алфавита — начальные строчные буквы латинского алфавита. Например, выражение V = {a,b} обозначает алфавит из двух символов a и b.

Цепочка представляет собой конечную последовательность символов. Например, abc — цепочка из трех символов. Часто при обозначении цепочек в символах используют индексы. Сами цепочки обозначают строчными символами конца греческого алфавита. Например, omega = a1...an — цепочка из n символов. Цепочка может быть пустой, т.е. не содержать ни одного символа. Такие цепочки будем обозначать греческой буквой эпсилон.

Наконец, формальный язык L над алфавитом V — это произвольное множеств цепочек, составленных из символов алфавита V. Произвольность здесь означает тот факт, что язык может быть пустым, т.е. не иметь ни одной цепочки, так и бесконечным, т.е. составленным из бесконечного числа цепочек. Последний факт часто вызывает недоумение: разве имеются реальные языки, которые содержат бесконечное число цепочек? Вообще говоря, в природе все конечно. Но мы здесь используем бесконечность как возможность образования цепочек неограниченной длины. Например, язык, который состоит из возможных имен переменных языка программирования C++, является бесконечным. Ведь имена переменных в C++ не ограничены по длине, поэтому потенциально таких имен может быть бесконечно много. В реальности, конечно, длинные имена переменных не имеют для нас особого смысла т.к. к концу чтения такого имени уже забываешь его начало. Но в качестве потенциальной возможности задавать неограниченные по длине переменные, это свойство выглядит полезным.

Итак, формальные языки — это просто множества цепочек, составленных из символов некоторого конечного алфавита. Но возникает вопрос: как можно задать формальный язык? Если язык конечен, то можно просто выписать все его цепочки одну за другой (конечно, можно задуматься, имеет ли смысл выписывать цепочки языка, имеющего хотя бы десять тысяч элементов и, вообще, есть ли смысл в таком выписывании?). Что делать, если язык бесконечен, как его задавать? В этот момент на сцену выходят грамматики.

Формальные грамматики

Способ задания языка называет грамматикой этого языка. Таким образом, грамматикой мы называем любой способ задания языка. Например, грамматика L = {a^nb^n} (здесь n — натуральное число) задает язык L, состоящий из цепочек вида ab, aabb, aaabbb и т.д. Язык L представляет собой бесконечное множество цепочек, но тем не менее, его грамматика (описание) состоит всего из 10 символов, т.е. конечна.

Назначение грамматики — задание языка. Это задание обязательно должно быть конечным, иначе человек не будет в состоянии эту грамматику понять. Но каким образом, конечное задание описывает бесконечные совокупности? Это возможно только в том случае, если строение всех цепочек языка основано на единых принципов, которых конечное число. В примере выше в качестве такого принципа выступает следующий: «каждая цепочка языка начинается с символов a, за которыми идет столько же символов b». Если язык представляет собой бесконечную совокупность случайным образом набранных цепочек, строение которых не подчиняется единым принципам, то очевидно для такого языка нельзя придумать грамматику. И здесь еще вопрос, можно или нет считать такую совокупность языком. В целях математической строгости и единообразия подхода обычно такие совокупности языком считают.

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

Такие парадигмы описания грамматик называют синтаксическими теориями. Формальная грамматика — это математическая модель грамматики, описанная в рамках какой-то синтаксической теории. Таких теорий придумано довольно много. Самый известный метаязык для задания грамматик — это, конечно, порождающие грамматики Хомского. Но имеются и другие формализмы. Один из таких них — окрестностные грамматики, будет описан чуть ниже.

С алгоритмической точки зрения грамматики можно подразделить по способу задания языка. Имеются три основных таких способа (вида грамматик):

  • Распознающие грамматики. Такие грамматики представляют собой устройства (алгоритмы), которым на вход подается цепочка языка, а на выходе устройство печатает «Да», если цепочка принадлежит языку, и «Нет» — в противном случае.
  • Порождающие грамматики. Этот вид устройств используется для порождения цепочек языков по требованию. Образно говоря, при нажатии кнопки будет сгенерирована некоторая цепочка языка.
  • Перечисляющие грамматики. Такие грамматики печатают одну за другой все цепочки языка. Очевидно, что если язык состоит из бесконечного числа цепочек, то процесс перечисления никогда не остановится. Хотя, конечно его можно остановить принудительно в нужный момент времени, например, когда будет напечатана нужная цепочка.

Интересным представляет вопрос о преобразовании видов грамматики друг в друга. Можно ли, имея порождающую грамматику, построить, скажем, перечисляющую? Ответ — да, можно. Для этого достаточно генерировать цепочки, упорядочив их, скажем по длине и порядку символов. Но превратить перечисляющую грамматику в распознающую в общем случае нельзя. Можно использовать следующий метод. Получив на вход цепочку, запустить процесс перечисления цепочек и ждать, напечатает ли перечисляющая грамматика эту цепочку или нет. Если такая цепочка напечатана, то заканчиваем процесс перечисления и печатаем «Да». Если цепочка принадлежит языку, то она обязательно будет напечатана и, таким образом, распознана. Но, если цепочка не принадлежит языку, то процесс распознавания будет продолжаться бесконечно. Программа распознающей грамматики зациклится. В этом смысле мощность распознающих грамматик меньше мощности порождающих и перечисляющих. Это следует иметь ввиду, когда сравнивают порождающие грамматики Хомского и распознающие машины Тьюринга.

Окрестностные грамматики

В середине 60-х годов советский математик Юлий Анатольевич Шрейдер предложил простой способ описания синтаксиса языков на основе т.н. окрестностных грамматик. Для каждого символа языка задается конечное число его «окрестностей» — цепочек, содержащих данный символ (центр окрестности) где-то внутри. Набор таких окрестностей для каждого символа алфавита языка называется окрестностной грамматикой. Цепочка считается принадлежащей языку, задаваемому окрестностной грамматикой, если каждый символ этой цепочки входит в нее вместе с некоторой своей окрестностью.

В качестве примера рассмотрим язык A = {a+a, a+a+a, a+a+a+a,...}. Этот язык представляет собой простейшую модель языка арифметических выражений, где роль чисел играет символ «a», а роль операций — символ «+». Составим для этого языка окрестностную грамматику. Зададим окрестности для символа «a». Символ «a» может встречаться в цепочках языка A в трех синтаксических контекстах: вначале, между двумя символами «+» и в конце. Для обозначения начала и конца цепочки введем псевдосимвол «#». Тогда окрестности символа «a» будут следующими: #a+, +a+, +a#. Обычно для выделения центра окрестности этот символ в цепочке подчеркивается (ведь в цепочке могут быть и другие такие символы, которые не являются центром!), здесь этого делать не будем за неимением простой технической возможности. Символ «+» встречается только между двух символов «a», поэтому для него задается одна окрестность, цепочка a+a.

Рассмотрим цепочку a+a+a и проверим, принадлежит ли она языку. Первый символ «a» цепочки входит в нее вместе с окрестностью #a+. Второй символ «+» входит в цепочку вместе с окрестностью a+a. Подобное вхождение можно проверить и для остальных символов цепочки, т.е. данная цепочка принадлежит языку, как и следовало ожидать. Но, например, цепочка a+aa языку A не принадлежит, поскольку последний и предпоследний символы «a» не имеют окрестностей, с которыми они входят в эту цепочку.

Не всякий язык может быть описан окрестностной грамматикой. Рассмотрим, например, язык B, цепочки которого начинаются либо с символа «0», либо с символа «1». В последнем случае далее в цепочке могут идти символы «a» и «b». Если же цепочка начинается с нуля, то далее могут идти только символы «a». Нетрудно доказать, что для этого языка нельзя придумать никакой окрестностной грамматики. Легитимность вхождения символа «b» в цепочку обусловлена ее первым символом. Для любой окрестностной грамматики, в которой задается связь между символами «b» и «1» можно будет подобрать достаточно длинную цепочку, чтобы всякая окрестность символа «b» не доставала до начала цепочки. Тогда в начало можно будет подставить символ «0» и цепочка будет принадлежать языку A, что не отвечает нашим интуитивным представлениям о синтаксическом строении цепочек этого языка.

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

Можно сказать, что шрейдеровские языки задают одно простое синтаксическое отношение — «быть рядом» или отношение непосредственного предшествования. Отношение дальнего предшествования (которое, очевидно, присутствует в языке B) окрестностной грамматикой задано быть не может. Но, если визуализировать синтаксические отношения в цепочках языка, то для диаграмм отношений, в которые превращаются такие цепочки, можно придумать окрестностную грамматику.

Базовый английский


Базовые уроки английского языка, которые помогут вам изучить основы английского языка

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

Просмотреть все уроки базового английского нажмите на эту ссылку, чтобы просмотреть все уроки базового английского

Базовые уроки английского

Чтобы выбрать урок, щелкните по ссылкам в левой части списка.

** Эти уроки включены в базовый уровень 1 **

Список всех уроков английского

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

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

Изучение базового английского

Learning Basic English with Easy Pace Learning

Learning English basics lesson

Изучение базового английского языка — справка и поддержка

Если урок кажется трудным или вы испытываете затруднения, свяжитесь с нами или воспользуйтесь форумом, чтобы оставить сообщение, и мы поможем вам, чем сможем.

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

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

Онлайн-словарь Easy pace Learning и как пользоваться словарями

Щелкните следующую ссылку, чтобы открыть онлайн-словарь английского языка — урок английского языка, если вы не уверены в словах.

Учителя и студенты, не стесняйтесь спрашивать об уроке, если вы не видите его на желаемом веб-сайте.Отправьте сообщение, и обычно в течение 2 дней мы добавим его на сайт.


английских книг, чтобы скачать бесплатно

Скачать БЕСПЛАТНО словари в pdf

.

Самый быстрый способ выучить новый язык за 8 простых шагов

Хотите поторопиться со всем этим «изучением нового языка»?

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

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

Или так, чтобы вы могли читать свой любимый роман на том языке, на котором он был впервые написан.

Какой бы ни была причина для изучения нового языка, вы, вероятно, согласитесь, что было бы идеально выучить его быстро .

Однако идея изучения языка, особенно когда вы изучаете его с нуля, кажется совсем не быстрой: вам придется выучить новую грамматику, запомнить словарные слова, попрактиковаться в разговорной речи…

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

Выполните эти восемь шагов, и вы будете на пути к овладению этим новым языком быстрее, чем вы могли себе представить!

Загрузить: Эта запись в блоге доступна в виде удобного портативного PDF-файла.
можно взять куда угодно.Щелкните здесь, чтобы получить копию. (Загрузить)

Learn a foreign language with videos

1. Установите цели изучения языка.

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

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

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

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

  • Сосредоточьтесь на конкретных, ощутимых результатах. Установите подробные цели и сосредоточьтесь на том, что вы планируете изучать, а не на том, сколько времени вы планируете изучать. Примером хорошей цели может быть: «На этой неделе я собираюсь выучить 30 испанских слов, связанных с покупками.”
  • Ставьте краткосрочные цели. Хорошо иметь конечную цель — то, чего вы в конечном итоге надеетесь достичь. Но долгосрочные цели слишком сложны, чтобы мотивировать вас каждый день. Разбейте конечную цель на более мелкие части и ставьте более мелкие цели на каждую неделю или месяц.
  • Испытайте себя (но не слишком много). Цели работают лучше всего, когда они заставляют вас двигаться вперед. Но если они слишком устрашающие, они действительно могут вас отпугнуть.Хороший способ обойти это — ставить цели с диапазоном результатов . Например, вы можете сказать: «Я хочу выучить 30–50 новых словарных слов на этой неделе». Меньшее число в этом диапазоне помогает вам почувствовать, что цель достижима, а большее число позволяет вам подтолкнуть себя.
  • Запишите свои цели. Записывание целей помогает вам придерживаться их. Разместите свои цели на видном месте, например, в зеркале в ванной или на главном экране смартфона.

2. Учите «правильные» слова.

Языки состоят из поразительного количества слов. В английском, например, от 600 000 до 1 миллиона слов.

К счастью, вам не нужно выучить столько слов, чтобы владеть языком. Подумайте: первых 100 слов составляют примерно 50 процентов текстов на английском языке, а первые 1000 слов составляют примерно 90 процентов !

Ознакомьтесь с этими списками из 1000 самых популярных слов на этих языках:

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

3. Учись умно.

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

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

Когда вы учитесь с помощью карточек, следуйте этим советам, чтобы учиться быстро:

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

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

  • Обязательно угадывайте значение слова перед тем, как переворачивать карточку. Карточки работают лучше всего, когда вы используете их для проверки памяти, поэтому не торопитесь переворачивать карточки. Даже если вы не знаете ни слова, сделайте предположение.
  • Сначала выучите перевод, а затем научитесь составлять новые слова. Легче выучить перевод иностранного слова, чем научиться произносить иностранное слово, когда вы видите его английский эквивалент. Начните с того, что посмотрите на сторону карточки, на которой написано иностранное слово, и запомните английский перевод. Позже переверните карточки и используйте их, чтобы попрактиковаться в произношении иностранных слов, когда увидите их английские эквиваленты.

Практика делает совершенство, но эффективная практика делает совершенство еще быстрее!

Еще несколько отличных стратегий для объединения новых слов вместе с карточками и за их пределами:

  • Визуализируйте и озвучивайте. Визуализируйте изучаемое слово, представьте образ того, что оно представляет, и произнесите новое слово вслух. Это поможет вам соединить концепции и может улучшить запоминание.
  • Жест. Мозг учится лучше, когда вы используете физические действия во время обучения. Воспользуйтесь этим, жестикулируя. Если вы хотите выучить немецкое слово Schuh (обувь), произнесите это слово, притворившись, что надеваете обувь.
  • Используйте FluentU. FluentU обеспечивает уникальное обучение в контексте, которое выходит далеко за рамки обычных карточек.

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

С FluentU вы слышите языков в реальном контексте — так, как их на самом деле используют носители языка.

Просто беглый взгляд даст вам представление о разнообразии предлагаемых на FluentU видеороликов:

fastest-way-to-learn-a-new-language

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

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

fastest-way-to-learn-a-new-language

Получите доступ к полной интерактивной расшифровке каждого видео на вкладке Dialogue и легко просматривайте слова и фразы из видео в разделе Vocab.

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

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

Начните использовать FluentU на веб-сайте со своего компьютера или планшета или, что еще лучше, загрузите приложение FluentU из магазина iTunes или магазина Google Play.

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

4. Начните использовать язык весь день, каждый день.

Для новичка может показаться сложным пытаться использовать язык весь день, но это не так сложно, как кажется. Есть много простых и даже забавных способов сделать язык частью вашей повседневной жизни.

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

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

Существует множество онлайн-ресурсов для доступа к развлекательным аудио- и видеоклипам.Вы можете зайти на YouTube, найти радиостанции, доступные в Интернете, или использовать FluentU.

Вы можете спросить: «Как я могу смотреть видео или слушать радио, если я знаю только несколько слов?»

Цель, когда вы начинаете, состоит не в том, чтобы понять все, что вы слышите, а в том, чтобы познакомиться со звуками языка. Даже если вы не понимаете большую часть того, что слышите, простое слушание может иметь множество положительных эффектов, в том числе:

  • Привыкание к ритму речи.
  • Учимся определять и понимать общие слова.
  • Учимся понимать, используя только контекст и несколько родственных слов.
  • Сохраняйте мотивацию!

5. Найдите практическую практику.

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

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

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

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

  • Встречайтесь с языковым партнером еженедельно или раз в две недели. Вы можете заплатить своему языковому партнеру за его или ее время или предложить обменять один час практики на языке, который вы хотите выучить, на час практики разговорного английского.
  • Вступите в разговорный клуб. Во многих городах и школах есть разговорные клубы, где студенты, изучающие иностранные языки, регулярно встречаются, чтобы практиковаться в неформальных дискуссиях на их изучаемом языке.
  • Воспользуйтесь сайтом онлайн-репетиторов или партнерским языковым сайтом. таких сайтов, как Coeffee.com или My Language Exchange могут познакомить вас с людьми, говорящими на том языке, который вы хотите практиковать. Даже если вы не видите их лично, вы можете практиковаться в реальной жизни, общаясь в чате.
  • Станьте волонтером с иммигрантами в вашем городе. Найдите возможности волонтерства на таких сайтах, как VolunteerMatch или Idealist, или напрямую свяжитесь с организациями, которые обслуживают иммигрантов, говорящих на языке, который вы хотите выучить.
  • Посетите предприятия, где люди говорят в основном на вашем целевом языке. Возможно, поблизости есть мексиканский ресторан, где вы сможете насладиться вкусной едой и попрактиковаться в испанском с официантами или владельцами, или, возможно, вы можете попрактиковаться в китайском в продуктовом магазине, который продает еду местной китайской общине.

6. Узнайте о культуре.

Понимание языка — это больше, чем понимание слов на странице. Важно узнать о культуре и истории, связанных с этими словами.

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

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

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

7. Проверьте себя.

Информация о том, что вы планируете пройти тест, — отличный способ мотивировать себя учиться быстрее.

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

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

Тест ACTFL OPI популярен во многих языковых кругах и пользуется большим уважением. Он проверяет уровень устной речи и дает оценку вашего уровня от «Низкий для новичка» до «Превосходный».

Для некоторых языков также есть стандартизированные тесты для этого языка, например JLPT для японского или HSK для китайского. Спросите учителей или специалистов, знающих язык, какие тесты они рекомендуют.

8. Удачи!

Мы стараемся учиться лучше всего, когда развлекаемся, поэтому не забывайте делать изучение языка увлекательным.

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

Вы также можете сосредоточить свое обучение на том, что вам интересно, например на любимом хобби.

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

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

Наконец, найдите друзей, которые говорят на вашем изучаемом языке или заинтересованы в его изучении. Языки не следует изучать в вакууме! Социальные мероприятия и разговоры в реальной жизни — вот что делает изучение языка интересным и полезным.

Старайтесь разговаривать с людьми и узнавать больше об их жизни и культуре.

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

Загрузить: Эта запись в блоге доступна в виде удобного портативного PDF-файла.
можно взять куда угодно.Щелкните здесь, чтобы получить копию. (Загрузить)

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

Зарегистрируйтесь бесплатно!

.

Обработка естественного языка: от основ до использования RNN и LSTM | by vibhor nigam

Подробное введение во все концепции, распространенные в мире обработки естественного языка

vibhor nigam

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

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

Прежде чем мы углубимся в это, необходимо понять основы

Что такое язык?

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

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

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

Как компьютеры понимают язык?

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

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

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

Классификация — это, по сути, отнесение фрагмента текста к категории, а при переводе этот фрагмент преобразуется на любой другой язык.

Что такое обработка естественного языка?

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

Изучение обработки естественного языка существует уже более 50 лет и выросло из области лингвистики с появлением компьютеров. [1]

Подробное руководство по основам НЛП можно найти на сайте

Базовые преобразования

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

Токенизация, стемминг и леммитизация

Токенизация — это процесс разбиения текста на слова. Токенизация может произойти для любого символа, однако наиболее распространенный способ токенизации — это сделать это для символа пробела.

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

Лемматизация выполняет словарный и морфологический анализ слова и обычно направлена ​​только на удаление флективных окончаний. Флективное окончание — это группа букв, добавленных в конец слова, чтобы изменить его значение. Примерно флективных окончаний : -s. летучая мышь. летучие мыши.

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

N-граммы

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

Например, рассмотрим предложение: « Обработка естественного языка необходима для информатики.

Модель 1-грамм или unigram преобразует предложение в однословные комбинации и, таким образом, на выходе будет« Natural, Language, Processing, is, essential, to, Computer, Science »

Модель биграммы , с другой стороны, будет токенизировать ее в комбинацию из 2 слов каждое, и на выходе будет « Natural Language, Language Processing, Processing is, is, essential, important to, Computer, Computer Science »

Точно так же модель триграммы разбивает его на «Обработка естественного языка, Обработка языка есть, Обработка необходима, необходима, необходима для компьютера, для информатики», и модель n-грамм, таким образом, токенизирует предложение в комбинацию n слова вместе.

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

Одним из наиболее распространенных методов достижения этого в представлении пакета слов является tf-idf

TF-IDF

TF-IDF — это способ оценки словарного запаса, чтобы обеспечить адекватный вес для слово пропорционально влиянию, которое оно оказывает на значение предложения.Оценка представляет собой произведение двух независимых оценок: частоты термина (tf) и обратной частоты в документе (idf).

Изображение предоставлено — Google

Частота термина (TF): Частота термина определяется как частота слова в текущем документе. .

Частота обратных документов (IDF): это мера того, сколько информации предоставляет слово, то есть является ли оно общим или редким во всех документах. Он рассчитывается как журнал (N / d), где N — общее количество документов, а d — количество документов, в которых встречается это слово.

Горячее кодирование

Горячее кодирование — это еще один способ представления слов в числовой форме. Длина вектора слов равна длине словаря, и каждое наблюдение представлено матрицей со строками, равными длине словаря, и столбцами, равными длине наблюдения, со значением 1, где слово словарный запас присутствует в наблюдении и нулевое значение там, где его нет.

Изображение предоставлено — Джон Крон (выбрано через поиск в Google)

Вложения слов

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

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

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

Каждое слово представлено в пространстве характеристик (Пол, Королевство, Возраст, Еда) и т. Д.

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

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

Мешок слов

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

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

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

Ниже приведен пример модели мешка слов для выборки статей из медицинских журналов

Pictrue Credit -Google

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

Однако у этого представления есть два основных недостатка:

  1. Он игнорирует порядок / грамматику текста и, таким образом, теряет контекст, в котором используется слово
  2. Матрица, сгенерированная этим представлением, очень sparse и более тяготеют к наиболее употребительным словам.Подумайте об этом, алгоритмы в первую очередь работают над подсчетом слов, тогда как в языке важность слова на самом деле обратно пропорциональна частоте их появления. Слова с более высокой частотой встречаемости — это более общие слова, такие как, is, an, которые существенно не меняют значение предложения. Таким образом, становится важным правильно взвесить слова, чтобы отразить их адекватное влияние на значение предложения.

Матрица вложения

Матрица вложения — это способ представления вложений для каждого слова, присутствующего в словаре.Строки представляют размеры пространства для вложения слов, а столбцы представляют слова, присутствующие в словаре.

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

Следует иметь в виду, что здесь горячая кодировка просто относится к n-мерному вектору со значением 1 в позиции слова в словаре, где n — длина словаря.Эти горячие кодировки взяты из словаря, а не из серии наблюдений.

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

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

RNN обрабатывает каждое слово предложения как отдельный ввод, происходящий во время «t», и также использует значение активации в «t-1» в качестве ввода в дополнение к вводу в момент «t». На схеме ниже показана подробная структура архитектуры RNN.

Описанная выше архитектура также называется архитектурой «многие ко многим» с (Tx = Ty) i.е. количество входов = количество выходов. Такая структура весьма полезна при моделировании последовательности.

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

  1. Многие к одному RNN : Архитектура «многие к одному» относится к архитектуре RNN, в которой много входов (Tx) используются для получения одного выхода (Ty). Подходящим примером использования такой архитектуры будет задача классификации .

Изображение предоставлено — Google

На изображении выше H представляет результат функции активации.

2. Один ко многим RNN : Архитектура «один ко многим» относится к ситуации, когда RNN генерирует серию выходных значений на основе одного входного значения. Ярким примером использования такой архитектуры будет задача создания музыки , где вводом является jounre или первая нота.

Изображение предоставлено — Google

3. Архитектура «Многие ко многим» (Tx не равно Ty): эта архитектура относится к тому, где многие входные данные считываются для получения большого количества выходных данных, где длина входов не равна длине выходных данных.Ярким примером использования такой архитектуры является машинного перевода задач.

Picture Credit — Google

Encoder относится к части сети, которая читает предложение для перевода, а Decoder — это часть сети, которая переводит предложение на желаемый язык.

Ограничения RNN

Помимо всей своей полезности, RNN имеет определенные ограничения, основными из которых являются:

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

Оба эти ограничения приводят к появлению новых типов архитектур RNN, которые обсуждаются ниже.

Стробируемый рекуррентный блок

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

Изображение предоставлено Google

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

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

Для более подробного объяснения можно обратиться к https://towardsdatascience.com/understanding-gru-networks-2ef37df6c9be

LSTM

В архитектуре LSTM вместо одного шлюза обновления, как в GRU, есть ворота обновления и ворота забыть.

Эта архитектура дает ячейке памяти возможность сохранить старое значение в момент времени t-1 и добавить к нему значение в момент времени t.

Более подробное объяснение LSTM доступно по адресу http://colah.github.io/posts/2015-08-Understanding-LSTMs/

Двунаправленный RNN

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

Двунаправленная RNN состоит из прямой и обратной рекуррентной нейронной сети, и окончательное прогнозирование выполняется с объединением результатов обеих сетей в любой момент времени t, как можно увидеть на изображении.

.

Преподавание английского языка от 0: Как дать абсолютному новичку быстрый старт

Вы немного опоздали на свой первый урок ESL.

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

Они могут болтать между собой и медленно замолкают.

Они могут не разговаривать на одном языке, и вы сталкиваетесь с общим молчанием.

Вы улыбаетесь и говорите «Доброе утро».

Вы встречаетесь с невыразительными лицами.

Никто не понял ни одного вашего слова, а вы сказали только два слова!

У вас класс абсолютных новичков.

Загрузить: Эта запись в блоге доступна в виде удобного портативного PDF-файла, который вы можете
можно взять куда угодно. Щелкните здесь, чтобы получить копию. (Загрузить)

Learn a foreign language with videos

The Challenge of Teaching English from 0

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

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

Как вы собираетесь преподавать язык, если вы не можете общаться со своими учениками?

Что ж, не все потеряно. Утешайте себя, зная, что вы не первый преподаватель ESL / EFL, которому пришлось столкнуться с этой проблемой.Вот где вам действительно интересно: обучать начинающих — сложная задача, но она, несомненно, обогатит ваш опыт преподавания английского языка.

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

Нажмите здесь, чтобы присоединиться к нашей команде!

Когда вы встретите абсолютных новичков в английском?

Есть много ситуаций, в которых вы можете обучать абсолютных новичков:

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

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

Независимо от демографической группы в вашем классе, есть некоторые основы, которые нужно помнить, которые помогут вам начать обучение этим ученикам.

Ваша цель? Заставьте их говорить и поверить: «Я хорошо говорю по-английски».

Эти основы делятся на четыре основные категории: Физический язык , мысленный язык , разговорный язык и, наконец, общий язык .

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

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

1. Физический язык

Самое раннее наше общение — это невербальный язык, который понимают наши матери, отцы, братья и сестры.

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

Как: использовать жесты перед словами

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

Прежде чем «обременять» класс устными командами вроде «подожди», «успокойся, пожалуйста» и «открой книги», потратьте пару дней, используя только жесты .

Вы можете легко установить жесты, чтобы обозначить базовое поведение в классе:

  • Открытая ладонь, слегка выдвинутая вперед, означает «подождите».
  • Пальцы к губам означает «успокоиться».
  • Открытие воображаемой книги.
  • Запись на воображаемом листе бумаги.

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

Точно так же вы можете попробовать следующую игру в первых нескольких классах.

Упражнение: пантомима

Вам понадобятся:

  • Короткие видеоролики с обычными повседневными ситуациями

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

Это «молчаливое обращение» подобно тому, как сказать «нет» ребенку или мужу: это, скорее всего, заставит их сделать прямо противоположное этому «нет», а именно высказаться открыто — и это именно то, что вы от них хотите. делать!

Итак, вот что нужно делать.

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

Это упражнение можно использовать при знакомстве с любым языком.

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

В конце презентации каждой пары научите своих учеников безмолвным аплодисментам: покажите им руки вверх, ладонями наружу и покачивайте из стороны в сторону.Поаплодируйте беззвучно, когда каждая пара закончит воспроизведение!

Как: объединить язык тела со смыслом

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

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

Для начала попробуйте песню «Если ты счастлив и знаешь это».

Задание: Если вы счастливы и знаете это

Вам понадобятся:

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

Без песни потяни карточку эмоций. Воспроизведите соответствующее движение.

Спойте соответствующую строчку, например:

«Если ты злишься и знаешь, что топчет ногами!»

Когда ученики выполнили действие, остановитесь и переходите к следующей карточке.

Как видно из этой версии, каждое действие накапливается и повторяется перед переходом к следующему действию.

Задание: показать или рассказать

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

Им нужно будет показать , чтобы показать .

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

Показывать, но не рассказывать!

Вам понадобится:

  • Карточки с вещами: мяч, книга, удочка, кот.
  • Таймер яйца для ограничения поворотов одной или двумя минутами.

Вытащите одного ученика вперед. Предложите им выбрать карточку, которую видят только они.

Этот студент имитирует действие с вещью, которую он хочет.

Студенты поднимают руки, и пантомима зовет их по очереди.

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

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

Поддерживайте динамику этого занятия, ограничивая время на пантомиму и ответ до одной или двух минут.

Как: использовать полную физическую реакцию (TPR)

TPR кажется последней модой в методах обучения языку.Как правило, за этим методом стоит верная идея о том, что соединение языка со связанным физическим движением помогает как в понимании, так и в усвоении этого языка.

При соответствующем обучении вы, возможно, сможете основать весь свой метод обучения на TPR.

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

В том же духе, вот забавная вариация известной игры «Саймон говорит»:

Задание: Саймон не говорит

Вам понадобится:

  • Карточки с активными глаголами: прыгать, сидеть, гулять, смеяться, хлопать.
  • В колоду замешано несколько красных «молчаливых» карт.

Вытащите карточку из стопки и скажите: «Саймон говорит, ешьте!» Все должны есть.

Продолжайте, пока не дойдете до «тихой» карты. Следующую карту вы не скажете, а скорее покажете.

Учащиеся должны выкрикивать слово, обозначающее действие.

В качестве альтернативы можно поместить студентов в круг и дать каждому из них по очереди разыграть то, что говорит Саймон. Когда появится молчаливая карточка, быстро переходите от ученика к ученику, пока один из них не произнесет правильный глагол действия.Этот ученик становится Саймоном.

2. Психологический язык

Практическое руководство. Обработка до начала производства

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

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

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

Активность: Какой аукцион вы хотите?

Вам потребуется:

Затем приведите задание в действие:

  • Раздайте фиксированное количество теста каждому ученику.
  • Вытащите предмет из пакета с реквизитом, поднесите его вверх, чтобы увидеть, и опишите его, не говоря, что это такое. .
  • Начните аукцион с вопроса «Кто предложит 100 долларов за эту [вещь]?»
  • Студенты называют все увеличивающиеся суммы, которые они готовы заплатить за предмет.
  • Быстро перемещайте ставки, продавайте «вещь», но не передавайте ее, пока тот, кто предложит самую высокую цену, не сможет назвать «вещь».
  • Спросите: «Вы хотите?» и ученик отвечает «да» или «да, я хочу это».”

Как: демонстрация и повторение

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

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

Тем не менее, есть способы, которыми этот вид деятельности может быть включен в класс ESL, не вводя ваших учеников в транс. Попробуй это!

Действие: Это самолет, он большой, это большой самолет

Вам понадобится:

большой самолет / маленький самолет

красивая женщина / уродливый мужчина

полный стакан / пустой стакан

  • Гитара или арфа для игры на нескольких аккордах.

Начните с «Это» (или «Это»!). Пролистайте всю страницу, отмечая время, 1-2 хлопайте в ритме:

Это плоскость . Это самолет . Она мужчина или человек. Он человек .

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

Это большое . Это маленький . Она красавица красивая. Он грн св.

Несколько кругов прилагательных, и вы готовы объединить существительные с прилагательными:

Это плоскость , она большая .Она — человек, человек, она — человек, более человек.

Сохраняйте ритм, 1–2 на всем протяжении.

Предпоследний шаг — изменение существительных с прилагательными:

Это плоскость , большая , большая плоскость . Она человек, человек, человек, человек, человек, человек, человек, человек.

Последний шаг — вернуться к простому «Это а» + существительное / «это а» + прилагательное, как к повторяющейся песне.

Т: Это самолет. — Сс: Это самолет.

T: Он большой. — Сс: Он большой.

Т: Это самолет. — Сс: Это самолет.

T: Маленькая. — Сс: Маленькая.

Придумайте мелодию самостоятельно и соблюдайте ритм, особенно в длинных словах, таких как « beau tiful», где эти три слога должны уместиться в том же месте, что и « big.

Как: объединить звук со смыслом

Эдгар Аллен По преподал нам очаровательный урок звукоподражания в своем стихотворении« Колокола.”Описательный язык, который он использовал, напоминает звуки, которые издает каждый колокол:

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

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

Действие: Похоже на….

Вам понадобятся:

  • Различный реквизит: автомобили, звонок, телефон и т. Д.

Используя изображения и звук, каждый день представляйте своим ученикам несколько из них. Например:

Толкайте две игрушечные машинки по столу, издавая шум мотора. Попросите одного разогнаться, крикнуть и остановиться. Затем один врезался в другой.Вот вам три звукоподражания:

мотор (мммрррр) ; визг (ээээээ!) ; crash (kkkshshsh)

Теперь научите слова, связанные с этими звуками.

3. Разговорный язык

Развлекательные игры и пантомимы созданы, пора научить студентов использовать свой разум и рот для создания языка.

Как обучать высказываниям, а не словарю

Многие учителя, сталкиваясь с абсолютным новичком, думают, что лучше учить отдельные «слова», чем усложнять вещи так называемыми «полными предложениями».”

Подумайте об этом, но как часто вы произносите отдельные слова? Как бы вы отреагировали, если бы кто-нибудь вошел в комнату и просто сказал «стол»? Вы упускаете из виду, что имел в виду этот человек, большая часть общения была бы в его или ее голове.

Обучайте своих начинающих учеников полному изречению, то есть связкам передаваемых звуков, а не спискам слов. Умение сосчитать от одного до двадцати не означает, что ученик может автоматически сказать вам, сколько пальцев вы держите (не всегда начинайте с «один»!).

Попробуйте научить основам речевой речи в классе с помощью простой песни.

Упражнение: напишите свою собственную песню на ESL

Используя базовые мелодии детских стишков, вы можете создавать полезные английские песни с произнесением слов, которые будут оставаться в голове ваших учеников на долгие годы. Начнем со слов «Вот и мы, вокруг куст тутовника». С вашей стороны, это просто задача заменить оригинальный текст фразами, которые вы хотите преподать:

Вот и мы идем вокруг куста тутового дерева

  • Могу я пойти в туалет, пожалуйста?
  • Можно мне взять карандаш?
  • Могу я ответить на вопрос, пожалуйста?

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

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

Будьте музыкальны и сочиняйте собственные песни. Купите себе дешевую гитару и выучите несколько аккордов. Это понравится студентам любого возраста.

Как: войти во «Вселенную дискурса»

Вселенная дискурса, или контекст, имеет фундаментальное значение при использовании языка.Недостаточно просто научить лексике и грамматике. Студентам необходимо знать , когда уместно использовать все.

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

Activity: Что вы говорите, когда….

Вам понадобится:

  • Пара десятков ситуационных карточек, например:
    • Первая встреча с кем-то.
    • Прибытие в уже сформированную очередь ожидания.
  • Начальные очереди для каждой из этих ситуаций:
    • Рад познакомиться.
    • Это линия для…
  • Ответные строки для них:
    • Приятно познакомиться.
    • Нет, эта линия там.

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

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

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

4. Общий язык

Как: поощрять разговор

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

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

Активность: Чем вы занимались прошлым летом?

Вам понадобятся:

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

Раздайте карточки своим ученикам и спросите их: «Что вы делали прошлым летом?»

Вначале разрешите учащимся раскритиковать свою летнюю деятельность.

Позвольте другим назвать существительное, представляющее действие. Постепенно попросите их добавить глагол, а затем местоимение.

Как: налаживать отношения

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

Постройте здоровые отношения между учителем и учеником со своими учениками. Это довольно просто: проявить интерес к их жизни. Например, младшим школьникам можно задать назойливый вопрос: «Кем вы хотите стать, когда вырастете?

Задание: Кем вы хотите быть и почему?

Вам понадобятся:

  • Карточки профессии (включая некоторые необычные!)

Просмотрите шаблоны:

  • Потому что [Я могу / Мне нравится / Мне нравится] + форма глагола

Дайте студенту карточку и задайте свой вопрос.Спросите первого ученика, затем они спросят человека слева от них и так далее.

Как: отметить достижения в области коммуникации

Наконец, награда будет иметь разные формы и цвета. Всегда будьте позитивны во всех комментариях, которые вы делаете в классе. «Хорошо» и «хорошо сделано» должны легко вылетать из вашего рта.

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

Задание: Групповая сессия похвалы

Расставьте учеников в круг. Ты начинаешь.

«Хуан, ты очень хороший ученик».

Хуан продолжает человека слева от него, возможно, бросая ей мешок с фасолью.

«Мария, ты очень хорошая ученица».

Когда мешок с фасолью вернется к вам, измените комплимент:

«Педро, ты произносишь слова очень четко».

Вы можете помочь своим ученикам, подготовив карточки с комплиментами, из которых они смогут извлечь.

Как: поделиться сильной философией изучения языка

Это в основном для нас, учителей, хотя мы должны делиться и развивать эту идею с нашими учениками.

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

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

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

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

Обзор: Также важная часть изучения языка на всех уровнях, но особенно на ранних, начальных уровнях.Студентам потребуется многократное знакомство с новым материалом, прежде чем он перестанет быть новым материалом. Основываясь на ранее изученном материале, оставьте время на то, чтобы просмотреть этот материал, прежде чем переходить к новому.

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

Абсолютные новички будут иметь один язык за плечами. Некоторые придут с большим количеством.

Все знают, как общаться, они просто не знают, как это сделать по-английски.

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


Ревел Эрроуэй преподавал английский как иностранный язык в течение 30 лет, прежде чем уйти на пенсию в качестве учителя. Его блог Interpretive ESL предлагает взгляды на преподавание языка, упрощение работы в классе, занятия языковых классов и общие мысли об обучении ESL.

Загрузить: Эта запись в блоге доступна в виде удобного портативного PDF-файла, который вы можете
можно взять куда угодно. Щелкните здесь, чтобы получить копию. (Загрузить)

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

Погружение в английский в вашем классе!

.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *