- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
function loadQuestionsInTest() {
$mysqli = connectDB();
$testID = $_POST['testID'];
$testSets = $mysqli -> query('select * from testsets where test_id = '.$testID.';');
if ($testSets->num_rows > 0) {
$query = [];
while ($row = $testSets -> fetch_assoc()) {
$loID = $row['lo_id'];
$questionsCount = $row['count'];
$questionsInLO = $mysqli -> query('select count(*) as num from questions where lo_id = '.$loID.';') -> fetch_assoc()['num'];
if ($questionsCount > $questionsInLO)
$questionsCount = $questionsInLO;
$query[] = '(select id, content, result, lo_id from questions where lo_id = '.$loID.' order by rand() limit '.$questionsCount.')';
}
$query = implode(' union ', $query).' order by rand();';
$questionRes = $mysqli -> query($query);
$questions = array();
while ($row = $questionRes->fetch_assoc()) {
$questionType = json_decode($row['result']) -> type;
if ($questionType == 'check') {
$question = array(
'id' => $row['id'],
'content' => $row['content'],
'loID' => $row['lo_id']
);
array_push($questions, $question);
} else if ($questionType == 'input') {
$questionContent = json_decode($row['result']);
$questionText = $questionContent -> text;
$answers = $questionContent -> answers;
for ($i = count($answers) -1; $i >= 0; $i--)
$questionText = mb_substr_replace($questionText, '(|answer'.$answers[$i] -> id.'|)', $answers[$i] -> posStart, $answers[$i] -> posEnd - $answers[$i] -> posStart);
$content = array( 'type' => 'input', 'text' => $questionText );
$question = array(
'id' => $row['id'],
'content' => json_encode($content, JSON_UNESCAPED_UNICODE),
'loID' => $row['lo_id']
);
array_push($questions, $question);
}
}
$response = json_encode($questions, JSON_UNESCAPED_UNICODE);
echo $response;
$mysqli -> close();
return;
}
echo '[]';
$mysqli -> close();
}
Моя дипломная работа по теме "тестирование студентов". Загрузка вопросов для прохождения теста из базы. Вопросы должны идти в рандомном порядке, варианты ответов тоже.
defecate-plusplus 16.05.2016 09:58 # +1
почитай про mvc, не для преподов, а для себя
и выбери другой язык, ни одна пыхоблядь mvc так и не освоила
Vasiliy 16.05.2016 11:15 # +3
defecate-plusplus 16.05.2016 11:31 # −1
inkanus-gray 16.05.2016 12:25 # +3
defecate-plusplus 16.05.2016 12:39 # +3
не прочитали ни одной книжки
guesto 16.05.2016 12:54 # 0
defecate-plusplus 16.05.2016 12:58 # 0
Vasiliy 16.05.2016 13:49 # 0
defecate-plusplus 16.05.2016 15:02 # 0
ты перечитай ещё раз внимательно что я написал
http://www.yiiframework.com/doc/guide/1.1/ru/basics.best-practices
Таким образом, если применить это к рассмотренному выше примеру, необходимо добавить модель News с методом getLatestNews в пользовательскую часть и ещё одну модель News с методом getDeletedNews в административную часть.
я же говорю
пыхоблядь не может в mvc
Vasiliy 16.05.2016 15:14 # 0
Базовая модель будет таскать данные из БД а бизнес логику буду реализовывать в дочках.
Если кто то не умеет в пхп это его проблемы.
defecate-plusplus 16.05.2016 15:29 # +4
Должен быть слой, который умеет читать и писать коллекции твоих сущностей:
NewsRepository.getLatestNews() -> Collection<NewsItem>
NewsRepository.getDeletedNews() -> Collection<NewsItem>
он должен быть интерфейсом, в реализации интерфейса должна содержаться функциональность работы с конкретным источником этих сущностей (база, файл, может - чужой сервис)
В самой модели (NewsItem) никаких методов нахуй не нужно, это декларация, она as is уйдет в wsdl, wadl, она прекрасно мапится (де/сериализуется) на объекты в запросах и ответах, таблицы и другие вещи, ничего не ведающие про методы.
Обработать, отфильтровать про правам и другие полезные бизнес-действия должен выполнить специальный сервисный слой, который внутри обратится к куче репозиториев различных сущностей и примет решения.
а ты предлагаешь наделить модель методами, наебенив бизнес-логики в них, а через лапшу наследования ещё и усложнить связи, чтобы вообще хуй кто разобрался, в каких ещё унаследованных классах этой модели надо исправить бизнес-логику, которая сейчас взяла и поменялась
> выбери другой язык, ни одна пыхоблядь mvc так и не освоила
ЧТД
defecate-plusplus 16.05.2016 15:38 # +1
прекрасно работает, особенно, с тайпскриптом
Vasiliy 16.05.2016 17:13 # 0
Родительский класс умеет читать писать коллекции получать сохранять отдельные инстансы, знает если ему показать о физических связях в хранилище. НЕ знает о бизнес процессах и о том где и как хранятся данные.
дочерний класс знает про бизнес логику. Бизнес логика тоже может быть разделена на части. Логика приложения отличается от логики админки хотя они и работают с одними сущностными.
Если требуется поменять бизнес логику то мы меняем дочерний класс над моделью данных.
И еще зачем нужны лишние слои абстракций типа repository service?
Лепить абстракции ради абстракций путь в никуда.
defecate-plusplus 16.05.2016 17:29 # +3
далее
тебе требуется вместо базы использовать сторонний сервис - твои действия?
а т.к. ты все ещё тестируешься, хранилище не готово, ты хочешь просто почитать свои сущности из файла
ты уже написал в дочернем классе кучу sql шита с этими волосами, т.к. у тебя нет слоя абстракции, решающего конкретную задачу "дай мне 100 объектов, откуда тебе виднее", ты начинаешь судорожно писать какие-нибудь switch-case или портянку if
или просто забиваешь, говоришь "пехопе выше всего этого!!11!!", и просто делаешь ещё один дочерний класс "модели", и ещё один и ещё один
когда наступает время поменять одно на другое ты делаешь "заменить все вхождения" одного названия класса на другое, такой себе орёл бгг
далее
тебе требуется поменять бизнес-логику
у тебя в элементе "Новость" появляется атрибут "источник", и теперь тебе надо в обоих дочерних классах поебстись с этим атрибутом единообразно
ты знаешь что у тебя есть NewsItem, и каким то неведомым образом должен поискать все дочерние классы, которые как бы вместо того, чтобы расширить атрибутный состав этой базовой сущности (а такое бывает сплошь и рядом), за каким то хером расширяют его методами по обработке - ну кроме того, что это удаление гланд через жопу, это даже пыхобляди должно быть очевидным нарушением архитектуры приложения - часть классов будет добавлять атрибуты, часть классов - методы, часть классов - и то и другое, и все они как бы находятся на одном и том же уровне
> Лепить абстракции ради абстракций путь в никуда.
я вообще считаю неразумным делить всё на файлы и даже папки, мало того, что это не удобно - закрываешь один файл, открываешь другой, так ещё и интерпретатору пиздец неудобно, это существенное замедление
поэтому самые крутые проекты всё пишут быстро и эффективно в index.php
inkanus-gray 16.05.2016 17:58 # +1
bormand 16.05.2016 19:25 # 0
guesto 16.05.2016 20:01 # +1
guestbook.cgi
bormand 16.05.2016 19:37 # +2
3_14dar 16.05.2016 19:39 # +3
roman-kashitsyn 16.05.2016 18:09 # +3
bormand 16.05.2016 19:24 # 0
guesto 17.05.2016 00:30 # 0
bormand 17.05.2016 00:32 # 0
defecate-plusplus 17.05.2016 00:39 # 0
мол, приехал борманд в новосиб, а он ему как раз!
bormand 17.05.2016 00:48 # 0
Угу. Задачки интересные, люди хорошие, зарплата очень даже норм. Ня ^_^
guesto 17.05.2016 00:50 # 0
а осилил бы PHP, работал бы сейчас:
https://novosibirsk.hh.ru/vacancy/17051910?query=php
bormand 17.05.2016 00:52 # 0
Эх, такую возможность упустил...
З.Ы. Ну там вон рядом сеньор-похапор есть. Уже 60-80к, получше.
guesto 17.05.2016 00:57 # +5
джуниор пхп пишет так:
$polzovatel = mysql_query("SELECT * from polzovateli where id=".$_GET['id'].);
а сеньер так
$polzovatel = mysqli_query("SELECT * from polzovateli where id=".$_GET['id'].);
bormand 17.05.2016 01:01 # +1
Сеньор должен хотя бы немного знать инглиш и уметь экранировать, иначе какой он нахуй сеньор...
guesto 17.05.2016 01:02 # +3
но все равно у него в базе должен быть пользователь "O\'Hara". Причем в конце концов должен получиться O\\\\\\\'Hara"
Иначе какой он пхпист>?
guesto 16.05.2016 20:02 # +2
так что без БД никак
inkanus-gray 17.05.2016 13:21 # +1
Vasiliy 17.05.2016 14:32 # +1
roman-kashitsyn 16.05.2016 23:46 # +2
это BazaDannyh, разумеется.
Saehrimnir 28.10.2020 20:19 # 0
defecate-plusplus 16.05.2016 19:29 # +4
давайте, давайте, пыхобляди, не стесняемся, рассказываем о своих охуительных приключениях с бизнес-логикой в унаследованных моделях
модели сами себя не унаследуют
guesto 16.05.2016 12:40 # +1
Vasiliy 16.05.2016 14:37 # 0
guesto 16.05.2016 15:35 # +3
Я пробовал PHP и могу сказать что готов подписаться под каждым словом в статье "фрактал плохого дизайна"
Vasiliy 16.05.2016 17:14 # −2
Я про это и говорил.
bormand 16.05.2016 18:55 # +4
И слава богу. Хватит нам и одного адепта PHP.
3_14dar 16.05.2016 18:59 # 0
Уж какая потеря. После прочтения фрактала мне показалось что проще осилить питон чем рнр на таком уровне, чтобы не наступать на грабли. Нахуй он такой нужен, васютка? Чтобы зарабатывать деньги, правя код людей, работавших за еду или лайк в инете?
inkanus-gray 16.05.2016 19:23 # +2
3_14dar 16.05.2016 19:40 # −3
guesto 16.05.2016 19:00 # 0
kerman 17.05.2016 01:01 # 0
p.s. Продолжаю жрать кактус использовать PHP в тех задачах, где его блядство нивелируется его плюсами.
Vasiliy 17.05.2016 08:02 # +1
какой блядский язык ты считаешь менее блядским?
kerman 19.05.2016 01:01 # 0
Какие задачи проще на PHP сделать? Да самые простейшие. Вывести список сотрудников с ебальниками на корпоративном портале. Да, тупым <table>, без всяких дивов. Показать календарь и закрасить красным выходные дни. Нарисовать тортики, если дни рождения сотрудников. Ну и тому подобное одноразовое корпоративное говнецо, где не надо всеми этими правильностями заморачивается.
Смысл кода пыха в том, чтобы отработать и умереть.
inkanus-gray 19.05.2016 01:14 # +2
1. Какое отношение к этому имеет PHP?
2. Почему <table> тупой?
kerman 19.05.2016 01:31 # 0
2. Table тупой в том же смысле что и молоток. Молоток тупой. Он умеет забивать гвозди. Шурупы тоже может, но хуёво.
inkanus-gray 19.05.2016 01:40 # 0
2. Я так и не увидел объяснения. Почему <table> тупой?
kerman 19.05.2016 01:47 # 0
Потому что это не модно уже много лет.
Потому что он решает только одну задачу и не является серебрянной пулей.
inkanus-gray 19.05.2016 01:51 # +1
Кроме «не модно» аргументы есть?
defecate-plusplus 19.05.2016 08:34 # +1
не виден сайт, пока все не прогрузится
сетки обычно гораздо сложнее, чем просто таблица
это уж не говоря о том, что содержание должно быть развязано от представления - у тебя есть 20 одинаковых итемов - ты делаешь 20 одинаковых дивов, далее css понимает что, например, колонки три, и располагает твои 20 элементов в три колонки по сетке, или рисует из них буллетами ненумерованного списка в одну
а с таблицами программист должен явно рассказать где же будет tr, где td, и больше ничего не поделать, на телефоне не сделать автоматом из 3 колонок одну переносом
inkanus-gray 19.05.2016 11:45 # +2
table-layout:fixed изменит это поведение.
> содержание должно быть развязано от представления
Согласен. Если вынести представление в CSS, то его будет легко менять без изменения вёрстки.
> располагает твои 20 элементов в три колонки по сетке, или рисует из них буллетами ненумерованного списка в одну
Хороший пример. <ul>/<li> и выглядит семантично как список, и может отображаться по-разному. Однако, браузеры применяют к спискам свои встроенные стили, которые потом трудно перекрыть, так что к великому баттхёрту дизайнеров добиться во всех браузерах отображения 1:1, как у них на макете, не получится. Но HTML и разрабатывался как средство передачи текста, а не дизайна.
> не сделать автоматом из 3 колонок одну переносом
С одной стороны, иногда хочется получить адаптивное отображение. С другой стороны, в некоторых случаях лучше бы ничего не переносилось. Например, если мы имеем дело с принципиально двумерными таблицами данных, в которых хочется просматривать и строчки, и колонки, перенос будет только во вред.
Доходит до смешного, когда таблицы данных (вроде расписаний и ведомостей) верстают несемантичными тегами не потому, что хотят добиться переноса, а потому что кто-то сказал, что использовать <table> уже не модно.
*****
Кстати, kerman не сказал, о чём он спорит: об элементах <table> vs <div> или о стилях отображения display:table vs display:block. А то некоторые верстают дивами со стилем display:table и говорят, что у них нетабличная вёрстка.
А ещё display:block — не панацея. Он сносно располагает абзацы текста, но не годится для дизайна, потому что задача выравнивания становится нетривиальной. Для автоматически перетекающих блоков больше подходит display:flex, но он не работает в браузерах пятилетней давности.
defecate-plusplus 19.05.2016 11:56 # +2
сам достаточно знаешь, чтобы решить, чем верстать
а керман в веб-технологиях валенок, он к прости господи мускулу из толстого клиента подключается, на что ты рассчитывал не пойму
inkanus-gray 19.05.2016 12:04 # +1
guesto 16.05.2016 12:39 # 0
Говнокод -- основа идеологии языка:
https://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html
inkanus-gray 16.05.2016 12:42 # 0
guesto 16.05.2016 12:50 # 0
wvxvw 16.05.2016 19:44 # +2
3_dar 16.05.2016 21:51 # 0
А для лабы, тем более сойдёт.
Если следовать общепринятым правилам - то всё будет заебись.
3_14dar 16.05.2016 23:02 # 0
bormand 16.05.2016 23:21 # 0
3_dar 16.05.2016 23:29 # +1
Я ж говорю, у него низкий порог вхождения. Именно поэтому он такой популярный.
И именно поэтому так много говнокодеров.
guesto 16.05.2016 23:35 # +1
Дорогой школьник! Есть такое понятие -- модуль. Оно набрало популярность еще в 70е, когда умные дяди придумали структурное программирование. Если у тебя один код работает с HTTP, то у тебя есть специальный модуль для работы с ним.
Например для работы с кукой есть модуль http.cookies. Какое неожиданное имя, правда?)
А еще есть такой тип данных -- dict. ПХПшники про него не знают, и путают его с массивом, но он есть.
А поскольку куки приходят через HTTP запрос который, как ты помнишь, попадает в аргумент environ функции ``application`(environ, ...` , то нужно сделать так: SimpleCookie(environ['HTTP_COOKIE'])
Но это все лоу-левел скам, а потому кончай выябываца и ставь Джангу.
В далеком 1998м школьников учили паскалю. И 14тилетние дети как-то понимали что для работы с экраном надо сделать uses crt, а для работы с графикой -- uses graph.
Думаете, с тех пор потупели?
3_dar 17.05.2016 00:00 # 0
На любом языке можно говнокодить как на php. Просто в php это делать легче.
guesto 17.05.2016 00:08 # +1
Нуб ведь впитывает стандартную библиотеку, стандартные идиомы, и считает что именно так и надо. Он как импринт. Если функция срет в глобальный спейс то и он так будет делать. Чего не делать то, если сами авторы ЯП так сделали?
1024-- 17.05.2016 00:19 # +2
> http.cookies
Понятно.
Значит, $_COOKIE - плохо, http.cookies - хорошо.
$_COOKIE[x] - плохо, http.cookies.SimpleCookie()[x] - хорошо.
Естветсвенно, $_COOKIE - глобальная переменная и вселенское зло.
В то время, как http.cookies - няшный модуль, который, разумеется, не является глобальной переменной и, разумеется, не виден ни в одной из функций, кроме main, откуда куки канонично переносятся через аргументы и замыкания...
Хотя, постойте-ка, в питоне же нет функции main, а http.cookies можно использовать в любой точке кода. Фундаментальные отличия? В питоне нужно писать больше букв, поэтому программист подумает над тем, что ему писать, и не станет писать говнокод.
Теперь буду рекламировать модули всем друзьям, ведь они настолько отличаются от глобальных переменных в лучшую сторону!
guesto 17.05.2016 00:23 # 0
конечно, ведь там же есть неймспейсы.
Не говоря уже о том, что его можно заимпортировать в нужную функцию.
>>Хотя, постойте-ка, в питоне же нет функции main
если очень хочется что можно сделать (if __name__ == "__main__"), однако же в случае визги точной входа является ф-я application, считайте что это main
>>Теперь буду рекламировать модули всем друзьям, ведь они настолько отличаются от глобальных переменных в лучшую сторону!
Лучше почитай, например, "Идеальный Код"
Может быть тебя еще можно спасти.
1024-- 17.05.2016 00:32 # 0
Чаще всего эти неймспейсы - просто повод понаписать имена подлиннее и с точками.
Используют псевдоним для неймспейса только когда уже совсем плохо с конфликтами, иначе пишут как есть, а то мужики не поймут.
> __main__
Всё равно куки пролезут в обход неё.
guesto 17.05.2016 00:38 # 0
нет. В стандартной либе модули это вполне себе оформленные, документированные сущности которые имеют публичный интерфейс (__all__) и импортируются только в нужные места
>>Всё равно куки пролезут в обход неё.
нет
1024-- 17.05.2016 00:46 # 0
>нет
А, их надо ещё всасывать из контекста в кукообъект. Выходит, я точно наполовину наврал.
guesto 17.05.2016 00:47 # 0
еще раз: точкой входа визги является функция. В нее они передаются как аргументы (точнее заголовки передаются). Куки сами по себе нигде не гуляют.
1024-- 17.05.2016 00:58 # 0
> В нее они передаются как аргументы (точнее заголовки передаются).
Вот из такого, переданного через аргументы.
bormand 17.05.2016 00:26 # +2
$_COOKIES видно всем.
Да, в питоне, в отличие от ваших js и php, внезапно, есть модули.
1024-- 17.05.2016 00:36 # 0
bormand 17.05.2016 00:43 # 0
Это ты про from хуй import * (aka using namespace в крестах)? Это сколько надо выпить, чтобы случайно написать *?
1024-- 17.05.2016 00:50 # 0
Это надо много кода написать, каждый раз импортируя только нужные функции, и обновляя этот список. Потом пишешь звезду, и всё работает. Явно написать её легче, чем списочек.
А в доморощенных жс-модулях надо целый for-in написать (ещё и правильно), это не каждый сможет.
guesto 17.05.2016 00:51 # +1
во-вторых для ленивых есть IDE
3_14dar 17.05.2016 00:54 # +1
3_14dar 17.05.2016 00:53 # +1
guesto 17.05.2016 00:55 # +1
пых изначально заточен под то, чтобы быть шаблонизатором. Для этих целей он не так уж плох. А вот когда ты пишешь на нем бизнес-логику, то он уже не под веб
1024-- 17.05.2016 00:59 # +1
Vasiliy 17.05.2016 08:05 # +1
Для всего остального питон не нужен.
inkanus-gray 17.05.2016 13:23 # +2
Тогда сишка и кресты — говно. Директива #include, заголовочные файлы и (почти) ручная линковка — это не модульность.
Vasiliy 17.05.2016 14:33 # +2
а, что кто то так не считает?
bormand 17.05.2016 19:14 # +1
Кто-то с этим спорит? Модулей там нет, и это большая жопа.
bormand 16.05.2016 23:37 # −1
Конечно. Благодаря им, код, использующий параметры запроса, размазывается толстым слоем по всей портянке... А из-за суперглобальности - ещё и затекает в половину функций...
> через какую жопу это нужно получить в питоне или жабе
Я просто скопипащу первый попавшийся пример по Весеннему Каркасу, ок?
guesto 16.05.2016 23:38 # 0
Блин! Если человек не понимает в чем минус глобальной переменной, то о чем вообще можно говорить?
bormand 16.05.2016 23:44 # 0
Она не просто глобальная, а суперглобальная.
guesto 16.05.2016 23:45 # 0
а, я забыл
в ПХП нету нормальных модулей
bormand 16.05.2016 23:48 # 0
В том смысле, что она лезет во все подряд скопы, даже если там нахуй не нужна. Да, в пхп есть единственная адекватная фича - глобалки нельзя юзать без слова global.
3_14dar 17.05.2016 00:30 # 0
global писать не надо
Vasiliy 17.05.2016 08:07 # 0
Не создавай функций, глобальных переменных и будет тебе счастье.
guesto 17.05.2016 10:08 # 0
mysql_query как было в глобальном, так и осталось
пыхомакаки не осилили модули
Vasiliy 17.05.2016 10:43 # 0
Если тебк критично откуда приходят значения переменных не юзай его.
_REQUEST - юзается только в битриксе а он квинтэссенция говна и php тут не причем.
dxd 17.05.2016 11:56 # 0
Vasiliy 17.05.2016 12:07 # +3
Почему не на питоне. потому как разрабы питона сами не знают с кем они с умными или с красивыми. Да я про не совместимость версий 2 и 3.
guesto 17.05.2016 12:39 # 0
guesto 17.05.2016 12:40 # −1
http://php.net/manual/ru/reserved.variables.request.php
Vasiliy 17.05.2016 13:15 # +1
Он нужен но в очень узком спектре задач типа пагинации.
guesto 17.05.2016 16:03 # −1
это часть культуры языка что-ли -- постоянно брехать?
https://developers.google.com/s/results/?q=%22%24_REQUEST%22
3.14159265 17.05.2016 22:17 # 0
Да и не всё так плохо. Язык изначально заточен на обработку http и быстрое изучение/написание сраниц. Гораздо больше удивляют те кто на нём vk/fb пишут.
И главное у них всё шустро работает!
Вон в JSP request.getCookies(). Вроде глобальная (на странице), а по факту нет.
defecate-plusplus 16.05.2016 23:57 # +1
let the butthurt.jpg
>> через какую жопу
через какую?
HttpServletRequest из параметров?
roman-kashitsyn 16.05.2016 23:44 # 0
Только ты забыл указать зависимости системы сборки, конфиг спринга (xml или код), какой-нибудь web.xml (сейчас они вроде тоже кодом задаются), и настроенный контейнер сервлетов. А так коротко, да.
guesto 16.05.2016 23:45 # 0
Джава не лучший ЯП чтобы начинать обучение программированю
guest 16.05.2016 23:50 # 0
На нем писала еще моя прапрапрапрапрапрапрапрапрапрапрабабушка , все старое луче
guesto 16.05.2016 23:51 # 0
3_14dar 17.05.2016 00:31 # +1
guesto 17.05.2016 00:32 # +2
нубу нужно просто:
a = 42
print(a)
а в жабе ему сразу public static void main
и у нуба песдец в голове
Короче, детей я бы джаве не учил
3_14dar 17.05.2016 00:55 # +1
>а в жабе ему сразу public static void main
Питон прост в начале, но гораздо сложнее жавы если полезть в потроха.
Не знаю нащет детей и нубов, но для студентов-программистов жава практически стандарт.
guesto 17.05.2016 16:01 # 0
иначе получится говно, а не студент
wvxvw 17.05.2016 16:30 # 0
guesto 17.05.2016 16:35 # 0
Говно получается из неосилянторов вроде тебя. К счастью, таковые не все
dxd 17.05.2016 17:56 # 0
wvxvw 17.05.2016 18:09 # +2
В Си, как и в ПХП нет нормальных структур данных.
В Си реализация любых алгоритмов общего назначения упирается в отсутствие генериков / необходимость решать кто и когда будет освобождать память. И поэтому в Си их нет, и самому написать = страдать.
В Си так трудно добиться того, чтобы код можно было повторно использовать, что, по-сути, никто к этому даже не стремится. В Си так тяжело добиться вообще работающего кода, что когда оно наконец скомпилировалось, и после отключения всех чужих библиотек валгринд выдал всего сотню-другую ошибок, хочется заплакать и бежать закрыв глаза до самого горизонта.
Си не учит программировать, он учит выживать в условиях, когда есть только один говноязык, и нет альтернатив, потому что тимлид вырос в этом абсурдном мире, и не может себе в этом признаться - он хочет, чтобы другие страдали так же, как и он. В этом смысле, он очень похож на ж.скрипт.
defecate-plusplus 17.05.2016 19:09 # +5
мля ну начались стенания
Си - язык для тех, кто понимает как работает вычислительная машина, где должно работать приложение, как на этой вычислительной машине работает ОС и среда выполнения
т.к. в ВУЗе обязательно должны рассказать, чем процессор отличается от оперативной памяти, то сишка туда прекрасно вписывается
просто на сишке не надо проходить абстрактные синглтоны и прочие паттерны с функциональщиной, на сишке надо проходить вызовы ядра, межпроцессное взаимодействие и прочие вещи, которые называются "системным программированием"
bormand 17.05.2016 19:37 # +1
+1. Ну, кстати, кресты для сишных задач тоже неплохо подходят, как показала практика. RAII, шаблоны и move семантика превращают лютую системщину в более-менее няшный код. Даже если под ногами нет не только операционки, но даже аллокатора...
З.Ы. Но для обучения, само собой, лучше чистая сишка.
inkanus-gray 17.05.2016 19:40 # 0
bormand 17.05.2016 19:47 # 0
Потому что паскаль - птица гордая. Без рантайма не полетит. А кресты - ещё как летают.
З.Ы. Или всё-таки полетит?
inkanus-gray 17.05.2016 20:04 # 0
Но никто не мешает написать свой минимальный SYSTEM.PAS для эмбеддопердолинга.
bormand 17.05.2016 20:05 # 0
Это возможно? Или там придётся перепиливать какую-нибудь магию в самом компиляторе?
> некоторые арифметические операции
Ну это и в сишке/крестах так.
inkanus-gray 17.05.2016 20:10 # 0
Если ты не собираешься создавать собственную перегрузку арифметических операторов и библиотечных функций, а также менять названия встроенных типов данных, то никакую магию перепиливать не нужно.
Чтобы полетело, нужно реализовать некоторое подмножество функций/процедур из модуля SYSTEM.
bormand 17.05.2016 20:14 # 0
writeln (или какой-то его бекенд?) и прочую платформозависимую мишуру я смогу реализовать? Ну и свой аллокатор. Если да - то норм, можно поюзать.
З.Ы. А, ещё точку входа можно поправить? Чтобы она за параметрами и окружением, к примеру, не лазила.
Ну и хотелось бы что-нибудь 32-64 битное, типа FPC. А не 16-битное говно мамонта, застрявшее в первом мегабайте...
TarasB 18.05.2016 14:29 # 0
bormand 18.05.2016 18:51 # 0
> оконные
А чем оно окна делает? :) Через прерывание сисколлы венды дёргает?
inkanus-gray 18.05.2016 20:23 # +2
bormand 18.05.2016 20:28 # 0
inkanus-gray 19.05.2016 01:23 # 0
Единственное, что может напрячь — нужно некоторое место в стеке (иначе нельзя будет вызывать процедуры и функции) и некоторое место под глобальные переменные и типизированные константы. Т. е. написать загрузчик БИОСа, когда ОЗУ ещё не инициализировано, скорее всего, не получится.
bormand 19.05.2016 18:18 # 0
Есть хак с использованием кеша в качестве оперативки. Так что х.з., может быть и там будет работать...
TarasB 19.05.2016 10:50 # 0
inkanus-gray 19.05.2016 14:08 # +1
Сразу ясно, из какой DLL под каким именем импортируется.
А теперь вспомним, сколько способов есть для импорта функции из DLL в сишке.
guesto 19.05.2016 15:14 # +1
inkanus-gray 19.05.2016 16:33 # 0
guesto 19.05.2016 16:36 # +2
bormand 19.05.2016 18:22 # +1
Что там говно, что сям:
- один глобальный плоский неймспейс
- возможность запилить приватную для куска кода функцию/переменную
Семантической разницы нет вообще. Никакой. Как и модулей.
guesto 19.05.2016 18:23 # 0
в JS же инклуда нет( он есть только в ноде)
Потому в сях модульность на двойку, а в джаваскрипте на единицу
bormand 19.05.2016 18:30 # +1
Формально - да. А так - это ж просто препроцессор, который и с js прекрасно будет работать.
1024-- 19.05.2016 19:30 # 0
Хорошо бы, если встроенное было.
А то теперь скриптушню, рассчитанную на "написал - уже работает" туда-сюда перегоняют из языка в язык, минифицируют, склеивают (осталось ещё два-три раза прогонять жс в асм и обратно для профилактики)... Тогда б на пацанской сишке уже сразу под веб писали, что ли.
bormand 19.05.2016 19:33 # 0
Дык 100 раз уже говорили, что в браузерах надо не язык, а виртуальную машину.
Один хуй js после всех этих минификаций нечитаем.
inkanus-gray 19.05.2016 19:40 # 0
Были же жабоапплеты, в которых можно было посылать всех на Jython. А теперь на некоторых платформах плагин для JVM не поставишь.
bormand 19.05.2016 19:44 # 0
bormand 17.05.2016 20:23 # 0
inkanus-gray 17.05.2016 20:49 # +1
Т. е. вызов Write('Высота = ', 5) магия компилятора, описанная в SYSTEM.TPS, превратит в вызов WriteStr и WriteInt.
У WriteStr три аргумента: файловая переменная (куда магия компилятора подсовывает Output, если мы ничего не указали), собственно строка, а третьим аргументом идёт длина поля вывода (если мы её указали через двоеточие, то она подставляется, иначе берётся длина строки).
bormand 17.05.2016 20:51 # 0
inkanus-gray 17.05.2016 20:58 # +1
Стоп! Она же является переменной стандартного типа Text. Боязно менять структуру без синхронного патча SYSTEM.TPS. Компилятор же под var X: Text; выделяет известный ему размер памяти.
P.S. А в 32-битных Дельфях нужно реализовать аналогичные функции:
И тоже тип Text явно в интерфейсе не описан, а считается встроенным.
inkanus-gray 17.05.2016 21:05 # +1
bormand 17.05.2016 21:09 # 0
inkanus-gray 17.05.2016 21:16 # +2
_WriteСString — это для PChar — сишных строк с завершающим нулём.
P.S. Я немного ошибся про перегрузку:
JECXZ не выкинули. По сути два варианта функции отображаются на один, как в том анекдоте про математика и полный чайник.
inkanus-gray 17.05.2016 21:29 # +3
bormand 17.05.2016 21:34 # 0
О, значит туда можно свои вписать?
inkanus-gray 17.05.2016 22:12 # +3
TarasB 18.05.2016 14:28 # 0
Был прикол с рантаймом для графических баблиотек, но никто не мешает самому написать свою, которая прерываниями выставит нужный видеорежим и запишет в видеопамять то, что нужно.
inkanus-gray 18.05.2016 14:48 # 0
Если вопрос о том, нужны ли библиотеки во время запуска экзешников, то мой ответ — не нужны. Таки да, паскалевские программы идут на «голой» машине.
TarasB 18.05.2016 15:25 # +1
inkanus-gray 18.05.2016 15:47 # 0
Да, Борланд называет это рантаймом. Рантайм не обязан быть динамическим и подгружаться отдельно, как в Вижуал Бейсике. Никто не запрещает «рантайм» насмерть линковать в экзешник.
bormand 18.05.2016 18:52 # +1
Нахуй мне ваша голая операционка и экзешники в 4кб, которые только под операционкой стартуют? На операционке я лучше нормальные либы поюзаю, которые все её фичи раскроют...
Я про bare metal, когда под ногами даже bios/uefi нету.
inkanus-gray 18.05.2016 18:55 # +1
inkanus-gray 18.05.2016 19:08 # 0
1. Турбо Паскаль до версии 4.0 (не включая) генерировал только COM-файл. Модель памяти tiny, все указатели короткие, код 16-битный, лимит 64 килобайта.
2. Турбо Паскаль с 4.0 (включая) по Дельфи 1.0 генерировал только экзешник (TP 6.0, BP 7.0, Delphi 1.0 могли генерировать ΝΕ-файл для 16-битного защищённого режима). Указатели на данные «длинные» (сегмент+смещение), указатели на код в пределах модуля могут быть и длинными, и короткими, указатели на код между модулями только длинные. «Процедурный тип» (указатели на процедуры/функции) только длинные.
Глобальные var размещаются в неинициализированном сегменте данных (в экзешнике «ноль» байт), const — в инициализированном сегменте, локальные var — в стеке.
OBJ получить нельзя, но можно готовый экзешник пропустить через кросслинкер (так на нём получали SYS-драйвера для ДОСа, патча заголовок) или написать кросслинкер для TPU-файлов (для TP4.0 была неофициальная программа TPU2OBJ).
3. Дельфи, начиная с версии 2.0, генерирует 32-битный код. Может получать OBJ-файлы (Microsoft/Intel OMF), не линкуя.
Были ещё версии для .ΝΕΤ и для 64-битного кода, но это уже после Борланда, если я не путаю.
bormand 18.05.2016 19:19 # +1
Да это не особо важно. The cat coff/elf is a fine too. Можно постпроцессингом релоки поправить да на секции нарезать как надо. См. мою говно"ось" на гитхабе.
Или ты про трудности линковки с nasm'ом и прочими няшными ассемблерами?
З.Ы. 16 битные компиляторы под x86 (кроме ассемблера) нинужны. Даже точки входа прошивок через десяток команд в ужасе съябывают из реалмода и возвращаются в него только если надо сэмулировать BIOS для загрузчика... А все модули UEFI прошивки (включая тот, где точка входа), внезапно, оформлены в виде PE файлов.
inkanus-gray 18.05.2016 19:36 # +1
Линуксовый Дельфи не смотрел (подозреваю, что как раз для него ELF будет родным форматом). Но наткнулся на то, что виндовый Delphi XE может компилировать под OSX/iOS и генерировать объектные ELF-файлы.
Ну и, наконец, есть GPC, использующий инфраструктуру GCC, и FPC, для которого COFF родной.
bormand 18.05.2016 19:47 # 0
defecate-plusplus 17.05.2016 19:49 # −1
вся эта магия с индексами не с нуля, эти длины строк, темнота с указателями, вложенные функции в функции и прочая школярская поебень, которая не создает даже близко ощущения, что ты работаешь с синтаксическим сахарком поверх ассемблера
на паскале надо базовые алгоритмы проходить
ну там, циклы, условные выражения, сортировки пузырьком и т.д.
inkanus-gray 17.05.2016 19:59 # 0
Поясните свою мысль.
> вся эта магия с индексами не с нуля
Какая там магия?
defecate-plusplus 17.05.2016 20:07 # 0
где лежит в памяти этот элемент массива?
надо ли знать школьнику, где он конкретно лежит относительно других его переменных?
>> темнота с указателями
> Поясните свою мысль.
насколько я помню из школьных лет, даже работа с кучей - приличное такое табу
если тебе не надо уметь в кучу, тогда и указатели не нужны, и адресная арифметика
не надо понимать что такое стек, надо лишь понимать, что вот тут мы переставляем элементы массива, а вот тут мы делаем writeln
а ты думал почему столько неосиляторов указателей на 1 курсе? нипаняятна!! сишка миня угнитаает
inkanus-gray 17.05.2016 20:17 # +2
В Паскале нельзя написать 134[myarray] и myarray+134. Это, конечно, страшное ограничение.
> работа с кучей - приличное такое табу
Что за табу? Впервые слышу.
> адресная арифметика
Вот тут как раз в сишке кое-что спрятано под капотом. В Паскале Inc(p) увеличивает адрес на единицу, а в сишке ++p неявно домножает единичку на размер элемента массива.
TarasB 18.05.2016 14:11 # +3
неправда
inkanus-gray 18.05.2016 14:45 # 0
Просто не приходилось этим пользоваться, ведь в Паскале довольно легко кастануть в массив или в структуру.
TarasB 18.05.2016 14:31 # +4
3.14159265 18.05.2016 19:34 # +1
Да. Не царское это дело. То ли дело Си. Там и jumpы и регистр флагов.
>которая не создает даже близко ощущения, что ты работаешь с синтаксическим сахарком поверх ассемблера
Лол.
Кстати а можно уточнить поверх какого именно ассемблера ты работаешь в сишке?
guest 17.05.2016 19:57 # +1
inkanus-gray 17.05.2016 20:07 # 0
guest 17.05.2016 20:18 # 0
inkanus-gray 17.05.2016 21:22 # +1
guest 17.05.2016 22:11 # +2
Потому знание сей есть насущая необходимость любого программера. Вот тупо чтобы узнать как работает fork или CreateProcess.
guest 17.05.2016 22:18 # +3
Так что я рад что в моем детстве детей учили паскалю.
guest 17.05.2016 22:20 # +1
guest 17.05.2016 22:09 # +1
Конечно, блин, паттерн Visitor надо не на plain си учить.
Просто зная си _можно_ освоить джаву (ну придется подучить паттерны и ООП), а вот неосилившие си нытики как wwxwxw будут бегать по форумам о орать что на си невозможно ничего написать
wvxvw 17.05.2016 23:16 # +1
guesto 17.05.2016 23:21 # +3
Именно по этому первыми языками программирования должны стать flow diagrams, decision trees, Эренфух-Фраисе игры итд.
А знать что такое int и float вообще не надо. Вон, PHPшники не знают, и ничего: живут
wvxvw 17.05.2016 23:36 # +1
guesto 17.05.2016 23:38 # 0
inkanus-gray 18.05.2016 00:13 # 0
float не сможет показать 100 знаков числа π => не нужен.
guesto 18.05.2016 00:19 # +2
он там всякий разный
Так что может и нужен еще
inkanus-gray 18.05.2016 00:27 # 0
wvxvw 17.05.2016 23:02 # +1
http://arxiv.org/abs/1603.05636
И это-то после тридцати лет написания оптимизирующих компиляторов.
Я вообще не вижу каким обрзом Си поможет с вычислительными машинами (их только доминируювих подходов есть аж три, из которых два вооще Си не доступны, а третий так плохо выражен, что как модель для теории Си годится примерно менее чем никак). В Си есть одно фатальное достоинство - фигурные скобки.
Ну а уже о том, что в Си нет нормального способа, например, представить число как сроку, склеить две строки и т.п. банальные вещи, делает процесс обучения очень насыщеным и плодотворным.
guesto 17.05.2016 23:07 # +2
Тем, что в нем можно напрямую работать с памятью, и тем что API операционок описаны на нем.
>>На самом деле Сишка на столько убога и непонятна даже тем, кто на ней пишет
Тем, кто пишет -- очень даже понятна. Не понятна она только тебе, потому что ты на ней не пишешь, в следствие ее неосиления.
>>Ну а уже о том, что в Си нет нормального способа, например, представить число как сроку, склеить две строки и т.п. банальные вещи
А еще там нет Twitter клиента в стандартной библиотеке.
TarasB 18.05.2016 14:15 # +3
ЛОАЛЛЛ ты чисто копируешь то, над чем я ржал. А какой нативный язык не позволяет-то?
> и тем что API операционок описаны на нем.
На любом нативном языке ты можешь точно так же подключиться к любому АПИ. А то, что в АПИ осей часто встречается такое дерьмо, как null-terminated string, то это не плюс сишки, это минус АПИ. Это рак, которым АПИ заразилось от сишки.
defecate-plusplus 18.05.2016 09:51 # +3
надо почитать лунный календарь, www.xxx последнее время в особенном обострении
сишка - это сахарок над ассемблером
под ассемблер затачивается всякое железо
нуу ок, как скажешь
> с вычислительными машинами (их только доминируювих подходов есть аж три
да-да, лисп машины захватили мир
а ещё микрософт уже 10 лет как выпускает процессоры, исполняющие c# напрямую
зачем ты выбрал синюю таблетку?
wvxvw 18.05.2016 12:34 # 0
Ну и Сишка "сахарок" (кому сахарок, а кому и глоток из параши) над ассемблером в такой же степени как и десяток, а может и сотня других языков. Смысл же в том, что это плохая надстройка над ассемблером, а не в том, что она вообще надстройка.
Электронная вычислительная техника затачивается под Сишку, даже скорее под конкретные компиляторы, а не под ассемблер т.как известно, что какие-то вещи Сишка умеет оптимизировать хорошо, а какие-то вообще не умеет / плохо оптимизирует.
defecate-plusplus 18.05.2016 12:59 # +3
я даже спорить не буду
сишка - портируемый ассемблер, она легко транслируется в машинный код любой экзотической вундервафли, синтаксис её прост и ориентирован не на абстракции, а на исполнение на конкретном железе, а бородатые дяденьки отстояли то, чтобы чужой модуль, собранный 10 лет назад для этой платформы, неплохо смог прилинковаться к твоему
что и доказывает 40 лет успешного применения этого языка и чрезвычайной актуальности оного для написания прослоек между этими вашими космическими фабриками абстрактных адаптеров и реальным железом с шинами и регистрами
> Электронная вычислительная техника затачивается под Сишку
железо оптимизируется не под сишку, оно оптимизируется под рынок
если ты собрался выпустить железку, где софт покупателя твоей железки будет тормозить или работать с ошибками, то либо ты экономически эффективно решаешь и эту проблему тоже, либо выпускаешь железку, понимающую проблемы софта, либо ты бесконечно теоретизируешь о том, насколько ibm pc хуевая архитектура, за тарелочкой ароматного доширака
TarasB 18.05.2016 14:13 # +2
На железе PDP-11? В целом, по сравнению с другими нативными языками, она выделяется лишь своей общей уёбищностью.
defecate-plusplus 18.05.2016 15:00 # +2
TarasB 18.05.2016 15:28 # +6
Где в любом современном распространённом процессоре аналоги пост и пред-инкременты?
Где в сишке бср, бсф? Где блять лонгмул? Как написать функцию, которая меняет два числа значениями, но не дрочит память? А какого хуя массив и указатель на массив неявно кастятся друг в друга?
inkanus-gray 18.05.2016 15:49 # 0
1024-- 18.05.2016 16:06 # 0
Предыдущие утверждения покрывали аппаратную питушню. Это последнее утверждение - внезапный переход на математику или реально по каким-то причинам такие касты мешают железному питуху?
TarasB 18.05.2016 16:15 # +1
inkanus-gray 18.05.2016 16:40 # 0
http://ideone.com/u2wvOL
Этот язык не претендует на близость с железом, ему прощается путать указатели и значения.
А в Паскале значения и указатели чётко отделены друг от друга. Пример копирования значения:
http://ideone.com/szTMXt
Пример копирования указателя:
http://ideone.com/aFglyP
TarasB 18.05.2016 16:47 # +3
3.14159265 18.05.2016 19:47 # 0
Классы==указатели? r u mad?
В жабе нет указателей. В жабе ссылки. Причём jvm может их двигать как пожелает.
guesto 18.05.2016 19:50 # 0
Хотя технически они, конечно же, ссылки.
Речь о том, что в джаве инстансы классов в общем случае живут на куче, и с ними общаются через указатель(точнее ссылку)
Потому когда я говорю "Переменная goo это объект", на самом деле я говорю "переменная foo это указатель на объект"
Может-ли JVM разместить класс на стеке? Наверное, может если знает что я его за пределы блока не опубликовал. Но программист никогда не должен про это думать
3.14159265 18.05.2016 19:55 # 0
Что "жабские классы,на самом деле указатели"?
Инстансы классов != Классы.
В жабе нет указателей. Только ссылки. Точка.
AtomicReference, WeakReference, SoftReference, PhantomReference.
>JVM разместить класс на стеке?
JVM размещает классы в permgene. Если кто-то разместит его на стеке - он просто сумасшедший.
bormand 18.05.2016 20:06 # +1
Шёл 2016 год, а люди до сих пор не научились отличать классы от объектов...
inkanus-gray 18.05.2016 20:30 # +1
То, что в крестах зовут классом, в иных местах называют типом объекта/класса, а то, что в крестах зовут объектом, в иных местах называют экземпляром объекта/класса.
В общем, если употреблять термин экземпляр/инстанс, то не придерутся.
guesto 18.05.2016 20:38 # +2
guesto 18.05.2016 20:39 # +1
ссылку на инстанс класса многие люди называют инстансом класса , а то и вовсе классом
guesto 18.05.2016 20:40 # 0
NullPointerException ;)
Да, разумеется с точки зрення терминологии ++ они ссылки
>>JVM размещает классы в permgene.
да) это вот пример того что я объект назвал классом
даже точнее ссылку на объект
TarasB 19.05.2016 12:01 # 0
3.14159265 18.05.2016 19:31 # +1
Для удобства программиста. Как и всё в сишке.
1024-- 18.05.2016 19:47 # 0
3.14159265 18.05.2016 19:48 # +1
1024-- 18.05.2016 19:57 # 0
Иногда в этих терминах удобно думать. Где-нибудь внутри алгоритма, когда не надо передавать массив как целое (что сделать не получится из-за разделённости массива и его длины).
TarasB 19.05.2016 10:55 # +1
А в Аде слайсы вообще родные, в язык вшиты, никаких специальных структур передавать не надо. В Фортране кажется даже двумерные слайсы вшитые есть (!!!)
dxd 19.05.2016 13:34 # 0
roman-kashitsyn 18.05.2016 17:55 # +2
> Где в сишке бср
псевдокод
Не фонтан, но жить можно.
Хреново, конечно, что в каждом проекте нужна эта тоскливая копипаста. Хорошо бы иметь модульный компилятор, у которого можно спрашивать, что он умеет делать, со стандартизированным набором фич.
inkanus-gray 18.05.2016 18:42 # 0
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
http://www.opennet.ru/man.shtml?topic=ffsll&category=3
https://msdn.microsoft.com/en-us/library/fbxyd7zd.aspx
https://msdn.microsoft.com/en-us/library/wfd9z0bb.aspx
https://msdn.microsoft.com/en-us/library/bb384809.aspx
В Шланге вообще красиво:
Встроенные функции похожи на GCC, а в хидерах определены переходники, похожие на MSVC.
3.14159265 18.05.2016 19:21 # +2
А поделить два числа и получить раздельно остаток и частное?
Работает в 1 инструкцию только благодаря "умному" компилятору.
TarasB 19.05.2016 10:56 # +1
3.14159265 18.05.2016 19:28 # 0
The PDP-7, however, did have a few `auto-increment' memory cells, with the property that an indirect memory reference through them incremented the cell. This feature probably suggested such operators to Thompson; the generalization to make them both prefix and postfix was his own. Indeed, the auto-increment cells were not used directly in implementation of the operators, and a stronger motivation for the innovation was probably his observation that the translation of ++x was smaller than that of x=x+1.
The B compiler on the PDP-7 did not generate machine instructions, but instead `threaded code' [Bell 72], an interpretive scheme in which the compiler's output consists of a sequence of addresses of code fragments that perform the elementary operations. The operations typically—in particular for B—act on a simple stack machine.
.
3.14159265 18.05.2016 13:47 # 0
>Та ладно, и чем он так хорош для системщины?
PDP-7.
>Тем, что под это уебище специально затачиватся всякое железо?
На самом деле они ж из Сишки делают некое промежуточное представление (типа шланг-асма), которое уже оптимизируют под конкретную тачку.
guest 17.05.2016 22:06 # 0
в си есть препроцссор
>>В Си, как и в ПХП нет нормальных структур данных.
это традиционный пиздеж, все там есть
>>В Си реализация любых алгоритмов общего назначения упирается в отсутствие генериков
лол, как и в любой ЯП, выдуманном в 1970х.
void* и вперед. Си не для этого. Не пишите на нем бизнес-логику.
>>В Си так трудно добиться того, чтобы код можно было повторно использовать, что, по-сути, никто к этому даже не стремится.
Это очередной пиздеж. В мире дохуя либ, написанных на си. СМ API OS.
>>В Си так тяжело добиться вообще работающего кода, что когда оно наконец скомпилировалось, и после отключения всех чужих библиотек валгринд выдал всего сотню-другую ошибок, хочется заплакать и бежать закрыв глаза до самого горизонта.
У миллионов людей получается, а у тебя нет. Потому что ты неосилятор, который не знает си. Пиши на ПХП или 1С.
>>Си не учит программировать, он учит выживать в условиях,
Очередной бессмысленный пездеж
1024-- 17.05.2016 22:28 # +1
>Очередной бессмысленный пездеж
Почему же? Берёшь сишку - и уже не программируешь, а байты таскаешь и за флагами ошибок следишь. Чуть не уследил - отлаживаешь и ещё строже следишь за байтиками.
Программирование вроде как задачи должно решать. А на сишке программист в первую очередь решает задачу о том, как ему нужно написать код, чтобы тот решал задачу, а не о том, как всё же решить эту задачу.
Слишком много нужно думать о том, что не влияет на результат.
Всё равно, что повару использовать ледяной нож. Точишь его, точишь, комнату охлаждаешь, а блюдо всё не готово.
defecate-plusplus 17.05.2016 22:35 # +3
guest 17.05.2016 22:43 # +2
Я не знаю что такое "таскать байты", потому я обычно использовал СИ для составления алгоримтов для решения конкретных задач. И задачи эти решались. И миллионы людей так делали. Например, они написали Apache Web Server. Или Linux. Или Windows. Или nginx. И все у них получилось.
Наверное они просто какие-то не правильные.
TarasB 18.05.2016 14:17 # +5
roman-kashitsyn 18.05.2016 18:01 # +1
Честно говоря, за почти 20 лет с первого стандарта можно было бы и получше инфраструктуру развить.
Чем собирать проект на C++? Как повторно использовать библиотеки?
На эти вопросы, увы, нет простого ответа.
guesto 18.05.2016 18:03 # 0
Я вот хочу писать на smalltalk. Но на нем не так удобно будет писать, например, под iOS. Правда?
guesto 18.05.2016 18:03 # +4
bormand 18.05.2016 19:36 # 0
> У миллионов людей получается
Но у многих из этих либ внутри такое говно, что даже всё желание их юзать/править отпадает.
Понятный сишный код без изъёбств, костылей и ляпов редко встретишь...
guesto 18.05.2016 19:41 # +2
Я думаю что говно внутри у 99% либ
dxd 19.05.2016 10:50 # 0
bormand 16.05.2016 23:50 # 0
На изкоробочном томкате неплохо взлетало... Не продакшен, конечно, но подебажиться хватит.
> зависимости, конфиг
Можно подумать, что какой-нибудь модуль к ПХП проще прикручивается. Там со всякой экзотикой, типа редких СУБД, вообще дело до ручной сборки из исходников доходило... Ну и всякие помойки типа php.ini + .htaccess тоже не стоит забывать.
guesto 16.05.2016 23:54 # 0
пыхобляди никогда не могли его осилить, и потому наплодили denverов
bormand 16.05.2016 23:58 # 0
А уж как в php роутинг делается - это вообще отдельный вопрос. Может быть, при запуске через fastcgi, что-то повменяемее завезли?
guesto 17.05.2016 00:01 # +1
в зенде, например, для этого routes.ini
Там через mod_rewrite ВСЕ заворачивается в пых, ну и дальше routes.ini
roman-kashitsyn 16.05.2016 23:59 # +2
Ну, чтобы поиграться достаточно
http://php.net/manual/en/features.commandline.webserver.php
guesto 17.05.2016 00:00 # 0
правда в мавене тоже был томкат
можно был mvn run:tomcat или как-то так
bormand 17.05.2016 00:03 # +1
guesto 17.05.2016 00:04 # 0
Мавен, к сожалению, все равно не спасает от хелла
Потому что нельзя в класс-пасе иметь два разных класса foo.Bar.
Зато в .NET можно, кстати) там в манифесте указана версия
Тут .NET сделал JVM
bormand 17.05.2016 00:08 # 0
Да один фиг, не всегда это будет работать. Если у сборки нету общего стейта - ну ок, хоть 100500 копий запускай. А если есть стейт - всё разъедется уже на второй.
guesto 17.05.2016 00:09 # 0
bormand 17.05.2016 00:09 # 0
guesto 17.05.2016 00:12 # 0
GUI тред конечно один и какие сборки в него не лезут
Там вертится луп, и они в этот луп задачи пихают
bormand 17.05.2016 00:13 # 0
guesto 17.05.2016 00:14 # 0
Вот если у меня будет две сборки с лупом для доступа к моей ВундерВафле на USB, тады ой
Но и тады там будет фабричный метод, который вернет верную реализацию интерфейса для работы с вафлей и сборки ее там зарегят. Кто последний -- тот и победил
bormand 17.05.2016 00:16 # 0
Ну а сборки от майкрософта типа не подчиняются общим правилам? Их не могут затребовать разные куски твоего продукта? :) Или они всегда взаимо-исключающи?
guesto 17.05.2016 00:19 # 0
хотя я хз, если честно, я давно туда не смотрел. Но в целом возможность сказать что "мой модуль хочет Foo версии 1.0" это лучше чем просто сказать "Мой модуль хочет bar.Foo"
bormand 17.05.2016 00:31 # 0
+1. Кстати, в мире джавы OSGi решает эту проблему (по крайней мере, пытается).
bormand 17.05.2016 00:17 # 0
Которую из? :)
> Кто последний -- тот и победил
Ну это ж хуёвый способ, недетерминированный. Сегодня первый победил. Завтра второй. А послезавтра бегай с больной головой и ищи в чём была трабла...
guesto 17.05.2016 00:18 # 0
Кто последний загрузился, тот и прописал себя в некое глобальное хранилище
bormand 17.05.2016 00:19 # 0
Тогда уж - у кого хуй длиннее версия больше. Так хоть детерминированно будет.
(На UEFI так драйверы сортируются).
guesto 17.05.2016 00:25 # 0
можно получить отсутствие обратной совместимости и упасть
но в уефи наверное можно запустить бутменеджера или его шелл и загрузить нужный модуль и нужный .efi файл
bormand 17.05.2016 00:15 # 0
guesto 17.05.2016 00:16 # 0
просто это все же меньшее из говен. Вот когда ты депендишься на foo, а foo на bar, а bar привез тебе log4j не той версии что тебе надо -- вот это боль.
Кстати, пулы в дотнете уже реализованы обычно в ADO.NET (если есть нужные дрова)
guesto 17.05.2016 00:10 # +1
бля, это еще Дейкстры с Никлаусами говорили
не nasrat_govno() а govno = nasrat_govno().
на худой конец nasrat_govno(&govno); же
bormand 17.05.2016 00:12 # 0
guesto 17.05.2016 00:12 # 0
это может быть
интересно, полетит-ли класскаст?)
3_14dar 17.05.2016 00:21 # −2
Сишкопроблемы
guesto 17.05.2016 00:27 # 0
nasrat_govno(out govno) // шарпей
так лучше?
хотя в C# лучше коенчно просто вернуть хендлер по причинам того что он все равно будет в куче
3_14dar 17.05.2016 00:28 # 0
Да уж, через жопу. Но рнр слегка проще, согласен.
3_14dar 17.05.2016 00:25 # 0
guesto 16.05.2016 23:08 # +1
Писать на нем плохо очень легко, а писать хорошо -- сложно.
Он имеет плохой синтаксис, плохую библиотеку, плохие best practices, и плохое, тупое коммунити.
Почитай "фрактал плохого дизайна". посмотри на вопросы на PHPClub, а потом сравни их с вопросами по питону на StackOverflow
3_14dar 17.05.2016 00:33 # 0
guesto 17.05.2016 00:34 # +1
а что такого?
а вот так в пистоне нельзя
$php[1] = 1;
$php["govno"] = 2;
потому что массив (он же список для простоты, хотя это конечно не так) не равен дикту (он же хеш он же мап)
3_14dar 17.05.2016 00:57 # 0
>посмотри на вопросы на PHPClub, а потом сравни их с вопросами по питону на StackOverflow
>Как раз на СО полно вопросов типа "как сложить 2 массива" с кучей плюсов, тут ты не в тему.
guesto 17.05.2016 00:58 # 0
guest 16.05.2016 23:11 # +1
Это как с едой, сожрал элитные пельмени пощелкивая креветкой, но выходит ведь все равно говно.
bormand 16.05.2016 23:23 # 0
... прострелить себе ногу
guesto 16.05.2016 23:24 # 0
Вам разве не по душе высирание в глобальный неймспейс переменных, полученных гетом?
Vasiliy 17.05.2016 08:12 # +1
guesto 17.05.2016 16:01 # −1
guest 16.05.2016 23:24 # 0
guest 16.05.2016 23:26 # +1
guest 16.05.2016 23:37 # +1
guest 16.05.2016 23:41 # 0
guest 16.05.2016 23:26 # 0
3_14dar 17.05.2016 00:22 # 0
guest 17.05.2016 00:25 # 0
bormand 16.05.2016 23:20 # 0
Vasiliy 17.05.2016 08:13 # 0
guesto 17.05.2016 09:07 # 0
inkanus-gray 17.05.2016 13:33 # 0
Vasiliy 17.05.2016 14:35 # 0
http://php.net/ChangeLog-5.php
До 10 года