Отличительные особенности языков программирования [закрыто]
помимо синтаксиса каждого языка (например, print v. echo), каковы некоторые ключевые отличительные характеристики, которые нужно искать, чтобы отличить язык программирования?
как новичок в программировании, я все еще путаюсь между сильными и слабыми сторонами каждого языка программирования и тем, как отличить их от их псевдонимов для общих собственных функций. Я думаю, что гораздо проще классифицировать языки на основе набора отличительных признаков, например, ООП В. Функциональная.
8 ответов
есть много вещей, которые определяют PL, здесь я перечислю несколько:
- это процедурно, ОО, императивно?
- имеет ли он сильную проверку типов(C#, C++, Delphi) или динамическую (PHP, Pythong, JS)
- как ссылки делать? (Скрывает ли он указатели, такие как C#?)
- требуется ли среда выполнения(C#, Java) или она является родной для ОС (C, C++)
- поддерживает ли он потоки (например, Eiffel нужны дополнительные библиотеки для это)
есть и другие, такие как предчувствие сборщиков мусора,обработка парамов и т. д. Язык Eiffel имеет интересную функцию, которая является дизайном по контракту, я не видел этого ни на одном другом языке (я думаю, что C# 4.0 имеет его сейчас), но он может быть очень полезен, если его хорошо использовать.
Я бы рекомендовал вам взглянуть на работу Бертрана Мейера, чтобы получить более глубокое понимание того, как работа PL и вещи, которые их определяют. Еще одна вещь, которая может определить PL-это уровень взаимодействия с системой, это то, что делает разницу между языками низкого уровня и языками высокого уровня.
надеюсь, я могу помочь
в домене (императивный, функциональный, конкатенативный, переписывание терминов) иногда лучше всего смотреть на наличие или отсутствие какого-либо конкретного набора функций. Например, для основного потока.
- функции первого порядка!--4-->
- закрытие
- встроенные классы, прототипическое наследование или инструментарий (пример: C++, Self / JavaScript, Lua/Perl)
- сложные типы данных (чем больше массив)
- встроенный параллелизм примитивы!--4-->
- фьючерсы
- пройти по значениям, пройти по имени, пройти по ссылке или их комбинации
- сборщик мусора или нет? Какой?
- событие на основе
- интерфейс виды, типы, основанные класса, или нет пользователь (идти, Ява, Луа)
etc
вы можете рассмотреть такие вещи, как:
- можете ли вы вызвать функции?
- можете ли вы передать функции другим функциям?
- можете ли вы создать новые функции? (В C вы можете передавать указатели функций функциям, но вы не можете создавать новые функции)
- можете ли вы создать новые типы данных?
- вы можете создавать новые типы данных с функциями, которые работают на них? (типичная основа для языков" ОО")
- можете ли вы выполнить код, который был недоступно во время компиляции (с помощью
eval
функции, может быть)? - должны ли все типы быть известны во время компиляции?
- доступны ли типы во время выполнения?
разницу между низкий уровень и высокого уровня языки. (Хотя "низкий" и "высокий" - относительные термины.)
язык высокого уровня будет использовать абстракцию, чтобы скрыть детали, которые языки низкого уровня будут предоставлять пользователю. Например, в Matlab или Python вы можете инициализировать n-мерный массив в одной команде. Не так в C или сборке.
ИМХО Сила языка определяется тем, сколько вещей вы можете сделать с ним; как быстро и как легко вы можете достичь целей.
слабости языка-это сумма ограничений (различных типов), с которыми вы сталкиваетесь, пытаясь достичь своей цели.
существует множество функций, которые может поддерживать язык программирования. Кроме того, эти функции не всегда взаимоисключающие. Например, OCaml и F# являются функциональными и объектно-ориентированными. Также написание списка здесь всех парадигм, которые может поддерживать язык, было бы исчерпывающим, однако есть книга Прагматика Языка Программирования это всестороннее рассмотрение многих парадигм, найденных в языках программирования.
однако, для меня важные вещи, которые мне нужно знать при работе с языком, следующие:
- это динамически или статически типизированный
- это типизированный язык, и если он типизирован, является сильным или слабым?
- это мусора
- поддерживает ли он pass by value или pass by reference semantics или оба?
- поддерживает ли он функции первого порядка (т. е. могут ли функции рассматриваться как переменные)
- это объектно-ориентированный
- полиморфизм. Является ли он параметрическим или ad-hoc.
- насколько выразительна система типов (т. е. могу ли я создавать не протекающие абстракции)
- перегруженных методов
- дженерики (шаблоны)
- обработка исключений.
- введите system (типизированный vs нетипизированный, статически vs динамически типизированный, слабо и сильно типизированный).
- поддерживаемых парадигм (процедурный, объектно-ориентированный, функциональный, логический, мульти).
- реализация по умолчанию (компилятор vs интерпретатор vs JIT-компилятор).
- управление памятью (руководство vs автоматический (подсчет ссылок или GC)).
- предназначены домен использования (номер хруст, прототипирование, сценарии, DSL,...).
- поколения (1GL, 2GL, 3GL, 4gl по, 5GL).
- используется естественный язык (английский vs неанглийские основе). Однако речь идет о синтаксисе.
общее замечание: многие из этой схемы классификации не являются всеобъемлющими и не так хороши. И ссылки в основном в Википедии. Так что будьте бдительны.
вы можете рассмотреть другие характеристики, такие как:
- сильный против слабого и статического против динамического ввода, поддержка универсального ввода
- как обрабатывается память (она абстрагирована или у вас есть прямой контроль над вашими данными, передайте ref vs pass by value)
- скомпилированный vs интерпретируется vs немного обоих
- формы пользовательских типов... классы, структуры, кортежи, списки и т. д.
- ли продевая нитку объекты встроенный или вам нужно обратиться к внешним библиотекам
- средство для генеративного программирования... C++ шаблон метапрограммирования является формой этого
- в случае ООП, одиночного против multi наследования, интерфейсов, анонимных / внутренних классов etc.
- является ли язык мультипарадигменный (т. е. C# и его поддержку функционального программирования)
- наличие отражения
- многословие языка или количество "синтаксического сахара"... например, C++ довольно многословно, когда дело доходит до итерации по вектору. Java довольно лаконичен, когда анонимные внутренние классы используются для обработки событий. Понимание списка Python экономит много ввода.