Re[2]: А вот скриптовые языки со статической типизацией?
От: deniok Россия  
Дата: 16.01.09 20:05
Оценка: +2 :))) :)
Здравствуйте, MasterZiv, Вы писали:

MZ>dmz пишет:


>> А вот где бы посмотреть на *простые* (простые — это не окамл с

>> хаскеллом, пожалуйста) скриптовые языки со
>> статической типизацией? Т.е. что бы тип всех переменных выводится в

MZ>Гы, Java !


Где там тип переменных выводится? Там компилятор такой тупой, что ему два раза говорить тип надо — он с первого не понимает:
MySuperType mySuperObject = new MySuperType();


Re: А вот скриптовые языки со статической типизацией?
От: c-smile Канада http://terrainformatica.com
Дата: 16.01.09 21:15
Оценка: :)
Здравствуйте, dmz, Вы писали:


dmz>А вот где бы посмотреть на простые (простые — это не окамл с хаскеллом, пожалуйста) скриптовые языки со

dmz>статической типизацией? Т.е. что бы тип всех переменных выводится в компайл-тайме. Нужен источник вдохновения.

EiC — C interpreter : http://www.linuxbox.com/tiki/node/149
Вывода типов конечно нет. Но я бы не сказал что динамическая типизация "оборачивается усложнением vm и разрастанием кода и memory footprint".
Re: А вот скриптовые языки со статической типизацией?
От: c-smile Канада http://terrainformatica.com
Дата: 17.01.09 00:21
Оценка:
Здравствуйте, dmz, Вы писали:

dmz>что бы тип всех переменных выводится в компайл-тайме.

dmz>Интересно, можно ли сделать легковесную (простую в реализации) статическую систему типов.

что такое "статическая система типов"?

V8 engine используемый в Chrome говорят делает вывод типов (когда может). При этом он может строить
оптимальную структуру кода. Например для инкремента i:

var i = 1; ++i;

может сгенерирвать BC_INC_INT вместо BC_INC_VAR. Но на всю глубину AST вывод типов построить достаточно сложно (сложная вычислительная задача). Т.е. где-то типы тебе таки нужно объявлять чтобы получить разумную скорость компиляции.
Например параметры функций наверное должны быть типизированы чтобы не анализировать все call paths.
Re[2]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 17.01.09 05:12
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, dmz, Вы писали:


dmz>>что бы тип всех переменных выводится в компайл-тайме.

dmz>>Интересно, можно ли сделать легковесную (простую в реализации) статическую систему типов.

CS>что такое "статическая система типов"?


def main()
{
    local b = "PECHEN TRESKI";
    local c;

    c = b + 1;
}
||
\/
FFFF {3} {3}       JMP    000F ; [0D 13 00]  
0003 {2} {2} 0011: DATA   000D ; [0D 00] len: 13 'PECHEN TRESKI' 
FFFF {2} {2}       DATA   4550 ; [50 45]  
FFFF {2} {2}       DATA   4843 ; [43 48]  
FFFF {2} {2}       DATA   4E45 ; [45 4E]  
FFFF {2} {2}       DATA   5420 ; [20 54]  
FFFF {2} {2}       DATA   4552 ; [52 45]  
FFFF {2} {2}       DATA   4B53 ; [53 4B]  
FFFF {2} {2}       DATA   0049 ; [49 00]  
0013 {3} {3} 000F: LIT    0000 ; [29 00 00] b#0 -- main 
FFFF {3} {3}       LIT    0000 ; [29 00 00] c#0 
FFFF {3} {3}       SF     0001 ; [07 01 00] main 
FFFF {1} {1}       NOP         ; [00  ]  
FFFF {3} {3}       ADDROF 0011 ; [29 03 00]  
FFFF {1} {1}       STORE0      ; [34  ] -> b#0 
FFFF {1} {1}       LOAD0       ; [2C  ] b#0 
FFFF {1} {1}       INC         ; [13  ]  <- (*1)
FFFF {1} {1}       STORE1      ; [35  ] -> c#0 
0024 {1} {1} 0010: DOWN        ; [FF  ] 

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


а система типов всплывает, в частности тут. Вот надо мне описать интерфейс с нативными функциями — сейчас это выглядит как-то так:

(* BUILTINS *)

BUILTIN beepvm_do_something  do_somethin : вот что мне тут написать, что бы компилятор понял, что возращаемое значение - список списков строк?

...

BUILTIN beepvm_put_char putc(1)
BUILTIN beepvm_put_int  put_int(1)
BUILTIN beepvm_put_str  puts(1)            
BUILTIN beepvm_gc       alloc(1)        EMIT(ALLOC)
BUILTIN beepvm_gc       gc(0)           EMIT(GC)
BUILTIN beepvm_gc_cheap gc_cheap(0)     EMIT(CGC)
BUILTIN beepvm_dump     debug_dump(0)   EMIT(DUMP)



CS>Например параметры функций наверное должны быть типизированы чтобы не анализировать все call paths.


не хотелось бы; запись

def function(a:int, b:string)


