Отличительные особенности языков программирования [закрыто]

помимо синтаксиса каждого языка (например, print v. echo), каковы некоторые ключевые отличительные характеристики, которые нужно искать, чтобы отличить язык программирования?

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

8 ответов


есть много вещей, которые определяют PL, здесь я перечислю несколько:

  • это процедурно, ОО, императивно?
  • имеет ли он сильную проверку типов(C#, C++, Delphi) или динамическую (PHP, Pythong, JS)
  • как ссылки делать? (Скрывает ли он указатели, такие как C#?)
  • требуется ли среда выполнения(C#, Java) или она является родной для ОС (C, C++)
  • поддерживает ли он потоки (например, Eiffel нужны дополнительные библиотеки для это)

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

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

надеюсь, я могу помочь


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

  1. функции первого порядка!--4-->
  2. закрытие
  3. встроенные классы, прототипическое наследование или инструментарий (пример: C++, Self / JavaScript, Lua/Perl)
  4. сложные типы данных (чем больше массив)
  5. встроенный параллелизм примитивы!--4-->
  6. фьючерсы
  7. пройти по значениям, пройти по имени, пройти по ссылке или их комбинации
  8. сборщик мусора или нет? Какой?
  9. событие на основе
  10. интерфейс виды, типы, основанные класса, или нет пользователь (идти, Ява, Луа)

etc


вы можете рассмотреть такие вещи, как:

  • можете ли вы вызвать функции?
  • можете ли вы передать функции другим функциям?
  • можете ли вы создать новые функции? (В C вы можете передавать указатели функций функциям, но вы не можете создавать новые функции)
  • можете ли вы создать новые типы данных?
  • вы можете создавать новые типы данных с функциями, которые работают на них? (типичная основа для языков" ОО")
  • можете ли вы выполнить код, который был недоступно во время компиляции (с помощью eval функции, может быть)?
  • должны ли все типы быть известны во время компиляции?
  • доступны ли типы во время выполнения?

разницу между низкий уровень и высокого уровня языки. (Хотя "низкий" и "высокий" - относительные термины.)

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


ИМХО Сила языка определяется тем, сколько вещей вы можете сделать с ним; как быстро и как легко вы можете достичь целей.

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


существует множество функций, которые может поддерживать язык программирования. Кроме того, эти функции не всегда взаимоисключающие. Например, OCaml и F# являются функциональными и объектно-ориентированными. Также написание списка здесь всех парадигм, которые может поддерживать язык, было бы исчерпывающим, однако есть книга Прагматика Языка Программирования это всестороннее рассмотрение многих парадигм, найденных в языках программирования.

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

  • это динамически или статически типизированный
  • это типизированный язык, и если он типизирован, является сильным или слабым?
  • это мусора
  • поддерживает ли он pass by value или pass by reference semantics или оба?
  • поддерживает ли он функции первого порядка (т. е. могут ли функции рассматриваться как переменные)
  • это объектно-ориентированный
  • полиморфизм. Является ли он параметрическим или ad-hoc.
  • насколько выразительна система типов (т. е. могу ли я создавать не протекающие абстракции)
  • перегруженных методов
  • дженерики (шаблоны)
  • обработка исключений.

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


вы можете рассмотреть другие характеристики, такие как:

  • сильный против слабого и статического против динамического ввода, поддержка универсального ввода
  • как обрабатывается память (она абстрагирована или у вас есть прямой контроль над вашими данными, передайте ref vs pass by value)
  • скомпилированный vs интерпретируется vs немного обоих
  • формы пользовательских типов... классы, структуры, кортежи, списки и т. д.
  • ли продевая нитку объекты встроенный или вам нужно обратиться к внешним библиотекам
  • средство для генеративного программирования... C++ шаблон метапрограммирования является формой этого
  • в случае ООП, одиночного против multi наследования, интерфейсов, анонимных / внутренних классов etc.
  • является ли язык мультипарадигменный (т. е. C# и его поддержку функционального программирования)
  • наличие отражения
  • многословие языка или количество "синтаксического сахара"... например, C++ довольно многословно, когда дело доходит до итерации по вектору. Java довольно лаконичен, когда анонимные внутренние классы используются для обработки событий. Понимание списка Python экономит много ввода.