LINUX.ORG.RU
ФорумTalks

сравнение ЯП с естественными языками

 


1

1

время от времени фофан экспериментирую с написанием простеньких интерпретаторов, и пришел к таким вот выводам.

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

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

1) С первыми криками петухов Василий проснулся.

2) В этом году природа проснулась очень рано, в феврале уже капали сосульки.

Очевидно, что «проснуться» тут означает несколько разные вещи. Наш интерпретатор исходит из контекста.

если мы берем выражение, например foo.bar.baz, то наш интерпретатор, как правило, абсолютно не видит текущего окружения. В лучшем случае, при наличии динамического связывания, baz может прочитать и зарезольвить лишь предыдущее слово, выполниться в его контексте, про foo на этапе выполнения baz ничего не известно, и никогда не будет, он исчез бесследно, и доступа к нему нет. Даже в наиболее динамичных языках, подобные возможности сильно ограничены, хотя кое какие попытки есть, например code-walking.

Думал, как можно было бы в теории решить эту проблему.

Пока думаю, ввести некий класс Interpreter, и каждое выражение им оборачивать. Нужно запоминать текущее выражение, и пытаться выполнить последующие слова в контексте предыдущих, которые уже схлопнулись Тут еще надо заметить, что разные объекты должны обрабатывать те же самые выражения по-разному.

Перемещено tailgunner из development



Последнее исправление: portquest2016 (всего исправлений: 3)
Ответ на: комментарий от portquest2016

Приведи пример, как бы ты на идеальном языке написал этот bar и использовал в нем foo. А то я все еще не понимаю, куда ты клонишь. От глобально доступного состояния мы перешли к состоянию, которое может где-то как-то быть, или не быть, или не такое, какое ожидали. Но ясности это не прибавило.

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

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

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

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

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

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

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


someFu = function(foo){
  return new Promise(bar)
}
bar = function(resolve, reject){resolve(foo)}
final = function(data){console.log(data + 3)}

someFu(1).then(final) // 4

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

И как программист, который прочитает где-то в коде

bar = function(resolve, reject){resolve(foo)}
должен догадываться, что значит foo?

А если я напишу

someOtherFu = function() {
    return new promise(bar);
}
То откуда здесь bar возьмет свое foo, и как я должен был догадаться, что нужно это foo обеспечить где-то в своем контексте для правильной работы bar?

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

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

должен догадываться, что значит foo?

а как программист, который читает где то в коде fu = function(){return foo.a}, догадается что такое foo и что такое a? Детский сад.

проблема, которую это должно было решать, так и не озвучена

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

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

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

portquest2016
() автор топика
Ответ на: комментарий от ddos3

должен догадываться, что значит foo?

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

portquest2016
() автор топика
Ответ на: комментарий от ddos3

причем, это не что-то запредельное, а обычная практика, принятая во многих ЯП, в тч в том же JS. У тебя в function(){this.foo}, foo абсолютно ни с чем не связана и ничего не значит

portquest2016
() автор топика
Ответ на: комментарий от Deleted

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

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

portquest2016
() автор топика
Ответ на: комментарий от Deleted

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

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

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

это практически устранит callback-hell
проблемы проектирования, декомпозиции, построения абстракций

Я все еще не вижу, каким образом.

кстати, ты вообще тотально не врубаешься.

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

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

С каким значением оно свяжется в том примере, который я привел?

в function(){this.foo}, foo абсолютно ни с чем не связана и ничего не значит

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

Проблема не в том, что я плохо доношу мысли

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

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

Две страницы, а никто так и не поправил, что этого Ларри зовут Уолл.

greatperson
()

Это такой трэш... Я представил себе программирование на этом языке - это был бы ад похлеще malbolge.

XShell
()

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

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