выглядит уже как-то не по скриптовому. но в крайнем случае могу на это пойти.
Re[10]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 17.01.09 05:17
Оценка:
D>(язык условный). Эта функция полиморфна истинным (параметрическим) полиморфизмом. Тип x — под квантором всеобщности, если хочется вывода типов, никуда не деться.

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

local a = [[[1,2],[1,2]],[[1,2],[1,2]]];

a[0]     # <- Тип?
a[0][0]  # <- Тип ?


собственно, из-за них то все и началось. правда, их можно сделать встроенными, и таким образом, полиморфны будут только те операции, которые встроены в язык.
Re[2]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 17.01.09 05:28
Оценка:
CS>EiC — C interpreter : http://www.linuxbox.com/tiki/node/149

CS>Вывода типов конечно нет. Но я бы не сказал что динамическая типизация "оборачивается усложнением vm и разрастанием кода и memory footprint".


Ну как же. Вот у меня стековая машина. 256 16-битных слов стека, 1024 слов кучи. Арифметика обязана быть 16-битной, ну пусть, в крайнем случае, 15-битной — это все равно не спасает.

Динамическая типизация означает, что для каждого значения (на стеке или на куче) мы храним признак его типа, и выполняем операции над ним в зависимости от этого признака. Ну то есть, самое простое — это считать все объектами, а к каждому значению приписать vptr. Допустим, у нас не более 256 разных типов объектов — тогда vptr можно урезать до 1 байта. Правда, боюсь, придется выровнять, так что два. Итого — мы урезали объем доступной скрипту памяти в одном случае на треть, во втором — в два раза.

Далее, сама VM. На TI MSP430F1612, который, допустим будет нижней планкой, на которой будет работать наша система, 55K program flash. Это я к тому, что хранить там таблицу методов на каждый объект — тоже особо не разгуляешься. А в случае генерации кода компилятором, если грамотно выбрать базис инструкций, например для работы с памятью, то добавление новых типов можно будет делать, не трогая код VM вообще, расширяя только компилятор.
Re: А вот скриптовые языки со статической типизацией?
От: FR  
Дата: 17.01.09 06:56
Оценка:
Здравствуйте, dmz, Вы писали:


dmz>А вот где бы посмотреть на простые (простые — это не окамл с хаскеллом, пожалуйста) скриптовые языки со

dmz>статической типизацией? Т.е. что бы тип всех переменных выводится в компайл-тайме. Нужен источник вдохновения.

Есть простой функциональный (фвп, паттерн матчинг и т. п.) язык со статической типизацией, без вывода типов, но с возможностю полиморфного определения типов (типа шаблонов в C++) это Hope http://www.soi.city.ac.uk/~ross/Hope/ ну и плюс конечно классическое "Функциональное программирование" Филда и Харрисона в котором разжеваны многие детали реализации.
Re[11]: А вот скриптовые языки со статической типизацией?
От: FR  
Дата: 17.01.09 07:05
Оценка: 5 (1)
Здравствуйте, dmz, Вы писали:

dmz>собственно, из-за них то все и началось. правда, их можно сделать встроенными, и таким образом, полиморфны будут

только те операции, которые встроены в язык.

http://www.soi.city.ac.uk/~ross/Hope/hope_tut/node17.html
Re[9]: А вот скриптовые языки со статической типизацией?
От: Трурль  
Дата: 17.01.09 08:09
Оценка:
Здравствуйте, dmz, Вы писали:


D>>Правда это как раз и есть то, что используют и Хаскелл, и ML

dmz>Боюсь, что так.
А чо там бояться?
Вот рекомендую: Luca Cardelli, Basic Polymorphic Type checking. Реализация для простенького языка, ~500 строк на Modula-2.
Re[7]: А вот скриптовые языки со статической типизацией?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 17.01.09 10:12
Оценка:
Здравствуйте, dmz, Вы писали:


M>>Так прикручивай.

dmz>Есть мнение, что надо сначала подумать, потом делать. Хотя бы пару дней подумать. Я пока не понимаю, как работает вывод типов, который меня, в общем, устраивает для задачи, вероятно рано или поздно пойму.

В качестве пищи для размышлений: Implementing Typed Intermediate Languages:

Unfortunately, type information is very hard to represent and manipulate efficiently, especially when the underlying type system involves ML-like polymorphic types and module types. A naive implementation can easily add exponential overhead to the compilation and execution of a program.
...
We describe several different ways of representing type variables bound in the term languages and then compare their performance.

Re[3]: А вот скриптовые языки со статической типизацией?
От: MasterZiv СССР  
Дата: 17.01.09 10:43
Оценка: +1
deniok пишет:

> MySuperType mySuperObject = new MySuperType();


1) ну вот тут и вводится. Слева.
2) Это — РАЗНЫЕ типы, вообще-то. Слева — тип переменной-ссылки, справа — тип
значения переменной (объекта).

