Языком программирования называется 1 балл

Содержание

Языки программирования: что это такое, зачем нужны и какой выбрать новичку

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

Что такое язык программирования

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

Вот, например, программа на языке JavaScript:

Здесь слово alert — лексика, один из принятых в языке методов обработки текста. Текст в одинарных кавычках, скобки, точка с запятой — правила синтаксиса. А то, что нужно сделать в итоге, — семантика. Получив эти инструкции, компьютер выведет на экран всплывающее окно с кнопкой и сообщением: «Это программа на JavaScript».

Фанат Free Software Foundation, использую Linux и недолюбливаю Windows. Пишу истории про кодинг и программы на Python. Влюблен в LISP, но пока что не умею на нем программировать.

Чем языки программирования отличаются от алгоритмов

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

Алгоритм работает как маршрут в навигаторе: «Из пункта А едем в пункт Б, поворот через 150 метров». Англичанин понимает его по-английски, китаец —
по-китайски, а мы с вами — по-русски. Языки разные, а порядок действий один и все должны добраться до нужного места.

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

То же самое, но на Python.

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

Перейти с одного языка программирования на другой легко: если знаешь Java — быстро начнёшь кодить, например, на Python или C#.

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

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

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

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

Что такое библиотеки

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

Например, в Python есть модуль — библиотека yandex_translate, которая переводит тексты на разные языки. Программистам не надо создавать программу-переводчик с нуля, достаточно подключить этот модуль и обратиться к нему из любой точки кода.

Источник

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

Язы́к программи́рования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия, которые выполнит исполнитель (компьютер) под её управлением.

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

Создатели языков по-разному толкуют понятие язык программирования. К наиболее распространённым утверждениям, признаваемым большинством разработчиков, относятся следующие: [источник не указан 1249 дней]

Содержание

Стандартизация языков программирования

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

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

Типы данных

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

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

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

Читайте также:  Что такое язык поэзии

Структуры данных

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

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

Семантика языков программирования

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

Наиболее широко распространены разновидности следующих трёх: операционного, деривационного (аксиоматического) и денотационного (математического).

Парадигма программирования

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

Несмотря на то, что большинство языков ориентировано на императивную модель вычислений, задаваемую фон-неймановской архитектурой ЭВМ, существуют и другие подходы. Можно упомянуть языки со стековой вычислительной моделью (Форт, Factor, PostScript и др.), а также функциональное (Лисп, Haskell, ML, F# и др.) и логическое программирование (Пролог) и язык РЕФАЛ, основанный на модели вычислений, введённой советским математиком А. А. Марковым-младшим.

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

Способы реализации языков

Языки программирования могут быть реализованы как компилируемые и интерпретируемые.

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

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

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

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

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

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

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

Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime.

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

Используемые символы

Современные языки программирования рассчитаны на использование ASCII, то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF).

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

Использование символов за пределами ASCII (например, символов KOI8-R или символов Юникода) зависит от реализации: иногда они разрешаются только в комментариях и символьных/строковых константах, а иногда и в идентификаторах. В СССР существовали языки, где все ключевые слова писались русскими буквами, но большу́ю популярность подобные языки не завоевали (исключение составляет Встроенный язык программирования 1С:Предприятие).

