LINUX.ORG.RU

И это мэйнстримный язык?

 , , ,


0

3

Имеем содержимое файла testbool.cpp

#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    bool foo = 7 > 0;
    cout << foo << endl;
    bool bar = 7.5;
    cout << bar << endl;
    bool baz = "dont't foo";
    cout << baz << endl;
    return 0;
}
Компилируем:
den@haruhi:/tmp$ g++ -o testbool testbool.cpp
den@haruhi:/tmp$ ./testbool 
1
1

den@haruhi:/tmp$ g++ -Wall -o testbool testbool.cpp
den@haruhi:/tmp$ 

den@haruhi:/tmp$ g++ -std=c++0x -Wall -o testbool testbool.cpp
den@haruhi:/tmp$

Ничего, ни одного предупреждения несмотря на явное несоответствие типов.

Код на Java:

public class Main
{
    public static void main(String args[])
    {
        boolean foo = 7.5 < 0;
        System.out.println(foo);
        boolean baz = "Хурдыбурды";
        System.out.println(baz);
    }
}
Вывод компилятора:
den@haruhi:/tmp$ javac Main.java 
Main.java:7: incompatible types
found   : java.lang.String
required: boolean
		boolean baz = "Хурдыбурды";
		              ^
1 error

И как это понимать? Где «логический тип» в С++?

★★★★★

Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
$ clang++ q.cc
q.cc:7:16: warning: implicit conversion from 'double' to 'bool' changes value
      from 7.5 to true [-Wliteral-conversion]
    bool bar = 7.5;
         ~~~   ^~~
1 warning generated.

i-rinat ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Значит компилер говно?

На самом деле проблема не только в компилере. Проблема у истоков C++. Это попытка сохранить совместимость с C. В C 0 - false, не 0 - true. Строка это указатель и он не равен 0, а значит true.

Ведь выражение while (<bool expresion>) {} можно записать while (1) {}, а можно while (true) {}. Если компилятор постоянно ругался бы, то получилось бы такое количество ругани в смешанных (C + С++) проектах, что просто на предупреждения перестали бы обращать внимание.

С++ все равно намного строже чем C.

А вот Java это другое дело. У разработчиков не было идеи ни сохранить совместимость со всем что можно, ни сделать суперязык (типа common lisp, haskel или C++). Они сделали простой язык, богатую библиотеку стандартных классов и даже подумали сразу о соглашениях по написанию кода. Java - это сейчас мейнстрим: Web, Android, Enterpise и много чего еще. C++ legacy code + код с высокими требованиями к быстродействию. Но на мой взгляд в плане быстродействия лучше сразу на C - он намного проще. Так голова не болит то ли использовать исключения, то ли нет, какой из 100500 классов строки взять (их нет и проблем нет :).

olegk ★★
()
Ответ на: комментарий от LongLiveUbuntu

Какая версия шланга?

$ clang++ --version
Debian clang version 3.3-1 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix
i-rinat ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Значит компилер говно?

Всё говно. Поэтому я прогоняю свои поделки через разные компиляторы, включаю параноидальные -Wall -Wextra, и стараюсь добиться, чтобы ни одного предупреждения не было.

В последний раз так не сделал и искал ошибку (опечатка) две недели. Правда заодно нашёл ещё три, уже не опечатки.

i-rinat ★★★★★
()
Ответ на: комментарий от olegk

Строка это указатель и он не равен 0, а значит true.

А ведь технически ничего не мешает ему быть равным 0. Да, так исторически сложилось, что страница адресного пространства, начинающаяся по адресу 0, обычно используется для отлавливания неинициализированных указателей и кидания сегфолтов, но ведь на какой-то платформе это может быть не так, и строка разместится по адресу 0

Harald ★★★★★
()
Ответ на: комментарий от anonymous

Не хотел отвечать на грубость. Просто замечу. Дело ведь не в страницах, а в понятности для человека. Я сам ничего против не имею Haskell. Сам им занимался не долго, из функциональных достаточно долго увлекался erlang и scheme. И мне erlang очень много дал в понимании, как правильно организовать многопоточные приложения (хотя язык тут не столь важен).

Если вы откроете спецификацию Java то увидете, что там есть разделы по бинарной совместимости и даже по многопоточности. Java просто стандартизирован до мелочей. Например для сравнения в Java стандартизирован даже name mangling для перегрузки методов в отличии от C++.

