«Ничего» интерпретатор /компилятор

Это реализация языка программирования Nothing . Спецификация языка выглядит следующим образом:

  

Философия дизайна

     

В текущей индустрии программного обеспечения основное внимание уделяется решению сложных   проблемы с использованием сложных алгоритмов. Язык «Ничего» не был   созданный для того, чтобы перенести этот фокус с сложных проблем на   ожидания программиста и пользователя. Таким образом, даже самые   сложные проблемы программирования быстро исчезают, как будто они никогда   существовали раньше. В основном основные достоинства языка   «Ничего»:

     
  • для создания бесплатного и портативного программного обеспечения https://esolangs.org/wiki/Nothing
  •   
  • для смещения фокуса с сложных технических решений в сторону ожидания программистов и пользователей.
  •   

Структура программы

     

Ничто не имеет простой и простой структуры. Это   нетривиальный язык, который не использует какое-либо известное программирование   конструкции, такие как циклы, выбор и тому подобное. Это единственный язык   которые можно рассматривать как 1GL, 2GL, 3GL, 4GL и 5GL на одном и том же   время.

Что я хотел бы знать:

  • Соответствует ли моя программа языковым спецификациям?
  • Соответствует ли философия дизайна?
  • Считываемость, производительность и т. д. Любые улучшения приветствуются

Исходный код:

/*
 * A 'Nothing' compiler
 * <http://www.turtle.dds.nl/nothing/>
 * September 2010, RoPe Development Inc.
 *
 * Author: authorname
 */

#include <iostream>
#include <fstream>
#include <cstdlib> // EXIT_FAILURE
#include <string> // std::char_traits<char>::eof

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        std::cerr << "nothing: fatal error: no input files\n";
        std::cerr << "compilation terminated.";
        return EXIT_FAILURE;
    }

    std::ifstream program(argv[1]);

    if (!program)
    {
        std::cerr << "nothing: error: " << argv[1] << ": No such file or directory\n";
        std::cerr << "nothing: fatal error: no input files\n";
        std::cerr << "compilation terminated.";        
        return EXIT_FAILURE;
    }

    if (program.peek() != std::char_traits<char>::eof())
    {
        std::cerr << "nothing: fatal error: program is not empty\n";
        std::cerr << "compilation terminated.";
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

Пример:

# bash
$ touch helloworld.not
$ ./nothing helloworld.not
$ 
11 голосов | спросил user82302 29 PM00000070000003031 2015, 19:25:30

3 ответа


8

Эта строка здесь:

return EXIT_SUCCESS

Это эквивалентно этому:

return 0;

, который автоматически вставляется компилятором, если он не найден. Короче говоря, return EXIT_SUCCESS можно удалить.

Кроме того, некоторые из сообщений об ошибках не включают в себя новую строку в конце, как показано в этой строке здесь, и два других места:

std::cerr << "compilation terminated.";

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

std::cerr << "compilation terminated.\n";

Вместо того, чтобы требовать от пользователя предоставления файла в аргументах командной строки, вы можете просто сделать, ну, ничего. В конце концов, это язык. Это означает, что этот фрагмент кода здесь:

if (argc < 2)
{
    std::cerr << "nothing: fatal error: no input files\n";
    std::cerr << "compilation terminated.";
    return EXIT_FAILURE;
}

Может просто стать следующим:

if (argc < 2)
{
    return 0;
}

Кроме этих двух nitpicks, для меня здесь не так уж и много. Насколько я могу судить, вы отлично следили за спецификацией языка и создали некоторый читаемый код.

ответил Ethan Bierlein 29 PM00000070000003231 2015, 19:56:32
5
  • Не печатайте сообщение об ошибке. Невозможность открыть поток не обязательно из-за no such file or directory; например, у вас могут быть недостаточные привилегии. Используйте perror().

  • Невозможно скомпилировать только один файл за раз.

  • Нет причин ограничивать программу файлами на диске. Было бы неплохо иметь возможность использовать его в конвейере.

  • Параметр --silent для подавления сообщений об ошибках всегда хорош.

  • Локализация - обязательное условие! Не все читают английский.

  • help отсутствует.

  • Для получения дополнительной информации посетите страницу GNU Hello World .

ответил vnp 29 PM000000100000005531 2015, 22:25:55
2
  

Отказ от ответственности : я знаю Nothing о C ++

Внутри !program, если вы, похоже, забыли эту строку:

std::cerr << "nothing: fatal error: no input files\n";

, который также присутствует в блоке if (argc < 2). Возможно, ошибка копирования-пасты?


Так как ваши сообщения об ошибках почти всегда одинаковы, вы можете сделать функцию для отображения сообщения об ошибке. Вот так:

void show_error(std::string message)
{
    std::cerr << "nothing: fatal error: " << message << "\n";
    std::cerr << "compilation terminated.\n";
}

У вас есть следующая строка:

std::ifstream program(argv[1]);

В первый раз, когда я это прочитал, я понимаю: почему он создает новую программу? Но после некоторого обучения я обнаружил, что это объект.

Блок if (!program) действительно смутил меня. Я не мог понять, почему вы проверяли, нет ли программы.

Так как это компилятор /интерпретатор, вам нужен код. Мое предложение: переименуйте его в code или file. Оба были бы настолько очевидны, чем program. Это не плохое имя! Это не самый лучший.

ответил Ismael Miguel 29 PM00000090000004631 2015, 21:04:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132