Расширение набора используемых символов сдерживается тем, что многие проекты по разработке программного обеспечения являются международными. Очень сложно было бы работать с кодом, где имена одних переменных записаны русскими буквами, других — арабскими, а третьих — китайскими иероглифами. Вместе с тем, для работы с текстовыми данными языки программирования нового поколения (Delphi 2006, C#, Java) поддерживают Unicode.

Источник

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


Студенты периодически спрашивали меня какой язык программирования учить чтобы получить хорошую работу и зарплату. Конечно, я не мог сказать учите этот язык, а этот не учите и будет вам счастье. Но зато мог дать информацию о языках программирования чтобы этот выбор был легче. Проклассифицируем языки программирования с семи сторон: Модные и не модные • Компилируемые и интерпретируемые • Универсальные и специализированные • Алгоритмические и языки описания данных • Низкоуровневые и высокоуровневые • Объектно-ориентированные и языки структурного программирования • Сопутствующие Фреймворки, Библиотеки и Технологии.

Первый способ классификации, в котором есть доля шутки: Модные или популярные языки программирования, и вышедшие из моды или активного применения

Почему некоторые языки становятся модными, а о других почему-то забывают? Во-первых, смена технологий. Например, во времена операционной системы MS DOS, которая работала на 16-битных процессорах Intel, огромной популярностью пользовались языки Турбо C и Турбо Паскаль. А владеющие Ассемблером программисты считались элитой. Но, по понятным причинам, мы теперь не пользуемся ни этими устаревшими процессорами, ни системой MS DOS, так что языки отпали сами собой. Хотя мне, например, они до сих пор очень нравятся.

Читайте также:  Самоучитель немецкого языка аудио бориско

Другая ситуация с языком Delphi, который был продолжением Турбо Паскаля, и который был очень популярен во времена первых 32-х битных версий Windows, однако не выдержал конкуренции с другими языками программирования, в том числе от компании Microsoft, которые развивались более активно.

Это может быть и победа в конкуренции двух аналогичных языков, например, таких как JScript от Microsoft для веб-браузеров и JavaScript, первоначально представленный компанией Netscape. Популярным JavaScript стал за счет большей открытости и поддержки большим числом компаний разработчиков.

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

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

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

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

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

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

2. Компилируемые и Интерпретируемые

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

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

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

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

3. Универсальные и специализированные

Классификация говорит сама за себя. Есть языки, на которых можно в принципе написать любую программу, но не всегда это можно сделать, например, быстро. Или такая программа не обязательно будет оптимально быстро работать. Типичный универсальный язык всех времен и народов: С++. И в этом его большой плюс. А, может, даже два плюса )).

