LINUX.ORG.RU

почему в языки программирования вводят искусственные ограничения для идентификаторов?

 , , ,


1

1

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

int return; // переменная с именем return
int ;; // переменная с именем ;
int an int; // переменная с именем an int
return = 0; // error
; = 0; // error
an int = 0; // error
, который не является валидным. и тут появляется вопрос: а ПОЧЕМУ он не является валидным?
грамматика C в основном регулярна, в выражении ; = 0; ровным счётом никакого труда не составляет определить, что ; — это, блджад, имя переменной, просто по расположению этого символа. ошибка на return = 0; — это вообще позор, неужели так сложно отличить переменную от ключевого слова? ну а про идиотию с запретом пробела в идентификаторах даже и говорить не хочется, особенно учитывая, что в Алголе-58 это было разрешено, а в потомках выпилили — нинужна, видите ли!
точно такая же петрушка имеет место и в других популярных языках: C++, Java, педон и остальная пыхоплеяда... хорошо хоть запрет иметь идентификаторы с одинаковым именем, но разными типами потихоньку уходит в прошлое (и то в основном только для функций).

у меня, собственно, остаётся только два вопроса:

  1. зачем так сделано?
  2. существуют ли языки, не калькирующие этот маразм?

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

privet ()

Круто ты упоролся.

itn ★★ ()
Ответ на: комментарий от lazyklimm
Welcome to Racket v6.2.900.15.
> (define |"I am not a string :)"| 42)
> |"I am not a string :)"|
42
> 
privet ()

а ПОЧЕМУ он не является валидным

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

IvanR ★★ ()
Ответ на: комментарий от newKingOfTheBlock

Под не-дебилом ты себя подразумевал, что ли? Спешу огорчить: ты ошибся.

postman_ ★☆ ()

Они также не позволяют использовать цифру в начале и использовать в них пробелы... во звери!

существуют ли языки, не калькирующие этот маразм?

Да, например встроенный язык ms-офиса

P.S. anonimous захватывает аккаунты или мозг?

at ★★ ()
int ;; // переменная с именем ;

Точно? А может с именем ";;" и ты просто ";" забыл поставить? А может с именем "", а ты просто поставил две ";"? А может она с именем ";; // переменная с именем "?

Suntechnic ★★★★★ ()

существуют ли языки, не калькирующие этот маразм?

> tclsh
% set {} 3
3
% set set 3
3
% puts ${}
3
% puts $set
3
%
Suntechnic ★★★★★ ()
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от lazyklimm

(define return «return»)

типо рисанулся? думаешь, никто не знает, что в схеме return вообще нет? Ты уж если вызвался, показывай реальные вещи, покажи как переопределяется define, set! и прочее синтаксическое говнецо.

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

как переопределяется define

нормально переопределяется

lazyklimm ★★★★★ ()
Ответ на: комментарий от newKingOfTheBlock

не-дебилам становиться невыносимо прогать на этом патриаршьем говне

Тебе-то откуда знать.

thesis ★★★★★ ()

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

anonymous ()
Ответ на: комментарий от anonymous

А для естественных языков кто-нибудь грамматику составляет прежде чем пускать их в «продакшн»? Нет? А почему же они тогда работают? Ответ прост: грамматика вторична по отношению к языку.

newKingOfTheBlock ()
Ответ на: комментарий от anonymous

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

Lincor ()
Ответ на: комментарий от newKingOfTheBlock

Хлебало завали, анонiмус, тебя вообще никто не спрашивал.

anonymous ()
Ответ на: комментарий от Lincor

у перла, например, нет и никогда не будет формальной грамматики, но интерпретатор есть и работает

и что, он по звездам определяет что-ли как код интерпретировать?

privet ()
Ответ на: комментарий от privet

по звездам определяет

по предикатам

if(foo) --> bar
if(bar) --> baz
для того чтобы язык *работал* не нужна формальная грамматика. Она нужна для анализа.

newKingOfTheBlock ()

зачем так сделано?

Чтобы было понятно, что if(0 == a) - это условный оператор, а не функция, принимающая boolean, а int * b; - это объявление указателя на int, а не умножение.

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

существуют ли языки, не калькирующие этот маразм?

От всей души надеюсь, что нет.

Вопрос на засыпку: что будет, если перед данным в топике кодом написать int //;//= 42;?

alix ★★★★ ()
Ответ на: комментарий от anonymous

Кстати, ты чушь сморозил, умник. Грамматика — это категория формального языка, а не языка программирования.

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

Ну это не совсем тоже самое. Ты же вручную это в таблицу суешь.

privet ()
Ответ на: комментарий от newKingOfTheBlock

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

privet ()
Ответ на: комментарий от privet

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

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

Но в репле ведь тот же самый разбор происходит.

privet ()
Ответ на: комментарий от privet

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

newKingOfTheBlock ()
Ответ на: комментарий от privet

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

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

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

privet ()
Ответ на: комментарий от newKingOfTheBlock

Разберу, но это не значит что нет у него грамматики.

privet ()
Ответ на: комментарий от privet

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

newKingOfTheBlock ()
Ответ на: комментарий от Lincor

Даже естественные языки описываются формальной грамматикой. Что же может помешать это сделать для перла?

newKingOfTheBlock ()
Ответ на: комментарий от Lincor

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

privet ()
Ответ на: комментарий от privet

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

Формальный язык задается формальной грмматикой

и

Формальный язык описывается формальной грмматикой

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

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

Прежде чем разбирать выражение, надо его распознать.

А потом че?

Kuzy ★★ ()
Ответ на: комментарий от newKingOfTheBlock

Да какие противоречия :) Грамматика описывает и задает (это одно и то же ведь) язык. Парсер — программа, принимает на вход язык описанный это грамматикой и возвращает дерево.

privet ()
Ответ на: комментарий от Kuzy

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

Вообще, про предикаты это я немного сморозил. Я как то читал реализацию лиспа на лиспе, а там пишется типо (if (self-evaluated expr) expr) но это ведь сахарок. на самом деле, там сам разбор не показан толком, синтаксический, поэтому вводит в заблуждение. на самом деле, разбор предшествует предикату, сам предикат определяется разбором выражения, так точней:)

newKingOfTheBlock ()
Ответ на: комментарий от newKingOfTheBlock

Ну чет не очень, три предыдущих коммента полущ.

Kuzy ★★ ()
Ответ на: комментарий от Lincor

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

Ну и потом читай:

for for in in for:
    for for(in in for)
holuiitipun ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.