LINUX.ORG.RU

[Forth] Статическая типизация.

 


0

0

Я в форте разбираюсь совсем слабо, поэтому прошу местных его любителей оценить такую бредовую идею:

Форт в котором:
1. Все слова имеют constant stack effect
2. Все строго типизировано (Возможно даже Hindley-Milner)
3. Стек работает типизированно, т.е. слово с опред. типом будет брать из стека не, например, значение в вершине, а наиболее высокое значение опр. типа.

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

Вот небольшие примеры из фп (точнее -- из хаскеля):

: map(Cons) uncons apply map cons ;
: map(Nil) ; -- как быть с pattern matching я еще не придумал, поэтому в такой условной форме.

: foldl(Cons) uncons apply foldl ;
: foldl(Nil) ;

Занимательно то, что простыми арифметическими действиями -- просто проверяя условия underflow стека -- можно вывести типы и того, и другого. (Я к сожалению не знаю как работает вывод типов в hindley-milner, поэтому заранее извините за такое примитивное понимание).


Совсем забыл: одним из основных преимуществ имхо будет сильное сокращение жонглирований стеком.

pierre
() автор топика

>Я к сожалению не знаю как работает вывод типов в hindley-milner

посмотри в примерах к MBase http://lambda-the-ultimate.org/node/2895 -- там разобрана реализация алгоритма на Лиспе (MBase -- это компилятор компиляторов вроде lex/yacc/bison, только на лиспе)

anonymous
()

> 3. Стек работает типизированно, т.е. слово с опред. типом будет брать из стека не, например, значение в вершине, а наиболее высокое значение опр. типа.

как тогда работает приведение типов? если положили в стек char (byte), прочитали например wchar -- из стека должны вытащить другое количество байт. Сомневаюсь, что это можно сделать с единственным стеком, если же под каждый тип заводить свой стек и делать общий стек таких стеков, то вроде как возможно.

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

ещё там пишут "строгая типизация(динамическая, да), lexical и dynamic scoping как в лиспе". А пример как делать Хиндли-Милнера на лиспе уже был.

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

> как тогда работает приведение типов? если положили в стек char (byte), прочитали например wchar -- из стека должны вытащить другое количество байт.

Приведения типов (неявного) нет, как и в хаскеле. Т.е. строжайшая типизация, можно конечно это сделать из фактора -- но это все равно что из лиспа делать хаскель.

pierre
() автор топика

> Будет ли этот бред жизнеспособен?

Едва ли. Если #1 выполнено, нафига там стек? Дописываем скобки (ведь это можно сделать) и получаем более-менее обычный строго типизированый язык.

Смысл стека как раз в том что он делает ненужным понятие аргументов функций. IMHO.

> 3. Стек работает типизированно, т.е. слово с опред. типом будет брать из стека не, например, значение в вершине, а наиболее высокое значение опр. типа.

Вот это будет нежизнеспособно независимо ни от чего.

Можно представить себе типизацию в смысле проверки что типы первых N аргументов в стеке для этой функции подходят. При наивной реализации это потребует условия #1, а более серьёзная... ну, это и будет весьма хитрозадый type inference, не знаю вообще реализуемый или нет, но почти наверняка "внешний" по отношению к языку. Т.е. берём программу, предполагаем начальное состояние стека (в смысле типов), и выводим что получится в конце. Попытно не забывая про th. Тьюринга.

> как быть с pattern matching я еще не придумал

Таки сюрприз, но через if ;-) Разве у этой фичи есть какое-то фундаментально значение? Если в плане "во всех с.т. языках которые я видел делали так", то можно успокоится, в стековых языка _многое_ делается "не так".

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

Ну и последнее замечание: #2 это как кнопка "сделать мне зашибись". Я вот сейчас встану и скажу что postscript строго типизирован. И пусть кто-нибудь оспорит ;) См. http://en.wikipedia.org/wiki/Strongly-typed_programming_language#Interpretation , там хорошая цитата в начале.

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

> Едва ли. Если #1 выполнено, нафига там стек? Дописываем скобки (ведь это можно сделать) и получаем более-менее обычный строго типизированый язык.

А можно какие-нибудь неизвратные примеры на форте когда без отсутствия #1 не обойтись? Пока что все что я видел (оно было простое, да) было только constant effect

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

> Я вот сейчас встану и скажу что postscript строго типизирован. И пусть кто-нибудь оспорит ;) См. http://en.wikipedia.org/wiki/Strongly-typed_programming_language#Interpretation , там хорошая цитата в начале.

да, есть некоторая путаница в понятиях, путают Type checking и Type strength
см. http://rosettacode.org/wiki/Category:Type_System -- это два разных ортогональных понятия, может быть и динамическая strong типизация, и статическая слабая. См. также http://rosettacode.org/wiki/Language_Comparison_Table

> ну, это и будет весьма хитрозадый type inference, не знаю вообще реализуемый или нет, но почти наверняка "внешний" по отношению к языку


что-то вроде алгоритма Дейкстры перевода в обратную польскую нотацию http://en.wikipedia.org/wiki/Shunting_yard_algorithm , только не с одним стеком операторов, а с несколькими (или стеком функций, и т.п.)

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