- 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();
}
Моя дипломная работа по теме "тестирование студентов". Загрузка вопросов для прохождения теста из базы. Вопросы должны идти в рандомном порядке, варианты ответов тоже.
почитай про mvc, не для преподов, а для себя
и выбери другой язык, ни одна пыхоблядь mvc так и не освоила
не прочитали ни одной книжки
ты перечитай ещё раз внимательно что я написал
http://www.yiiframework.com/doc/guide/1.1/ru/basics.best-practices
Таким образом, если применить это к рассмотренному выше примеру, необходимо добавить модель News с методом getLatestNews в пользовательскую часть и ещё одну модель News с методом getDeletedNews в административную часть.
я же говорю
пыхоблядь не может в mvc
Базовая модель будет таскать данные из БД а бизнес логику буду реализовывать в дочках.
Если кто то не умеет в пхп это его проблемы.
Должен быть слой, который умеет читать и писать коллекции твоих сущностей:
NewsRepository.getLatestNews() -> Collection<NewsItem>
NewsRepository.getDeletedNews() -> Collection<NewsItem>
он должен быть интерфейсом, в реализации интерфейса должна содержаться функциональность работы с конкретным источником этих сущностей (база, файл, может - чужой сервис)
В самой модели (NewsItem) никаких методов нахуй не нужно, это декларация, она as is уйдет в wsdl, wadl, она прекрасно мапится (де/сериализуется) на объекты в запросах и ответах, таблицы и другие вещи, ничего не ведающие про методы.
Обработать, отфильтровать про правам и другие полезные бизнес-действия должен выполнить специальный сервисный слой, который внутри обратится к куче репозиториев различных сущностей и примет решения.
а ты предлагаешь наделить модель методами, наебенив бизнес-логики в них, а через лапшу наследования ещё и усложнить связи, чтобы вообще хуй кто разобрался, в каких ещё унаследованных классах этой модели надо исправить бизнес-логику, которая сейчас взяла и поменялась
> выбери другой язык, ни одна пыхоблядь mvc так и не освоила
ЧТД
прекрасно работает, особенно, с тайпскриптом
Родительский класс умеет читать писать коллекции получать сохранять отдельные инстансы, знает если ему показать о физических связях в хранилище. НЕ знает о бизнес процессах и о том где и как хранятся данные.
дочерний класс знает про бизнес логику. Бизнес логика тоже может быть разделена на части. Логика приложения отличается от логики админки хотя они и работают с одними сущностными.
Если требуется поменять бизнес логику то мы меняем дочерний класс над моделью данных.
И еще зачем нужны лишние слои абстракций типа repository service?
Лепить абстракции ради абстракций путь в никуда.
далее
тебе требуется вместо базы использовать сторонний сервис - твои действия?
а т.к. ты все ещё тестируешься, хранилище не готово, ты хочешь просто почитать свои сущности из файла
ты уже написал в дочернем классе кучу sql шита с этими волосами, т.к. у тебя нет слоя абстракции, решающего конкретную задачу "дай мне 100 объектов, откуда тебе виднее", ты начинаешь судорожно писать какие-нибудь switch-case или портянку if
или просто забиваешь, говоришь "пехопе выше всего этого!!11!!", и просто делаешь ещё один дочерний класс "модели", и ещё один и ещё один
когда наступает время поменять одно на другое ты делаешь "заменить все вхождения" одного названия класса на другое, такой себе орёл бгг
далее
тебе требуется поменять бизнес-логику
у тебя в элементе "Новость" появляется атрибут "источник", и теперь тебе надо в обоих дочерних классах поебстись с этим атрибутом единообразно
ты знаешь что у тебя есть NewsItem, и каким то неведомым образом должен поискать все дочерние классы, которые как бы вместо того, чтобы расширить атрибутный состав этой базовой сущности (а такое бывает сплошь и рядом), за каким то хером расширяют его методами по обработке - ну кроме того, что это удаление гланд через жопу, это даже пыхобляди должно быть очевидным нарушением архитектуры приложения - часть классов будет добавлять атрибуты, часть классов - методы, часть классов - и то и другое, и все они как бы находятся на одном и том же уровне
> Лепить абстракции ради абстракций путь в никуда.
я вообще считаю неразумным делить всё на файлы и даже папки, мало того, что это не удобно - закрываешь один файл, открываешь другой, так ещё и интерпретатору пиздец неудобно, это существенное замедление
поэтому самые крутые проекты всё пишут быстро и эффективно в index.php
guestbook.cgi
мол, приехал борманд в новосиб, а он ему как раз!
Угу. Задачки интересные, люди хорошие, зарплата очень даже норм. Ня ^_^
а осилил бы PHP, работал бы сейчас:
https://novosibirsk.hh.ru/vacancy/17051910?query=php
Эх, такую возможность упустил...
З.Ы. Ну там вон рядом сеньор-похапор есть. Уже 60-80к, получше.
джуниор пхп пишет так:
$polzovatel = mysql_query("SELECT * from polzovateli where id=".$_GET['id'].);
а сеньер так
$polzovatel = mysqli_query("SELECT * from polzovateli where id=".$_GET['id'].);
Сеньор должен хотя бы немного знать инглиш и уметь экранировать, иначе какой он нахуй сеньор...
но все равно у него в базе должен быть пользователь "O\'Hara". Причем в конце концов должен получиться O\\\\\\\'Hara"
Иначе какой он пхпист>?
так что без БД никак
это BazaDannyh, разумеется.
давайте, давайте, пыхобляди, не стесняемся, рассказываем о своих охуительных приключениях с бизнес-логикой в унаследованных моделях
модели сами себя не унаследуют
Я пробовал PHP и могу сказать что готов подписаться под каждым словом в статье "фрактал плохого дизайна"
Я про это и говорил.
И слава богу. Хватит нам и одного адепта PHP.
Уж какая потеря. После прочтения фрактала мне показалось что проще осилить питон чем рнр на таком уровне, чтобы не наступать на грабли. Нахуй он такой нужен, васютка? Чтобы зарабатывать деньги, правя код людей, работавших за еду или лайк в инете?
p.s. Продолжаю жрать кактус использовать PHP в тех задачах, где его блядство нивелируется его плюсами.
какой блядский язык ты считаешь менее блядским?
Какие задачи проще на PHP сделать? Да самые простейшие. Вывести список сотрудников с ебальниками на корпоративном портале. Да, тупым <table>, без всяких дивов. Показать календарь и закрасить красным выходные дни. Нарисовать тортики, если дни рождения сотрудников. Ну и тому подобное одноразовое корпоративное говнецо, где не надо всеми этими правильностями заморачивается.
Смысл кода пыха в том, чтобы отработать и умереть.
1. Какое отношение к этому имеет PHP?
2. Почему <table> тупой?
2. Table тупой в том же смысле что и молоток. Молоток тупой. Он умеет забивать гвозди. Шурупы тоже может, но хуёво.
2. Я так и не увидел объяснения. Почему <table> тупой?
Потому что это не модно уже много лет.
Потому что он решает только одну задачу и не является серебрянной пулей.
Кроме «не модно» аргументы есть?
не виден сайт, пока все не прогрузится
сетки обычно гораздо сложнее, чем просто таблица
это уж не говоря о том, что содержание должно быть развязано от представления - у тебя есть 20 одинаковых итемов - ты делаешь 20 одинаковых дивов, далее css понимает что, например, колонки три, и располагает твои 20 элементов в три колонки по сетке, или рисует из них буллетами ненумерованного списка в одну
а с таблицами программист должен явно рассказать где же будет tr, где td, и больше ничего не поделать, на телефоне не сделать автоматом из 3 колонок одну переносом
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, но он не работает в браузерах пятилетней давности.
сам достаточно знаешь, чтобы решить, чем верстать
а керман в веб-технологиях валенок, он к прости господи мускулу из толстого клиента подключается, на что ты рассчитывал не пойму
Говнокод -- основа идеологии языка:
https://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html
А для лабы, тем более сойдёт.
Если следовать общепринятым правилам - то всё будет заебись.
Я ж говорю, у него низкий порог вхождения. Именно поэтому он такой популярный.
И именно поэтому так много говнокодеров.
Дорогой школьник! Есть такое понятие -- модуль. Оно набрало популярность еще в 70е, когда умные дяди придумали структурное программирование. Если у тебя один код работает с HTTP, то у тебя есть специальный модуль для работы с ним.
Например для работы с кукой есть модуль http.cookies. Какое неожиданное имя, правда?)
А еще есть такой тип данных -- dict. ПХПшники про него не знают, и путают его с массивом, но он есть.
А поскольку куки приходят через HTTP запрос который, как ты помнишь, попадает в аргумент environ функции ``application`(environ, ...` , то нужно сделать так: SimpleCookie(environ['HTTP_COOKIE'])
Но это все лоу-левел скам, а потому кончай выябываца и ставь Джангу.
В далеком 1998м школьников учили паскалю. И 14тилетние дети как-то понимали что для работы с экраном надо сделать uses crt, а для работы с графикой -- uses graph.
Думаете, с тех пор потупели?
На любом языке можно говнокодить как на php. Просто в php это делать легче.
Нуб ведь впитывает стандартную библиотеку, стандартные идиомы, и считает что именно так и надо. Он как импринт. Если функция срет в глобальный спейс то и он так будет делать. Чего не делать то, если сами авторы ЯП так сделали?
> http.cookies
Понятно.
Значит, $_COOKIE - плохо, http.cookies - хорошо.
$_COOKIE[x] - плохо, http.cookies.SimpleCookie()[x] - хорошо.
Естветсвенно, $_COOKIE - глобальная переменная и вселенское зло.
В то время, как http.cookies - няшный модуль, который, разумеется, не является глобальной переменной и, разумеется, не виден ни в одной из функций, кроме main, откуда куки канонично переносятся через аргументы и замыкания...
Хотя, постойте-ка, в питоне же нет функции main, а http.cookies можно использовать в любой точке кода. Фундаментальные отличия? В питоне нужно писать больше букв, поэтому программист подумает над тем, что ему писать, и не станет писать говнокод.
Теперь буду рекламировать модули всем друзьям, ведь они настолько отличаются от глобальных переменных в лучшую сторону!
конечно, ведь там же есть неймспейсы.
Не говоря уже о том, что его можно заимпортировать в нужную функцию.
>>Хотя, постойте-ка, в питоне же нет функции main
если очень хочется что можно сделать (if __name__ == "__main__"), однако же в случае визги точной входа является ф-я application, считайте что это main
>>Теперь буду рекламировать модули всем друзьям, ведь они настолько отличаются от глобальных переменных в лучшую сторону!
Лучше почитай, например, "Идеальный Код"
Может быть тебя еще можно спасти.
Чаще всего эти неймспейсы - просто повод понаписать имена подлиннее и с точками.
Используют псевдоним для неймспейса только когда уже совсем плохо с конфликтами, иначе пишут как есть, а то мужики не поймут.
> __main__
Всё равно куки пролезут в обход неё.
нет. В стандартной либе модули это вполне себе оформленные, документированные сущности которые имеют публичный интерфейс (__all__) и импортируются только в нужные места
>>Всё равно куки пролезут в обход неё.
нет
>нет
А, их надо ещё всасывать из контекста в кукообъект. Выходит, я точно наполовину наврал.
еще раз: точкой входа визги является функция. В нее они передаются как аргументы (точнее заголовки передаются). Куки сами по себе нигде не гуляют.
> В нее они передаются как аргументы (точнее заголовки передаются).
Вот из такого, переданного через аргументы.
$_COOKIES видно всем.
Да, в питоне, в отличие от ваших js и php, внезапно, есть модули.
Это ты про from хуй import * (aka using namespace в крестах)? Это сколько надо выпить, чтобы случайно написать *?
Это надо много кода написать, каждый раз импортируя только нужные функции, и обновляя этот список. Потом пишешь звезду, и всё работает. Явно написать её легче, чем списочек.
А в доморощенных жс-модулях надо целый for-in написать (ещё и правильно), это не каждый сможет.
во-вторых для ленивых есть IDE
пых изначально заточен под то, чтобы быть шаблонизатором. Для этих целей он не так уж плох. А вот когда ты пишешь на нем бизнес-логику, то он уже не под веб
Для всего остального питон не нужен.
Тогда сишка и кресты — говно. Директива #include, заголовочные файлы и (почти) ручная линковка — это не модульность.
а, что кто то так не считает?
Кто-то с этим спорит? Модулей там нет, и это большая жопа.
Конечно. Благодаря им, код, использующий параметры запроса, размазывается толстым слоем по всей портянке... А из-за суперглобальности - ещё и затекает в половину функций...
> через какую жопу это нужно получить в питоне или жабе
Я просто скопипащу первый попавшийся пример по Весеннему Каркасу, ок?
Блин! Если человек не понимает в чем минус глобальной переменной, то о чем вообще можно говорить?
Она не просто глобальная, а суперглобальная.
а, я забыл
в ПХП нету нормальных модулей
В том смысле, что она лезет во все подряд скопы, даже если там нахуй не нужна. Да, в пхп есть единственная адекватная фича - глобалки нельзя юзать без слова global.
global писать не надо
Не создавай функций, глобальных переменных и будет тебе счастье.
mysql_query как было в глобальном, так и осталось
пыхомакаки не осилили модули
Если тебк критично откуда приходят значения переменных не юзай его.
_REQUEST - юзается только в битриксе а он квинтэссенция говна и php тут не причем.
Почему не на питоне. потому как разрабы питона сами не знают с кем они с умными или с красивыми. Да я про не совместимость версий 2 и 3.
http://php.net/manual/ru/reserved.variables.request.php
Он нужен но в очень узком спектре задач типа пагинации.
это часть культуры языка что-ли -- постоянно брехать?
https://developers.google.com/s/results/?q=%22%24_REQUEST%22
Да и не всё так плохо. Язык изначально заточен на обработку http и быстрое изучение/написание сраниц. Гораздо больше удивляют те кто на нём vk/fb пишут.
И главное у них всё шустро работает!
Вон в JSP request.getCookies(). Вроде глобальная (на странице), а по факту нет.
let the butthurt.jpg
>> через какую жопу
через какую?
HttpServletRequest из параметров?
Только ты забыл указать зависимости системы сборки, конфиг спринга (xml или код), какой-нибудь web.xml (сейчас они вроде тоже кодом задаются), и настроенный контейнер сервлетов. А так коротко, да.
Джава не лучший ЯП чтобы начинать обучение программированю
На нем писала еще моя прапрапрапрапрапрапрапрапрапрапрабабушка , все старое луче
нубу нужно просто:
a = 42
print(a)
а в жабе ему сразу public static void main
и у нуба песдец в голове
Короче, детей я бы джаве не учил
>а в жабе ему сразу public static void main
Питон прост в начале, но гораздо сложнее жавы если полезть в потроха.
Не знаю нащет детей и нубов, но для студентов-программистов жава практически стандарт.
иначе получится говно, а не студент
Говно получается из неосилянторов вроде тебя. К счастью, таковые не все
В Си, как и в ПХП нет нормальных структур данных.
В Си реализация любых алгоритмов общего назначения упирается в отсутствие генериков / необходимость решать кто и когда будет освобождать память. И поэтому в Си их нет, и самому написать = страдать.
В Си так трудно добиться того, чтобы код можно было повторно использовать, что, по-сути, никто к этому даже не стремится. В Си так тяжело добиться вообще работающего кода, что когда оно наконец скомпилировалось, и после отключения всех чужих библиотек валгринд выдал всего сотню-другую ошибок, хочется заплакать и бежать закрыв глаза до самого горизонта.
Си не учит программировать, он учит выживать в условиях, когда есть только один говноязык, и нет альтернатив, потому что тимлид вырос в этом абсурдном мире, и не может себе в этом признаться - он хочет, чтобы другие страдали так же, как и он. В этом смысле, он очень похож на ж.скрипт.
мля ну начались стенания
Си - язык для тех, кто понимает как работает вычислительная машина, где должно работать приложение, как на этой вычислительной машине работает ОС и среда выполнения
т.к. в ВУЗе обязательно должны рассказать, чем процессор отличается от оперативной памяти, то сишка туда прекрасно вписывается
просто на сишке не надо проходить абстрактные синглтоны и прочие паттерны с функциональщиной, на сишке надо проходить вызовы ядра, межпроцессное взаимодействие и прочие вещи, которые называются "системным программированием"
+1. Ну, кстати, кресты для сишных задач тоже неплохо подходят, как показала практика. RAII, шаблоны и move семантика превращают лютую системщину в более-менее няшный код. Даже если под ногами нет не только операционки, но даже аллокатора...
З.Ы. Но для обучения, само собой, лучше чистая сишка.
Потому что паскаль - птица гордая. Без рантайма не полетит. А кресты - ещё как летают.
З.Ы. Или всё-таки полетит?
Но никто не мешает написать свой минимальный SYSTEM.PAS для эмбеддопердолинга.
Это возможно? Или там придётся перепиливать какую-нибудь магию в самом компиляторе?
> некоторые арифметические операции
Ну это и в сишке/крестах так.
Если ты не собираешься создавать собственную перегрузку арифметических операторов и библиотечных функций, а также менять названия встроенных типов данных, то никакую магию перепиливать не нужно.
Чтобы полетело, нужно реализовать некоторое подмножество функций/процедур из модуля SYSTEM.
writeln (или какой-то его бекенд?) и прочую платформозависимую мишуру я смогу реализовать? Ну и свой аллокатор. Если да - то норм, можно поюзать.
З.Ы. А, ещё точку входа можно поправить? Чтобы она за параметрами и окружением, к примеру, не лазила.
Ну и хотелось бы что-нибудь 32-64 битное, типа FPC. А не 16-битное говно мамонта, застрявшее в первом мегабайте...
> оконные
А чем оно окна делает? :) Через прерывание сисколлы венды дёргает?
Единственное, что может напрячь — нужно некоторое место в стеке (иначе нельзя будет вызывать процедуры и функции) и некоторое место под глобальные переменные и типизированные константы. Т. е. написать загрузчик БИОСа, когда ОЗУ ещё не инициализировано, скорее всего, не получится.
Есть хак с использованием кеша в качестве оперативки. Так что х.з., может быть и там будет работать...
Сразу ясно, из какой DLL под каким именем импортируется.
А теперь вспомним, сколько способов есть для импорта функции из DLL в сишке.
Что там говно, что сям:
- один глобальный плоский неймспейс
- возможность запилить приватную для куска кода функцию/переменную
Семантической разницы нет вообще. Никакой. Как и модулей.
в JS же инклуда нет( он есть только в ноде)
Потому в сях модульность на двойку, а в джаваскрипте на единицу
Формально - да. А так - это ж просто препроцессор, который и с js прекрасно будет работать.
Хорошо бы, если встроенное было.
А то теперь скриптушню, рассчитанную на "написал - уже работает" туда-сюда перегоняют из языка в язык, минифицируют, склеивают (осталось ещё два-три раза прогонять жс в асм и обратно для профилактики)... Тогда б на пацанской сишке уже сразу под веб писали, что ли.
Дык 100 раз уже говорили, что в браузерах надо не язык, а виртуальную машину.
Один хуй js после всех этих минификаций нечитаем.
Были же жабоапплеты, в которых можно было посылать всех на Jython. А теперь на некоторых платформах плагин для JVM не поставишь.
Т. е. вызов Write('Высота = ', 5) магия компилятора, описанная в SYSTEM.TPS, превратит в вызов WriteStr и WriteInt.
У WriteStr три аргумента: файловая переменная (куда магия компилятора подсовывает Output, если мы ничего не указали), собственно строка, а третьим аргументом идёт длина поля вывода (если мы её указали через двоеточие, то она подставляется, иначе берётся длина строки).
Стоп! Она же является переменной стандартного типа Text. Боязно менять структуру без синхронного патча SYSTEM.TPS. Компилятор же под var X: Text; выделяет известный ему размер памяти.
P.S. А в 32-битных Дельфях нужно реализовать аналогичные функции:
И тоже тип Text явно в интерфейсе не описан, а считается встроенным.
_WriteСString — это для PChar — сишных строк с завершающим нулём.
P.S. Я немного ошибся про перегрузку:
JECXZ не выкинули. По сути два варианта функции отображаются на один, как в том анекдоте про математика и полный чайник.
О, значит туда можно свои вписать?
Был прикол с рантаймом для графических баблиотек, но никто не мешает самому написать свою, которая прерываниями выставит нужный видеорежим и запишет в видеопамять то, что нужно.
Если вопрос о том, нужны ли библиотеки во время запуска экзешников, то мой ответ — не нужны. Таки да, паскалевские программы идут на «голой» машине.
Да, Борланд называет это рантаймом. Рантайм не обязан быть динамическим и подгружаться отдельно, как в Вижуал Бейсике. Никто не запрещает «рантайм» насмерть линковать в экзешник.
Нахуй мне ваша голая операционка и экзешники в 4кб, которые только под операционкой стартуют? На операционке я лучше нормальные либы поюзаю, которые все её фичи раскроют...
Я про bare metal, когда под ногами даже bios/uefi нету.
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-битного кода, но это уже после Борланда, если я не путаю.
Да это не особо важно. The cat coff/elf is a fine too. Можно постпроцессингом релоки поправить да на секции нарезать как надо. См. мою говно"ось" на гитхабе.
Или ты про трудности линковки с nasm'ом и прочими няшными ассемблерами?
З.Ы. 16 битные компиляторы под x86 (кроме ассемблера) нинужны. Даже точки входа прошивок через десяток команд в ужасе съябывают из реалмода и возвращаются в него только если надо сэмулировать BIOS для загрузчика... А все модули UEFI прошивки (включая тот, где точка входа), внезапно, оформлены в виде PE файлов.
Линуксовый Дельфи не смотрел (подозреваю, что как раз для него ELF будет родным форматом). Но наткнулся на то, что виндовый Delphi XE может компилировать под OSX/iOS и генерировать объектные ELF-файлы.
Ну и, наконец, есть GPC, использующий инфраструктуру GCC, и FPC, для которого COFF родной.
вся эта магия с индексами не с нуля, эти длины строк, темнота с указателями, вложенные функции в функции и прочая школярская поебень, которая не создает даже близко ощущения, что ты работаешь с синтаксическим сахарком поверх ассемблера
на паскале надо базовые алгоритмы проходить
ну там, циклы, условные выражения, сортировки пузырьком и т.д.
Поясните свою мысль.
> вся эта магия с индексами не с нуля
Какая там магия?
где лежит в памяти этот элемент массива?
надо ли знать школьнику, где он конкретно лежит относительно других его переменных?
>> темнота с указателями
> Поясните свою мысль.
насколько я помню из школьных лет, даже работа с кучей - приличное такое табу
если тебе не надо уметь в кучу, тогда и указатели не нужны, и адресная арифметика
не надо понимать что такое стек, надо лишь понимать, что вот тут мы переставляем элементы массива, а вот тут мы делаем writeln
а ты думал почему столько неосиляторов указателей на 1 курсе? нипаняятна!! сишка миня угнитаает
В Паскале нельзя написать 134[myarray] и myarray+134. Это, конечно, страшное ограничение.
> работа с кучей - приличное такое табу
Что за табу? Впервые слышу.
> адресная арифметика
Вот тут как раз в сишке кое-что спрятано под капотом. В Паскале Inc(p) увеличивает адрес на единицу, а в сишке ++p неявно домножает единичку на размер элемента массива.
неправда
Просто не приходилось этим пользоваться, ведь в Паскале довольно легко кастануть в массив или в структуру.
Да. Не царское это дело. То ли дело Си. Там и jumpы и регистр флагов.
>которая не создает даже близко ощущения, что ты работаешь с синтаксическим сахарком поверх ассемблера
Лол.
Кстати а можно уточнить поверх какого именно ассемблера ты работаешь в сишке?
Потому знание сей есть насущая необходимость любого программера. Вот тупо чтобы узнать как работает fork или CreateProcess.
Так что я рад что в моем детстве детей учили паскалю.
Конечно, блин, паттерн Visitor надо не на plain си учить.
Просто зная си _можно_ освоить джаву (ну придется подучить паттерны и ООП), а вот неосилившие си нытики как wwxwxw будут бегать по форумам о орать что на си невозможно ничего написать
Именно по этому первыми языками программирования должны стать flow diagrams, decision trees, Эренфух-Фраисе игры итд.
А знать что такое int и float вообще не надо. Вон, PHPшники не знают, и ничего: живут
float не сможет показать 100 знаков числа π => не нужен.
он там всякий разный
Так что может и нужен еще
http://arxiv.org/abs/1603.05636
И это-то после тридцати лет написания оптимизирующих компиляторов.
Я вообще не вижу каким обрзом Си поможет с вычислительными машинами (их только доминируювих подходов есть аж три, из которых два вооще Си не доступны, а третий так плохо выражен, что как модель для теории Си годится примерно менее чем никак). В Си есть одно фатальное достоинство - фигурные скобки.
Ну а уже о том, что в Си нет нормального способа, например, представить число как сроку, склеить две строки и т.п. банальные вещи, делает процесс обучения очень насыщеным и плодотворным.
Тем, что в нем можно напрямую работать с памятью, и тем что API операционок описаны на нем.
>>На самом деле Сишка на столько убога и непонятна даже тем, кто на ней пишет
Тем, кто пишет -- очень даже понятна. Не понятна она только тебе, потому что ты на ней не пишешь, в следствие ее неосиления.
>>Ну а уже о том, что в Си нет нормального способа, например, представить число как сроку, склеить две строки и т.п. банальные вещи
А еще там нет Twitter клиента в стандартной библиотеке.
ЛОАЛЛЛ ты чисто копируешь то, над чем я ржал. А какой нативный язык не позволяет-то?
> и тем что API операционок описаны на нем.
На любом нативном языке ты можешь точно так же подключиться к любому АПИ. А то, что в АПИ осей часто встречается такое дерьмо, как null-terminated string, то это не плюс сишки, это минус АПИ. Это рак, которым АПИ заразилось от сишки.
надо почитать лунный календарь, www.xxx последнее время в особенном обострении
сишка - это сахарок над ассемблером
под ассемблер затачивается всякое железо
нуу ок, как скажешь
> с вычислительными машинами (их только доминируювих подходов есть аж три
да-да, лисп машины захватили мир
а ещё микрософт уже 10 лет как выпускает процессоры, исполняющие c# напрямую
зачем ты выбрал синюю таблетку?
Ну и Сишка "сахарок" (кому сахарок, а кому и глоток из параши) над ассемблером в такой же степени как и десяток, а может и сотня других языков. Смысл же в том, что это плохая надстройка над ассемблером, а не в том, что она вообще надстройка.
Электронная вычислительная техника затачивается под Сишку, даже скорее под конкретные компиляторы, а не под ассемблер т.как известно, что какие-то вещи Сишка умеет оптимизировать хорошо, а какие-то вообще не умеет / плохо оптимизирует.
я даже спорить не буду
сишка - портируемый ассемблер, она легко транслируется в машинный код любой экзотической вундервафли, синтаксис её прост и ориентирован не на абстракции, а на исполнение на конкретном железе, а бородатые дяденьки отстояли то, чтобы чужой модуль, собранный 10 лет назад для этой платформы, неплохо смог прилинковаться к твоему
что и доказывает 40 лет успешного применения этого языка и чрезвычайной актуальности оного для написания прослоек между этими вашими космическими фабриками абстрактных адаптеров и реальным железом с шинами и регистрами
> Электронная вычислительная техника затачивается под Сишку
железо оптимизируется не под сишку, оно оптимизируется под рынок
если ты собрался выпустить железку, где софт покупателя твоей железки будет тормозить или работать с ошибками, то либо ты экономически эффективно решаешь и эту проблему тоже, либо выпускаешь железку, понимающую проблемы софта, либо ты бесконечно теоретизируешь о том, насколько ibm pc хуевая архитектура, за тарелочкой ароматного доширака
На железе PDP-11? В целом, по сравнению с другими нативными языками, она выделяется лишь своей общей уёбищностью.
Где в любом современном распространённом процессоре аналоги пост и пред-инкременты?
Где в сишке бср, бсф? Где блять лонгмул? Как написать функцию, которая меняет два числа значениями, но не дрочит память? А какого хуя массив и указатель на массив неявно кастятся друг в друга?
Предыдущие утверждения покрывали аппаратную питушню. Это последнее утверждение - внезапный переход на математику или реально по каким-то причинам такие касты мешают железному питуху?
http://ideone.com/u2wvOL
Этот язык не претендует на близость с железом, ему прощается путать указатели и значения.
А в Паскале значения и указатели чётко отделены друг от друга. Пример копирования значения:
http://ideone.com/szTMXt
Пример копирования указателя:
http://ideone.com/aFglyP
Классы==указатели? r u mad?
В жабе нет указателей. В жабе ссылки. Причём jvm может их двигать как пожелает.
Хотя технически они, конечно же, ссылки.
Речь о том, что в джаве инстансы классов в общем случае живут на куче, и с ними общаются через указатель(точнее ссылку)
Потому когда я говорю "Переменная goo это объект", на самом деле я говорю "переменная foo это указатель на объект"
Может-ли JVM разместить класс на стеке? Наверное, может если знает что я его за пределы блока не опубликовал. Но программист никогда не должен про это думать
Что "жабские классы,на самом деле указатели"?
Инстансы классов != Классы.
В жабе нет указателей. Только ссылки. Точка.
AtomicReference, WeakReference, SoftReference, PhantomReference.
>JVM разместить класс на стеке?
JVM размещает классы в permgene. Если кто-то разместит его на стеке - он просто сумасшедший.
Шёл 2016 год, а люди до сих пор не научились отличать классы от объектов...
То, что в крестах зовут классом, в иных местах называют типом объекта/класса, а то, что в крестах зовут объектом, в иных местах называют экземпляром объекта/класса.
В общем, если употреблять термин экземпляр/инстанс, то не придерутся.
ссылку на инстанс класса многие люди называют инстансом класса , а то и вовсе классом
NullPointerException ;)
Да, разумеется с точки зрення терминологии ++ они ссылки
>>JVM размещает классы в permgene.
да) это вот пример того что я объект назвал классом
даже точнее ссылку на объект
Для удобства программиста. Как и всё в сишке.
Иногда в этих терминах удобно думать. Где-нибудь внутри алгоритма, когда не надо передавать массив как целое (что сделать не получится из-за разделённости массива и его длины).
А в Аде слайсы вообще родные, в язык вшиты, никаких специальных структур передавать не надо. В Фортране кажется даже двумерные слайсы вшитые есть (!!!)
> Где в сишке бср
псевдокод
Не фонтан, но жить можно.
Хреново, конечно, что в каждом проекте нужна эта тоскливая копипаста. Хорошо бы иметь модульный компилятор, у которого можно спрашивать, что он умеет делать, со стандартизированным набором фич.
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.
А поделить два числа и получить раздельно остаток и частное?
Работает в 1 инструкцию только благодаря "умному" компилятору.
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.
.
>Та ладно, и чем он так хорош для системщины?
PDP-7.
>Тем, что под это уебище специально затачиватся всякое железо?
На самом деле они ж из Сишки делают некое промежуточное представление (типа шланг-асма), которое уже оптимизируют под конкретную тачку.
в си есть препроцссор
>>В Си, как и в ПХП нет нормальных структур данных.
это традиционный пиздеж, все там есть
>>В Си реализация любых алгоритмов общего назначения упирается в отсутствие генериков
лол, как и в любой ЯП, выдуманном в 1970х.
void* и вперед. Си не для этого. Не пишите на нем бизнес-логику.
>>В Си так трудно добиться того, чтобы код можно было повторно использовать, что, по-сути, никто к этому даже не стремится.
Это очередной пиздеж. В мире дохуя либ, написанных на си. СМ API OS.
>>В Си так тяжело добиться вообще работающего кода, что когда оно наконец скомпилировалось, и после отключения всех чужих библиотек валгринд выдал всего сотню-другую ошибок, хочется заплакать и бежать закрыв глаза до самого горизонта.
У миллионов людей получается, а у тебя нет. Потому что ты неосилятор, который не знает си. Пиши на ПХП или 1С.
>>Си не учит программировать, он учит выживать в условиях,
Очередной бессмысленный пездеж
>Очередной бессмысленный пездеж
Почему же? Берёшь сишку - и уже не программируешь, а байты таскаешь и за флагами ошибок следишь. Чуть не уследил - отлаживаешь и ещё строже следишь за байтиками.
Программирование вроде как задачи должно решать. А на сишке программист в первую очередь решает задачу о том, как ему нужно написать код, чтобы тот решал задачу, а не о том, как всё же решить эту задачу.
Слишком много нужно думать о том, что не влияет на результат.
Всё равно, что повару использовать ледяной нож. Точишь его, точишь, комнату охлаждаешь, а блюдо всё не готово.
Я не знаю что такое "таскать байты", потому я обычно использовал СИ для составления алгоримтов для решения конкретных задач. И задачи эти решались. И миллионы людей так делали. Например, они написали Apache Web Server. Или Linux. Или Windows. Или nginx. И все у них получилось.
Наверное они просто какие-то не правильные.
Честно говоря, за почти 20 лет с первого стандарта можно было бы и получше инфраструктуру развить.
Чем собирать проект на C++? Как повторно использовать библиотеки?
На эти вопросы, увы, нет простого ответа.
Я вот хочу писать на smalltalk. Но на нем не так удобно будет писать, например, под iOS. Правда?
> У миллионов людей получается
Но у многих из этих либ внутри такое говно, что даже всё желание их юзать/править отпадает.
Понятный сишный код без изъёбств, костылей и ляпов редко встретишь...
Я думаю что говно внутри у 99% либ
На изкоробочном томкате неплохо взлетало... Не продакшен, конечно, но подебажиться хватит.
> зависимости, конфиг
Можно подумать, что какой-нибудь модуль к ПХП проще прикручивается. Там со всякой экзотикой, типа редких СУБД, вообще дело до ручной сборки из исходников доходило... Ну и всякие помойки типа php.ini + .htaccess тоже не стоит забывать.
пыхобляди никогда не могли его осилить, и потому наплодили denverов
А уж как в php роутинг делается - это вообще отдельный вопрос. Может быть, при запуске через fastcgi, что-то повменяемее завезли?
в зенде, например, для этого routes.ini
Там через mod_rewrite ВСЕ заворачивается в пых, ну и дальше routes.ini
Ну, чтобы поиграться достаточно
http://php.net/manual/en/features.commandline.webserver.php
правда в мавене тоже был томкат
можно был mvn run:tomcat или как-то так
Мавен, к сожалению, все равно не спасает от хелла
Потому что нельзя в класс-пасе иметь два разных класса foo.Bar.
Зато в .NET можно, кстати) там в манифесте указана версия
Тут .NET сделал JVM
Да один фиг, не всегда это будет работать. Если у сборки нету общего стейта - ну ок, хоть 100500 копий запускай. А если есть стейт - всё разъедется уже на второй.
GUI тред конечно один и какие сборки в него не лезут
Там вертится луп, и они в этот луп задачи пихают
Вот если у меня будет две сборки с лупом для доступа к моей ВундерВафле на USB, тады ой
Но и тады там будет фабричный метод, который вернет верную реализацию интерфейса для работы с вафлей и сборки ее там зарегят. Кто последний -- тот и победил
Ну а сборки от майкрософта типа не подчиняются общим правилам? Их не могут затребовать разные куски твоего продукта? :) Или они всегда взаимо-исключающи?
хотя я хз, если честно, я давно туда не смотрел. Но в целом возможность сказать что "мой модуль хочет Foo версии 1.0" это лучше чем просто сказать "Мой модуль хочет bar.Foo"
+1. Кстати, в мире джавы OSGi решает эту проблему (по крайней мере, пытается).
Которую из? :)
> Кто последний -- тот и победил
Ну это ж хуёвый способ, недетерминированный. Сегодня первый победил. Завтра второй. А послезавтра бегай с больной головой и ищи в чём была трабла...
Кто последний загрузился, тот и прописал себя в некое глобальное хранилище
Тогда уж - у кого хуй длиннее версия больше. Так хоть детерминированно будет.
(На UEFI так драйверы сортируются).
можно получить отсутствие обратной совместимости и упасть
но в уефи наверное можно запустить бутменеджера или его шелл и загрузить нужный модуль и нужный .efi файл
просто это все же меньшее из говен. Вот когда ты депендишься на foo, а foo на bar, а bar привез тебе log4j не той версии что тебе надо -- вот это боль.
Кстати, пулы в дотнете уже реализованы обычно в ADO.NET (если есть нужные дрова)
бля, это еще Дейкстры с Никлаусами говорили
не nasrat_govno() а govno = nasrat_govno().
на худой конец nasrat_govno(&govno); же
это может быть
интересно, полетит-ли класскаст?)
Сишкопроблемы
nasrat_govno(out govno) // шарпей
так лучше?
хотя в C# лучше коенчно просто вернуть хендлер по причинам того что он все равно будет в куче
Да уж, через жопу. Но рнр слегка проще, согласен.
Писать на нем плохо очень легко, а писать хорошо -- сложно.
Он имеет плохой синтаксис, плохую библиотеку, плохие best practices, и плохое, тупое коммунити.
Почитай "фрактал плохого дизайна". посмотри на вопросы на PHPClub, а потом сравни их с вопросами по питону на StackOverflow
а что такого?
а вот так в пистоне нельзя
$php[1] = 1;
$php["govno"] = 2;
потому что массив (он же список для простоты, хотя это конечно не так) не равен дикту (он же хеш он же мап)
>посмотри на вопросы на PHPClub, а потом сравни их с вопросами по питону на StackOverflow
>Как раз на СО полно вопросов типа "как сложить 2 массива" с кучей плюсов, тут ты не в тему.
Это как с едой, сожрал элитные пельмени пощелкивая креветкой, но выходит ведь все равно говно.
... прострелить себе ногу
Вам разве не по душе высирание в глобальный неймспейс переменных, полученных гетом?
http://php.net/ChangeLog-5.php
До 10 года