ИТ-образование с точки зрения национальных интересов



Cbiybr hekbn b ybbg`n!
ты хотел сказать "Сишник рулит и ниипёт!"?
Буахаха.
ВБ.НЕТ ещё более безупречно современен, ага.
На мой взгляд, следующие языки знать надо бы:
- какой-нибудьт простой асм, типа Z80
- Basic
- C++, чтобы знать, каково это писать ядра
- Паскаль
- Java
- Lisp
- Prolog
- Haskell или ML
При всём при том, детей лучше учить ML-ю, ИМХО, если дети продвинутые, или действительно Паскалю.
ядра чего?
В вангерах были Жабли, из которых в нужный сезон сыпались Ядробусы. Мб это как-то связано?
Basic damages brain (c) Dijkstra.
Basic damages brain (c) Dijkstra.
Блин, вот вылез. Ядра юниксов и СУБД, всякие там орбы - хттп сервера, логику раутинга в раутерах - всё, что пишут программисты-ядерщики в страшных корчах. И что падает в корах, когда из него уходит Дао, или когда оные программисты начинают верить в неправильные вещи, вроде UML или OOC++, чтобы знать, каково это писать ядраядра чего?

P.S. Ну конечно же и дотнет ещё.
"They call them fingers, but I've never ever seen them actually fing".
> а затем понять на своём же опыте, зачем нужно структурное программирование,
На бейсике можно писать структурно.
> почему хорошо когда результат вычисления функции зависит только от её аргументов,
А при чём тут бейсик?
> зачем нужна типизация
Ну-ка? Есть много прекрасных языков - типа пхп, перла, жаваскрипта етс. в которых типизации нет вообще. В отличие от бейсика, кстати.
Это как раз после того, как подопытный заценит чистый С, с его полным описанием, вмещающимся на две странички А4 (включая формальную грамматику, но без стандартной библиотеки вот после этого можно надеятся, что при виде бейсика его начнёт тошнить. А наоборот - вряд ли.
Открою тебе секрет - всё вышеперечисленное как правило пишется на чистом С. В частности потому, что людей, полностью понимающих плюсы - нет.Пурист знает, что писать "struct s_a { }" - это C++, равно как и "// комментарий" однако ядерщики так пишут. Отклоняется. Что же до непонимания, то это, вроде, никогда проблемой не было. Это вообще-то, humanum est - считать себя специалистом во всём, где ты можешь сделать хотя бы что-то... Это никого не отпугивает. Раздел сосайти - конструктивно построенный пример.
Ты его предлагаешь изучать _ВТОРЫМ_ по счёту. Три четверти подопытных уже не оправятся никогда.Читай внимательнее. Я написал, что детей надо учить ML-ю (крутых) и паскалю (всех остальных).
Но если это так неясно, то я добавлю, что порядок в том перечислении ничего не отражает. И я сам сначала учил басик, потом паскаль, и только потом писишный асм.
На бейсике можно писать структурно.Особенно помогают тому оператор GOSUB, позволяя сразу проникнуться идеей подпрограмм

Ну-ка? Есть много прекрасных языков - типа пхп, перла, жаваскрипта етс. в которых типизации нет вообще. В отличие от бейсика, кстати.А, так ты не знаешь? Надёжность кода. То, на чём пишут скрипткиддиес, работает как надо только когда надо, но чуть что не так, так оно сразу умножает глюки, а с ними скорбь и печаль.
Это как раз после того, как подопытный заценит чистый С, с его полным описанием, вмещающимся на две странички А4 (включая формальную грамматику, но без стандартной библиотеки вот после этого можно надеятся, что при виде бейсика его начнёт тошнить. А наоборот - вряд ли.Нормальный подопытный захочет семантику - а её-то и не будет.
Кстати, хочу напомнить про то, что человек, сначала изучавший математику, не может понять, что значит x=x+1

Нагнал. Вот я не знаю, в какой древней версии С таких комментариев не было, но я с ней ни разу не встречался.
> struct s_a { }
Не понял. Чистый С:
typedef struct _MyStruct
{
int i;
} MyStruct;
Только так и нужно писать. Всё остальное - от лукавого.
> Особенно помогают тому оператор GOSUB, позволяя сразу проникнуться идеей подпрограмм
Бейсик вообще-то успел шагнуть далеко вперед. Там уже нет обязательных номеров строчек, госаба тоже нет, и вообще ВБ.НЕТ это тот же Сшарп, только с чудовищным синтаксисом.
Да, кстати. GOSUB является полным эквивалентом ассемблерного call, так что не гнать на него! =)
> А, так ты не знаешь? Надёжность кода.
Надёжность кода определяется не только количеством запретов со стороны компилятора, но и количеством кода, необходимого для написания задачи. Скриптовые языки отличаются удивительной ёмкостью. Не знаю, как на них можно писАть что-нить большое, наверное можно, ограничения сидят в голове программера на самом деле (и чистый С очень помогает это осознать но наличие строгой типизации, точнее даже отстутствие возможности сказать
this.value = obj."MyMethod(" + param + ");"
меня в шарпе нервирует местами.
> Нормальный подопытный захочет семантику - а её-то и не будет.
Будет, будет, не волнуйся. В полном объёме. Это ж С. Да, ещё, конечно, придётся потратить пару страничек А4 на описание макропроцессора.
PS: Сейчас я буду тренироваться переносить эту макагню в программинг...
> "// комментарий"
Нагнал. Вот я не знаю, в какой древней версии С таких комментариев не было, но я с ней ни разу не встречался.
int main {
return 0;
}
// test
$ gcc -ansi test.c
test.c:5: error: parse error before '/' token
Если ты ошибаешься в фактах, то как с тобой можно обсуждать выводы?
А стандарт C99 с некоторых пор стал некошерным и чистым C уже не считается?
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
А стандарт C99 с некоторых пор стал некошерным и чистым C уже не считается?Да я-то вообще считаю, что C - дело некошерное. Свинина под молочным соусом. И, в частности, поэтому детей ни при каких условиях ему учить не следует, кроме как чтобы знали, какие уродства бывают в природе.
-ansi
In C mode, support all ISO C90 programs.
С - это уродство... Приехали нах!
Чувак, учи албанский. Албанский - самый прогрессивный язык программирования!
Какая разница на чем прогать учить, главное как это делать.
Разница есть. Программы сложны, и я нуждаюсь в костылях, которые будут чисто механически мешать мне делать вещи гнилым способом. И в C таких костылей мало, а в том же паскакале (в его идеальном варианте с автоматической сборкой мусора) такие костыли есть, и довольно правильные. В перле ж полная свобода от костылей, за что его и любит молодёжь, свято верящая в свои немерьныя силы.
nspired by Daniel Horn's Obfuscated V contest in the fall of 2004, we hereby announce an annual contest to write innocent-looking C code implementing malicious behavior. In many ways this is the exact opposite of the Obfuscated C Code Contest: in this contest you must write code that is as readable, clear, innocent and straightforward as possible, and yet it must fail to perform at its apparent function. To be more specific, it should do something subtly evil.http://www.brainhz.com/underhanded/
Неплохо было бы сначала научить пониманию, что такое информация и что с ней может сделать компьютер. Чтобы человек мог рассуждать об этом без ссылок на магию и телепатию. Потом про сети рассказать (отдельно стоящий компьютер сейчас мало кому интересен). А там уж можно и языки повыбирать, если дойдёт до этого.
Неплохо было бы сначала научить пониманию, что такое информация и что с ней может сделать компьютер.Не согласен насчёт "сначала". Детей учат ходить, хотя они ещё не знают о таких достижениях ходьбы, например, как возможность сбросить вес. Точно так же учить програмить можно даже без предварительных чётких представлений о том, что это такое.
* почему одна и та же кнопка может выполнять различные функции в разное время, и как определить, какие,
* откуда берутся различные рекомендации (как подключиться к инету, как защититься от вирусов и что можно сделать в случаях, в рекомендации не описанных,
* что для того, чтобы добиться от компьютера нужного результата, необходимо, но не всегда достаточно, сообщить ему всю нужную информацию
* в конце концов, понимание, что всю технику разрабатывают такие же люди, которые мыслят такими же способами, которые только что излагал преподаватель, и можно предсказывать возможности программы до полного ознакомления с ними и т.д.
Открою тебе секрет - всё вышеперечисленное как правило пишется на чистом Спрога на "чистом C" php-src
в самой проге реализованы подсчет ссылок, конструкторы, деструкторы для ресурсов калбэки...
на C++ можно и не писать ядра, однако там есть конструкции, полезные для применения на практике.
З.Ы. деревья могут и не быть частью языка, однако это не мешает их использовать в любых языках
Есть. Вот я например.

Что происходит, когда во время <вызванного <выкинутым исключением> <исполнения деструктора <автоматически созданного на стеке объекта>>> происходит выкидыш ещё одного исключения? Только без заглядки в стандарт.
Честно - не знаю. Думаю что вызов какого-нибудь из termination.
Полностью поддерживаю.
ps
Какие-нибудь простые средства для обработки информации сейчас есть?
на ум только электронные таблицы приходят.
PS: могу объяснить почему я так думаю. Очевидно что два исключения в программе жить не могут(иначе получатся 2 точки выхода). Потеря одного из них тоже не вариант. поэтому остается одно - аварийно завершить программу. Стандартный способ этого в С++ с глюками в исключениях - std::terminate.
#include <cstdio>
class E1
{
};
class E2
{
};
class A
{
public:
A
{
}
~A
{
throw E1;
}
};
int main
{
try
{
A a;
throw E2;
}
catch ( E1 e )
{
printf("c1\n");
}
catch ( E2 e )
{
printf("c2\n");
}
}
terminate called after throwing an instance of 'E1'
Aborted
В общем я про это и говорил, когда писал что я понимаю весь С++. Это значит что даже досконально не зная все его аспекты поведения, я могу предсказать как он будет себя вести.

Когда я учился в школе, там одно время были часы, автоматические дающие звонки по расписанию. На этих часах уже можно продемонстрировать хранение информации, вычисление и управление, хотя и кривовато.
И как после такого писать устойчивые программы (24x7) ?
Но на чем они смогут применить свои навыки?
Очень просто. Все зубры С++ рекомендуют все деструкторы писать так чтобы они не кидали исключений. Вообще исключения в дестркуторе плохи по многим причинам. Например по этой, как оказалось. Или например если объект выделен в куче и в дестркуторе произошло исключение, память может не освободиться, насколько я помню.

#include <cstdio>
class E1
{
};
class E2
{
};
class A
{
public:
A
{
}
~A
{
try
{
throw E1;
}
catch ( ... )
{
printf( "bad\n" );
//syslog( blablabla );
//message( blablabla );
}
}
};
int main
{
try
{
A a;
throw E2;
}
catch ( E1 e )
{
printf("c1\n");
}
catch ( E2 e )
{
printf("c2\n");
}
}

Например, можно учить моделировать существующие системы и процессы, раскладывая их на элементы, а параллельно читать теоретический курс про устройства подобных элементов. Тут можно рассказать очень кратко про процессор, маш. код (что очень важно с моей точки зрения, так как без этого не поймёшь отличие компьютера от прочей мебели языки высокого уровня, а так же принципы работы основной периферии.
Потом наверное можно и программировать.
Хотя наверняка я лажу пишу, и дети такого не поймут.
Не поймут. Даже продвинутые. Класса до 10 точно(с этого времени в головы начинают закладывать начала фундаментальных наук).

Это и ежу понятно. Об этом в любой продвинутой книге по С++ говорится(Страуструп в моем понимании - novice level).
Но ведь точно так же можно сказать, что и программирования не поймут.
PS: лично у меня все деструкторы - с throw.
Программирование - поймут. В его простейших проявлениях. А большего и не требуется.
И зачем они нужны?
for i:= 1 to 10 step 1
begin
writeln( i );
end
>И зачем они нужны?
Не нужны они. Как и большая часть остального что дается в школе.
Сабж, как я понимаю, подразумевает преподавание чего-то нужного.
Сабж вероятно подразумевает очередную выдачу денег на разворовывание.
1. Введение
2.
3. Приложение: WirthSin
MODULE WirthSin; (* excerpt from a module by N.Wirth 10.7.02; edited by FVT 2004-09-29 *)
PROCEDURE Sin* ( x: REAL ): REAL;
CONST c1 = 6.366197723675814E-001; (*c1 = 2/pi*)
p0 = 7.853981633974484E-001;
p1 = -8.074551218828054E-002;
p2 = 2.490394570188736E-003;
p3 = -3.657620415845570E-005;
p4 = 3.133616216619040E-007;
p5 = -1.757149292755000E-009;
p6 = 6.877100349000000E-012;
q0 = 9.999999999999998E-001;
q1 = -3.084251375340372E-001;
q2 = 1.585434424373457E-002;
q3 = -3.259918864540401E-004;
q4 = 3.590859123360360E-006;
q5 = -2.460945716614000E-008;
q6 = 1.136381269700000E-010;
VAR n: INTEGER; y, yy, f: REAL;
BEGIN
y := c1*x;
n := SHORT(ENTIER(y+0.5;
y := 2*(y-n);
yy := y*y;
IF ODD(n) THEN
f := q6*yy + q5)*yy + q4)*yy + q3)*yy + q2)*yy + q1)*yy + q0
ELSE
f := p6*yy) + p5)*yy + p4)*yy + p3)*yy + p2)*yy + p1)*yy + p0)*y
END ;
IF ODD(n DIV 2) THEN f := -f END ;
RETURN f
END Sin;
END WirthSin.
4. EBNF, конечные автоматы
5. Правило чистоты функций, задача об арифметическом переполнении
6. Buffer overflow, как расположены эл-ты многомерного массива в памяти, неявное разыменовывание, динамические массивы, автоматическое управление памятью
7. Списки, инварианты цикла из теории Дейкстры
8. Простейшее рисование, эволюция ЯП, LoopInvWirth.Multiply, LoopInvWirth.Divide, сортировки, сортировка списка, профилирование
9. Полиморфизм, композиция vs. наследование, методы
10. Как писать программы, Дейкстра vs. исключения, обработка исключений через абстрактные методы, RecursionWirth(трансляция формулы в обратную польскую запись)
Трансляция формулы в "обратную польскую запись".
Алгоритм придумали в 50-х гг. два немца [..+Rutishauser] и Андрей Петрович Ершов из Новосибирска.
MODULE Kurs2004RecursionWirth;
(* parsing of simple expressions *)
(*original: NW; port to BlackBox and minor edits: FVT 2002-aug-02 *)
IMPORT In := Epse21SysIn, Log := StdLog;
PROCEDURE Postfix*;
(* Convert expression to postfix form.
Syntax in EBNF:
expression = term {("+" | "-") term}.
term = factor {("*" | "/") factor}.
factor = letter | "(" expression ")".
*)
VAR sym: CHAR;
PROCEDURE GetSym;
BEGIN
REPEAT In.Char( sym ) UNTIL sym # " "
END GetSym;
PROCEDURE Emit ( sym: CHAR );
BEGIN Log.Char( sym )
END Emit;
PROCEDURE Expression;
VAR addop: CHAR;
PROCEDURE Factor;
BEGIN
IF sym = "(" THEN
GetSym; Expression;
IF sym = ")" THEN GetSym END
ELSIF ( sym >= "a" ) & ( sym <= "z" ) THEN
Emit( sym ); GetSym
ELSE
Emit("^")
END
END Factor;
PROCEDURE Term;
VAR mulop: CHAR;
BEGIN
Factor;
WHILE ( sym = "*" ) OR ( sym = "/" ) DO
mulop := sym; GetSym; Factor; Emit( mulop )
END
END Term;
BEGIN
Term;
WHILE ( sym = "+" ) OR ( sym = "-" ) DO
addop := sym; GetSym; Term; Emit( addop )
END
END Expression;
BEGIN (*Postfix*)
In.Open;
GetSym; Expression;
Log.Ln
END Postfix;
END Kurs2004RecursionWirth.
Kurs2004RecursionWirth.Postfix a*b + c
Kurs2004RecursionWirth.Postfix (a+b)*(c-d)/e
compiling "Kurs2004RecursionWirth" 304 0
ab*c+
ab+cd-*e/
Маш команды: Состояние арифм. стека:
~
Push( addr( a ) ) ~[a]
Push( addr( b ) ) ~[a][b]
Add ~[a+b]
Push( addr( c ) ) ~[a+b][c]
Push( addr( d ) ) ~[a+b][c][d]
Sub ~[a+b][c-d]
Mul ~[(a+b)*(c-d)]
Push( addr( e ) ) ~[(a+b)*(c-d)][e]
Div ~[(a+b)*(c-d)/e]
Pop( addr( result ) ) ~
Операцию Push( addr( a ) ) можно также оформить типа так:
#
Load( addr( frame ) ) #[addr( frame )] --из станд. регистра
Load( offset( a ) ) #[addr( frame )][offset( a )] --константа
Add #[addr( a )]
LoadFromMem #[a]
Т.е. вычисление свелось к набору очень простых операций.
По этой схеме можно реализовать арифметику компл. чисел:
MODULE Kurs2004ComplexStack;
IMPORT Math;
CONST depth = 10;
TYPE Complex* = RECORD x, y: REAL END;
VAR
stack: RECORD
l: INTEGER; (* level; first unused *)
a: ARRAY depth OF Complex;
END;
PROCEDURE Push* ( IN a: Complex );
BEGIN
ASSERT( ( stack.l >= 0 ) & ( stack.l < depth 20 );
stack.a[ stack.l ] := a;
INC( stack.l )
END Push;
PROCEDURE Pop* ( OUT a: Complex );
BEGIN
ASSERT( ( stack.l > 0 ) & ( stack.l <= depth 21 );
DEC( stack.l );
a := stack.a[ stack.l ];
END Pop;
PROCEDURE Add*;
PROCEDURE Add0 ( VAR a: Complex; IN b: Complex );
BEGIN
a.x := a.x + b.x;
a.y := a.y + b.y;
END Add0;
BEGIN
ASSERT( stack.l >= 2, 20 );
DEC( stack.l );
Add0( stack.a[ stack.l - 1 ], stack.a[ stack.l ] )
END Add;
(* и т.д.
Кроме арифметики полезно иметь примерно такие операции:
PushReal( x: REAL ); --компл. число с нулевой мнимой частью
Drop; --просто сбросить "верхнее" число со стека
CopyOut( OUT c: Complex ); --как Pop, но без "сбрасывания"
Dupl; --Push "верхнее" значение
...
Найти хороший универсальный минимальный набор непросто.
*)
END Kurs2004ComplexStack.
Задача. Реализовать, спрофилировать, выяснить, сколько времени проводит в Add0 и собственно Add.
11. Снова списки, поглощение списка (=> сортировка слияние списков, пример оформления ОО-средствами
12. Разделение интерфейса и реализации, фабричные объекты и методы, статическое разделение фаз существования объектов, работа с файлами и ввод-вывод, Stores, "reflection services"
13. Визуальное представление информации, Views, диалоги, пример рисования графика функции
14. Методы Рунге и Эйткена ускорения сходимости, functions, кривые Безье, hyper-links, folds
15. Views (advanced работа с текстами, SYSTEM, DLLs
ойой, а стоит вместо printf написать какой-нибудь log << и получаем замечательный шанс схолопотать Aborted из за того что в лог не записалось...
PS: лично у меня все деструкторы - с throw.Ооо!

#include <iostream>
#include <stdexcept>
using namespace std;
void f {
throw runtime_error("qq");
}
void g throw {
throw runtime_error("qq");
}
int main
{
try { f; }
catch(exception & e) {
cerr << e.what << endl;
}
try { g; }
catch(exception & e) {
cerr << e.what << endl;
}
}
[xenon andrei]$ ./test
Aborted
- C++, чтобы знать, каково это писать ядраЕсли ты сам не знаешь, как пишутся ядра, почему ты рекомендуешь знать это детям?
Это откуда следует что я этого не знаю?


Я деструкторам приписываю throw потому что они не создают исключительных ситуаций. Ты попутал причину со следствием.
>Есть. Вот я например.
Рискну предположить, что это оттого, что экстремальных вариантов использования темплейтов не видел: http://www.oonumerics.org/blitz/

http://www.oonumerics.org/blitz/
При беглом просмотре не нашёл там ничего особо экстремального.
Внутренности того же boost'а гораздо забавнее выглядят.
>Рискну предположить, что это оттого, что экстремальных вариантов использования темплейтов не видел: При беглом просмотре не нашёл там ничего особо экстремального.
Внутренности того же boost'а гораздо забавнее выглядят.
psКубы OLAP-овские?
Какие-нибудь простые средства для обработки информации сейчас есть?
на ум только электронные таблицы приходят.
И что с ними делать?
Практическое применение какое-нибудь натянуть можно?
Можно, например, mp3-файлы проклассифицировать?
Понятно, что сначала надо иметь базу, по ней сделать куб
И на сколько это реально на практике?
Поднять базу,
вытащить метаданные и положить в базу,
поднять куб,
проклассифицировать,
на основе классификации, что-то сделать с файлами
"что-то сделать с файлами" - это уже другая задача, наверное... А остальное - в принципе реально. Только для перекладывания метаданных в базу надо будет свой скриптик писать
Типа таких:
Только с большим кол-вом комбинаций. И считается это намного быстрее, т.к. для этого не надо обходить всю базу с каким-то хитрым селектом по куче таблиц.
меня смущает именно практическая сторона - привязка к реальному применению.
Реальное применение - ковыряться в больших массивах статистических данных. Это инструмент для анализа, а не для автоматизации какого-то законченного процесса.
Оставить комментарий
garikus
http://www.inr.ac.ru/~info21/pdf/2005juneMGU.pdf (178 Kb)(то же самое)
Запостить текст из pdf сюда не могу
Анонс события: http://ict.edu.ru/event/index.php?a=event&c=getForm&r=eventDesc&id_event=151&d=light