Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
VAR pl, pr, p, qb, qe: Piece; org, end: LONGINT;qb.f? pl.off? voff? Серьезно? Это продакшн код или первые шаги школьника изучающего программирование? Я, помню, писал такой код в школе примерно первые пару лет после того как купил первую книжку по программированию.
IF (qb # NIL) & (qb.f = pl.f) & (qb.off = pl.off + pl.len) & (qb.fnt = pl.fnt) & (qb.col = pl.col) & (qb.voff = pl.voff) THEN
PROCEDURE SetWidth*;Что такое S.i? И почему он может быть от 1 до 6?
VAR S: Texts.Scanner;
BEGIN GetArg(S);
IF (S.class = Texts.Int) & (S.i > 0) & (S.i < 7) THEN Graphics.SetWidth(S.i) END
END SetWidth;
PROCEDURE Backup (VAR name: ARRAY OF CHAR);Если входящая строка более 32 символов — что будет? Будет ошибка, потому что массив выделяется на 32 элемента внутри. А если строка 28 символов или более но меньше 32 — то метод просто молча ничего не делает.
VAR res, i: INTEGER; ch: CHAR;
bak: ARRAY 32 OF CHAR;
BEGIN i := 0; ch := name[0];
WHILE ch > 0X DO bak[i] := ch; INC(i); ch := name[i] END;
IF i < 28 THEN
bak[i] := "."; bak[i+1] := «B»; bak[i+2] := «a»; bak[i+3] := «k»; bak[i+4] := 0X;
Files.Rename(name, bak, res)
END
END Backup;
Я просто код не видел еще, исхожу из того, что вы дали. А как еще назвать?Вот в этом и суть — чтобы понять то что делает строчка в методе — надо залезть еще посмотреть кучу окружающего кода, а код должен быть самодокументируемым, посмотрел на метод — понял что он делает на базовом уровне. Это должно быть очевидно из названия метода, названия параметров и тела метода, из контекста можно привязать еще название класса, но никак мне не нужно лезть в дебри чтобы понять что такое S.i.
Вы можете называть свои переменные, как вам угодно.
Код на обероне все равно останется надежным,
Надежно передавая ваши мысли машине. Вот написал автор процедуру, и она будет работать. Алгоритмическая часть передается обероном точно,
что остальным просто лень лезть в кишки ядра линукс или jvm и искать там недостатки.Так там есть недостатки, я же не утверждаю что язык на котором я пишу — магическим образом снижает количество ошибок, не требует отладки и прочие ереси, которые тут расписывают оберонщики. Конечно есть недостатки в любом более-менее большом проекте, это очевидно. Создание безошибочного кода (а точнее понижение вероятности ошибок до определенного уровня который можно считать «принебрежимо малым») — это очень долго и дороге, вне зависимости от языка.
но вы не доказали их применимость.Т.е. на обероне не надо писать разборчивый код? Эти вещи не зависимы от языка.
while(!done)
{
...
if (...)
{
done = true;
}
...
}
int i = 0;
while(i < something)
{
var currentListElement = someList[i];
...
i++;
}
for (int i = 0; i < something && stayInLoop; i++) { ... }foreach(var currentListElement in someList)
{
if (IsThisTheElementImLookingFor(currentListElement))
{
result = currentListElement;
break;
}
}
var result = someList.FirstOrDefault(IsThisTheElementImLookingFor);Но при небольшом усложнении логики оно перестает влезать в FirstOrDefault, и тогда приходится писать цикл.Мы правы и это просто еще один виртуал?
while(!found && I.moveNext())
{
...
Found = ...
If(found)
{
....
}
...
}
Если есть break — значит он не в конце цикла, значит он заставляет цикл пропустить какие-то инструкции, значит если его убрать — образуется новый if, возможно не один.
подавляющее большинство NRE — не из-за неправильно обратобки случая с null, а из-за того, что человека забыл, что тут может быть nullИли забыл захватить нужный лок и получил data race. NPE вылетает редко, но метко.
а от того, что он не знает/забывает, что в данном случае может быть nullКогда вы каждый раз слышите в кино предупреждение «выключите звук на мобильнике» — вы его начинаете просто игнорировать. И чем чаще вы туда ходите тем больше гарантии что на предупреждение вы не будете проверять телефон. Так же и здесь — человек точно так же будет забывать и будет машинально писать обертку, как будто все хорошо. В итоге вместо 10 NRE получите 5 трудноуловимых ошибок. Предупреждения хороши когда они осознанно обрабатываются — например при запуске стат. анализатора (и то не 100% гарантия). Но разменивать такую замечательно обнаружимую ошибку как NRE на что-то более опасное — смысла нету.
семантическая ошибка обращения к несуществующему элементу
CodeFile = name key version size
imports typedesc varsize strings code commands entries ptrrefs fixP fixD fixT body "O".
imports = {modname key} 0X.
typedesc = nof {byte}.
strings = nof {char}.
code = nof {word}.
commands = {comname offset} 0X.
entries = nof {word}.
ptrrefs = {word} 0.MODULE Test;
IMPORT Files, Texts, Oberon;
PROCEDURE P*;
VAR
W : Texts.Writer;
file : Files.File;
t : INTEGER; (* длину названия именно этой переменной будем варьировать *)
BEGIN
Texts.OpenWriter(W);
file := Files.Old("Test.rsc");
Texts.WriteInt(W, Files.Length(file), 6);
Texts.WriteInt(W, 123, 6); (* число 123 будем менять, чтобы убедиться, что у нас запущена новая версия модуля *)
Texts.Append(Oberon.Log, W.buf);
END P;
END Test.
MODULE Test;
IMPORT Files, Texts, Oberon;
PROCEDURE P*;
VAR
W : Texts.Writer;
file : Files.File;
r : Files.Rider;
t : INTEGER;
b : BYTE;
s012345678901234567890123456789, u0123456789012345678900123456789 : INTEGER; (* 2 *)
BEGIN
Texts.OpenWriter(W);
file := Files.Old("Test.rsc");
Files.Set(r, file, 0);
Texts.WriteInt(W, Files.Length(file), 6);
Texts.WriteInt(W, 0, 6); (* число 0 будем менять, чтобы убедиться, что у нас запущена новая версия модуля *)
t := 0;
WHILE ~r.oef DO
Files.ReadByte(r, b);
t := t + b;
END;
Texts.WriteInt(W, t, 6);
Texts.Append(OBeron.Log, W.buf);
Files.Close(file);
END P;
END Test.
t , s012... , u0123... : 432 0 32948
t , s012... , u0123... : 432 1 32949
--
t01234, s012... , u0123... : 432 0 32948
t01234, s012... , u0123... : 432 1 32949
--
t01234, - , - : 432 0 32932
t01234, - , - : 432 1 32933
--
t01234, s , u : 432 0 32948
t01234, s , u : 432 1 32949
Поэтому ещё раз повторяю, глянь исходники проектов на других языках, относящимся к этому времени, и часто увидишь то же самое.
VerbalizeFtpError: PUBLIC PROCEDURE [ftpError: FtpError, message: STRING] =
BEGIN
-- Note: Appends message to string.
-- append message to string
SELECT ftpError FROM
IN CommunicationError => VerbalizeCommunicationError[ftpError, message];
IN CredentialError => VerbalizeCredentialError[ftpError, message];
IN FileError => VerbalizeFileError[ftpError, message];
IN DumpError => VerbalizeDumpError[ftpError, message];
IN MailError => VerbalizeMailError[ftpError, message];
IN ClientError => VerbalizeClientError[ftpError, message];
IN ProtocolError => VerbalizeProtocolError[ftpError, message];
IN InternalError => VerbalizeInternalError[ftpError, message];
ENDCASE => VerbalizeUnidentifiedError[ftpError, message];
-- IN UnidentifiedError
END;
RemoveDeviceFromChain: PUBLIC ENTRY PROCEDURE [network: Network] =
BEGIN
tail: Network ← firstNetwork;
IF useCount > 0 THEN
BEGIN
DriverDefs.GetPupRouter[].removeNetwork[network];
DriverDefs.GetOisRouter[].removeNetwork[network];
network.deactivateDriver[];
END;
IF state = ready THEN UnlockCode[network.interrupt];
IF firstNetwork = network THEN firstNetwork ← network.next
ELSE
BEGIN
UNTIL tail.next = network DO tail ← tail.next; ENDLOOP;
tail.next ← network.next;
END;
-- network.index is not updated. It is used only to collect Gateway statistics.
END;
Алексей, не стоит упирать на число 2013 в названии Project Oberon 2013 — коду в этом проекте более 20-ти лет.
Если в текущем учебном проекте такого нет (сейчас(lа и в ближайшие 2-3 недели) проверить не смогу, то Вирт следовал простому правилу, сделать, как можно проще для обучения — есть основная концепция выдачи отладочной информации, минимальная, но полностью понятная.
VAR
x: REAL;
x: COMPLEX;
x, x1: Vector;
VAR
x: REAL;
$i$x$_i$: COMPLEX;
$b$x$_b$$sub$1$_sub$: Vector;
Мне тут коллеги одну полезную нагрузочку дали. Я быстренько с вами проведу беседу о вреде избирательной слепоты, поскольку с нею, проклятою, в нашей индустрии не совсем благополучно. Значит, перво-наперво, прежде чем с нею бороться, с нашим общим врагом – слепотой проклятой, давайте мы как следует обсудим и изучим примеры того, что не видит сообщество, чтобы наверняка знать, как оно может быть на самом деле.
Потому что трудно проводить беседу о борьбе с избирательной слепотой. Может быть так, – беседу закончим. Прямо приступим к борьбы с ею. Ведь у нас…(заплетающимся языком), одно должны помнить – все мы, как один, должны мы все бороться. Должны с ею, как один. Должны мы все … бороться, один должны как. Мы все…Без этого говнеца статья бы смотрелась куда более прилично. А так впечатление становится негативным, к сожалению.
*p = q?Правильно ли я понимаю, что нет разделения на kernelspace и userspace?
Доступен ли модуль SYSTEM для прикладных программ?
A fixed-size table (or array) is usually not considered a collection because it holds a fixed number of items, although tables/arrays commonly play a role in the implementation of collections. Variable-sized arrays are generally considered collections, and fixed-size arrays may likewise considered a collection, albeit with limitations
Когда вам показывают обход массива на обероне, называя это обходом коллекции, и вам это не фонит, то тут надо понять, что коллекция по определению не массив.
Зачем мне приводить какой-то код, когда люди видят какие-то ошибки там, где их нет?
Я согласен с тем что рынок не меняется в одночасье, но если он не принял что-то за несколько десятилетий в такой динамичной области как IT, то вероятность того что он примет — крайне мала.
что жёсткость оберон-подхода заставляет писать аккуратно сразу.Так где пруфы то? Я пока вижу что можно свободно писать говнокод, чем и пользуются. А как он заставляет писать аккуратно — не понятно ни разу.
WHILE p # T.trailer DOЧто делает оператор #?
Еще, это, конечно, субъективно, но мне кажется, что код КРИЧИТ НА МЕНЯ. Оберон обращает внимание на регистр ключевых слов? Или это просто вкус у автора кода такой странный?
Н. Вирт решил дополнить свою систему еще одним компонентом — своим вариантом языка для программирования FPGA, который был назван Lola.тоесть код может быть сконвертирован в verilog? Весь? Можно красивый пример типа помигать лампочкой? Вывести текст на экран? Игру тетрис?
И Оберон способствует аккуратности написания кода, потому что оберон способствует аккуратности написания кода.
Собственно, что мешает класть конфиг с любыми стилями в текстовом виде рядом с текстовым же исходником? Зачем для этого бинарник?
{range1 : {color1, style1}},
{range2 : {color2, style2}},
...
Что мешает вставлять картинки и выделять значимые куски исходника так как это делает Кнут в своем «литературном программировании»?
Если модуль — черная коробочка, то где поддержка версионности модулей?
Что делать если мне нужен модуль сразу в нескольких версиях? Простой пример — я использую сторонний модуль новой версии и при этом у меня есть еще один сторонний модуль, который использует первый, но более старой версии. Вся модульная система тут же ломается?
Собственно, это только характеризует оберон-сообщество с не очень хорошей стороны.
Подозреваю, что состоит оно в основном из выходцев из академической среды, очень плохо понимающих реальные задачи и проблемы индустрии. Парадокс блаба как он есть, только в совсем смешном варианте.
Вообще, вы сейчас делаете странную вещь, лезете в новую для вас экосистему со своим набором правил. Я не говорю, что они все не работают, но вы не доказали их применимость.
Вы не могли бы мне рассказать на простом примере, в каком месте семантика оберона отличается от семантики любого другого статически-типизованного язык программирования?
Хабрахабр — не для клонов. НЛО будет блокировать виртуалов, их создателей и тех, кто об этом думает.habrahabr.ru/info/help/rules
Оберон был все-таки сделан «проще, чем нужно»
недостает ряда языковых конструкций из-за чего код на нем выглядит много хуже, чем аналогичный на Java/C# и никак не безопасней
не считаю, что за простоту компилятора должен платить программист
не считаю, что за простоту реализации пользователького интерфейса системы должен платить конечный пользователь
Уже даже призыв не считать оберонщиков людьми в плюсе
В Обероне же GUI мог быть только нарисрован в редакторе и потом сохранен на диск по средством сериализации входящих в GUI объектов.
В промышленном же виде для перегрузки модулей есть пока только OSGi (очень крупные модули), но на него все, просто реально все, матерятся кто имел дело в реальном продакшене!Это исключительно вопрос того, как народ их напилил. Сам по себе OSGi на уровне модулей описан в самом начале спеки и довольно прост, единицей импорта/экспорта является package, который может состоять и из маленького количества классов (как и рекомендуется). Как никто не мешает и в обероне делать крупные модули, так и в яве — никто не мешает делать мелкие модули. Оверхед на сборку и управление зависимостями будет и там, и там (например, при изменении api модуля).
Но все это XEROX хозяйство гонялось на мэйнфреймах и было жутко тяжеловесное.
возьмем более-менее приличную по размеру задачу, и вы ее реализуете на Обероне
войной за сохранение паритета мейнстрим-языков программирования и зарплат их фанатов и адептов.
начиная с треда habrahabr.ru/company/flprog/blog/257611
Очевидно, такие абсолютные суждения имеют мало общего с реальностью и призваны в основном оправдать последствия своих необдуманных действий по откровенной травле инакомыслящих
я часто сталкиваюсь с тем, что люди не стремятся понять других людей. Мало сомневаются в истинности своего высказывания. Часто нарушают правила приличий, скрыто или явно нарушая эмоциональное равновесие в беседе
Я не увидел попыток мирно, без оскорблений и передергиваний, без подмены контекста и ложных сравнений выяснить положительные и отрицательные стороны Оберон-парадигмы
Проект «Оберон 2013»