Комментарии 81
Вся авиация плотно сидит там же
JSF (это который F-35) уже на C++ программировали, в сети даже стандарт кода под него есть.
SpaceX на своих ракетах тоже C++ используют. А заграничные вакансии разработчиков на Ada обычно требуют возможности оформления допуска к секретам.
… а дата сатанисты пусть и дальше молятся на питон, где тоже много чего есть, только вот какчество этого дела как у ардуино, пользователям которых топорность тоже не очевидна :-)
Довольно большая часть библиотек научного стека Питона — это Фортран в обертке. Питон больше нужен для некритичных операций, как "клей".
Вполне себе такой современный бейсик, только мощнее.
Но если уж про обёртки вспомнили: сдаётся мне, компилятор гораздо эффективнее сможет оптимизировать монолитную программу, нежели сборище модулей.
Это так, и на Питоне зачастую куски, критичные по скорости, компилируют через Cython.
Современная популярность интепретируемых языков, в том числе Питона, скорее в возможности быстро прототипировать, выводить графики на ходу, а пртом переписывать, разбивать на процессы/сервисы и т.п.
Но и про Tcl забывать не стоит.
Писал я на не, м, почти 10 лет… Немного перефразируя Луркоморье, это язык, на котором можно писать только в стельку пьяным.
Но если даже он может, значит стоящий язык.
Сравнение python и tcl.
После примерно 5-7 тысяч строк и достаточно сложной логики на Tcl становится уж слишком сложно писать, и дико не хватает нормального объектно-ориенторованного подхода.
5-7 тысяч строк это все же немного, вот, например, Удостоверяющий Центр Tcl/Tk. Согласен с объектно-ориенторованным подходом было еще красивее. Но у Python-а свои заморочки, хотя все лучшее от Tcl он хорошо в себя вбирает.
… бывают такие ситуации, когда этот клей, старый-добрый клей момент, надышавшись которым можно увидать разноцветных, резиновых зверушек и это прямо сказывается на получаемых результатах, но без широкого математического кругозора, это не разу не очевидно…
Вот и получается, что вроде
Одни и те-же вещи считаем,
На босу ногу топор одеваем,
Сапогом небо косим,
В решете воду носим.
А результат достигается и так и эдак, немного хуже, много дольше, и это много оно не только из-за оптимизации, оно и по другим причинам, из-за которых дольше может статься никогда…
Извините что не пишу конкретики, поверьте её полно но, она мой хлеб в буквальном смысле слова.
LOL: дата сатанисты. Это даже круче, чем сайентологи.
там появляются фичи, которым трудно найти замену в других языках.
Какие это фичи?
Но многопоточностью сейчас, наврное, мало кого удивишь. Однако «killer-feature» на данный момент — это комассивы (по сути распределённые массивы), которые позволяют реализовывать параллелизацию по модели PAGS. Появилось это ещё в стандарте 2008, но полноценную поддержку компиляторами получило только пару лет назад. Позволяет писать эффективный код для суперкомпьютера, не вызывая напрямую MPI. Что-то подобное есть, по-моему, только в новом языке Julia, но он ещё из беты не вылез.
Правда, там только фичи, которые касаются производительности. Если хочется подробней, то прямо на сайте комиссии по стандартизации есть такие обзоры: New Features in Fortran 2003, то же для Fortran 2008, то же для Fortran 2018.
Только не PAGS а PGAS. все это взялось из coarray Fortran которому уже более 30 лет. И пробдемы там теже что и в нем(и что и во всех PGAS). Remote getы медленные на всех существующих имплементациях, т.е. об появлении высокоэффективногот кода для кластера заменой массиввов на co-масчивы рассчитывать не приходится => нужно переписывать код
CAF был расширением, теперь (уже лет 10) стал стандартом. Насчёт медленности get: можете дать ссылки на бенчмарки? Не флейма ради, действительно любопытно.
Мне кажется, что при оптимизрованной архитектуре, проблемы возникать не должно. А на данный момент производители кластеров оптимизируют их для PGAS.
Вот, например, сравнение производительности CAF и Non-blocking MPI. При это CAF (например в библиотеке Open Coarrays) реализуется, в том числе, и как тонкая прослойка над MPI-RMA (тот же get/put).
Всё что реализуют современный HPC сети тот же IB(а также даже и отечественные) это грубо говоря низкоуровневые примитивы (как в shmem, запись, чтение, блокировка). Проблема с get в том что его нельзя делать асинхронно put это положил кому-то и забыл, а у getа то результат есть, получается что на putах всё быстрее от этого мир розовых поней в лице coarrays/UPC рушится, т.к. они предоставляют такой же api как и в обычном C/fortran позволяя ему и читать и писать в память на уровне кода так же легко как и в локальнуюю память что побуждает программиста обращаться к этим шаренным массивам как к обычным и так же часто читать память нежели писать => см. про getы
В любом случае, понятно, что для того, чтобы выжать максимум масштабируемости, все коммуникации надо реализовывать руками на MPI. Но есть масса задача, где-то пересылки идут не часто и большими блоками. Тогда можно пожертвовать парой процентов в виде накладных расходов для того, чтобы сделать код читабельным и понятным.
Больше всего запомнилось, что после end надо указывать, чего именно это end («end Hello» в приведённом примере).
С тех пор часто пишу "}//Hello"
Ещё стоит отметить, что ОС для Intel 432 была написана на Ada:
https://en.wikipedia.org/wiki/IMAX_432
С тех пор часто пишу "}//Hello"
Вот она, профдеформация, во всей красе. А как после вас код дописывать/переписывать/рефакторить?
Если вы что-то не пользуете, то другим это надо запретить?
«end Hello» было нужно во времена многострочных вложенных циклов и низких разрешений экранов, т.ч. не влезало в экран. А среды программирования бывали однооконными (или их вообще не было, т.ч. — текстовый файл и вызов компилятора из командной строки). Разработчики сделали простое и полезное решение. А потом было лень переучиваться, да и незачем.
А мне почти 33 года, программированием я занимаюсь с 16 лет, застал и бейсик на Spectrum-like компьютерах, и турбо паскаль, и прочие «прелести» тех времён. Но те времена давным-давно прошли. И писать сейчас в стиле пятнадцати-двадцати -летней давности — это надо быть тем ещё динозавром с зашореным мысшлением, совсем не способным к адаптации.
dic.academic.ru/dic.nsf/ruwiki/1130547
Ада — модульный язык программирования со строгой типизацией, унаследовавший синтаксис от Паскаль и Алгол.
Что у вас со склонениями?
Еще у Ады есть очень интересное, так сказать, расширение — SPARK. Этот инструмент позволяет «доказывать» корректность выполнения программы на этапе компиляции.
There have always been debates over the usefulness and performance of assembly language relative to high-level languages. Assembly language has specific niche uses where it is important; see below. As of July 2017, the TIOBE index of programming language popularity ranks assembly language at 11, ahead of Visual Basic, for example.Но, ИМХО вряд ли кто скажет, что Ассемблер — ЯП, который совершенно никому не нужен. ИМХО очень неоднозначно с рейтингами ЯП: м.б. ЯП с небольшим рейтингом, но хоронить его никак нельзя.
Я лет шесть назад пробовал устроиться на работу в контору, в которой частью процесса было «решить задачу на языке, который не использовался в работе до тех пор». Я как раз попробовал на Ada.
Зачётное название статьи.
язык изначально разрабатывался для встраиваемых систем. Отсюда — неразвитость Ады по части GUI и СУБДЯзык 1980 года, о каких GUI и встраиваемых системах идёт речь?))
en.wikipedia.org/wiki/History_of_the_graphical_user_interface
Текущий стандарт Ады — это Ada 2012. И этот язык сильно отличается по своим возможностям от того, что было стандартизировано в 1983 году.
А вот ориентированность на embedded mission critical systems осталась. Это одно из основных применений Ады сейчас. Хотя есть либы и фреймворки и для всего остального. Написать http-сервер там не сложнее чем на С++.
Мне, кстати, больше всего GUI Cocoa нравится, а оно не просто так получилось таким. Оно восходит к Objective C (тогда ещё без дефиса) и его библиотек из тех самых страшных 80х. Но в тех самых страшных 80х оно, наверное, по сравнению с другими, было не очень, а за прошедшее время устаканилось, и поэтому такое хорошее. Иметь время устаканиться и быть на свежем языке — вещи не очень совместимые.
gnoga.com/#tools — движок для облачных приложений
github.com/mosteo/adagio — p2p (Gnutella2) сервачок
ironsides.martincarlisle.com — верифицированный DNS сервер на SPARK
parasail-lang.org — виртуальная машина (чем-то напоминает Erlang) и 4 языка программирования
www.pegasoft.ca/tia.html — консольный редактор
gprbuild (в составе дистрибутивов GNAT, хотя можно и отдельно установить) эволюцонировал из чисто адских gnatmake, а потом gprmake, чтобы лучше поддерживать смешанные C/C++ проекты. И настолько в этом преуспел, что и для проектов без языка Ада хорошо подходит. После gprbuild я не переварил CMake. Не знаю, чего с него так тащатся. Может, gprbuild никогда не видели.
muen.sk — верифицированный гипервизор
procedure STAR_TREK is
energy : integer := 4000;
torpedoes : integer := 10;
star_date : integer := 3421;
klingons : integer;
total_klingons : integer; -- # klingons in galaxy
star_bases : integer; -- # starbases in galaxy
x_sector,y_sector : integer; -- position of Enterprise
x_quadrant,y_quadrant : integer; -- position of Enterprise
condition : string(1..6) := "Green ";
damage : array(1..6) of integer;
x,y : integer;
max_klingons : constant integer := 4;
x_klingon, y_klingon, power_klingon : array(1..max_klingons) of integer;
sectors : array(0..7,0..7) of character;
quadrants : array(0..7,0..7) of integer;
command : integer;
moved, docked : boolean := false;
function rand(A : integer) return integer is
function truncate(A : float) return integer is
b : integer := integer(A);
begin
if float(b) < a then return b; else return b-1; end if;
end truncate;
begin
return truncate(rnd(0.0) * float(a));
end rand;
function distance(i,j,x,y : integer) return integer is
a,b : integer;
function sqrt(a : integer) return integer is
begin
if a=0 then return 0;
elsif a=1 then return 1;
else
for guess in 2..256 loop
if guess**2 = a or (guess+1)**2 > a then
return guess;
end if;
end loop;
end if;
end sqrt;
begin -- distance
a := i - x;
b := j - y;
return sqrt(a ** 2 + b ** 2) + 1;
end distance;
procedure get_blank_sector is
begin
x := rand(7);
y := rand(7);
if sectors(x,y) /= '.' then
get_blank_sector;
end if;
end get_blank_sector;
procedure reset is -- reset all enterprise variables
begin
new_line;
energy := 4000;
torpedoes := 10;
for i in 1..6 loop
damage(i) := 0;
end loop;
condition := "Green ";
end reset;
procedure dock is -- dock the enterprise at a starbase
begin
reset;
docked := true;
condition := "Docked";
end dock;
function unexplored(A,B : integer) return boolean is
begin
if quadrants(a,b) < 0 then
return true;
else
return false;
end if;
end unexplored;
procedure initialize is
begin
put("Please wait while I create the universe");new_line;
put("(Even God took seven days...)");new_line;
reset;
x_quadrant := rand(7);
y_quadrant := rand(7);
star_date := 3421;
total_klingons := 0;
star_bases := 0;
for i in 0..7 loop
for j in 0..7 loop
declare
n : integer := 1;
o : integer;
begin
o := rand(max_klingons+1); -- get rand # klingons
total_klingons := total_klingons + o;
n := n + o * 100;
n := n + rand(8);-- get rand # stars
if rand(8)=1 then
n := n + 10;
star_bases := star_bases + 1;
end if;
quadrants(i,j) := -n;
end;
end loop;
end loop;
put("Initialization complete."); new_line;
end initialize;
procedure set_up_quadrant is
begin
for i in 0..7 loop
for j in 0..7 loop
sectors(i,j) := '.';
end loop;
end loop;
x_sector := rand(7);
y_sector := rand(7);
sectors(x_sector,y_sector) := 'E';
if abs(quadrants(x_quadrant,y_quadrant)) mod 100 > 9 then
get_blank_sector;
sectors(x,y) := 'B';
end if;
if abs(quadrants(x_quadrant,y_quadrant)) >= 100 then
declare
i : integer :=
abs(quadrants(x_quadrant,y_quadrant))/100;
begin
for j in 1..i loop
get_blank_sector;
sectors(x,y) := 'K';
x_klingon(j) := x;
y_klingon(j) := y;
power_klingon(j) := rand(20) * 10 + rand(20) + 5;
end loop;
klingons := i;
end;
else
klingons := 0;
end if;
if abs(quadrants(x_quadrant,y_quadrant)) mod 10 > 0 then
declare
i : integer :=
abs(quadrants(x_quadrant,y_quadrant)) mod 10;
begin
for j in 1..i loop
get_blank_sector;
sectors(x,y) := '*';
end loop;
end;
end if;
end set_up_quadrant;
procedure attacked is
begin
if klingons /= 0 then
for i in 1..klingons loop
declare
j : integer;
begin
j := power_klingon(i) /
distance(x_klingon(i),y_klingon(i),x_sector,y_sector);
put(j);
put(character'val(9));
put("unit hit from Klingon at ");
put(x_klingon(i)+1);
put(',');
put(y_klingon(i)+1);
put(" (");
put(power_klingon(i));
put(')');
new_line;
energy := energy - j;
end;
end loop;
end if;
end attacked;
procedure commands is
procedure short_range_scan is
begin
-- set starship condition
if klingons > 0 then
condition := "Red ";
elsif docked then
dock;
elsif energy < 300 then
condition := "Yellow";
else
condition := "Green ";
end if;
-- print quadrant map
for i in 0..7 loop
for j in 0..7 loop -- print a row of quadrant
put(sectors(i,j)); put(' ');
end loop;
put(" ");
-- print a line of starship information
case i is
when 1 =>
put("Stardate=");put(star_date);new_line;
when 2 =>
put("Condition: ");
put(condition);
new_line;
when 3 =>
put("Quadrant=");
put(x_quadrant+1);put(",");
put(y_quadrant+1);new_line;
when 4 =>
put("Sector=");
put(x_sector+1);put(",");
put(y_sector+1);new_line;
when 5 =>
put("Energy=");put(energy);new_line;
when 7 =>
put("Klingons left=");put(total_klingons);new_line;
when others =>
new_line;
end case;
end loop;
end short_range_scan;
procedure long_range_scan is
procedure display(number : integer) is
procedure dispnum(number : integer) is
begin
if number = 0 then
put('-');
else
put(number);
end if;
end dispnum;
begin
dispnum(number/100);
dispnum((number/10) rem 10);
dispnum(number rem 10);
end display;
begin
put(" Long range scan");
new_line;
for i in 0..7 loop
for j in 0..7 loop
if abs(i-x_quadrant) <= 1 and abs(j-y_quadrant) <= 1 then
quadrants(i,j) := abs(quadrants(i,j));
end if;
if unexplored(i,j) then
put("***");
elsif i = x_quadrant and j = y_quadrant then
put(" E ");
else
display(quadrants(i,j));
end if;
put(' ');
end loop;
new_line;
end loop;
end long_range_scan;
procedure phasors is
units : integer;
aux : integer;
length : integer;
begin
put("Number of units to fire? ");
get(units);
energy := energy - units;
while units > 0 and klingons /= 0 loop
aux := power_klingon(klingons);
length := distance(x_klingon(klingons),y_klingon(klingons),
x_sector,y_sector);
if length /= 0 then
aux := aux * length;
end if;
-- aux has relative power needed to destroy klingon
if units >= aux then -- more than enough to kill
units := units - aux;
put("Klingon at ");
put(x_klingon(klingons)+1);
put(',');
put(y_klingon(klingons)+1);
put(" destroyed!!!");
sectors(x_klingon(klingons),y_klingon(klingons)) := '.'; klingons := klingons - 1;
quadrants(x_quadrant,y_quadrant) :=
quadrants(x_quadrant,y_quadrant) - 100;
total_klingons := total_klingons - 1;
new_line;
else -- subtract what we threw at it...
power_klingon(klingons) :=power_klingon(klingons) -
units / length;
put(units / length);
put(" unit hit on Klingon at ");
put(x_klingon(klingons)+1);
put(',');
put(y_klingon(klingons)+1);
new_line;
units := 0;
end if;
end loop;
end phasors;
procedure navigate is
type_of_propulsion : character;
x, y : integer;
procedure get_x_y is
begin
put("New x co-ordinate: ");
get(x);
put("New y co-ordinate: ");
get(y);
if x<1 or x>8 or y<1 or y>8 then
put("Invalid co-ordinates, try again!");new_line;
get_x_y;
end if;
x := x - 1; y := y -1;
end get_x_y;
procedure new_sector is
begin
get_x_y;
if sectors(x,y) = '.' then
sectors(x,y) := 'E';
sectors(x_sector,y_sector) := '.';
energy := energy - distance(x,y,x_sector,y_sector);
x_sector := x;
y_sector := y;
else
put("That sector is not empty, try again!");new_line;
new_sector;
end if;
end new_sector;
procedure check_docked is
begin
docked := false;
for i in x_sector-1..x_sector+1 loop
for j in y_sector-1..y_sector+1 loop
if sectors(i,j) = 'B' then
docked := true;
end if;
end loop;
end loop;
if docked then dock; end if;
end check_docked;
begin
put("Impulse (I) or Warp (W) power? ");
get(type_of_propulsion);new_line;
docked := false;
if type_of_propulsion = 'W' or type_of_propulsion = 'w' then
get_x_y;
moved := true;
energy := energy - distance(x_quadrant,y_quadrant,x,y) * 100;
x_quadrant := x;
y_quadrant := y;
else
new_sector;
short_range_scan;
end if;
check_docked;
end navigate;
begin -- commands
command := 0;
attacked; -- Enterprise is attacked immediately
short_range_scan; -- show the captain what he is up against
while not moved and energy > 0 and total_klingons /= 0 loop
put("Command? ");
get(command);
case command is
when 0 =>
long_range_scan;
when 1 =>
short_range_scan;
when 2 =>
phasors;
attacked;
short_range_scan;
when 3 =>
navigate;
when others => -- menu if bad command
put("0 - long range scan");new_line;
put("1 - short range scan");new_line;
put("2 - phasors");new_line;
put("3 - navigate");new_line;
end case;
end loop;
end commands;
begin -- main startrek program
initialize;
while energy > 0 loop
moved := false; -- say we haven't moved out yet
set_up_quadrant; -- initialize the quadrant
commands;
end loop;
if total_klingons = 0 then
if energy > 0 then
put("Congratulations, you have saved the Federation");
new_line;
put("and have been promoted to Admiral.");new_line;
else
put("You have destroyed the klingon manace and have");
new_line;
put("killed yourself in the process. A statue will");
new_line;
put("erected in your honor. Rest in peace and try");
new_line;
put("not to think of the pidgeons.");
new_line;
end if;
elsif energy <= 0 then
put("You have been destroyed and the empire has been");
new_line;
put("taken over by Klingons. Better luck next time.");
new_line;
else
put("Time has run out. The Klingons have invaded");
new_line;
put("en masse and wiped out the Federation.");
end if;
end STAR_TREK;
Компилируется, запускается и работает (IMHO без глюков) под CP/M.
А язык хорош по своему. Но к сожалению тяжелый, сложный и дорогой компилятор в 80х не оставил ему особых шансов на PC в сравнении с дешевыми и быстрыми Паскаля и С/С++ отсюда и не великая популярность, к тому же писать на нем тяжелее, а вот читать наоборот легче потом.
Я программировал на Ada немного, это было на VAX/VMS
Ада (Ada) — язык программирования, созданный в 1979—1980 годах в ходе проекта Министерством обороны США с целью разработать единый язык программирования для встроенных систем (то есть систем управления автоматизированными комплексами, функционирующими в реальном времени).[...] Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области.
разработавшая его [ЯП] группа под руководством француза Жана ИшбиаДавно на одной конференции познакомился с профессором CS не помню какого французского университета. Он рассказывал, что Ада во Франции — национальная гордость и многие курсы у них на этом языке. Поэтому если кто хочет найти больше литературы и кода на Аде, то имеет смысл искать во французских источниках.
В 1983 году язык был официально стандартизован ANSI. [...] Министерство обороны США [...], запретив выпускать трансляторы языка, не прошедшие официальную процедуру тестирования на соответствие стандартам. [...] Тестирование проводилось по принципу «всё или ничего» — при ошибке в обработке хотя бы одного тестового примера компилятор считался не прошедшим тест, причём тестирование было действительно только на той аппаратной и программной платформе, на которой оно проводилось. Таким образом была в зародыше подавлена возможность образования «версий» или «диалектов» языка Ада.Есть интересный сборник статей по сравнению ЯП: Языки программирования Ада, Си, Паскаль. Сравнение и оценка/ Под. ред.А.Р.Фьюэра, Н. Джехани, М.: Радио и связь, 1989.
Думаю, что из-за схожести синтаксиса ее надо позиционировать в том числе и разработчикам Oracle, примерно так как java и с# позиционировали разработчикам на C/C++.
Для разработчиков Oracle, наверное, было бы интересно разрабатывать нативные, быстрые, занимающие небольшое количество памяти, работающие вне базы Oracle DB web — приложения на Ada (и не только для Oracle DB).
А там и до embedded решений недалеко и расширения областей своего применения как разработчика (не всем нравится enterprise, где в основном и применяется Orcle)
Ада и PL/SQL соотносятся как C и С++, и именно благодаря PL/SQL, Ада является живым популярным языком.
habr.com/company/parallels/blog/430924/#comment_19411252
Отметил, что в PL/SQL тоже есть подобное.
Чтение википедии по теме даст больше знаний по этому вопросу, чем обсуждаемая статья или чей-то обзор («10 языков программирования, которые больше никому не нужны»).
Местами Ada — нужна, в основном — в Европе.
Стоит упомянуть о GNAT.
GNAT — часть большинства дистрибутивов Linux и BSD.
FSF GNAT is part of most major GNU/Linux or BSD distributions and is included in the main GCC Sources.
Ada и Fortran есть в GNU Compiler Collection, а всяких новомодных языков там нет. Т.ч. якобы «неиспользуемые» очень даже рабочие и поддерживающиеся.
Вот тут краткая Ада-библиография.
И в этой библиографии под номером 6 я:
От Паскаля к Аде/ Т.Ю.Бардинова, В.Ю.Блажнов, А.А.Маслов, В.Н.Орлов. — 1990
Москва, Финансы и статистика, 1990. 255 с. Твердый переплет.
Приятно, черт побеои.
Программирование на языке Ада