А по Haskell это просто report (отчет о проделанной научной работе).

Открываем раздел типов:

Haskell Haskell uses a traditional Hindley-Milner polymorphic type system to provide a static type semantics [4, 6], but the type system has been extended with type classes (or just classes) that provide a structured way to introduce overloaded functions.

А дальше читаем две книги про то, что кто такие Хиндли и Мильнер.

Java:

The types of the Java programming language are divided into two categories: primitive types and reference types. The primitive types (§4.2) are the boolean type and the numeric types. The numeric types are the integral types byte, short, int, long, and char, and the floating-point types float and double. The reference types (§4.3) are class types, interface types, and array types.

Т.е. ссылки на этот же документ.

Такое ощущение, что вы скинули информацию не посмотрев даже.

olegk ★★
()
Ответ на: комментарий от Harald

но ведь на какой-то платформе это может быть не так, и строка разместится по адресу 0

никаких проблем, во-первых при касте 0 к указателю может получится совсем не 0, если платформа требует этого, во-вторых к чему бы ни кастилось - стандарт говорит, что по этому адресу ничего не должно размещаться

wota ★★
()
Ответ на: комментарий от olegk

Совершенно верно: в простых языках, построенных на денотационной семантике, детали имплементации никого не интересуют, с ними разбираются компиляторостроители; а вот в сложных, построенных на операционной семантике, нужно рассказать каждую мелочь, а то запутаются. О том-то и речь, балбесина.

anonymous
()
Ответ на: комментарий от anonymous

Совершенно верно: в простых языках

Согласен: Haskell это самый простой язык программирования, проще только brainfuck)))

olegk ★★
()
Ответ на: комментарий от olegk

Открываем раздел типов:

То есть вроде бы открывал, но:

А по Haskell это просто report (отчет о проделанной научной работе).

Кэп-то намекает, что это «ревизия языка». Названия глав с описанием грамматик должны были навести на кое-какие мысли.
Можно просто цитировать.

Такое ощущение, что вы скинули информацию не посмотрев даже.

anonymous
()
Ответ на: комментарий от anonymous

Не понял, о чем вы. Я открыл только после того, когда мне сказали, что по java описание больше, поэтому java сложнее. Так как знаком с обоими языками, то не мог себе представить как java можно было назвать сложнее haskell (это анекдот просто ну или толстый троллинг).

А смотрел здесь: http://www.haskell.org/onlinereport/haskell2010/

Что там не так с названиями глав?

После вашего поста заглянул в preface:

After several years exploring the design space, it was decided that a single monolithic revision of the language was too large a task, and the best way to make progress was to evolve the language in small incremental steps, each revision integrating only a small number of well-understood extensions and changes. Haskell 2010 is the first revision to be created in this way, and new revisions are expected once per year.


ОК, тогда если это не все зачем тыкать в то, что report по Haskell меньше чем specification по java? В чем логика?

olegk ★★
()
Ответ на: комментарий от olegk

тогда если это не все зачем тыкать в то, что report по Haskell меньше чем specification по java?

Не знаю, недостаточно разбираюсь в java, чтобы судить. Возражал конкретно по:

report (отчет о проделанной научной работе)

Все же report не в этом смысле, а «веха» процесса развития языка.

integrating only a small number of well-understood extensions and changes

Там же описаны не только изменения, а _с изменениями_. И «changes» насколько я понимаю - это адаптация расширений ghc haskell (в первую очередь) в ревизию стандарта.

По-моему аналогия со спецификацией допустима.

anonymous
()
Ответ на: комментарий от olegk

Если компилятор постоянно ругался бы, то получилось бы такое количество ругани в смешанных (C + С++) проектах, что просто на предупреждения перестали бы обращать внимание.

не думаю

если было бы можно компилировать сишные файлы компилятором си, а плюсовые — компилятором с++, и затем линковать, то все было бы ок

некоторая проблема была бы, если бы в си надо было писать

network_result_t r = do_something(....);
if( !r ){ 
  printf("all ok\n");

а в с++ можно было бы написать

#pragma convert_enum_0_to_bool_true
...
...
...
...
network_result_t r = do_something(....);
if( r ){ 
  printf("all ok\n");

и это только в том случае, когда код тупо копипастился из си, а не транслировался из си в с++ — в случае копипаста он мог бы втихую приобрести баги

короче, идея *синтаксической* совместимости со старьем — ужасна

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.