Большинство терминов использовалось исключительно для маркетинга - "О, вы все еще используете третий язык поколения? Это , поэтому на прошлой неделе!"
За этим было крошечное немного технического значения, хотя (по крайней мере, некоторое время, хотя многие "4GL" игнорировали его).Основным отличием было (как предполагается, что) языки третьего поколения, позволяющие вам манипулировать только отдельными элементами данных, тогда как языки четвертого поколения позволяют вам манипулировать группами элементов как группой, а не по отдельности.
Два очевидных примераэто SQL и APL.В SQL вы в основном работаете с наборами.Результатом запроса является набор (не совсем математический набор, но, по крайней мере, несколько похожий).Вы можете использовать и манипулировать этим набором в целом, объединять его с другими наборами и т. Д. До тех пор, пока вы не подвергаете его воздействию внешнего мира (например, с помощью курсора), вам не нужно иметь дело с отдельными записями /строки / кортежи, которые составляют этот набор.
В APL вы получаете несколько ту же идею, за исключением того, что вы работаете с массивами вместо наборов.Чтобы получить представление о том, что это значит, давайте предположим, что вы хотели «повернуть» массив так, чтобы первый в настоящее время элемент был перемещен в конец, а каждый другой элемент был смещен вперед на определенную точку.Чтобы сделать это в типичном 3GL (Fortran, Pascal, C и т. Д.), Вы должны написать цикл, работающий с отдельными элементами в массиве.В APL, однако, у вас есть один оператор, который будет делать это с массивом в целом, все в одной операции.Даже операции, которые работают с отдельными элементами, обычно тривиально применять сразу ко всему массиву с помощью оператора /
, поэтому (например) сумма всех элементов в массиве с именем a
может быть вычислена с помощью +/a
(или, может быть, это было /+a
- это был длинный раз, с тех пор как я написал какую-либо APL).
Есть некоторые довольно серьезные проблемы с общей идеей различия, существующего там, хотя,Одна из них заключается в том, что в ней сделан сильный акцент на синтаксис - очевидно, что для задействованных действий требуются такие вещи, как внутренние циклы, поэтому различие сводится к синтаксису для неявного цикла.Другая проблема заключалась в том, что во многих случаях вы получали что-то вроде смеси двух поколений - например, большинство Бейсиков способны обрабатывать строку как одну вещь, но требуют циклов для аналогичных операций над массивами / матрицами.Наконец, возникла небольшая проблема с релевантностью: хотя в некоторых особых случаях (например, SQL) возможность работать с группой / набором / массивом / независимо от данных в целом действительно имела большое значение - но дляпо большей части это мало помогло людям думать и работать с абстракциями более высокого уровня (как это было, по крайней мере, очевидно, первоначальным намерением).
Это сочеталось с движением к языкам, которое стирало различие между тем, что было встроено,и что было частью библиотеки (или что-то еще).В C ++, большинстве языков семейства ML и т. Д., Тривиально написать функцию с произвольными действиями (включая, но не ограничиваясь циклами) и прикрепить ее к оператору, который по существу неотличим от оператора, встроенного в язык.
Это была броская фраза со значением, которое большинство не могли объяснить и даже меньше заботило - главный кандидат для превращения в чистый рыночный разговор, обычно переводимый примерно как: «Вы должны заплатить мне много за мою медленную, уродливую,глючный генератор приложений CRUD. "