Но в контексте разговора это, конечно, безполезно — человеку надо как пирмер
посмотреть реализацию, а копаться в спецификациях Java-машины наверное не очень
интересно в этом смысле.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: А вот скриптовые языки со статической типизацией?
От: c-smile Канада http://terrainformatica.com
Дата: 17.01.09 20:53
Оценка:
Здравствуйте, dmz, Вы писали:

CS>>Например параметры функций наверное должны быть типизированы чтобы не анализировать все call paths.


dmz>не хотелось бы; запись


dmz>
dmz>def function(a:int, b:string) 
dmz>


dmz>выглядит уже как-то не по скриптовому. но в крайнем случае могу на это пойти.


Да собственно другого способа и нет. Скажем есть:

def main()
{
    local b = "PECHEN TRESKI";
    local c = foo("GOLOVA MINTAYA", 1);
    local d = foo(2, "KIL`KIN HVOST");
    c = b + 1;
}


Что такое эта foo()? Или их две сгенерируется?
И какой тип будут иметь с и d?
Re[4]: А вот скриптовые языки со статической типизацией?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 17.01.09 21:25
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Да собственно другого способа и нет.


В Немерле типы локальных функций выводятся, а для нелокальных работает полиморфизм. Оба типа функций могут быть обобщёнными. Практичное такое решение.
Ce n'est que pour vous dire ce que je vous dis.
Re[8]: А вот скриптовые языки со статической типизацией?
От: thesz Россия http://thesz.livejournal.com
Дата: 17.01.09 22:21
Оценка:
ЮЖ>В качестве пищи для размышлений: Implementing Typed Intermediate Languages:
ЮЖ>

Unfortunately, type information is very hard to represent and manipulate efficiently, especially when the underlying type system involves ML-like polymorphic types and module types. A naive implementation can easily add exponential overhead to the compilation and execution of a program.


Ну, если реализовывать через унификацию, то это специальные программы нужны, чтобы получать экспоненциальное поведение. Если унификацию не использовать, то опять получится, что надо что-то придумывать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[4]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 18.01.09 03:41
Оценка:
CS>Да собственно другого способа и нет. Скажем есть:

local b = "PECHEN TRESKI";


(1) b -> string

local c = foo("GOLOVA MINTAYA", 1);


(2) c -> typeof foo [string, int] -> что там foo возвращает — определяем из словаря, если уже на вызов напарывались, или прямо сейчас определям и кладем в словарь

local d = foo(2, "KIL`KIN HVOST");


(3)
type_error: (fun(string,int), int) != (fun(int, string), int)



CS>Что такое эта foo()? Или их две сгенерируется?

Тип foo определим по первому встреченному вызову. При вызове foo типы ее аргументов должны быть выводибельны, иначе type_error.
Очевидно, что придется сделать опциональное декларирование типов на всякие крайние случаи, и вообще надо прочитать
описание хиднли-милнера. Примеры его реализации для игрушечных языков выглядят не страшно.

CS>И какой тип будут иметь с и d?

никакой, так как ошибка типов.
Re[5]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 18.01.09 04:38
Оценка:
local d = foo(2, "KIL`KIN HVOST");
type_error: (fun(string,int), int) != (fun(int, string), int)


ну то есть не ошибка в смысле type(d) != type(fun(string,int),?), а в смысле что вызывается функция не с той сигнатурой, с которой определена (парой строк раньше). Не проснулся просто еще.
Re: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 18.01.09 06:29
Оценка:
Хиндли-Милнер на перле: http://web.archive.org/web/20050420002559/www.cs.berkeley.edu/~nikitab/courses/cs263/hm.pl

Пять страниц простого кода.
Re[5]: А вот скриптовые языки со статической типизацией?
От: mkizub Литва http://symade.tigris.org
Дата: 18.01.09 10:28
Оценка:
Здравствуйте, dmz, Вы писали:

CS>>Что такое эта foo()? Или их две сгенерируется?

dmz>Тип foo определим по первому встреченному вызову.

А если один раз встретился foo — то тип можно не проверять, наверняка правильный?
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[6]: А вот скриптовые языки со статической типизацией?
От: dmz Россия  
Дата: 18.01.09 10:32
Оценка:
CS>>>Что такое эта foo()? Или их две сгенерируется?
dmz>>Тип foo определим по первому встреченному вызову.

M>А если один раз встретился foo — то тип можно не проверять, наверняка правильный?


да, выводить foo по его вызову нет смысла, для определения сигнатуры достаточно определения самой foo.
продолжаем курить хиндли-милнера.
Re[7]: А вот скриптовые языки со статической типизацией?
От: deniok Россия  
Дата: 18.01.09 10:54
Оценка:
Здравствуйте, dmz, Вы писали:


dmz>да, выводить foo по его вызову нет смысла, для определения сигнатуры достаточно определения самой foo.


Не, на самом деле все вхождения идентификатора foo равноправны — цель же не определить тип, а проверить самосогласованность всей программы.
id :: forall a . a -> a
id x = x

foo :: String
foo = id "Вася"
-- здесь id мономорфизируется и получает тип String -> String, благодаря вызову с "Васей"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.