Специализация в языках программирования касается, как правило, либо предметной области, например, математические вычисления (Fortran, F#), искусственный интеллект (LISP), веб-разработка (PERL, PHP), компьютерные игры (Unity, Lua), бухгалтерия (1С) и т.д., либо какой-то технологии программирования, например, многопоточность как в языке Cи-Омега (Cw) или способ записи операторов как в F#.

Для разных областей приложений создаются свои языки или скрипты. Особенно это относится к компьютерным играм, в которых переплетаются сразу несколько видов искусства, науки и технологии. Но системы разработки игр также используют и уже известные языки, например, Python в системе нарративных игр Ren’Py или язык Swift для устройств Apple.

Универсальные: семейство Pascal/Delphi, C/C++, C#, Java
Специализированные:
Математические вычисления: Fortran, F#
Математическое моделирование: MatLab, Wolfram (Mathematica)
Искусственный интеллект: LISP,
На основе передачи сообщений: Small Talk,
Многопоточные приложения Cw,
Веб-разработка: Perl, PHP, JavaScript
Базы данных: SQL
Компьютерные игры: Lua, Unity, Godot, Twine
Компьютерная графика: MEL (Maya), MAX Script (3ds Max)
Бухгалтерия: 1С

4. Алгоритмические и Языки описания данных

Алгоритмические: Pascal, C++, Java, C#
Языки описания данных: XML, XAML, JSON, HTML, DDL SQL

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

Языки же описания данных предназначены только для описания данных для разных типов приложений. Эти языки можно считать необходимой нагрузкой к обычным алгоритмическим языкам. Например, если вы учите JavaScript для разработки веб-приложений, то скорее всего вам придется также изучить и синтаксис каскадных таблиц стилей CSS и язык описания данных JSON, в формате которого удобно передавать данные между веб-сервером и клиентом.

Или, например, язык работы с базами данных SQL, по сути является языком для обработки и получения данных, но также включает в себя раздел Data Definition Language или Язык Описания Данных.

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

5. Низкоуровневые и Высокоуровневые

Низкоуровневые: Assembler, CIL,
Высокоуровневые: любой объектно-ориентированный или поддерживающий сложные типы данных язык.

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

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

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

Читайте также:  Японский язык основные фразы

6. Объектно-Ориентированные и Структурные языки программирования

Появление объектно-ориентированного программирования, сокращенно ООП, примерно со второй половины 80-х годов 20-го века стало настоящей технологической революцией. Это был буквально переворот, сейчас объясню почему. До ООП были популярны языки структурного программирования. И программисты были вполне счастливы писать программы на структурных языках высокого уровня, потому что в свое время это тоже было колоссальным шагом вперед.

Дело в том, что компьютер удалось создать только после титанических усилий таких гениев как Алан Тьюринг, который разработал свою теорию — машину Тьюринга, на основе которой и работают все числовые компьютеры в наши дни. Принцип машины Тьюринга, вкратце, состоит в том, что в оперативной памяти записана последовательность команд микропроцессора, в том числе команд условных или безусловных переходов на другие команды. Эти переходы на ассемблере называются JMP (англ.: jump — прыжок, переход), а в языках высокого уровня обозначаются командой GOTO (англ.: go to — перейти к чему-л.).

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

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

На практике это вылилось в появление языков программирования, таких как Basic, С, Паскаль, Algol, Cobol, Fortran, PL1. Разработка программ методом «сверху вниз» в структурном программировании превратилась в сплошное удовольствие. Суть ее состояла в написании набора функций, содержащих подфункции, которые можно вызывать, подставляя на вход нужные данные и получая соответствующий результат.

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

Для небольших задач типа сортировки данных или нахождения кратчайшего пути структурное программирование подходило идеально. Были найдены решения для большинства сложных алгоритмических задач. Появились фундаментальные труды, такие как многотомник “Искусство программирования” Дональда Кнута, который до сих пор считается настольной книгой для программистов.

Однако, увеличение сложности программ в результате привело к появлению и бо́льших шансов на внесение ошибок в программы, так как возможность подставлять любые данные на вход процедурам и функциям влекло за собой побочные эффекты. Так, например, в 1999 году космический аппарат NASA «Mars Climate Orbiter» потерпел крушение в из-за ошибки в программе — подстановки неправильных данных.

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

После появления объектно-ориентированных языков программирования, таких как С++, Object Pascal, Java, С#, а также новых аппаратных возможностей компьютеров, объемы программ и данных для них увеличились многократно, если не на порядки, что легко оценить хотя бы по объемам дистрибутивов программ, которые перестали помещаться сначала на дискеты, а потом и на компакт диски. А программирование снова как бы встало с головы на ноги.

Update 24.02.2021
См. также видео-версию этой главы.

7. Сопутствующие Фреймворки (Frameworks), Библиотеки и Технологии

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

Для использования языка С++ от Microsoft для первых 32-х битных версий Windows программистам для создания оконных приложений также приходилось изучать библиотеку MFC.

Для разработки веб-приложений с помощью технологии MVC от Microsoft программистам также потребуется язык разметки веб-страниц Razor.

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

Другие примеры:
Ruby on Rails — серверная платформа разработки веб-приложений.
Для компьютерных игр, такие как Unity, Cocos, Unreal Engine.
Для 3D графики: OpenGL, DirectX.

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

Выводы

В принципе, чем больше языков знает программист, тем увереннее себя чувствует как профессионал. Но в наше скоростное время возможно и такое, что версия языка может потерять свою актуальность буквально за полтора-два года. Например, у языка TypeScript c 2015 по 2019 год, то есть примерно за 5 лет, было выпущено, внимание, более 20-ти обновлений.

Если же с компанией еще не определились, то можно начать с одного из универсальных языков программирования. Из-за повсеместного проникновения интернета, для программиста желательно хотя бы в общих чертах представлять себе что такое язык HTML, а также сопутствующие языки описания данных типа XML и JSON. Желательно также иметь представление о языке управления базами данных SQL.

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

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

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

Источник

Ответы на самые частые вопросы пользователей рунета
Добавить комментарий

Adblock
detector