Здравствуйте, VladD2, Вы писали:
AVC>> Си++ Java Oberon AVC>>Модульность и раздельная компиляция Нет Да Да AVC>>Многомерные открытые массивы Нет Да Да VD>Погоди. В яве нет многомерных массивов. Кстати, как и в ассемблере.
Это как это "В яве нет многомерных массивов"?
Читаем Брюса Эккеля:
Многомерные массивы
Java позволяет вам легко создавать многомерные массивы:
//: c04:MultiDimArray.java
// Создание многомерных массивов.import java.util.*;
public class MultiDimArray {
static Random rand = new Random();
static int pRand(int mod) {
return Math.abs(rand.nextInt()) % mod + 1;
}
static void prt(String s) {
System.out.println(s);
}
public static void main(String[] args) {
int[][] a1 = {
{ 1, 2, 3, },
{ 4, 5, 6, },
};
for(int i = 0; i < a1.length; i++)
for(int j = 0; j < a1[i].length; j++)
prt("a1[" + i + "][" + j +
"] = " + a1[i][j]);
// 3-х мерный массив фиксированной длины:int[][][] a2 = new int[2][2][4];
for(int i = 0; i < a2.length; i++)
for(int j = 0; j < a2[i].length; j++)
for(int k = 0; k < a2[i][j].length;
k++)
prt("a2[" + i + "][" +
j + "][" + k +
"] = " + a2[i][j][k]);
// 3-х мерный массив с векторами переменной длины:int[][][] a3 = new int[pRand(7)][][];
for(int i = 0; i < a3.length; i++) {
a3[i] = new int[pRand(5)][];
for(int j = 0; j < a3[i].length; j++)
a3[i][j] = new int[pRand(5)];
}
for(int i = 0; i < a3.length; i++)
for(int j = 0; j < a3[i].length; j++)
for(int k = 0; k < a3[i][j].length;
k++)
prt("a3[" + i + "][" +
j + "][" + k +
"] = " + a3[i][j][k]);
// Массив не примитивных объектов:
Integer[][] a4 = {
{ new Integer(1), new Integer(2)},
{ new Integer(3), new Integer(4)},
{ new Integer(5), new Integer(6)},
};
for(int i = 0; i < a4.length; i++)
for(int j = 0; j < a4[i].length; j++)
prt("a4[" + i + "][" + j +
"] = " + a4[i][j]);
Integer[][] a5;
a5 = new Integer[3][];
for(int i = 0; i < a5.length; i++) {
a5[i] = new Integer[3];
for(int j = 0; j < a5[i].length; j++)
a5[i][j] = new Integer(i*j);
}
for(int i = 0; i < a5.length; i++)
for(int j = 0; j < a5[i].length; j++)
prt("a5[" + i + "][" + j +
"] = " + a5[i][j]);
}
} ///:~
Код, использующийся для печати, использует length, так что он не зависит от того, имеет ли массив фиксированную длину.
Первый пример показывает многомерный массив примитивных типов. Вы ограничиваете каждый вектор в массиве с помощью фигурных скобок:
int[][] a1 = {
{ 1, 2, 3, },
{ 4, 5, 6, },
};
Каждая пара квадратных скобок переносит нас на новый уровень в массиве.
Второй пример показывает трехмерный массив, резервируемый с помощью new. Здесь весь массив резервируется сразу:
int[][][] a2 = new int[2][2][4];
А в третьем примере показано, что каждый вектор массива, создающий матрицу, может быть произвольной длины:
int[][][] a3 = new int[pRand(7)][][];
for(int i = 0; i < a3.length; i++) {
a3[i] = new int[pRand(5)][];
for(int j = 0; j < a3[i].length; j++)
a3[i][j] = new int[pRand(5)];
}
Первый new создает массив произвольной длиной первого элемента, а остальные элементы не определены. Второй new, внутри цикла for, заполняет элементы, но оставляет третий индекс неопределенным, пока вы не введете третий new.
Вы увидите на выводе, что значения массива автоматически инициализируются нулями, если вы не передадите им явно начальные значения.
Вы можете работать с массивами не примитивных объектов точно таким же образом, что показано в четвертом примере, демонстрирующем возможность помещения множества выражений new в фигурных скобках:
Integer[][] a4 = {
{ new Integer(1), new Integer(2)},
{ new Integer(3), new Integer(4)},
{ new Integer(5), new Integer(6)},
};
Пятый пример показывает, как можно построить массив не примитивных объектов по частям:
Integer[][] a5;
a5 = new Integer[3][];
for(int i = 0; i < a5.length; i++) {
a5[i] = new Integer[3];
for(int j = 0; j < a5[i].length; j++)
a5[i][j] = new Integer(i*j);
}
i*j — это просто помещает отличное от нуля значение в Integer.
Re[9]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Алгоритмический язык Simula 67 (от “simulation” – моделирование) является первым полноценным объектно-ориентированных языком, который представлял собой все основные концепции объектного моделирования (инкапсуляция, полиморфизм, наследование). Simula был разработан в начале 60-х гг. в Norwegian Computing Centre для моделирования дискретных событий в реальном физическом мире.
Синтаксис языка Simula взят из Алгола-60. Основными новшествами были понятия объекта, класса и наследования. Симула не навязывает строгую инкапсуляцию данных и не заботится о деталях реализации. Модули можно перекомпилировать по отдельности, не меняя внешние интерфейсы. Проверка типов осуществляется во время компиляции. Сборка мусора осуществляется системой поддержки работающей программы.
В Simula имеется поддержка моделирования физических процессов реального времени. Для этого Simula может оперировать понятиями Модель (Simulation) и Процесс (Process).
Для инкапсуляции (сокрытие реализации, принцип “черный ящика”) в Simula было введено строгое контролирование к доступу информации, однако “черный ящик” в объектной модели является в открытым к изменениям. Создавая свою модель на подобием существующей (наследуясь от нее) можно сделать изменения в базовой модели для своего объекта. Это достигается за счет техники полиморфизма.
Объекты могут действовать независимо друг от друга, предоставляя возможность выполнения квазипараллельных вычислений. Действие объекта можно приостановить и возобновить позже. Встроенные классы добавляют в язык средства работы со списками, графику и моделирование дискретных событий.
Среда
Переносимая система Simula (S-Port) содержит независимый пакет, состоящий из компилятора, генерирующего промежуточный язык S-code, систему поддержки работающей программы и символьного отладчика. Также есть система, зависимая от целевой машины, содержащая компилятор, транслирующий S-code в целевой код, и набор программ интерфейса. Планируется создать дополнительные средства и библиотеку предопределенных модулей.
Поставщики
Первая реализации на Univac 1107 появилась в начале 70-х гг. С этих пор язык был реализован на большинстве платформ, от больших ЭВМ до персоналок. В настоящее время Simula развивается и выступает на рынке под названием Simula a.s., установленным норвежской фирмой в 1984 г.
Переносимая система Simula (S-Port) — является основой многочисленных версий, включая PC Simula.
<...>
Сформированная в 1972 г. организация Simula Standards Group осуществляет контроль за развитием языка: самая последняя версия была выпущена в 1986г. Изменения в язык вносит Simula Developement Group. Кроме того, есть ассоциация пользователей языка Simula.
! The program defines the main class "Geometry".;
! It represents a theory with terms "point, rectangle, circle, and line".;
Class Geometry;
Begin
Class Point(X,Y); Real X,Y;
Begin
Procedure Print; Begin ... End;
Procedure Shift(Dx, Dy); Real Dx, Dy; Begin ... End;
Print; ! Life of point;
End of Point;
Class Rectangle(RecName, Width, Height);
Text RecName; Real Width, Height;
Begin
Real Area, Perimeter;
Procedure Update; Begin ... End;
Procedure Show; Begin ... End;
Update; Show; ! Life of rectangle;
End of Rectangle;
Class Circle(Radius, Center); Real Radius; Ref(Point) Center;
Begin
Procedure Shift(Dx, Dy); Real Dx, Dy; Begin ... End;
OutText("Circle created at "); ! Life of circle;
Center.Print;
End of Circle;
Class Line(M,N); Ref(Point) M,N; ! Line defined by two points;
Begin
Real Slope;
Slope := ... ; ! Life of line;
End of Line;
!Variables declared in geometry:;
Ref(Point) Origin, A, B;
Ref(Line) X,Y;
!Life of geometry:;
Origin :- New Point(0,0); ! Creating the origin;
A :- New Point(1,0); B :- New Point(0,1);
X :- New Line(Origin, A); ! Creating the axes;
Y :- New Line(Origin, B);
OutText("*** Geometry initialized ***"); OutImage;
End of Geometry;
Next program is using the main class Geometry. Note how the classes declared in Geometry are used to declare subclasses specialized to the problem being solved. Later it is possible to declare and use reference variables qualified into both imported and locally declared classes. This is the fundamental idea of Simula based packages or user defined languages (what is the difference?)
External Class Geometry;
Geometry Begin
! Subclasses declared in the prefixed block:;
Point Class Color_Point(C); Character C; Begin ... End;
Rectangle Class Square; Begin ... End;
! Variables declared in the prefixed block:;
Ref(Color_Point) A1;
Ref(Point) C, D;
Ref(Circle) K;
Ref(Line) E, F;
Ref(Rectangle) R1;
Ref(Square) S1;
! Block body:;
C :- New Point(5,6);
D :- New Point(20,30);
A1 :- New Color_Point(3, 4, 'G');
K :- New Circle(10, C);
E :- New Line(C, D);
F :- X;
K.Shift (1,1);
R1 :- New Rectangle("Rec_R1", 5, 4);
S1 :- New Square("Square_S1", 4, 6);
S1.Show;
End of prefixed block;
Re[9]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, AVC, Вы писали:
AVC>Речь шла об использовании сборки мусора в компилируемых языках.
Ява не компилируемый язык! По крайней мере не был таковым до появления в конце девяностых!
Компиляторы для Лиспа сушествовали еще в 70-ых.
О Алголах и т.п. вообще лучше умолчать..
Еще вопросы?
AVC>Я думал (по незнанию ), что таким первым языком был Оберон. Я ошибался.
Ты вообще думал, что Оберон это великое открытие, а от от Явм ничем не отличается в том плане, что вобрал в себя кучу уже придуманных идей.
Так что единственный вклад в науку Вирта — это как не смешно звучит — это Паскаль, в котором Вирт отстаивал принципы строгой статической типизации. Все остальное всего лишь развитие этой идеи на базе заимствований из других языков.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, Cyberax, Вы писали:
C>Почти. JIT-компилятор уже был в версии 1.0.2 в 96 году.
Небыло. Первый джит создал МС. Потом Сан купил ХотСпот. Надо рассказывать где появился ХотСпот?
Ява же как технология появилась значительно раньше 96-го. Так что твои "аргументы" о том, тут были какие-то заимствования из Оберона просто смешна.
>> Она и в 1998 была *интерпретируемой*, и джит-компилятор который сейчас >> используется в реализации Явы от Сана был банально позаимствован... >> догадайся откуда? И Смолтока! Такого всего на свквозь инерпретироуемого.
C>В 98 уже Java 1.2 была на подходе.
Ага, вот только 1.2 — это конец 98 года. Вот овервь для нее. Погляди дату в конце.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, AVC, Вы писали:
AVC>Влад, я так понимаю, что весь этот поток красноречия вызван тем, что так и не удалось высосать из пальца обещанный пример опечатки с операцией присваивания :=
Этот поток от возмущения вызванного твоими словами. Придумывать же ничего не нужно. Опечалася и будет "=". Вопрос поправит или нет компилятор. А раз дело в контроле компилятора, то какая разница что использовать "=" или "==" для сравнения если компилятор все равно не даст ошибиться?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
VladD2 wrote:
> C>Почти. JIT-компилятор уже был в версии 1.0.2 в 96 году. > Небыло. Первый джит создал МС. Потом Сан купил ХотСпот. Надо > рассказывать где появился ХотСпот?
JIT в Java появился в начале 97 года в версии 1.0.не_помню_какая (там
еще оставался консервативный сборщик мусора и старый JNI). Затем в
начале 98 года (как раз после новогодних праздников) зарелизили Java
1.1. Причем у Sun в JVM даже был специальный документированый интерфейс
для custom'ных JITов (его убрали в 1.2).
JIT у MS появился примерно в то же время — как раз к выпуску новой Студии.
Затем в конце 98 года действительно появилась 1.2, но ветки 1.1 и 1.2
долго жили параллельно.
>>> Она и в 1998 была *интерпретируемой*, и джит-компилятор который сейчас >>> используется в реализации Явы от Сана был банально позаимствован... >>> догадайся откуда? И Смолтока! Такого всего на свквозь инерпретироуемого. > C>В 98 уже Java 1.2 была на подходе. > Ага, вот только 1.2 — это конец 98 года. Вот овервь > <http://www.artima.com/insidejvm/newin12.html> для нее. Погляди дату в > конце.
Здравствуйте, AVC, Вы писали:
AVC>uw указал на Алгол-68 (хотя у меня была книжка по Алголу-68, где про сборку мусора не было сказано ни слова), Trurl на Симулу-67.
Смотри здесь, это Algol 68 Revised Report, а не какая-нибудь "книжка". В Алголе-68 просто была возможность динамически выделять память(скорее всего неявно), а освобождать не было. Нужен был сборщик мусора. Это одна из многочисленных "засад", которые ожидали ипмлементоров языка. Напомню, что тогда большинство языков сначала полностью описывались в спецификациях, а только затем реализовывались.
Да и в дремучие 70-е мало кому могло прийти в голову, что широкое афиширование внутренних механизмов управления памятью может быть частью PR-компании, которой так как таковой тоже не было.
Это же и относится к PL/I, который содержит сразу несколько механизмов управления памятью; возможно для какого-то из них требовался сборщик мусора.
Re[7]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, iZEN, Вы писали:
ZEN>Здравствуйте, VladD2, Вы писали:
AVC>>> Си++ Java Oberon AVC>>>Модульность и раздельная компиляция Нет Да Да AVC>>>Многомерные открытые массивы Нет Да Да VD>>Погоди. В яве нет многомерных массивов. Кстати, как и в ассемблере.
ZEN>Это как это "В яве нет многомерных массивов"?
Так. Нет.
ZEN>Читаем Брюса Эккеля:
Лучше спецификацию почитать.
ZEN>//: c04:MultiDimArray.java ZEN>// Создание многомерных массивов. ZEN>import java.util.*;
Раскажи мне любезный, как можно импортировать фичи языка?
ZEN> // 3-х мерный массив фиксированной длины: ZEN> int[][][] a2 = new int[2][2][4];
Это не 3-х мерный массив. Это массив, массивов, массивов. Короче воженные массивы тройной вложенности.
Ограничение на количество потоков в Виндовс есть, но объясняется оно не размерами стэка, а тем, что для каждого потока нужно хранить определенный объем невыгружаемой памяти. Короче просто захардкодено. Если не ошибаюсь, Русиновичь это раскапывал как-то.
Вот здесь я с ходу нашел упоминание о том, что орлы в тесте создали около 10 000 потоков.
СГ> СГ>P. S. СГ>При переходе к 64-разрядным системам указанная проблема (фиксации виртуального размера стэка) снимается, т.к. виртуальное пространство становится ну очень большим.
Сильно ошибашся. х64-процессоры не адресуют невероятных адресных пространств. У них просто уразанные шины. Так что от разных Xeon-ов они мало чем отличаются.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Спрашивал я у Гуткнехта и Зуева, чего это они компилятор языка Zonnon пишут на C#, а не на нём же самом (как это делал Вирт со своими языками). Гуткнехт сказал — "а чё такого-то C# — нормальный язык"; Зуев сказал — "Возиться с раскруткой не охота, на C# быстрее." Ну и спрашивается чего эти два товарища сделают с таким подходом к делу? Потратят денежки проплаченные микрософтом на свои собственные исследования — вот что они сделают. А потом, чую я, все эти изученные идеи по человечески реализуют в новейшей Aos BlueBottle 2.0, а микрософт оставят с носом т.е. с Зонноном.
Сыр на халяву бывает только в мышеловке
Более вероятно, что изученные идеи появятся в C# 3.0, а с носом останется Вирт
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[18]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, Cyberax, Вы писали:
>> C>Чушь. Стек в Винде может быть минимально в 32Кб, что дает 120 тысяч >> C>потоков. >> И что будет если этим 120 тысячам потокам надо будет (по очереди) >> занимать на стэке больше чем 32Кб?
C>Memory overflow будет. А что вы хотели?
Вот. А если не резервировать виртуальную память под стэк заранее, а выделять ее по честному в куче (при каждом вызове очередной процедуры), то глубина стэка каждого потока будет ограничена только физически установленным в машине количеством памяти.
Re[5]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, Дарней, Вы писали:
Д>Сыр на халяву бывает только в мышеловке Д>Более вероятно, что изученные идеи появятся в C# 3.0, а с носом останется Вирт
А Вирт-то тут при чем? Zonnon-ом занимается не Вирт, а Гуткнехт. Кстати, Вирт совсем не в восторге от этой работы Гуткнехта. По вопросам Zonnon-а у Вирта и Гуткнехта есть большие разногласия. Опять же кстати, не знаю как там на счет C# 3.0, но вот язык Active C# уже применяет могучие идеи аппробированные в процессе реализации проекта Zonnon.
Re[6]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Сергей Губанов wrote:
> А Вирт-то тут при чем? Zonnon-ом занимается не Вирт, а Гуткнехт. > Кстати, Вирт совсем не в восторге от этой работы Гуткнехта. По > вопросам Zonnon-а у Вирта и Гуткнехта есть *большие* разногласия. > Опять же кстати, не знаю как там на счет C# 3.0, но вот язык Active C# > уже применяет могучие идеи аппробированные в процессе реализации > проекта Zonnon.
Эти идеи изначально появились в языке Эрланг, еще в 80-х годах. Задолго
до ActiveOberon.
--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[19]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Сергей Губанов wrote:
>>> И что будет если этим 120 тысячам потокам надо будет (по очереди) >>> занимать на стэке больше чем 32Кб? > C>Memory overflow будет. А что вы хотели? > Вот. А если не резервировать виртуальную память под стэк заранее, а > выделять ее по честному в куче (при каждом вызове очередной > процедуры), то глубина стэка каждого потока будет ограничена только > физически установленным в машине количеством памяти.
Так оно и будет ограничено объемом физической памяти. 15000 потоков в
Винде создаются без всяких проблем, а больше создавать уже не имеет
смысла — сказываются ограничения планировщика.
--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[7]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Трурль wrote:
> C>Эти идеи изначально появились в языке Эрланг, еще в 80-х годах. Задолго > C>до ActiveOberon. > Какие такие идеи изначально появились в языке Эрланг?
Меня уже поправили — сначала они появились в Симуле-67.
--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[8]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, VladD2, Вы писали:
AVC>>>> Си++ Java Oberon AVC>>>>Модульность и раздельная компиляция Нет Да Да AVC>>>>Многомерные открытые массивы Нет Да Да VD>>>Погоди. В яве нет многомерных массивов. Кстати, как и в ассемблере.
iZEN>>Это как это "В яве нет многомерных массивов"? VD>Так. Нет. iZEN>>Читаем Брюса Эккеля: VD>Лучше спецификацию почитать.
Читаем вместе.
Кен Арнольд, Джеймс Гослинг, Дэвид Холмс "Язык программирования Java, 3-е издание", изд. Вильямс, 2001
6.4.2 Многомерные массивы
В Java поддерживается возможность объявления многомерных массивов (multidimensional arrays) (т.е. массивов, элементами которых служат массивы). Код, предусматривающий объявление двумерной матрицы и вывод на экран содержимого её элементов, может выглядеть, например, так:
float[][] mat = new float[4][4];
setupMatrix(mat);
for (int y = 0; y < mat.length; y++) {
for (int x = 0; x < mat[y].length; x++)
System.out.print(mat[y][x] + " ");
System.out.println();
}
При создании массива должна быть указана, по меньшей мере, его первая, "самая левая", размерность. Другие размерности разрешается не задавать — в этом случае их придётся определить позже. Указание в операторе new единовременно всех размерностей — это самый лаконичный способ создания массива, позволяющий избежать необходимости использования дополнительных операторов new. Выражение объявления и создания массива mat, приведённое выше, равнозначно следующему фрагменту кода:
float[][] mat = new float[4][];
for (int y = 0; y < mat.length; y++)
mat[y] = new float[4];
Такая форма объявления обладает тем преимуществом, что позволяет наряду с получением массивов с одинаковыми размерностями (скажем 4x4) строить и массивы массивов различных размерностей, необходимых для хранения тех или иных последовательностей данных.
Раз уж сами создатели языка решили, что многомерные массивы и массивы массивов — одно и то же, то в чём же их/моё заблуждение кроется. Может неправильно перевели?
Объясни, а?
Re[8]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, VladD2, Вы писали:
VD>Раскажи мне любезный, как можно импортировать фичи языка?
Легко.
Вот простой пример из Оберона:
IMPORT SYSTEM;
SYSTEM — не отдельный модуль, а возможность доступа к низкоуровневым средствам языка.
ИМХО, такое явное обособление низкоуровневых средств языка очень полезно.
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Хоар
Re[10]: Мои впечатления о лекции Н. Вирта в ННГУ 26.09.2005
Здравствуйте, uw, Вы писали:
AVC>>uw указал на Алгол-68 (хотя у меня была книжка по Алголу-68, где про сборку мусора не было сказано ни слова), Trurl на Симулу-67.
uw>Смотри здесь, это Algol 68 Revised Report, а не какая-нибудь "книжка". В Алголе-68 просто была возможность динамически выделять память(скорее всего неявно), а освобождать не было. Нужен был сборщик мусора.
Я не ставлю под сомнение, что сборка мусора в Алголе-68 была.
Просто удивляюсь, как можно было издать книгу о языке программирования и упустить такую деталь.
Почему Вирт может написать пару десятков страниц, и становится ясно, как устроен язык, какие задействованы механизмы, а другие могут написать не один том, так и не удостоив своим вниманием важнейшие свойства языка?
Боюсь, что и сейчас мы с Вами не можем сказать, как именно работала сборка мусора в Алголе-68.
Она (пока) — как поручик Киже — "фигуры не имеет".
uw>Это одна из многочисленных "засад", которые ожидали ипмлементоров языка. uw>Напомню, что тогда большинство языков сначала полностью описывались в спецификациях, а только затем реализовывались.
Не только тогда.
Поэтому мне больше нравится подход Вирта, когда язык и компилятор разрабатываются вместе.
Этим его подход принципиально отличается от "комитетских" разработок.
ИМХО, как раз Алгол-68 и стал поворотным пунктом для Вирта. (Он вместе с Хоаром входил в состав комитета, его предложения сформулированы в проекте языка Algol W. Стиль работы комитета описан в тьюринговской лекции Хоара.)
С тех пор Вирт в комитетах "не участвовал".
И самостоятельно создал Паскаль, Модулу (эксперимент в середине 70-х по встраиванию многопоточности в язык на основе хоаровских мониторов; причем здесь Эрланг?! Модула была одним из первых языков такого рода), Модулу-2 и Оберон.
(Кстати, что касается динамических языков и функционального программирования, то был у Вирта в 1960-х экспериментальный язык Euler.)
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.